[源码分析]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实践项目九:操作文件-修改文件名

      描述:多个文件,文件名名包含美国风格的日期( MM-DD-YYYY),需要将它们改名为欧洲风格的日期( DD-MM-YYYY) 代码1:先创建100个文件名为美国风格日期的文件(文件路径为项目当前路径 ...

    2. [LOJ #2833]「JOISC 2018 Day 1」帐篷

      题目大意:有一个$n\times m$的网格图,若一个人的同一行或同一列有人,他就必须面向那个人,若都无人,就可以任意一个方向.若一个人无法确定方向,则方案不合法,问不同的方案数.$n,m\leqsl ...

    3. HTML5单页框架View.js介绍

      什么是单页应用单页应用,是指将用户视觉上的多个页面在技术上使用一个载体来实现的应用. 换句话来讲,用户视觉效果,与技术实现的载体,并不是一定要一一对应的.采取哪种技术方案,取决于产品设计.技术组成以及 ...

    4. 图解javascript的this指向

      图解javascript的this指向 作者: HerryLo 本文永久有效链接: https://github.com/AttemptWeb...... 以下就只有两张图,请放心食用!! #简版th ...

    5. Java中 单例模式(singleton)

      Java Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收( ...

    6. Java调用WebService方法总结(2)--JAX-WS调用WebService

      用JAX-WS(Java API for XML Web Services)调用WebService不需要引入其他框架,都是JDK自带的:文中所使用到的软件版本:Java 1.8.0_191.Dom4 ...

    7. Linux虚拟机设置静态ip

      二.设置静态ip dhclient 动态分配ip 修改 ifcfg-ens33网卡配置文件  静态分配ip dhclient -r (释放动态分配的ip地址) vi /etc/sysconfig/ne ...

    8. dubbo源码阅读之自适应扩展

      自适应扩展机制 刚开始看代码,其实并不能很好地理解dubbo的自适应扩展机制的作用,我们不妨先把代码的主要逻辑过一遍,梳理一下,在了解了代码细节之后,回过头再来思考自适应扩展的作用,dubbo为什么要 ...

    9. D1-JavaScript

      下面的代码,我想要打印出hey jack,结果却打印出hey rose,为什么? function greet(person) { if (person == {name: 'jack'}) { co ...

    10. HTTP缓存字段总结

      首部 通用首部:有些首部提供了与报文相关的最基本的信息,它们被称为通用首部. 请求首部:请求首部是只在请求报文中有意义的首部. 响应首部 实体首部: 用来描述HTTP报文的负荷,由于请求和响应报文中都 ...