AI時代的網站與手機App建置與開發Part27 - ML.NET與物件偵測

 ·       摘要

在自動駕駛的無人車和無人機風風火火出現在日常生活的應用的現今, 物件偵測技術的應用也日益普及, 例如自駕車必須要能夠偵測並判斷車輛前方的物體, 當然最近眾人關注的人形機器人, 也必須重度依賴物件偵測技術.

: 物件偵測示意圖

在本篇文章中, 我們將使用Visual Studio 2022, 搭配Microsoft ML.NET執行物件偵測.

·       準備訓練資料

首先請參考[使用 VoTT 為物件偵測標記影像]這篇文件的說明, 為欲偵測的圖片內容進行標示的動作. 您可以標示多張內含欲辨識的內容(例如: 汽車, 機車, , , 紅綠燈, 交通號誌等等)的圖片.

例如我們想辨識以下圖片中的停止號誌:

圖: 內含停止號誌的圖片

就可以使用Microsoft Visual Object Tagging Tool標示出圖中Stop號誌的位置, 得到內容位置資訊的JSON文件, 如下所示:

{

    "asset": {

        "format": "jpg",

        "id": "3a74b9294f2f787bf2abe678f6a43231",

        "name": "untitled-photo-3d6zCZ4lpBE-unsplash.jpg",

        "path": "file:E:/temp/Stop-Signs/untitled-photo-3d6zCZ4lpBE-unsplash.jpg",

        "size": {

            "width": 4592,

            "height": 3056

        },

        "state": 2,

        "type": 1

    },

    "regions": [

        {

            "id": "c3zgHARKz",

            "type": "RECTANGLE",

            "tags": [

                "Stop-Sign"

            ],

            "boundingBox": {

                "height": 607.4270453559028,

                "width": 532.2416769420469,

                "left": 1911.9179121551326,

                "top": 1123.539901168258

            },

            "points": [

                {

                    "x": 1911.9179121551326,

                    "y": 1123.539901168258

                },

                {

                    "x": 2444.1595890971794,

                    "y": 1123.539901168258

                },

                {

                    "x": 2444.1595890971794,

                    "y": 1730.966946524161

                },

                {

                    "x": 1911.9179121551326,

                    "y": 1730.966946524161

                }

            ]

        }

    ],

    "version": "2.2.0"

}

完成所有訓練圖片內容的標示之後, 請使用Microsoft Visual Tagging Tool工具的匯出功能匯出所有圖片的標示結果(JSON文件), 做為ML.NET的訓練資料.

·       使用ML.NET實作物件偵測

首先請啟動Visual Studio 2022, 執行[檔案 | 新增 | 專案]功能, 建立[Windows Forms應用程式]型態的專案. 做好之後, 請使用滑鼠右鍵點選[方案總管]視窗中的專案名稱, 執行[加入 | 機器學習模型]功能, 為專案加入ML.NET功能, 螢幕上就會出現如圖1的畫面


1: 為專案加入ML.NET功能

點選[電腦視覺]項目中的[物件偵測], 您就會看到如圖2的畫面:

2:選擇[物件偵測]功能後的畫面

如果電腦未配備Nvidia GPU, 可以選擇圖2畫面中的[本機(CPU)], 如果電腦有配備NVidia GPU, 而且有設定並啟用GPU(詳細做法可以參考: [AI時代的網站與手機App建置與開發Part19 - 啟用電腦配備的GPU, 提升深度學習的效率]的說明), 則可以選擇圖2畫面中的[本機(GPU)]項目, 做好之後請點選[下一步], 螢幕上就會出現輸入訓練資料的畫面, 請點選畫面中的[Vott]選項, 然後選擇前述利用Microsoft Visual Object Tagging Tool工具標示圖片內容後匯出的JSON文件, 輸入妥訓練資料的畫面如圖3所示:

3: 完成輸入訓練資料的畫面:

按下[下一步], 您就會看到執行訓練的畫面, 如圖4所示:

4: 執行訓練的畫面

按下畫面中的[執行訓練]鍵開始訓練物件偵測模型. 訓練完成後您會看到如圖5的畫面:

5: 完成訓練的畫面

按下[下一步], 進入評估機器學習模型的畫面. 請點選畫面中的[瀏覽影像]連結, 瀏覽至當做測試資料的圖片進行測試. 您將會看到類似圖6的測試結果:

6: 使用測試圖片測試物件偵測模型的結果畫面

如果測試結果不滿意, 可以使用Microsoft Visual Object Tagging Tool工具新增更多標示的訓練圖片, 再回到圖3的畫面重新訓練物件偵測模型. 如果測試結果滿意, 可以按下[下一步]鍵進入佈署畫面, 您就會看到如圖7的畫面:

 
7: 取用訓練妥的物件偵測模型的畫面

您可以點選畫面中的[新增主控台應用程式]連結, 將訓練妥的物件偵測模型佈署到新建立的主控台應用程式專案, 或是點選畫面中的[新增Web應用程式]連結, 將訓練妥的物件偵測模型佈署到新建立的Web應用程式專案使用.

·       取用使用ML.NET訓練的物件偵測模型

請點選圖7畫面中的[新增主控台應用程式]連結, 將訓練妥的物件偵測模型佈署到新建立的主控台應用程式專案, 再將新建立的[主控台應用程式]專案設定成啟動專案.

做好之後請修改專案中Program.cs的程式碼, 使用測試圖片測試物件偵測模型, 如下:

using MLModel1_ConsoleApp;

using Microsoft.ML.Data;

// 準備測試圖片

var image = MLImage.CreateFromFile(@"E:\temp\Stop-Signs\joshua-hoehne-WPrTKRw8KRQ-unsplash.jpg");

MLModel1.ModelInput sampleData = new MLModel1.ModelInput()

{

    Image = image,

};

// 餵入測試圖片給訓練妥的機器學習模型進行預測

var predictionResult = MLModel1.Predict(sampleData);

//輸出Stop Sign的座標位置

Console.WriteLine("\n\nPredicted Boxes:\n");

if (predictionResult.PredictedBoundingBoxes == null)        //找不到Stop Sign

{

    Console.WriteLine("No Predicted Bounding Boxes");

    return;

}

//取出Stop Sign的左上角點和右下角點座標

var boxes = predictionResult.PredictedBoundingBoxes.Chunk(4).Select(

    x => new { XTop = x[0], YTop = x[1], XBottom = x[2], YBottom = x[3] })

    .Zip(predictionResult.Score, (a, b) => new { Box = a, Score = b });

//顯示Stop Sign的位置座標和信心指數

foreach (var item in boxes)

{

    Console.WriteLine($"XTop: {item.Box.XTop},YTop: {item.Box.YTop},XBottom: {item.Box.XBottom},YBottom: {item.Box.YBottom}, Score: {item.Score}");

}

做好之後執行上述的程式就可以看到物件偵測的結果, 如圖8所示:

8: 對指定的測試圖片進行物件偵測的結果

範例下載:

https://github.com/CraigIII/ObjectDetection.git

留言

這個網誌中的熱門文章

AI時代的網站與手機App建置與開發Part24 - ML.NET與圖片異常偵測

AI時代的網站與手機App建置與開發Part28 - 使用YOLO模型進行物件偵測