https://www.cnblogs.com/yizhuqing/p/18140050
最近一段时间在研究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<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端调用更简单
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文件取帧识别
标签:浏览器,IoTBrowser,yolo,System,Drawing,ar,var,path,labelRect From: https://www.cnblogs.com/chinasoft/p/18143257