透過 BigQuery ML 將圖片資料分類

1. 簡介

在這個程式碼研究室中,我們將討論在 BigQuery 中儲存及分析 Yoga Poss 圖片的應用實例,以及如何透過 BigQuery ML 實作分類模型,只使用 SQL 結構來為姿勢加上標籤,而無需使用任何其他形式的程式碼。

BigQuery 和 BQML

BigQuery 是無伺服器的多雲端資料倉儲系統,能從位元組擴充至 PB 規模,且完全不投入營運負擔。因此非常適合用於儲存機器學習訓練資料。此外,內建的 BigQuery 機器學習 ( BQML) 和數據分析功能可讓您僅使用 SQL 查詢,不需編寫程式碼即可產生預測結果。此外,您還能透過聯合查詢存取外部來源的資料,無須進行複雜的 ETL 管道。如要進一步瞭解 BigQuery 提供的所有功能,請參閱 BigQuery 頁面

目前為止,我們都已經瞭解 BigQuery 是這個全代管雲端資料倉儲系統,能協助使用者分析結構化和半結構化資料。但是,

  • BigQuery 已擴大服務範圍,可對非結構化資料執行所有數據分析和機器學習作業
  • 我們可以使用 SQL 查詢,大規模針對圖片、影片、音訊等項目進行深入分析、分析和機器學習作業,而且無需編寫額外的程式碼
  • 我們可以將結構化和非結構化資料合併成表格,

我們會在下一節介紹的瑜珈姿勢分類使用案例。

透過 BigQuery ML 將圖片資料分類

能像結構化資料一樣,使用結構化查詢處理及分析圖片。現在,我們甚至能透過 BigQuery ML 的機器學習分類模型來預測結果。我已將各個階段分為 5 個步驟,以便理解:

fe97945bce996e1.jpeg

如果只是以標籤的形式來調查上述步驟,步驟可能會很複雜。各項相關元件的詳細資料,例如 BigQuery 資料集、BigLake 連線、Cloud Storage 值區 (容器)、物件資料表 (外部資料來源) 和 BQML 等,全都在實作一節定義。因此,如果您不熟悉這些字詞,請別的建議。

建構項目

您會使用 BQML 建立影像資料分類模型,內容涵蓋下列項目:

  • 一個 BigQuery 資料集,內含資料表和模型元件
  • 用來儲存模型瑜珈圖片的 Google Cloud Storage (GCS) 值區
  • 用於存取 Cloud Storage 映像檔的外部資料表
  • 外部資料表的 BigLake 連線,可存取 GCS 中的圖片
  • BigQuery ML 中的 ResNet 模型
  • 使用建立的模型進行推論
  • 用於分析圖片資料的 BigQuery SQL
  • 可透過 BigQuery SQL 同時查詢結構化和非結構化資料

課程內容

  • 如何建立 Cloud Storage 值區及儲存圖片
  • 如何建立 BigQuery 資料集、資料表和連線
  • 如何使用 BQML 建立圖像資料分類模型
  • 如何使用 BigQuery ML 以建立的模型進行預測
  • 如何使用 BigQuery SQL 查詢圖片並結合結構化資料與結構化資料

2. 需求條件

  • 瀏覽器,例如 ChromeFirefox
  • 已啟用計費功能的 Google Cloud 專案,當中包含 BigQuery、Cloud Storage 和 BigLake 連線服務
  • 下一節將說明建立圖片資料分類應用程式的步驟清單

3. 建立資料集和 BigLake 連線

我們使用公開的資料集來偵測 5 個瑜伽姿勢的圖片,因此你可以在這個存放區中存取資料集。我們所看到的瑜伽姿勢包括下犬、女神、飛機、樹木和戰士。在開始建立 BigQuery 資料集之前,請務必先選取或建立 Google Cloud 專案,並確認專案已啟用帳單功能。啟用 BigQuery API 和 BigQuery Connection API。請注意,您在這項實作中使用的所有服務,都必須位於所選區域。

a. 建立「yoga_set」資料集操作步驟如下:

前往 BigQuery 編輯器並輸入以下指令:

CREATE SCHEMA `<<project_id>>.yoga_set`;

b. BigLake 連線讓我們可以連結外部資料來源,同時保留精細的 BigQuery 存取權控管和安全性功能,本例中的 Cloud Storage 是圖片資料的 Cloud Storage。我們會使用這個連線從 Cloud Storage 讀取物件。請按照下列步驟建立 BigLake 連線。

在 BigQuery 頁面的「Explorer」窗格中,按一下「ADD DATA」(新增資料):

4cb42b1245bb0ba6.pngBigQuery「新增外部資料」螢幕

按一下「與外部資料來源的連線」,然後選取「BigLake 和遠端函式」選項:

9ffec2b2bfcc3cd5.png設定外部資料來源連線

請提供連線 ID 並建立連線。建立連線 <<SERVICE_ACCOUNT>> 後,請記下畫面上顯示的服務帳戶 ID。在本範例中,連線 ID 是「yoga-pose-conn」。請記得記下這個區域。

4. 建立 Google Cloud Storage 值區及授予權限

我們將使用 Google Cloud Storage 值區,存放要用來建立模型的瑜伽姿勢圖片檔。值區是 Cloud Storage 容器,用於存放要分析的圖片。

a. 在控制台中搜尋前往 Google Cloud Storage,然後按一下「值區」來前往「值區」首頁,然後點選「建立」

a6f6b26cffb53ae0.pngGoogle Cloud Storage 值區頁面

b. 在「建立值區」頁面中輸入值區資訊 (專屬名稱),然後繼續操作,請確定值區與先前步驟所述的資料集位於相同區域,然後按一下「建立」

1280366a42b7bdf6.pngGoogle Cloud Storage 建立值區頁面

前往下一個步驟前,請先確認您記下了服務帳戶、值區名稱和路徑。

c. 建立值區後,請透過控制台或 Cloud Shell 指令或程式輔助方式儲存映像檔,並授予連線服務帳戶 (我們稍早儲存) 存取映像檔的必要權限

> export sa=<<"SERVICE_ACCOUNT">>
> gsutil iam ch serviceAccount:$sa:objectViewer "gs://<<bucket>>"

5. 建立物件資料表

您可以透過 BigQuery 建立外部物件資料表,使用我們建立的連線存取值區中的非結構化資料。執行下列「透過 BigQuery 編輯器建立 SQL」指令:

CREATE OR REPLACE EXTERNAL TABLE `<<dataset>>.<<table_name>>`
WITH CONNECTION `us.<<connection-name>>`
OPTIONS(
object_metadata="SIMPLE", uris=["gs://<<bucket>>/<<folder_if_exists>>/*.jpg"]);

外部資料表的建立方式如下:

bda48f566e0c292f.png

現在讓我們從新建立的外部資料表快速查詢姿勢:

SELECT data , uri
FROM `yoga_set.yoga_poses`
WHERE REGEXP_CONTAINS(uri, 'gs://yoga_images/Downdog')
Limit 1;

如以下螢幕截圖所示,您可以建立及執行非結構化圖片,就像建立結構化資料一樣:

7d1784122b5013f.png

現在,讓我們將上述查詢結果匯出至小型 Python 程式碼片段,以視覺化方式呈現結果:

按一下 [儲存結果],然後選取 [CSV Localfile]匯出結果的選項。接著,開啟 Colab 筆記本 (或建立),並在下方輸入代碼

from IPython.display import display
from PIL import Image
import io
import pandas as pd
import base64
df = pd.read_csv('/content/sample_data/<<your_csv>>')
imgdata = base64.b64decode(str(df.data[0]))
image = Image.open(io.BytesIO(imgdata))
display(image)

執行 以查看結果,如下所示:

b8edd68cb281786a.png

我們現在已經建立外部資料表,並且只使用 SQL 查詢從 Cloud Storage 存取圖片,接著讓我們前往下一節建立分類模型。

6. 建立模型並上傳至 Google Cloud Storage

在這個實作項目中,我們將使用預先訓練的 ResNet 50 模型,對剛剛建立的物件表格執行推論。ResNet 50 模型會分析圖片檔,並輸出一批向量,代表圖片屬於對應類別 (記錄檔) 的可能性。

請先確認您具備所有必要的權限,再繼續進行這個步驟。然後按照下列步驟操作:

  1. 從這個位置下載模型,並儲存在本機
  2. 檔案應解除封裝至 saved_model.pb 和變數資料夾
  3. 將這兩個 (檔案和資料夾) 上傳到先前章節建立的值區

2629ff3eda214946.pngGoogle Cloud Storage 值區「yoga_images」並上傳 ResNet Model 檔案

完成這個步驟後,模型相關檔案應與圖片所在的值區相同,如上圖所示。

7. 將模型載入 BQML 並推論

在這個步驟中,我們會將模型載入先前建立的外部資料表所在的 BigQuery 資料集,並套用至 Cloud Storage 中儲存的圖片。

a. 在 BigQuery 編輯器中,執行下列 SQL 陳述式

CREATE MODEL `<<Dataset>>.<<Model_Name>>`
OPTIONS(
model_type = 'TENSORFLOW',
model_path = 'gs://<<Bucket>>/*');

執行完成後 (視資料集而定,可能需要一段時間),您會在 BigQuery 的「資料集」部分看到模型。

435fa0919aeb57a6.png列出已建立模型的 BigQuery 資料集

b. 檢查模型,查看其輸入和輸出欄位。

展開資料集,然後點選剛剛建立的模型「yoga_poses_resnet」。按一下 [結構定義] 分頁標籤。

e88928764f10f6ff.pngBigQuery 模型定義結構定義分頁

在「標籤」部分中,您會看到「activation_49」代表輸出欄位在「功能」部分,您會看到,代表預期會輸入至模型的欄位。您將參照「input_1」推論查詢 (或預測查詢) 做為您在「test」所傳入的欄位資料。

c. 推斷您的瑜珈姿勢!

現在,我們來使用剛建立的模型來分類測試圖片資料。請確定您的 Cloud Storage 值區已找到一些測試映像檔 (瑜伽姿勢),以便在建立外部資料表時將其放進外部資料表。我們會在 BigQuery 中選擇性地查詢這些測試圖片,以使用剛剛建立的 BQML 模型執行推論。使用下列查詢觸發測試。

SELECT *
FROM ML.PREDICT(
MODEL yoga_set.yoga_poses_resnet,
(SELECT uri, ML.DECODE_IMAGE(data) AS input_1
FROM yoga_set.yoga_poses where REGEXP_CONTAINS(uri,
'gs://yoga_images/Downdog/00000097.jpg')));

在上述查詢中,我們選擇了一張已確認在外部資料表中含有特定 URI 值 (00000097.jpg) 的測試映像檔。此外,SELECT 部分會使用 ML.DECODE_IMAGE 結構做為欄位「input_1」才能讓 ML.PREDICT 函式運作

執行作業完成後,結果如下所示:

867018993845e943.png

現在,深入瞭解 ResNet 模型的使用者,這類標記將有助於瞭解分類方式。否則,我們來加入一小段程式碼片段,以視覺化的方式瞭解分類。

d. 壓平合併結果

視覺化呈現上述輸出內容的其中一種方式,就是使用 BigQuery SQL 的 UNNEST 結構整併 enable_49 欄位值。請參閱下方查詢,瞭解如何簡化先前步驟的結果。如要針對產生的類別進一步為結果加上標籤,您可以導入相關邏輯來取代預留位置 <<LABEL_LOGIC>>(使用時取消註解)。

with predictions as (
SELECT
Uri, data, SPLIT(uri, "/")[OFFSET(ARRAY_LENGTH(SPLIT(uri, "/")) - 1)] as img,  
i as label_i,
<<LABEL_LOGIC>> label,
Score
FROM ML.PREDICT(
MODEL yoga_set.yoga_poses_resnet,
(SELECT data, uri, ML.DECODE_IMAGE(data) AS input_1
FROM yoga_set.yoga_poses 
WHERE
REGEXP_CONTAINS(uri,'gs://yoga_images/Goddess/00000007.jpg'))),
UNNEST(activation_49) as score WITH OFFSET i)
SELECT * FROM predictions 
ORDER BY score DESC
LIMIT  5;

如果沒有類別標籤邏輯,查詢的輸出內容如下:

71f580f41f0811f3.png

不過,在這個例子中,我套用了範例邏輯,結果如下:

1c6df6ecd14fba1.png

您可以進一步瞭解模型,並套用最適合您的資料和模型輸出內容的邏輯。

e. 以視覺化方式呈現推論

最後,一種簡單的 Python 程式碼片段,以視覺化方式呈現分類結果!將上述查詢結果匯出為 CSV 檔案,並在 Python 程式碼中參照。

68756e7e4b8d7a29.png

上圖輸出是瑜珈姿勢的「下跌狗」這與我們傳遞至 ML.PREDICT 查詢,使用 BQML 進行分類的測試輸入完全相同!

8. 統合結構化與非結構化資料

最後,我最喜歡的部分,就是將結構化關聯資料表中的欄位與這項非結構化圖片資料整合。我在外部資料表相同的資料集中,建立了結構化的 BigQuery 資料表,用來保存姿勢及其健康相關資料。

125bdf848c86fbe.pngBigQuery 結構化資料表「yoga_health」結構定義

上圖為名為「yoga_health」的結構化資料資料表結構定義而田野包括姿勢、專注力、health_benefit 和呼吸。下列查詢會彙整結構化和非結構化資料:

SELECT SPLIT(uri, "/")[OFFSET(ARRAY_LENGTH(SPLIT(uri, "/")) - 2)] as pose,
a.health_benefit, breath, focus, data
FROM `abis-345004.yoga_set.yoga_health` a, yoga_set.yoga_poses b
WHERE a.pose = SPLIT(uri, "/")[OFFSET(ARRAY_LENGTH(SPLIT(uri, "/")) - 2)];

結果如下:

469bdfcffa9e19fd.png

注意:只要使用 BigQuery Magic 指令,即可直接從 Python 筆記本執行本網誌涵蓋的所有查詢。

9. 清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本文中所用資源的費用,請按照下列步驟操作。

  1. 前往 Google Cloud 控制台中的「管理資源」頁面。
  2. 在專案清單中,選取要刪除的專案,然後按一下 [刪除]
  3. 在對話方塊中輸入專案 ID,然後按一下「關閉」以刪除專案

10. 恭喜

恭喜!您已成功在 BigQuery 中儲存、查詢非結構化資料、使用 BQML 建立分類模型,並使用該模型預測瑜珈體系。如要實作這項功能,請先在 Google Cloud 專案著手。另外,如要進一步瞭解 Google Cloud 的資料庫或其他端對端應用程式實作方式,請前往我的網誌