当前位置: 首页 > news >正文

深度学习:识别图片中的电话号码(1)

总结下最近做的一个项目,只提供一些技术方案,不涉及具体业务和具体实现。

背景

自动识别图片中电话号码,也可以推广到识别字符串,英文等。

1

---识别--->

“18811610168”

当然,背景会有干扰(自然环境),字体也更多变。

要求:全对识别,人工修正的成本过高,如果有一位识别错误,人工修正还不如重新输入方便(人工输入可以支持语音识别的)。保证85%以上的数据是可以全对识别的,最好返回全对识别的概率。当然对于电话号码业务,根据识别的文本结果再加上电话的一些规则,后判断程序也可以有效地判断哪些是高概率识别错误的。

方案

目标检测、ocr识别已经是被学术界玩透的技术了。神经网路是目前的大热,而且效果极佳。识别方案有以下三种:

方案一:作为传统ocr来解

检测图片中的数字位置,然后对数字region过分类器识别。传统方法:Sliding Windows、Selective Search等寻找候选区域;Boosting分类器、SVM等都可以用于识别。深度学习的方案效果更好,比如:Faster RCNN、YOLO等。

它们的实质都是:检测字符的位置,识别字符的类别(内容)。

检测:2

识别:3 --->数字“1”  4----->数字“8” … …

识别结果主要受检测准确度和识别精度的影响。在检测完全正确的情况下,自左向右识别各个字符,然后串联识别结果。如果检测完全正确,识别分类器的loss=0.01,每个字符的正确识别的概率p=0.99。11位电话全对的概率约为0.895,loss值=-ln(0.895)=0.111。

但是,检测可能出错。另外,图片中的电话可能是倾斜的,后期串联结果也会比较繁琐,比如。

方案二:循环神经网络RNN

方案一没有考虑电话号码的序列特性,如果将图片分割为时序信号,送入RNN/LSTM/BLSTM等网络,识别性能会大幅提升。

5

问题是图片的分割不准确怎么办?其实这里的分割并不是严格的,解决方案是,将图片按行分割成n个,比如电话号码分割成21个小图片,然后20个图片送入RNN网络得到20个序列化的输出。由于一个字符可能在相邻两个小图上出现(各一半),最终的识别结果很可能是“1_88_8_1_1_66_10_16_8”。最后再经过一个CTC网络融合得到“18811610168”。

方案三:循环卷积网路RCN

方案二是把图片原图分割后送入RNN网络,RNN做特征提取和分类识别。级联RNN的训练是不容易收敛的,而且特征的提取工作是CNN的强项。重新设计网络,可以使用cnn提取图片的特征,然后将feature Map分割成n个,送入RNN做识别,最终通过CTC得到识别结果。

6

这样的好处是,输入数据不用做预处理,切割可以通过网络中矩阵的转置实现;网络实现了End-to-End;输出是完整字符串,识别准确率高,loss值约为0.02,全对正确率约为0.98。

参考:

1. Long-term Recurrent Convolutional Networks for Visual Recognition and Description
2.Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks

相关文章:

  • X300等低端ATI显卡在Dapper的Gnome上使用XGL指南
  • 微信小程序正式上线 可置于聊天窗口顶部
  • 【转】iOS-APP如何做才安全
  • DataGrid行颜色随鼠标点击改变
  • Foundations of Python Network Programming - 读书笔记系列(2) - Web Services
  • flume-kafka 实例 详细
  • C#中三种截屏方式总结
  • 猫猫的客户端制作
  • window.atob()与window.btoa()方法实现编码与解码
  • 让我们在户外撒点野 新疆微软.net俱乐部2006年6月户外技术交流活动报道
  • mysql5.6传统复制改为基于GTID多线程复制
  • linux环境内存分配原理 mallocinfo【转】
  • My Frist in this frist!!
  • Linux 添加Nginx 到 service 启动
  • 加点自已内容的新内核下L7-FILTER的应用实例!
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Cookie 在前端中的实践
  • CSS魔法堂:Absolute Positioning就这个样
  • ES2017异步函数现已正式可用
  • Java|序列化异常StreamCorruptedException的解决方法
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • js如何打印object对象
  • leetcode-27. Remove Element
  • MySQL-事务管理(基础)
  • Redis字符串类型内部编码剖析
  • 阿里研究院入选中国企业智库系统影响力榜
  • 程序员最讨厌的9句话,你可有补充?
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 嵌入式文件系统
  • 我看到的前端
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 一份游戏开发学习路线
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 进程与线程(三)——进程/线程间通信
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (42)STM32——LCD显示屏实验笔记
  • (ZT)薛涌:谈贫说富
  • (二)windows配置JDK环境
  • (生成器)yield与(迭代器)generator
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)关于多人操作数据的处理策略
  • (转)母版页和相对路径
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .NET CLR Hosting 简介
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET HttpWebRequest、WebClient、HttpClient
  • .net mvc部分视图
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET 设计模式初探
  • .net经典笔试题
  • @JsonFormat与@DateTimeFormat注解的使用