最近一段時間在研究AI技術在.Net平臺的使用,目前AI絕大部分是使用Python開發,偶然一次在頭條看到一篇ML.NET的介紹,是Net平臺下開放源代碼的跨平臺機器學習框架。ML.NET詳細介紹
https://dotnet.microsoft.com/zh-cn/apps/machinelearning-ai/ml-dotnet
一開始學習的是圖像分類和目標檢測,整個ML.NET學習過程中走了不少彎路;目標檢測最開始使用VS插件ML.NET Model Builder進行數據訓練,發現執行效率低下。使用Vott進行圖片標註發現也有不少bug,視頻文件標註導出後文件路徑識別不了。最後,找到了一個效率很高的方式,使用yolo導出onnx模型,yolo數據集使用Python訓練和導出onnx,最後在.Net下進行調用即可。
一、車牌識別實現基本步驟
1. 數據標註,可以使用LabImg或其他標註工具
2.訓練數據,訓練車牌樣式,訓練文字和顏色ORC識別
3.導出onnx格式模型
4.使用ML.NET調用模型
二、整合到IoTBrowser
IoTBrowser增加Dynamic Api插件框架,另外找了一個Yolov5Net包,默認支持Net6,後面移植到.Net Framework下。
C#調用代碼很簡單
public AjaxResponse CarNo(string inArgs) {
var ar = new Infrastructure.Web.AjaxResponse();
var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(inArgs);
var path = string.Empty;
var beginTime = DateTime.Now;
if (obj.path != null)
{
path = obj.path;
}
var image = System.Drawing.Image.FromFile(path);
var predictions = yolo.Predict(image);
if (predictions.Count < 1) {
ar.Error("沒有檢測到車牌");
return ar;
}
foreach (var prediction in predictions) // iterate predictions to draw results
{
double score = Math.Round(prediction.Score, 2);
var labelRect = prediction.Rectangle;
var twoLayers = (labelRect.Height / labelRect.Width) > 0.5;
//定義截取矩形
System.Drawing.Rectangle cropArea = new System.Drawing.Rectangle((int)labelRect.X < 0 ? 0 : (int)labelRect.X, (int)labelRect.Y < 0 ? 0 : (int)labelRect.Y, (int)labelRect.Width, (int)labelRect.Height);
//定義Bitmap對象
System.Drawing.Bitmap bmpImage = new System.Drawing.Bitmap(image);
//進行裁剪
System.Drawing.Bitmap bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);
//保存成新文件
//bmpCrop.Save(Path.Combine(path, (fileName + "_" + dtNow + num + "_clone.png")), ImageFormat.Png);
var yoloOcrpredictions = yoloOcr.Predict(bmpCrop);
if (yoloOcrpredictions.Length > 0)
{
ar.Data = (new {carNo = yoloOcrpredictions[0] ,color = yoloOcrpredictions[1] });
}
}
return ar;
}
js端調用更簡單
var filePath ="";
var ar = await dds.dynamic.api.exectuce({
pluginName: "CarDetectApi",
actionName: "CarNo",
actionData: JSON.stringify({
path: filePath
})
})
if (ar.Success && ar.Data) {
var data = ar.Data;
self.resultInfo = data.carNo + "--" + data.color
} else {
self.resultInfo = ar.Message;
}
三、實現效果
支持的格式:
1.圖片絕對文件路徑
2.RTMP協議取幀識別
3.Mp4或ts文件取幀識別