最近一段时间在研究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文件取帧识别