教學課程:使用 Model Builder 偵測影像中的停止符號

瞭解如何使用 ML.NET Model Builder 和 Azure Machine Learning 來建置物件偵測模型,以偵測並找出停止登入影像。

在本教學課程中,您會了解如何:

  • 準備並了解資料
  • 建立 Model Builder 組態檔
  • 選擇案例
  • 選擇定型環境
  • 載入資料
  • 將模型定型
  • 評估模型
  • 使用模型來進行預測

必要條件

如需必要條件和安裝指示清單,請造訪 Model Builder 安裝指南

Model Builder 物件偵測概觀

物件偵測是一種電腦視覺問題。 雖然與影像分類密切相關,但物件偵測會更仔細的執行影像分類。 物件偵測會尋找影像中實體的位置「並」進行分類。 物件偵測模型通常透過深度學習和神經網路進行定型。 如需詳細資訊,請參閱深度學習與機器學習

當影像包含不同類型的多個物件時,請使用物件偵測。

螢幕擷取畫面:顯示影像分類與物件分類。

物件偵測的一些使用案例包括:

  • 自動駕駛車輛
  • 機器人
  • 臉部偵測
  • 工作場所安全
  • 物件計數
  • 活動辨識

此範例會建立 C# .NET Core 主控台應用程式,以使用以模型產生器建置的機器學習模型來偵測停止登入影像。 您可以在 dotnet/machinelearning-samples GitHub 存放庫中找到本教學課程的原始程式碼。

準備並了解資料

停止符號資料集包含從 Unsplash下載的 50 張影像,每張影像至少包含一個停止符號。

建立新的 VoTT 專案

  1. 下載 50 張停止符號影像的資料集並解壓縮。

  2. 下載 VoTT (視覺物件標記工具)。

  3. 開啟 VoTT,並選取新專案

    VoTT 主畫面

  4. 在 [專案設定] 中,將 [顯示名稱] 變更為「StopSignObjDetection」。

  5. 將 [安全性權杖] 變更為 [產生新安全性權杖]。

  6. 選取在 [來源連線] 旁的 [新增連線]。

  7. 在 [連線設定] 中,將來源連線的 [顯示名稱] 變更為「StopSignImages」,並選取 [本機檔案系統] 作為 [提供者]。 針對 [資料夾路徑],請選取包含 50 張定型影像的 [Stop-Signs] 資料夾,然後選取 [儲存連線]。

    VoTT 新連線對話方塊

  8. 在 [專案設定] 中,將 [來源連線] 變更為「StopSignImages」(即您剛才建立的連線)。

  9. 同時將 [目標連線] 變更為「StopSignImages」。 您的 [專案設定] 現在看起來應該會類似這張螢幕擷取畫面:

    VoTT 專案設定對話方塊

  10. 選取 [儲存專案]。

新增標籤和標記影像

您現在應該會看到一個視窗,視窗左側是所有定型影像的預覽影像,中間是所選取影像的預覽,右側是 [標籤] 資料行。 此畫面是標籤編輯器

  1. 選取 [標籤] 工具列中的第一個 (加號形狀) 圖示,以新增標籤。

    VoTT 新標記圖示

  2. 將標記命名為「Stop-Sign」,並點擊鍵盤上的 Enter 鍵。

    VoTT 新標記

  3. 按一下並拖曳,以在影像中每個停止符號的周圍繪製矩形。 如果您無法使用游標繪製矩形,請嘗試從頂端工具列選取 [繪製矩形] 工具,或使用鍵盤快速鍵 R

  4. 在繪製矩形之後,請選取您在先前步驟中建立的 Stop-Sign 標記,將此標記新增至週框方塊。

  5. 按一下資料集中下一張影像的預覽影像,然後重複此流程。

  6. 繼續針對每張影像中的每一個停止符號進行步驟 3 到 4。

    VoTT 標註影像

匯出 VoTT JSON

標記好所有定型影像之後,您就可以匯出 Model Builder 將使用的檔案,以用於定型。

  1. 選取左側工具列中的第四個圖示 (方塊中具有對角箭號的圖示),移至 [匯出設定]。

  2. 將 [提供者] 保留作為 [VoTT JSON]。

  3. 將 [資產狀態] 變更為 [僅標記的資產]。

  4. 取消核取 [包含影像]。 如果您包含影像,則會將定型影像複製到產生的匯出資料夾,但這是不必要的動作。

  5. 選取 [儲存匯出設定]。

    VoTT 匯出設定

  6. 返回 [標記編輯器] (左側工具列中像是絲帶的第二個圖示)。 在頂端工具列中,選取 [匯出專案] 圖示 (像是方塊中有個箭號的最後一個圖示),或使用鍵盤快速鍵 Ctrl+E

    VoTT 匯出按鈕

此匯出會在 Stop-Sign-Images 資料夾中建立名為 vott-json-export 的新資料夾,並在該新資料夾中產生名為 stopSignObjDetection-export 的 JSON 檔案。 您將在接下來的步驟中使用此 JSON 檔案,以在 Model Builder 中定型一個物件偵測模型。

建立主控台應用程式

在 Visual Studio 中,建立名為StopSignDetectionC# .NET Core 主控台應用程式

建立 mbconfig 檔案

  1. 在 [方案總管] 中,以滑鼠右鍵按一下 StopSignDetection 專案,然後選取 [新增機器學習模型...]> 以開啟 Model Builder 使用者介面。
  2. 在對話方塊中,將 Model Builde 專案命名為 StopSignDetection,然後按一下 [新增]。

選取情節

在此範例中的案例是物件偵測。 在 Model Builder 的案例步驟中,選取 [物件偵測] 案例。

Visual Studio 中的 Model Builder 精靈

若您在案例清單中看不到 [物件偵測],您可能需要更新 Model Builder 的版本

選擇定型環境

Model Builder 目前僅支援使用 Azure Machine Learning 的定型物件偵測模型,因此預設會選取 Azure 定型環境。

選取 Azure 定型環境

若要使用 Azure ML 來定型模型,您必須從 Model Builder 建立 Azure ML 實驗。

Azure ML 實驗是一種資源,封裝了一或多個機器學習執行定型的組態和結果。

您必須先在 Azure 中設定環境才能建立 Azure ML 實驗。 實驗需要下列項目才能執行:

  • Azure 訂用帳戶
  • 工作區:一種 Azure ML 資源,為所有 Azure ML 資源和作為部分定型執行而建立的成品提供一個集中地。
  • 計算:Azure Machine Learning 計算是用於定型的雲端式 Linux VM。 進一步了解 Model Builder 所支援的計算型別

設定 Azure ML 工作區

若要設定您的環境:

  1. 選取 [設定工作區]按鈕。

  2. 在 [建立新實驗] 對話方塊中,選取您的 Azure 訂用帳戶。

  3. 選取現有的工作區或建立新 Azure ML 工作區。

    您在建立新工作區時,會同時佈建下列資源:

    • Azure Machine Learning 工作區
    • Azure 儲存體
    • Azure Application Insights
    • Azure Container Registry
    • Azure 金鑰保存庫

    所以此流程可能需要幾分鐘的時間。

  4. 選取現有的計算或建立新的 Azure ML 計算。 此流程可能需要幾分鐘的時間。

  5. 保留預設的實驗名稱,並選取 [建立]。

    Azure 工作區設定對話方塊

系統會建立第一個實驗,並在工作區中註冊實驗名稱。 若使用相同的實驗名稱,則任何後續的執行都會記錄為相同實驗的一部分。 否則便會建立新的實驗。

若您對設定感到滿意,請選取 Model Builder 中的 [下一步] 按鈕,前往 [資料] 步驟。

載入資料

您將在 Model Builder 的 [資料] 步驟中,選取您的定型資料集。

重要

Model Builder 目前只接受 VoTT 所產生的 JSON 格式。

  1. 選取 [輸入] 區段內的按鈕,並使用 [檔案總管] 尋找應該位於 Stop-Signs/vott-json-export 目錄中的 StopSignObjDetection-export.json

    Model Builder 資料步驟

  2. 若您的資料在 [資料預覽] 中看起來是正確的,請選取 [下一個步驟] 以前往 [定型] 步驟。

將模型定型

下一個步驟是將模型定型。

在 Model Builder 的 [定型] 畫面中選取 [開始定型] 按鈕。

此時您的資料會上傳至 Azure 儲存體,而 Azure ML 中會開始進行定型流程。

定型流程需要一些時間,且所需時間會因選取的計算大小以及資料量而有所不同。 第一次在 Azure 中定型模型時,由於必須佈建資源,因此需要花費較多的定型時間。 針對這 50 張影像範例的定型時間大約需要 16 分鐘。

您可以選取 [監視 Azure 入口網站中目前的執行] 連結,以追蹤您在 Azure Machine Learning 入口網站中的執行進度。

定型完成後,請選取 [下一步] 按鈕,前往 [評估] 步驟。

評估模型

在 [評估] 畫面中,您可以從定型流程取得結果的概觀,包括模型的正確性。

Model Builder 評估步驟

在此情況下正確性會顯示 100%,這表示模型因為資料集中的影像太少而可能導致過度學習。

您可以使用試用您的模型體驗,快速檢查您的模型是否如預期般執行。

選取 [瀏覽影像] 並提供一張測試影像,且最好是模型在定型時沒有使用過的影像。

Model Builder 試用您的模型

在每個偵測到的週框方塊上所顯示的分數表示偵測到的物件信賴度。 例如,在上述螢幕擷取畫面中,停止符號周圍週框方塊上的分數表示模型是 99% 確定偵測到的物件是停止符號。

分數閾值會根據偵測到物件的分數來新增或移除這些物件。此分數閾值會隨著閾值滑杆而提高或降低。 例如,如果閾值為 .51,則模型只會顯示信賴分數為 .51 或以上的物件。 您在提高閾值時會看到偵測到的物件較少,而當您降低閾值時則會看到更多偵測到的物件。

如果您對正確性計量不滿意,請嘗試使用更多資料,這是改善模型正確性的簡單方式。 您也可以選取 [下一步] 連結,前往 Model Builder 中的 [取用] 步驟。

(選擇性) 取用模型

此步驟會有專案範本,可供您用來取用模型。 此步驟是選擇性的,您可以選擇最適合您使用模型需求的方法。

  • 主控台應用程式
  • Web API

主控台應用程式

在將主控台應用程式新增至您的解決方案時,系統會提示您為專案命名。

  1. 將主控台專案命名為 StopSignDetection_Console

  2. 按一下 [新增至解決方案],將專案新增至您目前的解決方案。

  3. 執行應用程式。

    程式所產生的輸出看起來應該會和以下程式碼片段相似:

    Predicted Boxes:
    
    Top: 73.225296, Left: 256.89764, Right: 533.8884, Bottom: 484.24243, Label: stop-sign, Score: 0.9970765
    

Web API

在將 Web API 新增至解決方案時,系統會提示您命名專案。

  1. 將 Web API 專案命名為 StopSignDetection_API

  2. 按一下 [新增至解決方案],將專案新增至您目前的解決方案。

  3. 執行應用程式。

  4. 開啟 Powershell 並輸入下列程式碼,其中 PORT 是應用程式正在接聽的連接埠。

    $body = @{
         ImageSource = <Image location on your local machine>
     }
    
     Invoke-RestMethod "https://localhost:<PORT>/predict" -Method Post -Body ($body | ConvertTo-Json) -ContentType "application/json"
    
  5. 如果成功了,輸出看起來應該會類似下列文字。

    boxes                                      labels scores       boundingBoxes
    -----                                      ------ ------       -------------
    {339.97797, 154.43184, 472.6338, 245.0796} {1}    {0.99273646} {}
    
    • boxes 資料行會提供所偵測物件的週框方塊座標。 此處的值分別屬於左、上、右和下的座標。
    • labels 是預測標籤的索引。 值 1 在此情況下是停止符號。
    • scores 定義了模型對於週框方塊屬於該標籤的信心程度。

    注意

    (選擇性) 週框方塊座標的寬度為 800 像素,高度則為 600 像素。 若要在後續處理中將週框方塊座標縮放到影像上,您需要:

    1. 將頂端和底部座標乘以原始影像高度,並將左右座標乘以原始影像寬度。
    2. 將頂端和底部座標除以 600,並將左右座標除以 800。

    例如,假設原始影像維度是 actualImageHeightactualImageWidth,以及稱為 predictionModelOutput。下列程式碼片段會顯示如何縮放 BoundingBox 座標:

    var top = originalImageHeight * prediction.Top / 600;
    var bottom = originalImageHeight * prediction.Bottom / 600;
    var left = originalImageWidth * prediction.Left / 800;
    var right = originalImageWidth * prediction.Right / 800;
    

    影像可能有多個週框方塊,因此相同的流程必須套用於影像中的所有週框方塊。

恭喜! 您已成功建置機器學習模型,以使用 Model Builder 偵測影像中的停止符號。 您可以在 dotnet/machinelearning-samples GitHub 存放庫中找到本教學課程的原始程式碼。

其他資源

若要深入了解此教學課程中提及的主題,請瀏覽下列資源: