本文分享自华为云社区《基于ModelArts实现车辆车牌号的目标识别》,作者:屿山岛 。

前言

车辆车牌是车辆的唯一身份标识,能够提供车辆的类型、颜色、归属地等信息,对于交通管理、安全监控、智能出行等领域具有重要的应用价值。随着计算机视觉技术的发展,车辆车牌的自动检测和识别成为了一个热门的研究课题,也有许多成熟的商业产品和开源项目。

我对车辆车牌检测和识别的技术原理和应用场景很感兴趣,想要通过实践来提高自己的图像处理和机器学习的能力,同时也想要探索一些新的方法和思路,解决一些实际问题。因此,我选择了华为云的ModelArts平台,利用其提供的数据处理、模型训练、模型管理和模型部署等全流程的支持,实现了一个对车辆车牌的目标检测模型。

在本博客中,我将详细介绍我使用ModelArts平台的过程和经验,包括数据集的准备、模型的选择和修改、训练的参数和结果、部署的方法和效果等,以及遇到的一些问题和解决方案。我希望能够通过本博客,与有兴趣的读者分享和交流,也欢迎大家提出宝贵的意见和建议。

前置工作

首先确保已经完成了华为云账号的开通与认证,并添加用户的访问密钥,以方便使用ModelArts。

数据集的准备

来自于中科大2018年开源的大型国内停车场车牌数据集CCPD(Chinese City Parking Dataset)弥补了上述车牌数据的缺陷,该车牌数据集图片收集自安徽省合肥市的各种街道路边停车场,每个收集员于各自负责的街道不分天气的从早上07:30一直工作到晚上22:00,每当开停车账单时就需要手持特殊设备根据要求拍摄前后车牌图片并进行车牌信息标注,从而在不可确认的拍摄位置、拍摄角度、拍摄光照、拍摄天气、拍摄背景、拍摄街道等约束条件下保障了所获取车牌数据的多样性

本人从github上获取了该数据的2020新版

OBS桶及对象的创建

OBS是ModelArts提供的使用对象存储服务,目的是为了进行数据存储以及模型的备份和快照。本次实验在创建训练数据集之前,需要创建一个OBS桶,然后在OBS桶中创建文件夹用于存放训练文件。

OBS桶的创建

进入服务列表,找到存储服务项,点击对象存储服务OBS

登录OBS管理控制台,在桶列表页面右上角单击“创建桶”,创建OBS桶

填写参数:

• "区域":华北-北京四,后续区域需要选择和OBS桶一致。

• "桶名称":创建桶名称“carlic-detect”,注意重名时可以添加后缀。

• “数据冗余存储策略”:多AZ存储

• “默认存储类型”:标准存储

其他使用默认值即可,确认无误后单击右下角“立即创建”。

OBS桶中对象的创建

在桶列表页面,单击桶名称,进入该桶的概览页面。单击概览页面的左侧导航的“对象”,在“对象”页面单击新建文件夹,创建OBS文件夹。我们在这里创建两个文件夹,一个用于数据集的输入,一个用于数据集的输出

数据集输入文件夹“carlic-input”

数据集输出文件夹“carlic-output”

ModelArts自动学习项目的创建

进入ModelArts自动学习版跨,创建物体检测的项目

创建物体检测项目的数据集

此时发现我们并没有数据集,所以需要创建数据集。此时点击创建数据集

点击后有如下界面,其中各参数为:

• “数据集名称”:carlicense

• “数据类型”:图片

• “数据来源”:OBS

• “导入路径”:选择之前创建OBS桶时创建的carlic-input文件夹

• “数据标注状态“:未标注

• “数据输出位置”:选择之前创建OBS时创建的carlic-output文件夹

再点击右下角提交,数据集创建成功

此时再填入物体检测项目的各个参数信息

• “名称”:carlicense-detect

• “数据集”:选择刚刚创建好的数据集“carlicense”

• “输出路径”:选择所创建OBS桶中的数据输出文件夹“carlic-output”

• “训练规格”:选择限时免费的规格

然后点击右下角的创建项目

创建项目后得到如下界面:

数据的上传与标注

该界面显示我们需要对实例进行标注,点击进入实例详细

数据上传

由于数据集是空的,所以该页面显示未查询到图片,此时我们点击添加数据

导入数据参数如下:

• “数据来源”:本地上传(因为下载的数据都在本地上,并没有上传至OBS中)

• “上传数据存储路径“:选择之前创建的OBS桶中的数据输入文件夹“carlic-input”

• “数据标注状态“:未标注(数据集的所有数据均为未标注)

然后点击文件上传,将本地文件上传之所创建的OBS桶中的数据输入文件夹中

点击添加文件,上传本地的训练数据文件

上传结束后我们再点开OBS存储,发现此时的输入文件夹已经有了所用的数据

但是此时实力详细中并没有数据信息,此时我们需要点击数据源同步,将已经上传至OBS桶中的数据全部同步至数据集中

结果如下

数据标注

接下来要对该数据集中的数据进行数据标注

先进行手动标注

在进行20多各样例的标注后,我们可以使用ModelArts所提供的工具:智能标注,即通过已标注的样例来自动学习,实现自动化标注

此时我们点击启动智能标注

参数选择如下:

• “智能标注类型”:主动学习(系统自动使用半监督学习,难例筛选等多种手段来进行智能标注,降低人工标注量,帮助用户找到难例)

• “算法类型”:精准型

• “计算结点规格”:任意选择即可

点击提交,得到如下界面

在智能标注完成后,我们需要确认智能标注信息是否正确,以下为智能标注后需要待确认的界面

然后我们点击进入具体确认界面

放大后查看该案例的智能标注情况

此图片中对与车牌的智能标注十分准确,但是这并不代表每一张图片都是十分准确的,在本人确认了多张图片的智能标注情况后发现一些常见的易错误标注的现象,过大的车标,车身与车牌类似的矩形广告贴,地表的一些与车牌十分相似的矩形牌号等。

过大的车标

车身矩形小广告-

地表的矩形牌号与车牌十分相似

在进行人工确认和改正后,得到最终的已标注所有的数据集

然后再进行对标注数据的快速复核,点击快速复核,得到如下界面,我们发现其中有一些明显不是车标的标注信息

点击其中一个得到如下图片标注

说明在确认标注过程中出现了纰漏,然后只需要对这些错误标注进行修改或者删除即可

进入工作流

在成功标注完数据后,我们便可以进入workflow流中开始工作

首先是数据集版本发布

然后是数据校验

同时我们可以查看后台的工作记录,跟进工作流的进度

然后就是模型的训练工作

模型训练

接下来是模型注册工作

模型部署

最后是模型部署工作

模型部署的参数选择如下:

• “AI应用来源”:我的AI应用

• “资源池”:公共资源池

• “是否自动停止”:是,选择在一小时后停止运行

其他参数保持默认即可

在部署过程中我们可以查看一些基本信息,同时跟踪部署情况事件:

在部署成功后,我们可以查看部署成功的AI应用,部署的AI应用信息如下

同时在该AI应用状态改变为运行中后,我们便可以开始进行我们的车辆车牌目标识别的实践了

结果检测

将图片上传至该AI应用进行目标检测,得到结果如下

发现检测的大致位置是正确的,但是精准度不高,于是再上传图片进行几次车牌的检测:

发先该模型的检测结果都是大致位置正确,但是不够精确,这说明该模型的精准度不够搞,还需要进一步改进。

对于出现该问题的原因,我猜测可能有以下几个原因:

1、数据集问题

2、数据处理算法设计和实现问题

3、算法设计和实现问题

4、超参设置问题

5、环境问题

……

在后续的实验中,会对该模型进行进一步优化,推出新的模型版本和应用版本。

资源释放

到此,该实践已完成,接下来我们需要对申请的各种资源进行释放

删除创建的在线服务

删除创建的自动学习项目

删除用于存储服务的OBS桶中的对象

释放资源到此结束,本次实践到此完成。

实践总结

在这篇文章中,我介绍了如何使用华为云技术ModelArts实现车辆车牌的目标识别的实践,并部署上线服务的过程。我首先介绍了车牌目标检测的背景和意义,然后介绍了ModelArts的特点和优势,以及如何使用ModelArts进行数据集的管理、模型的训练、评估和部署。我使用了CCPD数据集,这是一个包含了约30万张中国车牌图片的数据集,它根据图片的复杂度分为了八个类别。我使用了YOLOv5作为目标检测的模型,它是一个基于PyTorch的轻量级、高效的目标检测框架。我在ModelArts上进行了模型的训练和评估,得到了较高的精度和召回率。我还展示了如何使用ModelArts的在线服务功能,将模型部署为一个可调用的API,实现了车牌的实时检测。

通过这次实践,我深刻地体会到了ModelArts的强大和便捷。ModelArts为我提供了一个一站式的端到端的机器学习平台,让我可以在一个统一的界面上完成数据集的管理、模型的训练、评估和部署的全流程。ModelArts还提供了丰富的预置算法和模型,以及高性能的计算资源和存储空间,让我可以快速地搭建和运行我的模型,节省了时间和成本。ModelArts的在线服务功能也让我可以轻松地将我的模型转化为一个可用的服务,实现了车牌目标检测的应用场景。我认为ModelArts是一个非常适合机器学习爱好者和开发者的平台,它可以帮助我们实现更多的机器学习的创新和价值。

点击关注,第一时间了解华为云新鲜技术~

告别繁琐,ModelArts一键解决车牌号识别难题的更多相关文章

  1. 基于TensorFlow的车牌号识别系统

    简介 过去几周我一直在涉足深度学习领域,尤其是卷积神经网络模型.最近,谷歌围绕街景多位数字识别技术发布了一篇不错的paper.该文章描述了一个用于提取街景门牌号的单个端到端神经网络系统.然后,作者阐述 ...

  2. Android OpenCV集成摄像头图片动态识别车牌号

    最近两天开发一个使用OpenCV集成的一个识别车牌号的项目,困难重重,总结一下相关经验,以及开发注意事项: 一.开发环境: Android Studio 个人版本 3.1.4 NDK下载:14b CM ...

  3. python的车牌号的检测

    自己总结一下,从网上找到的关于车牌号的识别的一些博文.https://www.jianshu.com/p/fcfbd3131b84 https://www.cnblogs.com/do-hardwor ...

  4. 【代码笔记】iOS-验证手机号,邮箱,车牌号是否合法

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...

  5. 按要求编写Java应用程序。 (1)创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)、减速(车速自减)、修改车牌号,查询车的载重量。 编写两个构造方法:一个没有形参,在方法中将车牌号设置“XX1234”,速 度设置为100,载重量设置为100;另一个能为对象的所有属性赋值; (2)创建主类: 在主类中创建两个机动车对象。 创建第

    package com.hanqi.test; public class jidongche { private String chepaihao;//车牌号 private int speed;// ...

  6. Android中手机号、车牌号正则表达式

    手机号 手机号的号段说明转载自:国内手机号码的正则表达式|蜗牛的积累 手机名称有GSM:表示只支持中国联通或者中国移动2G号段(130.131.132.134.135.136.137.138.139. ...

  7. 车牌号对应归属地及城市JSON带简码

    车牌号对应归属地及城市JSON带简码 car_city.json [ { "code": "冀A", "city": "石家庄&q ...

  8. (1)创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)、减速(车速自减)、修改车牌号,查询车的载重量。 编写两个构造方法:一个没有形参,在方法中将车牌号设置“XX1234”,速 度设置为100,载重量设置为100;另一个能为对象的所有属性赋值; (2)创建主类: 在主类中创建两个机动车对象。

    package a; public class Jidongche { private String chepaihao; private int chesu; private double zaiz ...

  9. vue实战 - 车牌号校验和银行校验

    在看这篇文章之前,我建议大伙可以去把项目demo拉到本地看看.如果觉得写得不好,可以一起提提issues,一起维护.或者大伙有刚需,可以留言,后期会不断完善. 使用方法: git clone http ...

  10. 最全,可直接用的一些正则校验,判断邮箱,手机号码,车牌号,身份证号,网址,账号,密码,ip,去掉html格式,工商税号等。

    一些正则校验,判断邮箱,手机号码,车牌号,身份证号,网址,账号,密码,ip,去掉html格式,工商税号等. // 判断邮箱 isValid = [text isValidEmail]; // 判断手机 ...

随机推荐

  1. Blazor前后端框架Known-V1.2.8

    V1.2.8 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Gith ...

  2. 【更新】【解决中文文件名乱码】mac一键获取最新datagrid 2017.3注册码到剪贴板

    背景与前版实现请见: 前版原文 需要the unarchiver 解决中文文件名在mac上创建文件异常. 代码调整 IDEA_JIHUOMA_HOME="/tmp/idea-jihuoma& ...

  3. 常用c++ STL 汇总

    常用STL: vector 变长数组,倍增的思想 初始化: //初始化 vector<int> a; vector<int> a(n); vector<int> a ...

  4. 揭秘 .NET 中的 TimerQueue(下)

    前言 上文给大家介绍了 TimerQueue 的任务调度算法. https://www.cnblogs.com/eventhorizon/p/17557821.html 这边做一个简单的复习. Tim ...

  5. [golang]标准库-json

    前言 json数据格式通常包含两个操作:序列化(把对象转换成JSON数据类型)和反序列化(把JSON数据类型转换成对象),二者操作互逆. Go语言中相关标准库为encoding/json. 示例代码 ...

  6. 缓存面试解析:穿透、击穿、雪崩,一致性、分布式锁、Redis过期,海量数据查找

    为什么使用缓存 在程序内部使用缓存,比如使用map等数据结构作为内部缓存,可以快速获取对象.通过将经常使用的数据存储在缓存中,可以减少对数据库的频繁访问,从而提高系统的响应速度和性能.缓存可以将数据保 ...

  7. AVR汇编(七):位操作和MCU控制指令

    AVR汇编(七):位操作和MCU控制指令 位操作指令 SBI / CBI SBI 指令用于设置I/O寄存器中的第 b 位, CBI 指令用于清除I/O寄存器中的第 b 位. 例如: SBI DDRB, ...

  8. 京东工业根据ID取商品详情 API

    item_get-根据ID取商品详情  注册开通 vipmro.item_get 公共参数 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中) secret ...

  9. Poor God Water(ACM-ICPC 2018 焦作赛区网络预赛 矩阵快速幂)

    题目描述 God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells ...

  10. 聊透 GPU 通信技术——GPU Direct、NVLink、RDMA 审核中

    最近人工智能大火,AI 应用所涉及的技术能力包括语音.图像.视频.NLP 等多方面,而这些都需要强大的计算资源支持.AI 技术对算力的需求是非常庞大的,虽然 GPU 的计算能力在持续提升,但是对于 A ...