Convolutional Character Networks-论文链接-代码链接

目录

  • 1、需求解读
  • 2、CharNet算法简介
  • 3、CharNet网络架构详解
    • 3.1 字符检测分支详解
    • 3.2 文本检测分支详解
    • 3.3 迭代字符检测
  • 4、CharNet算法实现步骤
  • 5、CharNet算法效果展示
    • 5.1 主观效果展示
    • 5.2 客观效果展示
  • 6、个人总结
  • 参考资料
  • 注意事项

1、需求解读

  Charnet,即字符检测与识别算法,其主要被用来识别图片或者视频中的字符,包括商场中门店名称的识别和菜单等其它物体上面的字符识别等。它在我们的现实生活中得到了广泛的应用,比较成功的案例包括文档中的OCR识别、车牌识别等。由于该问题并不是一个新的研究问题,当前已经了存在了很多性能鲁棒的算法,但是这些算法都存在着几个严重的问题,问题1-学者们将文本检测和文本识别划分为两个不同的研究课题,而在现实场景中这两个问题通常都是结合在一起的;问题2-以前的那些文本检测与识别算法仅仅能够处理一些简单的场景,并不能很好的处理一些复杂的场景,而现实中的多个场景恰恰都是复杂场景。本文介绍的CharNet是一个将文本检测和文本识别两个任务结合在一起的一个端到端的文本检测与识别网络;该算法可以很好的处理一些复杂场景下的文本检测与识别问题,并在多个文本检测与识别数据集上面获得多项state-of-art。比如我需要检测并识别这个纽扣上面的文字。

2、CharNet算法简介

  CharNet文本检测与识别算法是一个基于单阶段检测算法、融合文本检测和文本识别任务的端到端的文本处理算法。该算法可以直接输出图片中文本和字符所在的位置和相应的字符标签;该算法的初衷是为了解决双阶段文本检测与识别算法中ROI Pooling层对识别精度的影响。除此之外,本文提出了一个迭代字符检测算法用来更好的将在合成数据中训练好的模型应用到真实场景中的数据中,这些方法使得CharNet可以很好的处理多方向和曲线文本,并在3个标准的文本检测和识别数据集上面获得较大的性能提升。

3、CharNet网络架构详解


  上图展示了CharNet算法的网络框架。整个网络分为两个大的分支,上面的分支用来进行字符检测和识别(整体);下面的分支用来检测字符中的每一个文本(单个文字或字符)。

3.1 字符检测分支详解

  该分支的主要作用是对图片中的文字进行检测和识别。该分支首先使用ResNet50作用backbone;然后使用两个Hourglass模块来获取特征表示,期间经过了4个池化层,即最终的输入特征的大小是输入图片的1/4;接着将这个特征映射分别输入到3个不同的子分支中,包括文本实例分割子分支、字符检测分支和字符识别分支,前两个分支中包含3个卷积层,其对应的滤波器的大小为3x3,3x3和1x1,字符识别分支包含4个卷积核为3x3的卷积层。
  文本实例分割子分支的作用是输出一个2通道的特征映射来表示每一个像素中是否包含文本;字符检测分支输出一个5通道的特征映射,分别表示当前位置到上下左右4条边的距离和BB的方向;字符识别分支输出一个68通道的特征映射,每一个通道分别表示不同字符所对应的特征映射,具体包括26个英语字符、10个数字和32个特定的符号;这3个分支最终输出同等大小的一个特征映射;最后过滤掉概率值低于0.95的矩形框

3.2 文本检测分支详解

  该分支的主要作用是获取图片中字符所在的大致位置,并用一个不规则的形状来将不同的字符所在的位置标记出来。文本检测分支可以根据文本实例的类型定义不同的形式,并且可以通过最小的修改来适应现有的动态文本检测器。
  对于多方向的文本而言,使用改变的EAST算法作为文本检测器分支,它包含两个子分支,即文本实例检测分支和使用IoU_loss作为实例级的BB回归。预测的边界框由五个参数组成,包含x,y,w,h,d(方向),我们在每个空间位置计算密集预测,这个特征映射由两个3×3卷积层和一个1×1卷积层构成。最后,文本检测分支输出指示文本或非文本概率的2通道特征映射,以及5通道检测(带方向的BB)。我们仅仅保持置信值大于0.95的边界框。
  对于曲线文本检测而言,本文使用添加了方向场的Textfield算法,它对远离文本边界的方向进行编码,方向场分支用于分隔相邻的文本实例,并且由一个新的分支与文本检测分支和字符分支并行预测。这个分支是由两个3×3卷积层,和一个1x1卷积层构成。

3.3 迭代字符检测

  对于CharNet而言,该算法在训练过程中需要使用字符级和单次级别的标签,而标注这些标签需要昂贵的代码;除此之外,常见的文本检测benchmark中一般都没有这些标签,因而本文最终使用像Synth800k的合成数据集来进行网络的训练。
  一个比较简单的思路是直接在合成网络上训练模型;然后使用训练好的模型在真实场景中的图片上面执行推理,但是由于合成的图片和真实场景中的图片之间具有较大的分布差异,因而直接将在合成数据上面训练好的模型应用到真实场景中的数据上面并不能取得好的结果,为了很好的解决这个问题,本文提出了迭代字符检测方法,该方法的实现细节如下所示:

  • 首先使用包含实例和字符标签的合成数据上面训练一个初始模型,然后将训练好的模型应用到真实场景中的图片中,并做一个简单的预测。
  • 然后在真实场景上的图片上面根据相应的规则收集一些正确的字符BB,(如果文本中字符边界框的数量与字符标签的数目完全相等,则认为这个预测是正确的)将使用它们来对模型执行进一步的训练,需要注意的是这里并没有去使用预测的BB标签。
  • 重复执行上面的两个步骤来逐步提升模型的泛化能力,随着预测的正确BB数目的增加,模型的识别能力得到了加强。具体的效果如下图所示,通过观察我们可以发现随着迭代次数的增加,正确预测的BB(蓝色)的数据逐渐增加。

4、CharNet算法实现步骤

步骤1-读取输入图片,并对图片执行预处理操作;
步骤2-搭建CharNet网络,并将预处理之后的图片分别送入两个不同的分支中执行处理,首先将其送入Backbone网络ResNet50中获取特征映射;然后将处理后的特征映射输入到Hourglass网络中进一步提取高级的语义特征(主要用来做实例分割);接着分别将这个特征映射送入字符分支和检测分支获得预测的结果;最后将检测阈值低于0.95的边界框过滤掉。
步骤3-接着在Synth800k合成数据上面执行5个epochs的训练,batch=32,每个GPU装载4张图片,lr=0.0002,power=0.9, 具体的计算公式如下所示。
lrbase×(1−itermax-iter)powerl r_{\text {base}} \times\left(1-\frac{\text {iter}}{\text {max}_{\text {-iter}}}\right)^{\text {power}} lrbase​×(1−max-iter​iter​)power
步骤4-然后使用上面提到的迭代训练方法来在真实场景中的数据(ICDAR 2015和Total-Text)上面执行训练,lr=0.002,并使用数据增强和OHEM方法。
步骤5-将训练好的模型应用到测试图片中做预测。

5、CharNet算法效果展示

5.1 主观效果展示



  上图展示了CharNet算法的检测和识别结果。通过观察我们可以发现该算法可以在多种复杂的场景中获得较好的检测和识别结果,包括扭曲的文字、密集的文字、弯曲的文字等,基本上可以满足我们在现实场景中的需求。

5.2 客观效果展示


  上图展示了CharNet和其它文本检测和识别算法在ICDAR 2015数据集上面的效果。通过观察我们可以发现,与性能优异的EAST、Mask TextSpotter和FOTS算法相比,CharNet算法均获得了较大的性能提升,基本上在检测和识别任务中都获得了最好的结果。

  上图展示了CharNet和其它的文本检测算法在Total-Text数据集上面的效果。通过观察我们可以发现,与性能优异的TextNet和TextFied算法相比,CharNet在回调率R、准确率P和F1上面都获得了较大的性能提升。

  上图展示了CharNet和其它的文本检测算法在ICDAR 2017 MLT数据集上面的效果。通过观察我们可以发现,与性能优异的FOTS和FOTS MS算法相比,CharNet在回调率R、准确率P和F1上面都获得了较大的性能提升。

6、个人总结

  总而言之,CharNet是一个端到端的、性能优异的单阶段文本检测和识别算法,该算法将文本检测、文本识别、字符实例分割等多个算法结合起来,在多个文本检测和识别数据中取得了较大的性能提升;除此之外,本文的一个亮点在于如何很好的将在合成数据集上训练的模型成功的应用在真实场景中的数据中,这个问题在很多子研究课题中都会有所涉及。

参考资料

[1] 原始论文

注意事项

[1] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:1575262785@qq.com),我会在第一时间回复大家,谢谢大家的关注.
[2] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。
[3] 如果您在阅读本博客时遇到不理解的地方,希望您可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。
[4] 本人业余时间承接各种本科毕设设计和各种小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加QQ:1575262785详聊,备注“项目”!!!

CharNet算法详解相关推荐

  1. Matlab人脸检测算法详解

    这是一个Matlab人脸检测算法详解 前言 人脸检测结果 算法详解 源代码解析 所调用函数解析 bwlabel(BW,n) regionprops rectangle 总结 前言 目前主流的人脸检测与 ...

  2. 图论-最短路Dijkstra算法详解超详 有图解

    整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...

  3. C++中的STL算法详解

    1.STL算法详解 STL提供能在各种容器中通用的算法(大约有70种),如插入.删除.查找.排序等.算法就是函数模板,算法通过迭代器来操纵容器中的元素.许多算法操作的是容器上的一个区间(也可以是整个容 ...

  4. 粒子群(pso)算法详解matlab代码,粒子群(pso)算法详解matlab代码

    粒子群(pso)算法详解matlab代码 (1)---- 一.粒子群算法的历史 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,C ...

  5. 基础排序算法详解与优化

    文章图片存储在GitHub,网速不佳的朋友,请看<基础排序算法详解与优化> 或者 来我的技术小站 godbmw.com 1. 谈谈基础排序 常见的基础排序有选择排序.冒泡排序和插入排序.众 ...

  6. 目标检测 RCNN算法详解

    原文:http://blog.csdn.net/shenxiaolu1984/article/details/51066975 [目标检测]RCNN算法详解 Girshick, Ross, et al ...

  7. Twitter-Snowflake,64位自增ID算法详解

    Twitter-Snowflake,64位自增ID算法详解 from: http://www.lanindex.com/twitter-snowflake%EF%BC%8C64%E4%BD%8D%E8 ...

  8. 数据结构与算法详解目录

    数据结构与算法详解是一本以实例和实践为主的图书,主要是经典的数据结构与常见算法案例,来自历年考研.软考等考题,有算法思路和完整的代码,最后提供了C语言调试技术的方法. 后续配套微课视频. 第0章  基 ...

  9. [搜索]波特词干(Porter Streamming)提取算法详解(2)

     接[搜索]波特词干(Porter Streamming)提取算法详解(1), http://blog.csdn.net/zhanghaiyang9999/article/details/4162 ...

最新文章

  1. linux cat 查看文件内容 不带#号的,Linux下如何不用cat命令读取文件内容
  2. 解决maven找不到jdk的问题
  3. 使用CAShapeLayer实现一个音量大小动态改变的控件
  4. linux下svn重新定位的方法
  5. 2021天翼杯 密码官方wp
  6. Active Record 数据库迁移总结
  7. Camshift算法原理及其Opencv实现
  8. 记录QT在实时显示摄像头数据时候切换TAB页出现异常
  9. apache 添加虚拟机
  10. Silverlight/WPF/WP7一周学习导读(12月6-12月12)
  11. JSP项目引入Vue.js进行项目开发(工程搭建)
  12. php家乡介绍网页,家乡网站设计与实现.doc
  13. HDU 2036 (平面几何 多边形面积)
  14. Python数据分析-北京房价分析
  15. java clh_Java多线程编程CLH锁详解
  16. 深度学习学习率对模型训练的影响
  17. h5根据手机尺寸调整字体大小
  18. php实现狼和兔子,兔子和狼作文4篇
  19. 一个青蛙过河程序及其解析
  20. php firebase/php-jwt token验证

热门文章

  1. Galaxy+note3+android+5.0,5.9寸+Android 5.0 Galaxy Note 4参数曝光
  2. 烂泥:【解决】-bash: ftp: command not found
  3. ffplay的快捷键以及选项
  4. mongodb及其索引的使用例子
  5. 1、取得/etiantian文件的权限对应的数字(考试题答案系列)
  6. 如何在ESX下抓取数据包
  7. Ubuntu16.04 php7.0+mysql5.7+apache2环境搭配
  8. java seconds_Java LocalTime minusSeconds()用法及代码示例
  9. stm32怎么调用for循环内部的变量_循环中的异步amp;amp;循环中的闭包
  10. 教育教学知识与能力小学计算机,浅谈小学计算机教学论文