• 物联网浏览器(IoTBrowser)-整合机器学习yolo框架实现车牌识别


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

     

  • 相关阅读:
    【UML】UML基本概念
    Java毕业设计 基于SpringBoot vue 图片分享平台
    口袋参谋:如何对宝贝关键词进行词根分析?用它就对了!
    【算法】复习搜索与图论
    猫罐头哪个牌子好吃?精选5款好评率高的猫罐头推荐!
    jwt简介
    【Deep Learning 5】卷积神经网络CNN
    ftplib模块--ftp密码爆破
    信管知识梳理(三)软件工程相关知识
    京能查干淖尔电厂电子汽车衡称重系统
  • 原文地址:https://www.cnblogs.com/yizhuqing/p/18140050