[源码分析]Text-Detection-with-FRCN

原创
2017年11月21日 17:58:39

        <ul class="article_tags clearfix csdn-tracking-statistics tracking-click" data-mod="popu_377" style="display: none;">
<li class="tit">标签:</li>

            <!--          [endarticletags]-->
</ul>
<ul class="right_bar">
<li><button class="btn-noborder"><i class="icon iconfont icon-read"></i><span class="txt">659</span></button></li>
<li class="edit" style="display: none;">
<a class="btn-noborder" href="https://mp.csdn.net/postedit/78580970">
<i class="icon iconfont icon-bianji"></i><span class="txt">编辑</span>
</a>
</li>
<li class="del" style="display: none;">
<a class="btn-noborder" onclick="javascript:deleteArticle(fileName);return false;">
<i class="icon iconfont icon-shanchu"></i><span class="txt">删除</span>
</a>
</li>
</ul>
</div>
<div id="article_content" class="article_content csdn-tracking-statistics tracking-click" data-mod="popu_519" data-dsm="post" style="overflow: hidden;">
<div class="htmledit_views">
<p><span style="white-space:pre;"></span><span style="white-space:pre;"></span><span style="white-space:pre;"></span><span style="white-space:pre;"></span><span style="font-size:12px;"><a href="https://github.com/jugg1024/Text-Detection-with-FRCN" target="_blank">Text-Detection-with-FRCN</a>项目是基于<a href="https://github.com/rbgirshick/py-faster-rcnn" target="_blank">py-faster-rcnn</a>项目在场景文字识别领域的扩展。对Text-Detection-with-FRCN的理解过程,本质上是对py-faster-rcnn的理解过程。我个人认为,初学者,尤其是对caffe还不熟悉的时候,在理解整个项目的过程中,会有以下困惑:</span></p><p><span style="font-size:12px;">1.程序入口</span></p><p><span style="font-size:12px;">2.数据是如何准备的?</span></p><p><span style="font-size:12px;">3.整个网络是如何构建的?</span></p><p><span style="font-size:12px;">4.整个网络是如何训练的?</span></p><p><span style="font-size:12px;"><span style="white-space:pre;"></span>那么,接下来,以我的理解,结合论文和源代码,一步步进行浅析。</span></p><p><br></p><p><span style="font-size:24px;">一.程序入口</span></p><p><span style="font-size:12px;">训练阶段:</span></p><p><span style="font-size:18px;">入口一</span>:<span style="font-size:12px;">/py-faster-rcnn/experiments/scripts/faster_rcnn_end2end.sh</span></p><p><span style="font-size:12px;">-- &gt;</span></p><p><br></p><p><span style="font-size:18px;">入口二</span>: <span style="font-size:12px;">/py-faster-rcnn/tools/train_net.py</span></p><p><span style="font-size:12px;">在train_net中:</span></p><p><span style="font-size:12px;">1.定义数据格式,获得imdb,roidb;</span></p><p><span style="font-size:12px;">2.开始训练网络。</span></p><p></p><div class="dp-highlighter bg_python"><div class="bar"><div class="tools"><b>[python]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_self">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_self">copy</a><div style="position: absolute; left: 245px; top: 923px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&amp;width=16&amp;height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_self">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_self">?</a></div></div><ol start="1" class="dp-py"><li class="alt"><span><span>train_net(args.solver,&nbsp;roidb,&nbsp;output_dir,&nbsp;pretrained_model,&nbsp;max_iters)&nbsp;&nbsp;</span></span></li></ol></div><pre class="python" name="code" style="display: none;">train_net(args.solver, roidb, output_dir, pretrained_model, max_iters)</pre><p></p><p><span style="font-size:12px;">train_net定义在/py-faster-rcnn/lib/fast_rcnn/train.py中</span></p><p><span style="font-size:12px;">--&gt;</span></p><p><br></p><p><span style="font-size:18px;">入口三</span>:<span style="font-size:12px;">/py-faster-rcnn/lib/fast_rcnn/train.py</span></p><p><span style="font-size:12px;">在train_net函数中:</span></p><p></p><div class="dp-highlighter bg_python"><div class="bar"><div class="tools"><b>[python]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_self">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_self">copy</a><div style="position: absolute; left: 245px; top: 1207px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&amp;width=16&amp;height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_self">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_self">?</a></div></div><ol start="1" class="dp-py"><li class="alt"><span><span>roidb&nbsp;=&nbsp;filter_roidb(roidb)&nbsp;&nbsp;</span></span></li><li class=""><span>sw&nbsp;=&nbsp;SolverWrapper(solver_prototxt,&nbsp;roidb,&nbsp;output_dir,&nbsp;pretrained_model=pretrained_model)&nbsp;&nbsp;</span></li><li class="alt"><span>model_paths&nbsp;=&nbsp;sw.train_model(max_iters)&nbsp;&nbsp;</span></li><li class=""><span><span class="keyword">return</span><span>&nbsp;model_paths&nbsp;&nbsp;</span></span></li></ol></div><pre class="python" name="code" style="display: none;">roidb = filter_roidb(roidb)

sw = SolverWrapper(solver_prototxt, roidb, output_dir, pretrained_model=pretrained_model)

model_paths = sw.train_model(max_iters)

return model_paths

这样,就开始对整个网络进行训练了。

在solver_prototxt中,定义了train_prototxt。在train_prototxt中,定义了各种层,这些层组合起来,形成了训练网络的结构。

-->

入口四:/py-faster-rcnn/models/coco_text/VGG16/faster_rcnn_end2end/train.prototxt

先举例说明形式:

1.自定义Caffe Python layer

  1. layer {  
  2.   name: 'input-data'  
  3.   type: 'Python'  
  4.   top: 'data'  
  5.   top: 'im_info'  
  6.   top: 'gt_boxes'  
  7.   python_param {  
  8.     module: 'roi_data_layer.layer'  
  9.     layer: 'RoIDataLayer'  
  10.     param_str: "'num_classes': 2"  
  11.   }  
  12. }  
layer {

name: 'input-data'

type: 'Python'

top: 'data'

top: 'im_info'

top: 'gt_boxes'

python_param {

module: 'roi_data_layer.layer'

layer: 'RoIDataLayer'

param_str: "'num_classes': 2"

}

}

在自定义的caffe python layer中:

type为’python';

python_param中:

module为模块名,通常也是文件名。module: 'roi_data_layer.layer':说明这一层定义在roi_data文件夹下面的layer中

layer为模块里的类名。layer:'RoIDataLayer':说明该类的名字为'RoIDataLayer'

param_str为传入该层的参数。

2.caffe中原有的定义好的层,一般用c++定义。

  1. layer {  
  2.   name: "conv1_1"  
  3.   type: "Convolution"  
  4.   bottom: "data"  
  5.   top: "conv1_1"  
  6.   param {  
  7.     lr_mult: 0  
  8.     decay_mult: 0  
  9.   }  
  10.   param {  
  11.     lr_mult: 0  
  12.     decay_mult: 0  
  13.   }  
  14.   convolution_param {  
  15.     num_output: 64  
  16.     pad: 1  
  17.     kernel_size: 3  
  18.   }  
  19. }  
layer {

name: "conv1_1"

type: "Convolution"

bottom: "data"

top: "conv1_1"

param {

lr_mult: 0

decay_mult: 0

}

param {

lr_mult: 0

decay_mult: 0

}

convolution_param {

num_output: 64

pad: 1

kernel_size: 3

}

}
在目录:/py-faster-rcnn/caffe-fast-rcnn/include/caffe/layers文件夹下面,可以看到conv_layer.hpp的头文件定义。

了解了layer的表示方法,接下来,看一下,整个网络是如何构建的。
整个网络可以分为四个部分:
1.Conv layers。首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
2.Region Propoasl Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于foreground或者background,再利用bounding box regression修正anchors来获得精确的proposals。
3.RoI Pooling。该层收集输入的feature maps和proposals,送入后续全连接层判定目标类别。
4.Classification。利用proposal feature maps计算proposal的类别,同时再次利用bounding box regression获得检测框最终的精确位置。

介绍到这里,相信大家对于整个程序的运行流程有了初步的了解。接下来,来看看具体的实现细节。首先,从数据的准备入手。

二.数据是如何准备的?

入口一: /py-faster-rcnn/tools/train_net.py

在train_net中:

获得imdb,roidb:imdb, roidb = combined_roidb(args.imdb_name)

进入位于 /py-faster-rcnn/tools/train_net.py,combined_roidb中:

  1. def combined_roidb(imdb_names):  
  2.     def get_roidb(imdb_name):  
  3.         imdb = get_imdb(imdb_name)  
  4.         print 'Loaded dataset {:s} for training'.format(imdb.name)  
  5.         imdb.set_proposal_method(cfg.TRAIN.PROPOSAL_METHOD)  
  6.         print 'Set proposal method: {

    FRCN文本检测(转)的更多相关文章

    1. 【OCR技术系列之六】文本检测CTPN的代码实现

      这几天一直在用Pytorch来复现文本检测领域的CTPN论文,本文章将从数据处理.训练标签生成.神经网络搭建.损失函数设计.训练主过程编写等这几个方面来一步一步复现CTPN.CTPN算法理论可以参考这 ...

    2. 【OCR技术系列之五】自然场景文本检测技术综述(CTPN, SegLink, EAST)

      文字识别分为两个具体步骤:文字的检测和文字的识别,两者缺一不可,尤其是文字检测,是识别的前提条件,若文字都找不到,那何谈文字识别.今天我们首先来谈一下当今流行的文字检测技术有哪些. 文本检测不是一件简 ...

    3. EAST 自然场景文本检测

             自然场景文本检测是图像处理的核心模块,也是一直想要接触的一个方面. 刚好看到国内的旷视今年在CVPR2017的一篇文章:EAST: An Efficient and Accurate S ...

    4. 文本检测: CTPN

      参考: https://zhuanlan.zhihu.com/p/37363942 https://zhuanlan.zhihu.com/p/34757009 https://zhuanlan.zhi ...

    5. 对博弈活动中蕴含的信息论原理的讨论,以及从熵角度看不同词素抽象方式在WEBSHELL文本检测中的效果区别

      1. 从赛马说起 0x1:赛马问题场景介绍 假设在一场赛马中有m匹马参赛,令第i匹参赛马获胜的概率为pi,如果第i匹马获胜,那么机会收益为oi比1,即在第i匹马上每投资一美元,如果赢了,会得到oi美元 ...

    6. Efficient and Accurate Arbitrary-Shaped Text Detection with Pixel Aggregation Network(利用像素聚合网络进行高效准确的任意形状文本检测)

      PSENet V2昨日刚出,今天翻译学习一下. 场景文本检测是场景文本阅读系统的重要一步,随着卷积神经网络的快速发展,场景文字检测也取得了巨大的进步.尽管如此,仍存在两个主要挑战,它们阻碍文字检测部署 ...

    7. OpenCV_contrib里的Text(自然场景图像中的文本检测与识别)

      平台:win10 x64 +VS 2015专业版 +opencv-3.x.+CMake 待解决!!!Issue说明:最近做一些字符识别的事情,想试一下opencv_contrib里的Text(自然场景 ...

    8. 使用Keras基于AdvancedEAST的场景图像文本检测

      Blog:https://blog.csdn.net/linchuhai/article/details/84677249 GitHub:https://github.com/huoyijie/Adv ...

    9. Scene Text Detection(场景文本检测)论文思路总结

      任意角度的场景文本检测论文思路总结共同点:重新添加分支的创新更突出场景文本检测基于分割的检测方法 spcnet(mask_rcnn+tcm+rescore) psenet(渐进扩展) mask tex ...

    随机推荐

    1. python类型检测最终指南--Typing模块的使用

      正文共:30429 字 预计阅读时间:76分钟 原文链接:https://realpython.com/python-type-checking/ 作者:Geir Arne Hjelle 译者:陈祥安 ...

    2. c# 用XmlWriter写xml序列化

      using System.Text; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; using ...

    3. tensorflow-简单的神经网络

      本次笔记是关于tensorflow1的代码,由于接触不久没有跟上2.0版本,这个代码是通过简单的神经网络做一个非线性回归任务,(如果用GPU版本的话第一次出错就重启) import tensorflo ...

    4. SQL 向表中添加字段

      如果要在数据表中添加一个字段,应该如何表示呢?下面就为您介绍表添加字段的SQL语句的写法,希望可以让您对SQL语句有更深的认识. 通用式: alter table [表名] add [字段名] 字段属 ...

    5. jstack的使用:死锁问题实战

    6. [SOJ #537]不包含 [CF102129I]Incomparable Pairs(2019-8-6考试)

      题目大意:给定一个长度为$n$的字符串$s$,求有多少个无序字符串二元组$(x,y)$满足:$x,y$是$s$的字串,且$x$不是$y$的字串,$y$不是$x$的字串 题解:发现满足$x,y$是$s$ ...

    7. 记录:拷贝gitblit里的项目使用git命令clone、pull、push等,出现一直在加载,卡住没反应的问题

      俺想克隆别人gitblit里的其中一个版本库(俺在别人gitblit有权限) 懂得git的道友们,都应该知道克隆一个公共项目,随便找到,打开git终端,输入git clone 项目地址就行了 到了俺这 ...

    8. 解决COM组件在WPF设计器中命名空间不存在XXX的问题(附带如何在WPF中使用APlayer引擎)

      总结起来就是:设计器的版本要跟外部引用的库版本一致,否则XAML设计器就会显示不出来. 例如你的程序是X64的,但是引用的COM组件是32位的,就会显示不出来.这里的建议是:编译一个32位的COM中间 ...

    9. Web应用和Web框架

      一.Web应用 二.Web框架 三.wsgiref模块 一.Web应用 1.什么是Web应用? Web应用程序是一种可以通过Web访问的应用程序,特点是用户很容易访问,只需要有浏览器即可,不需要安装其 ...

    10. Sqlite in flutter, how database assets work

      First off, you will need to construct a sqlite database from your csv. This can be done in the follo ...