惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
Recent Announcements
Recent Announcements
GbyAI
GbyAI
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Microsoft Azure Blog
Microsoft Azure Blog
N
Netflix TechBlog - Medium
人人都是产品经理
人人都是产品经理
MongoDB | Blog
MongoDB | Blog
D
DataBreaches.Net
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
U
Unit 42
腾讯CDC
D
Docker
The GitHub Blog
The GitHub Blog
阮一峰的网络日志
阮一峰的网络日志
Vercel News
Vercel News
I
InfoQ
Jina AI
Jina AI
爱范儿
爱范儿
宝玉的分享
宝玉的分享
博客园 - Franky
G
Google Developers Blog
P
Proofpoint News Feed

博客园 - 木子清

物联网浏览器(IoTBrowser)-驿站多系统查询 物联网浏览器(IoTBrowser)-js开发人脸识别 农产品实名收购系统功能说明之电子秤已支持类型和厂家型号 农产品实名收购系统功能说明之供应商RFID卡设计及用途 【农业数字化升级】农产品实名收购系统,让安全与效率同行 经历2年调整,重新出发! 物联网浏览器(IoTBrowser)-人脸快速搜索 探讨使用智能AI在农业养殖中的风险预警与应用 让摄像头带上智慧“智驭视界·AIEye” 物联网浏览器(IoTBrowser)-基于计算机视觉开发的应用“智慧眼AIEye” 码农的转型之路-全力以赴升级物联网浏览器(IoTBrowser) IoTBrowser V2.0:引领物联网时代的全新浏览器 车牌识别控制台 可快速整合二次开发 物联网浏览器(IoTBrowser)-使用深度学习开发防浸水远程报警 物联网浏览器(IoTBrowser)-Java快速对接施耐德网络IO网关 物联网浏览器(IoTBrowser)-MQTT协议集成和测试 物联网浏览器(IoTBrowser)-Modbus协议集成和测试 物联网浏览器(IoTBrowser)-电子秤模块及二次驱动开发 物联网浏览器(IoTBrowser)-顶尖OS2电子秤协议实现 物联网浏览器(IoTBrowser)-Web串口自定义开发
物联网浏览器(IoTBrowser)-整合机器学习yolo框架实现车牌识别
木子清 · 2024-04-18 · via 博客园 - 木子清

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