车牌识别作为一种常见的图像识别的应用场景,已经是一个非常成熟的业务了,在传统的车牌识别中,可以使用字符分割+字符识别的方式来进行车牌识别,而深度学习兴起后,出现了很多端到端的车牌识别模型,不用分割字符,直接输入车牌图片即可识别出车牌字符。2019年1月5日百度深度学习线下技术公开课PaddlePaddle TechDay第一期演讲则邀请了百度认证布道师胡晓曼老师分享基于PaddlePaddle最新版本Fluid作用于车牌识别模型训练的实践。
  
  以下为胡晓曼讲师的演讲实录:
  
  PaddlePaddle Fluid和TensorFlow的设计理念有何不同?
  
  执行流程不是“先定义再执行”,而是“先编译再运行”,通过写一个 Transpiler把Protobuf Message翻译成C++程序,然后用NCVV、ICC、GCC编译成二进制代码,可以直接运行在服务器和手机上。
  
  抛弃静态图思想,采用Program设计思想,原始的Program在平台内部转换成ProgramDesc,python的Executor接收ProgramDesc后,传递给Transpiler,输出一段C++可执行的Program。
  
  基于此,Fluid解释器极大的加快了执行Program的速度,PaddlePaddle Fluid运行速度也会更快。
  
  按步骤来,你也能创造自己的车牌识别数据集
  
  1.数据准备
  
  数据准备是做训练的第一步,往往大家第一印象都是去网上下载车牌数据集,但是会有很多问题,如数据集不方便下载,大部分需要花钱等等。但其实除了收集真实场景的车牌数据,我们也可以自己用程序的方式生成车牌数据:
  
  1.1生成车牌数据
  
  1.1.1定义车牌所需字符
  
  1.1.2生成中英文字符
  
  一个车牌第一个字母都是中文,后面是英文和数据集合。
  
  1.1.3数据增强:添加畸变、噪音和模糊处理
  
  字符生成后,需要对车牌数据进行一些数据增强,因为直接生成的数据是非常干净和清晰的车牌数据,跟真实场景的数据有一定差距,直接拿来用的训练结果会非常好,但是自然场景里,噪音、畸变、模糊等问题会影响真实图片的效果,最后实际应用依然达不到预期。因此,我们需要对这些数据进行畸变、噪音、模糊处理,尽量贴近现实场景的图片。
  
  1.1.4生成车牌背景——加入背景图片,生成车牌字符串list和label,并存为图片格式。
  
  车牌目前有蓝牌、绿牌、白牌、黑牌,常见的是蓝牌和绿牌,车牌数字搞定后需要加入背景图片,使其跟真实车牌更相近。
  
  1.1.5批量生成
  
  生成字符后加入背景图片,用函数的使其可以批量生成,做测试最好生成数量越多越好,起码几十万张起。
  
  1.2.6车牌生成效果
  
  2.Fluid数据读取
  
  支持两种传入数据的方式:
  
  以PythonReader同步读取方式为例(注:batch_size:Fluid中Tensor的第0维度固定为batch_size,在上面代码段中,图像输入x的形状为[3,32,32],分别代表:channel数目,图像的高度和宽度。如果不指定batch_size,那么data算子会根据实际数据来推断batch_size的大小,如果需要自定义batch_size,就需要在第0维指定维度即可):
  
  3.Fluid网络模型
  
  采用PaddlePaddle Fluid提供的vgg19模型来进行训练,完整代码请见:
  
  这个模型的好处是把vgg9所有的网络模型都写进去了。
  
  4.启动训练-参数初始化
  
  启动训练的时候如何进行参数初始化,可以选择是否使用GPU。初始化完成后,需要把数据灌进来,启动数据模型并输入数据。
  
  5.模型测试并输出日志
  
  打印日志
  
  打印的日志,pass表示第一次迭代,batch表示第一次batch,Loss是第一次迭代,第一次迭代里面是98,acc是0.08,一直迭代到后面,loss值在不断的下降。Loss值不断下降可以画成一张图,根据它下降的幅度,可以帮助我们侦查这个模型训练是否有问题。
  
  保存模型
  
  创建一个保存模型的路径,通过调用Fluidio这个模块,将这个模型保存下来。
  
  6.预测模型
  
  保存好的模型不一定要在这台机器上使用,在其他机器和容器里面,也是可以进行使用的。提前将这个网络和模型加载进来,放入测试数据,就可以进行测试,预测模型。
  
  预测结果(测试图片)
  
  这张图片是预测的新能源的车牌图片,豫GD17926,预测之后把模型加载进来,测试图片,结果是豫GD17826,9变成8,没有想象中的效果好,原因是只迭代了2000次,没有迭代太多的时间,如果模型并没有完全收敛,大家可以在自主构建过程当中,增加迭代次数,看是否能够达到收敛的状态。当然,实际应用落地中,还是要看具体的业务场景。
  
  最后,晓曼老师也根据自身经验,给初学者提出几点关于深度学习的建议:
  
  1.不要过于追求高大上的模型和数学名词,做工业应用实践,要做好最基本的工作,不要深究理论;
  
  2.不要随便调参,理论有助于我们懂得如何更快速、更高效调参,使其以最快的方式达到最优的状态;
  
  3.不要只依赖机器,机器的资源是有限的,我们更应该考虑如何把模型进行性能优化,这样可以加速模型进行训练;
  
  4.提高工程能力,多看代码,多写代码,论文多复现,以此提高自己的工程能力。
  
  //seekbarLayout 是seekBar对象statusSeekbar的父层布局
  
  seekbarLayout = mStatusViewLayout.findViewById(R.id.id_seekbar_layout);
  
  seekbarLayout.setOnTouchListener(new View.OnTouchListener() {
  
  @Override
  
  public boolean onTouch(View v, MotionEvent event) {
  
  Rect seekRect = new Rect(www.meiwanyule.cn/ );
  
  statusSeekbar.getHitRect(seekRect);
  
  if ((event.getY() >= (seekRect.top - 500)) && (event.getY() <= (seekRect.bottom + 500))) {
  
  float y = seekRect.top + seekRect.height(www.gcyL157.com) / 2;
  
  //seekBar only accept relative x
  
  float x = event.getX(www.mcyllpt.com) - seekRect.left;
  
  if (x < 0) {
  
  x = 0;
  
  } else if (x > seekRect.width(www.michenggw.com)) {
  
  x = seekRect.width();
  
  }
  
  MotionEvent me = MotionEvent.obtain(event.getDownTime(), event.getEventTime(),
  
  event.getAction(www.fengshen157.com/), x, y, event.getMetaState());
  
  return statusSeekbar.onTouchEvent(me);
  
  }
  
  return false;
  
  }
  
  });

TechDay公开课实录:PaddlePaddle车牌识别实战和心得的更多相关文章

  1. 【深度学习系列】用PaddlePaddle进行车牌识别(一)

    小伙伴们,终于到了实战部分了!今天给大家带来的项目是用PaddlePaddle进行车牌识别.车牌识别其实属于比较常见的图像识别的项目了,目前也属于比较成熟的应用,大多数老牌厂家能做到准确率99%+.传 ...

  2. 张小龙在2017微信公开课PRO版讲了什么(附演讲实录和2016微信数据报告)

    今天2017微信公开课PRO版在广州亚运城综合体育馆举行,这次2017微信公开课大会以“下一站”为主题,而此次的微信公开课的看点大家可能就集中在腾讯公司高级副总裁.微信之父——张小龙的演讲上了!今天中 ...

  3. Swift项目开发实战-基于分层架构的多版本iPhone计算器-直播公开课

    Swift项目开发实战-基于分层架构的多版本iPhone计算器-直播公开课 本课程采用Q Q群直播方式进行直播,价值99元视频课程免费直播.完整的基于Swift项目实战,手把手教你做一个Swift版i ...

  4. 【深度学习】用PaddlePaddle进行车牌识别(二)

    上节我们讲了第一部分,如何用生成简易的车牌,这节课中我们会用PaddlePaddle来识别生成的车牌. 数据读取 在上一节生成车牌时,我们可以分别生成训练数据和测试数据,方法如下(完整代码在这里): ...

  5. 【深度学习系列】用PaddlePaddle进行车牌识别(二)

    上节我们讲了第一部分,如何用生成简易的车牌,这节课中我们会用PaddlePaddle来识别生成的车牌. 数据读取 在上一节生成车牌时,我们可以分别生成训练数据和测试数据,方法如下(完整代码在这里): ...

  6. AI研讨会直播:《人工智能开发前沿》实战系列公开课第1期

    报名链接:https://www.slidestalk.com/m/276 活动背景 业务需求.数据.算法.算力等因素,决定人工智能技术走向产业落地面临各种挑战.博客园联合示说网以及产业内人工智能技术 ...

  7. 人工智能头条(公开课笔记)+AI科技大本营——一拨微信公众号文章

    不错的 Tutorial: 从零到一学习计算机视觉:朋友圈爆款背后的计算机视觉技术与应用 | 公开课笔记 分享人 | 叶聪(腾讯云 AI 和大数据中心高级研发工程师) 整    理 | Leo 出   ...

  8. kali 在线教学群 第一次 公开课 小结(1)

    kali 在线教学群 第一次 公开课 小结(1) 文/玄魂 1.1 需要准备的基础环境 vmware 虚拟机,kali 2.0 镜像,科学上网工具包.这三项内容,可以在本人的微信订阅号“xuanhun ...

  9. Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection

    网易公开课,第10,11课 notes,http://cs229.stanford.edu/notes/cs229-notes5.pdf   Model Selection 首先需要解决的问题是,模型 ...

随机推荐

  1. 解决老项目中 Timer运行一段时间后失效的问题

    那是因为Timer中的代码出现了异常未被捕获,所以线程被挂起 只需要加入  try catch即可 推荐使用 Quartz 2018-08-08 03:50:44 [ Timer-1:39366015 ...

  2. Struts 2(二):使用Struts2

    本文简单描述如何在Eclipse中使用使用Struts2,并介绍一下Struts2的配置文件 注:Struts2默认需要Java 5.0及其以上版本的运行环境支持,Web容器需要支持Servlet 2 ...

  3. Pandas v0.23.4手册汉化

    Pandas手册汉化 此页面概述了所有公共pandas对象,函数和方法.pandas.*命名空间中公开的所有类和函数都是公共的. 一些子包是公共的,其中包括pandas.errors, pandas. ...

  4. Phaser3游戏三角学应用--一只跟随屏幕点击位置游动的鱼

    fish fish 资源图: fish-136x80.png undersea-bg.png 代码 var config = { type: Phaser.AUTO, parent: 'iFiero' ...

  5. JY播放器【网易云音乐破解下载】

    今天给大家带来一款神器----JY播放器.可以直接下载网易云音乐的歌曲. 目前已经支持平台(蜻蜓FM.喜马拉雅FM.网易云音乐.QQ音乐) 使用方法: 在电脑打开网易云音乐或者网站找到你要听的歌曲或歌 ...

  6. android点击事件的四种方式

    android点击事件的四种方式 第一种方式:创建内部类实现点击事件 代码如下: package com.example.dail; import android.text.TextUtils; im ...

  7. linux 性能分析命令及其解释

    很多时候,我们需要对linux上运行的环境大体有一个了解,那么久需要大体知道当前系统的相关资源的使用情况,那么可以用一些linux提供的丰富的命令来查看 性能分析 vmstat 虚拟内存统计 用法 U ...

  8. BETA事后总结

    目录 所有成员 项目宣传视频链接 贡献比例 工作流程 组员分工 本组 Beta 冲刺站立会议博客链接汇总 燃尽图 原计划.达成情况及原因分析 组员:胡绪佩 组员:周政演 组员:庄卉 组员:何家伟 组员 ...

  9. 博弈---尼姆博奕(Nimm Game)(重点)

    尼姆博奕(Nimm Game):有三堆各若干个物品,两个人轮流从某一堆取任意多的 物品,规定每次至少取一个,多者不限,最后取光者得胜. 这种情况最有意思,它与二进制有密切关系,我们用(a,b,c)表示 ...

  10. BETA版本前冲刺准备

    [团队概要] 团队项目名:小葵日记 团队名:日不落战队 队员及角色: 队员 角色 备注 安琪 前端工程师 队长 佳莹 前端工程师 智慧 后端工程师 章鹏 后端工程师 语恳 UI设计师 炜坤 前端工程师 ...