最近一段时间在研究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#调用代码很简单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | public AjaxResponse CarNo( string inArgs) { var ar = new Infrastructure.Web.AjaxResponse(); var obj = Newtonsoft.Json.JsonConvert.DeserializeObject 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端调用更简单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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文件取帧识别