作者:石文华

编辑:祝鑫泉

前  言

文章来源:https://hackernoon.com/latest-deep-learning-ocr-with-keras-and-supervisely-in-15-minutes-34aecd630ed8

 
大家好,本教程在15分钟之内为大家介绍如果使用深度学习来构建现代文本识别系统,你将学会如何使用keras和监督学习解决这个问题,本指南适合对深度学习进行图像文本识别技术感兴趣的人们。 
思考现实世界中一个简单的例子:车牌识别,这是一个很好的起点,你可以轻松的使用它来定制你的任务,关于车牌识别简单的教程,你可以在这里找到它:https://towardsdatascience.com/number-plate-detection-with-supervisely-and-tensorflow-part-1-e84c74d4382c 
 
当我们进入这个领域时,面临着网上资源缺乏的问题,通过长期的研究和阅读很多论文,对构建有效的识别系统的原理我们有了自己的理解,我们在社区中用了2个小时的视频讲座分享了我们的想法,并用简单的语言解释了它是如何工作的,我们觉得这个内容是非常有价值的,因为你很难找到关于如何构建现代识别系统方面好的资源和浅析,我们强烈建议你在开始这篇文章之前观看它,因为它会给你很多直观的认识。 
要顺利完成本教程,你需要Ubuntu, GPU 和 Docker. 
所有的资源都可以在github(https://github.com/DeepSystems/supervisely-tutorials)上找到。源代码位于一个单独的jupyther笔记本上(https://github.com/DeepSystems/supervisely-tutorials/blob/master/anpr_ocr/src/image_ocr.ipynb),并带有解释和必要的可视化。 

1

在哪里获得训练数据

对于本教程,我们人工生成了超过10k的图像数据集,它们跟真实的车牌非常相似,这些图片如下: 
 
你可以很容易的从Supervisely(https://supervise.ly/)获取数据集,我们也在DeepSyetems(https://deepsystems.ai/)上做了很多像自动驾驶汽车,收据识别系统,道路缺陷检测等计算机视觉开发的案例。作为数据科学家,我们花费了很多时间处理训练数据集:创建自定义图像注释,将数据与公共数据集合并在一起,进行数据增强等,Supervisely这个网站简化了你使用训练数据,并自动执行许多日常任务。我们相信你会发现它真的很有用。 
第一步是在Supervisely中注册。下一步是进入“导入” - >“数据集库”选项卡并单击“anpr_ocr”项目。 

接着键入名称“anpr_ocr”并单击“下一步”按钮。 

然后点击“上传”按钮,项目“anpr_ocr”就被添加到您的帐户。 

它由两个数据集组成:“训练集”和“测试集”。 

如果你想预览图像,只需点击数据集,你会立即进入注释工具。对每张图片,我们都会有一段文字说明,将用作地面实况来训练我们的系统。要查看它,只需点击所选图像对应的小图标(红色框所示)。 

现在我们必须以特定格式下载它。要做到这一点,只需点击“导出”页面,并将此配置插入文本区域。如下图所示: 

在上面的截图中,你可以看到说明导出步骤的方案,我们不会深入研究技术细节(如果需要,你可以阅读官方文档https://docs.supervise.ly/)但是你要认真理解下面的过程:在“anpr_ocr”项目中,有两个数据集,“测试”数据集按照原样导出,“Train”数据集被分为两组,“训练集”和“验证集”,“Train”中95%的作为训练集,5%作为验证集。 
现在你可以点击“开始导出”按钮,等待两分钟,系统准备存档下载。点击下图红色框的按钮获取训练数据(以红色标记)。 

2

开始我们的实验

我们在git仓库中准备了所有需要用到的东西。用下面的命令克隆它。 
git clone https://github.com/DeepSystems/supervisely-tutorials.git  
cd supervisely-tutorials/anpr_ocr 
目录结构如下: 

├── data 
├── docker 
│ ├── build.sh 
│ ├── Dockerfile 
│ └── run.sh 
└── src 
├── architecture.png 
├── export_config.json 
└── image_ocr.ipynb 
将下载的压缩文件放入“data”这个目录并运行下面的命令。 
unzip .zip -d . 
我的例子中使用: 
unzip test1–1703.zip -d . 
现在让我们构建并运行准备好的工作环境(tensorflow和keras)。只需转到“docker”目录并运行以下命令: 
./build.sh 
./run.sh 
之后,你将在容器内。运行下一个命令启动Jupyther笔记本 
jupyter notebook 
在终端,你将看到: 

你必须复制选定的链接并将其粘贴到Web浏览器中。请注意,你的链接与我的略有不同。

最后一步是运行整个“image_ocr.ipynb”笔记本。点击“单元格” - >“全部运行”。

image_ocr.ipyn笔记本由几个主要部分组成:数据加载和可视化,模型训练,模型评估以及测试。此数据集训练过程大约需要30分钟。

如果运行正常,你会看到下面的输出: 

正如你所看到的,预测的字符串将与地面实况相同。因此,我们在一个非常清晰的jupyther笔记本(https://github.com/DeepSystems/supervisely-tutorials/blob/master/anpr_ocr/src/image_ocr.ipynb)中构建了现代OCR系统。接下来,我们将介绍并解释它的工作原理。

3

它是怎样工作的

对我们来说,理解神经网络架构是关键。 

首先,将图像输入到CNN以提取图像特征。 接着将这些特征输入到循环神经网络中,然后经过特殊的解码算法。 这种解码算法从每个时间步获得lstm输出并产生最终标签。 
详细的架构如下。 FC - 完全连接层,SM - softmax层。 

图片的维度是高度为64,长度为128,通道数为3 
上图可以看出我们的原始图片经过CNN特征提取之后,维度变成了4*8*4,在实际应用中,我们的输出特征图可能有很多,也就是图片长宽在缩小,但是我们的特征图的深度在增加。 
接着进行维度转换操作。得到16*8的向量序列,上图所示,有8个列向量,每个列有16个元素。 我们将这8个列向量输入LSTM网络并获得输出。 然后,我们使用全连接层+softmax层,并获得6个元素的向量。 该向量里面元素的含义是每个LSTM步骤预测的字母符号的概率。 
在实际问题中,CNN输出向量的数量可以达到32,64甚至更多。所以最好使用多层双向LSTM。 
如何解析得到的预测结果呢?如下图所示,我们输出了8个概率值,我们将连续的重复字符去掉,以及删除空格等特殊的字符,最后合并成一个字符串输出,也就是我们的预测结果。 

我们在训练网络的时候,使用了CTC损失层代替了解码算法,我们在第二个幻灯片上提到过,虽然现在只有俄语版本,但是我们有英文幻灯片,并且很快发布英文版。 
在实际中我们使用了更加复杂的NN价架构,如下图所示,但是原理的基本思想是相同的。 

训练好模型之后,模型在测试集上也得到了很高的准确率, 我们将每个RNN步骤的概率分布可视化为一个矩阵。如下图所示: 
 
上图的纵坐标是预测的符号和空白,横坐标表示时序。也就是输出结果的顺序。

总结

我们很高兴在社区分享我们的经验。我们希望视频讲座和本教程,以及我们的数据和源代码将带你入门图像文字识别,并且希望每个人都可以从头开始构建现代OCR系统。

end

(Keras/监督学习)15分钟搞定最新深度学习车牌OCR相关推荐

  1. 文科生也能搞定的深度学习漫画(下)

    文科生也能搞定的深度学习入门漫画!(上) 你知道机器怎么判断小黄图吗?请看文科生也能搞定的深度学习漫画(下)就明白了! 本文转载自云栖社区 https://yq.aliyun.com/articles ...

  2. 15分钟搞定Linux三剑客 grep sed awk

    剑客grep 来者何人 grep是linux上的字符串搜索匹配命令.这个名字来自于linux编辑器vim的一个命令g/re/p,表示全局匹配某个正则表达式并打印出来,这也体现了grep自身的功能. 基 ...

  3. AI模型落地难?试试这个15分钟搞定的开源工具

    自古兵家作战就讲究一个「度」. 公元 200年,官渡之战后.死敌袁绍的残兵败卒远逃塞北,劳师远征还是穷寇莫追,曹操陷入纠结.鬼才谋士郭嘉建言道:"用兵贵在神速!远征千里之外,辎重多.行军慢, ...

  4. 验证码 html 自动验证码,15分钟搞定自动识别网站验证码

    概述 很多开发者都讨厌网站的验证码,特别是写网络爬虫的程序员,而网站之所以设置验证码,是为了防止机器人访问网站,造成不必要的损失.现在好了,随着机器学习技术的发展,机器识别验证码的问题比较好解决了. ...

  5. 《看聊天记录都学不会C语言?太菜了吧》(15)你学了一节课的函数我5分钟搞定了,还很熟

    好消息2020年4月13日晚7.30我在CSDN开播,等你来聊天 预约连接:https://live.csdn.net/room/A757291228/MJWK0Gem 本系列文章将会以通俗易懂的对话 ...

  6. python使用教程pandas-十分钟搞定pandas(入门教程)

    本文是对pandas官方网站上<10Minutes to pandas>的一个简单的翻译,原文在这里.这篇文章是对pandas的一个简单的介绍,详细的介绍请参考:Cookbook .习惯上 ...

  7. 服务器添加管理员隐藏账号,绝招:隐藏管理员账号 三分钟搞定

    绝招:隐藏管理员账号 三分钟搞定 更新时间:2007年07月30日 11:30:59   作者: 对regedit.exe大家都很熟悉,但却不能对注册表的项键设置权限,而regedt32.exe最大的 ...

  8. JS组件系列——又一款MVVM组件:Vue(一:30分钟搞定前端增删改查)

    前言:关于Vue框架,好几个月之前就听说过,了解一项新技术之后,总是处于观望状态,一直在犹豫要不要系统学习下.正好最近有点空,就去官网了解了下,看上去还不错的一个组件,就抽空研究了下.最近园子里vue ...

  9. EasyExcel 三分钟搞定导入导出

    前言:本文章教你从零开始,三分钟搞定excel单sheet导出.导入.多sheet导出.导入.excel模板导入单个sheet.多个sheet,废话不多说,直接上代码 1.引入依赖 <!--ex ...

  10. java粒子特效_程序员20分钟搞定粒子效果, 仅仅200行代码

    原标题:程序员20分钟搞定粒子效果, 仅仅200行代码 这粒子的打造,确实没有布局代码,稍后大家在源码上可以看到,css代码都只有几行,绝大部分代码都是java代码,而且是原生java书写的,现在很多 ...

最新文章

  1. 【数字智能三篇】之二: 一页纸说清楚“什么是推荐系统?”
  2. 14个实用的数据库设计技巧!
  3. flask-session 在redis中存储session
  4. 微型计算机的主要硬件以及技术指标,微型计算机主要技术指标
  5. extjs 基础部分
  6. 教你轻松搞定javascript中的正则
  7. NumPy学习笔记之argsort()函数
  8. JBoss下载与安装
  9. NameNode故障处理之数据恢复
  10. 如何制作一个读取U盘文件系统的工程
  11. 上传叶绿体基因组序列至NCBI
  12. TCP端口作用,漏洞,操作详析--杨义贤
  13. JS:关系运算符(>大于、>=大于等于、<小于、<=小于等于)
  14. R语言 图片识别文字 PNG JPG图片转文字 OCR tesseract包
  15. 股票基本知识入门提纲
  16. 从零开始编写minecraft光影包(8)中级水面绘制 水下阴影与焦散
  17. Visual Studio 2017, 2019 官网下载地址
  18. WebRTC Trickle ICE 策略
  19. 恋空 By whaosoft
  20. 在刀尖舞蹈的今日头条,为什么要冒险“催熟”抖音?

热门文章

  1. 如何删除gmail快捷链接?
  2. XML文件处理总结 - 1
  3. tomcat中开启SSL
  4. Android - 找到当前类的Context
  5. 《Linux/UNIX OpenLDAP实战指南》——1.4 OpenLDAP目录条目概述
  6. 如何面对不讲信用的人
  7. 人和人之间不要靠的太近
  8. 正则表达式修正符的学习
  9. 自己动手修改VB.NET支付宝接口
  10. 这一刻只想好好做个平凡的人