一個通過TinyYolo2模型實作目标檢測的例子。
一、概述
本篇文章介紹通過YOLO模型進行目辨別别的應用,原始代碼來源于:https://github.com/dotnet/machinelearning-samples
實作的功能是輸入一張圖檔,對圖檔中的目标進行識别,輸出結果在圖檔中通過紅色框線标記出來。如下:

YOLO簡介
YOLO(You Only Look Once)是一種最先進的實時目标檢測系統。官方網站:https://pjreddie.com/darknet/yolo/
本文采用的是TinyYolo2模型,可以識别的目标類型包括:"aeroplane", "bicycle", "bird", "boat", "bottle","bus", "car", "cat", "chair", "cow","diningtable", "dog", "horse", "motorbike", "person","pottedplant", "sheep", "sofa", "train", "tvmonitor" 。
ONNX簡介
ONNX 即Open Neural Network Exchange(開放神經網絡交換格式),是一個用于表示深度學習模型的通用标準,可使模型在不同架構之間進行互相通路,其規範及代碼主要由微軟,亞馬遜 ,Facebook 和 IBM 等公司共同制定與開發。有了ONNX标準,我們就可以在ML.NET代碼中使用通過其他機器學習架構訓練并儲存的模型。
二、代碼分析
1、Main方法
第一次運作時需要運作TrainAndSave方法,生成本地模型後,可以直接運作生産代碼。
2、訓練并儲存模型
ImageNetData類定義如下:
tags.tsv檔案中僅包含一條樣本資料,因為模型已經訓練好,不存在再次訓練的意義。這裡隻要放一張圖檔樣本即可,通過Fit方法建立資料處理通道模型。
ApplyOnnxModel方法加載第三方ONNX模型,
其中,輸入、輸出的列名稱是指定的。可以通過安裝Netron這樣的工具來查詢ONNX檔案的詳細資訊,可以看到輸入輸出的資料列名稱。
輸出的“grid”列資料是一個float數組,不能直接了解其含義,是以需要通過代碼将其資料轉換為便于了解的格式。
YoloWinMlParser.ParseOutputs方法将float數組轉為YoloBoundingBox對象的清單,第二個參數是可信度阙值,隻輸出大于該可信度的資料。
YoloBoundingBox類定義如下:
其中:Label為目标類型,Confidence為可行程度。
由于YOLO的特點導緻對同一個目标會輸出多個同樣的檢測結果,是以還需要對檢測結果進行過濾,去掉那些高度重合的結果。
YoloWinMlParser.NonMaxSuppress第二個參數表示最多保留多少個結果,第三個參數表示重合率阙值,将去掉重合率大于該值的記錄。
四、資源擷取
源碼下載下傳位址:https://github.com/seabluescn/Study_ML.NET
工程名稱:YOLO_ObjectDetection
資源擷取:https://gitee.com/seabluescn/ML_Assets (ObjectDetection)
點選檢視機器學習架構ML.NET學習筆記系列文章目錄
簽名區:
如果您覺得這篇部落格對您有幫助或啟發,請點選右側【推薦】支援,謝謝!