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

物联网浏览器(IoTBrowser)-整合机器学习yolo框架实现车牌识别的更多相关文章

  1. [原创]mybatis中整合ehcache缓存框架的使用

    mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...

  2. C#开发微信门户及应用(48) - 在微信框架中整合CacheManager 缓存框架

    在我们的很多框架或者项目应用中,缓存在一定程度上可以提高程序的响应速度,以及减轻服务器的承载压力,因此在一些地方我们都考虑引入缓存模块,这篇随笔介绍使用开源缓存框架CacheManager来实现数据的 ...

  3. 整合X-Admin前端框架改造ABP

    “站在巨人的肩膀上”,这样一来,不要万事亲恭,在值得的方向上节约时间,毕竟人生就这么一次.在接触ABP以来,一直想花点时间整合LayUI前端框架到ABP中,进而能够逐渐打磨出一套适合自己的框架,开发习 ...

  4. Java高级特性 第10节 IDEA和Eclipse整合JUnit测试框架

    一.IDEA整合Junit测试框架 1.安装插件 打开File菜单的下拉菜单settings[设置] : 点击左侧Plugins[插件]菜单 在输入框中输入JUnitGenerator 2.0,点击I ...

  5. MyBatis高级篇之整合ehcache缓存框架

    MyBatis高级篇之整合ehcache缓存框架  2017-09-01  0 Comments  1,671 Views  0 Times 一.前言 MyBatis为我们提供了Cache接口,也提供 ...

  6. .NET数据挖掘与机器学习开源框架

    1.    数据挖掘与机器学习开源框架 1.1 框架概述 1.1.1 AForge.NET AForge.NET是一个专门为开发者和研究者基于C#框架设计的,他包括计算机视觉与人工智能,图像处理,神经 ...

  7. mybatis中整合ehcache缓存框架的使用

    mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...

  8. 史上最详细的IDEA优雅整合Maven+SSM框架(详细思路+附带源码)

    目录 前言: 1. 搭建整合环境 2.Spring框架代码的编写 3.SpringMVC框架代码的编写 4. Spring整合SpringMVC的框架 5.MyBatis框架代码的编写 6. Spri ...

  9. 整合ssm三大框架使用注解开发查询用户信息

    整合ssm三大框架使用注解开发查询用户信息 一.基础知识准备之spring mvc工作原理 二.分析 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求Hand ...

  10. SpringBoot 整合Quartz 定时任务框架

    更多内容,前往 IT-BLOG 一.Scheduled 定时任务 [1]添加 Scheduled相关依赖,它是 Spring自带的一个 jar包因此引入 Spring的依赖: 1 <depend ...

随机推荐

  1. Learning by teaching --- 费曼学习法

    世界上存在成千上万种学习法,如果上天只让我掌握一种,那一定就是"费曼学习法". 介绍 费曼学习法是由诺贝尔物理学奖获得者理查德·费曼提出的一种学习方法,其核心思想是将所学内容用自己 ...

  2. axios post xml data方法

    axios#request(config) axios#get(url[,config]) axios#delete(url[,config]) axios#head(url[,config]) ax ...

  3. KeyCastOW win10 屏幕显示按键 - 屏幕录像用

    KeyCastOW win10 屏幕显示按键 - 屏幕录像用 https://gitee.com/itas109/KeyCastOW/releases/v2.0.2.5-cn

  4. aardio 嵌入 其他应用程序

    aardio 嵌入 其他应用程序 需求 这个chrome壳不能进行拖拽和缩放,所以再套一个壳,可以再分屏的时候用 import win.ui; /*DSG{{*/ winform = win.form ...

  5. nrm 安装报错 解决方案

    想用 npm login 发现用的淘宝镜像,一看安装个nrm,结果运行还报错了.你看看. 改下,登录完再改回来. https://blog.csdn.net/mynewdays/article/det ...

  6. C#串口开发之SerialPort类封装

    目录 SerialPort类 参数封装 控件操作封装 SerialPortClient类实现 SerialPortClient类使用 测试Demo 参考文章 SerialPort类 微软在.NET中对 ...

  7. 为aws中国配置docker镜像加速

    在AWS中国,docker镜像基本无法拉取,更换国内镜像是必须的. 修改docker配置文件 sudo vi /etc/sysconfig/docker 找到OPTIONS参数,在后面加上" ...

  8. Windows 环境使用 Xshell 连接 VMware 虚拟机上的 CentOS 系统

    1.VMware 点击虚拟机的设置,打开弹窗,网络使用 NAT 模式 2.VMware 菜单栏:点击 编辑>>>虚拟网络编辑器 (1)选择 VMnet8 (2)选择 NAT 模式 ( ...

  9. 【Leetcode】300. 最长递增子序列

    题目(链接) 给你一个整数数组nums,找到其中最长严格递增子序列的长度. 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序.例如,[3,6,2,7]是数组[0,3,1 ...

  10. 记录--你可能忽略的10种JavaScript快乐写法

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 代码的简洁.美感.可读性等等也许不影响程序的执行,但是却对人(开发者)的影响非常之大,甚至可以说是影响开发者幸福感的重要因素之一: ...