最近一段时间在研究AI技术在.Net平台的使用,目前AI绝大部分是使用Python开发,偶然一次在头条看到一篇ML.NET的介绍,是Net平台下开放源代码的跨平台机器学习框架。ML.NET详细介绍
ML.NET |专为 .NET 设计的机器学习
一开始学习的是图像分类和目标检测,整个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.RTSP或RTMP协议取帧识别
3.Mp4或ts文件取帧识别
IoTBrowser平台开源地址:https://gitee.com/yizhuqing/IoTBrowser/