天天看點

機器學習架構ML.NET學習筆記【8】目标檢測(采用YOLO2模型)

一個通過TinyYolo2模型實作目标檢測的例子。

一、概述

本篇文章介紹通過YOLO模型進行目辨別别的應用,原始代碼來源于:https://github.com/dotnet/machinelearning-samples

實作的功能是輸入一張圖檔,對圖檔中的目标進行識别,輸出結果在圖檔中通過紅色框線标記出來。如下:

機器學習架構ML.NET學習筆記【8】目标檢測(采用YOLO2模型)

 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學習筆記系列文章目錄

簽名區:

如果您覺得這篇部落格對您有幫助或啟發,請點選右側【推薦】支援,謝謝!

繼續閱讀