如何正确的理解RPN网络的train和test[通俗易懂]

如何正确的理解RPN网络的train和test[通俗易懂]刚开始学FasterRCNN时,遇到这么一个困惑不知其他人有没有:RPN网络在程序中的训练是如何进行的?它都训练了网络中的哪些部分?其实这些我们如果不看源码都很难真正理解!我们以Faster-RCNN_TF的源码为例,以下代码取自./lib/networks/VGGnet_train.py#=========RPN============#以下代码的先后顺序我调整了一下,便…

大家好,又见面了,我是你们的朋友全栈君。

刚开始学Faster RCNN时,遇到些困惑不知其他人有没有:

1、RPN网络训练的输出是什么?
2、RPN网络在train中的作用是什么?
3、RPN网络在test中的作用是什么?
其实这些我们如果不看源码都很难真正理解!

以Faster-RCNN_TF的源码为例,以下代码取自./lib/networks/VGGnet_train.py

 #========= RPN ============
 #以下代码的先后顺序我调整了一下,便于理解
 (self.feed('conv5_3')
     .conv(3,3,512,1,1,name='rpn_conv/3x3')
     .conv(1,1,len(anchor_scales)*3*2 ,1 , 1, padding='VALID', relu = False, name='rpn_cls_score'))

 (self.feed('rpn_conv/3x3')
     .conv(1,1,len(anchor_scales)*3*4, 1, 1, padding='VALID', relu = False, name='rpn_bbox_pred'))
     .anchor_target_layer(_feat_stride, anchor_scales, name = 'rpn-data' ))

重点

anchor_target_layer的返回值’rpn-data’,这是一个字典
key分别是:rpn_labels, rpn_bbox_targets, rpn_bbox_inside_weights, rpn_bbox_outside_weights

rpn_labels
是 [1,1,A*height,width],如果把它reshape成[1,A,height,width]会更好理解,即feature map上每一点
都是一个anchor,每个anchor对应A个bbox,如果一个bbox与gt_box的重叠度大于0.7(其实还有一个条件),就认为这个bbox包含一个前景,则
rpn_labels 矩阵中相应位置就设置为1。
gt_box的label不能直接用来做训练的目标(target),在训练中使用rpn_labels作为训练的目标
gt_box的唯一作用就在于判断产生的共A*W*H个bbox哪些属于前景,哪些不属于,将那些属于前景的bbox设置为训练目标去训练rpn_cls_score_reshape。
在test中,正好相反,训练好的网络会产生一个rpn_cls_score_reshape,它可以转化成一个[1,A,height,width]的矩阵
#proposal_layer 产生的[1,A,height,width]个bbox哪些属于前景,哪些属于背景。我们会把属于前景的挑出来,
按照得分排序,取前300个输入后面的fc层,fc层会产生两个输出:
一个是cls_score,用于判断bbox中物体的类型
另一个是bbox_pred,用于微调bbox,使其向gt_box进一步靠近(由于bbox都是从anchor产生的,他们不会和gt_box重合,还需要进一步微调)

rpn_bbox_targets
根据 rpn_labels 我们已经可以挑选出300个bbox,这些bbox都是在[1,W,H,A*4]中根据与gt_box的重合程度挑选出来的,与gt_box并不相同,有一些偏差,这些偏差表示为[dx,dy,dw,dh],这就是rpn_bbox_targets。
因为传进后面全卷积网络的是bbox,与gt_boxes不完全重合,为了使最终的结果更加接近gt_box,还需要进一步微调
而全卷积层的输出bbox_pred就是用于微调的,rpn_bbox_targets就是它训练的目标(target)
损失函数的计算:

# RPN
# classification loss
rpn_cls_score = tf.reshape(self.net.get_output('rpn_cls_score_reshape'),[-1,2])
rpn_label = tf.reshape(self.net.get_output('rpn-data')[0],[-1])
rpn_cls_score = tf.reshape(tf.gather(rpn_cls_score,tf.where(tf.not_equal(rpn_label,-1))),[-1,2])
rpn_label = tf.reshape(tf.gather(rpn_label,tf.where(tf.not_equal(rpn_label,-1))),[-1])
rpn_cross_entropy = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=rpn_cls_score, labels=rpn_label))

# bounding box regression L1 loss
rpn_bbox_pred = self.net.get_output('rpn_bbox_pred')
rpn_bbox_targets = tf.transpose(self.net.get_output('rpn-data')[1],[0,2,3,1])
rpn_bbox_inside_weights = tf.transpose(self.net.get_output('rpn-data')[2],[0,2,3,1])
rpn_bbox_outside_weights = tf.transpose(self.net.get_output('rpn-data')[3],[0,2,3,1])

rpn_smooth_l1 = self._modified_smooth_l1(3.0, rpn_bbox_pred, rpn_bbox_targets, rpn_bbox_inside_weights, rpn_bbox_outside_weights)
rpn_loss_box = tf.reduce_mean(tf.reduce_sum(rpn_smooth_l1, reduction_indices=[1, 2, 3]))

其余代码:

# Loss of rpn_cls & rpn_boxes

(self.feed('rpn_conv/3x3')
     .conv(1,1,len(anchor_scales)*3*4, 1, 1, padding='VALID', relu = False, name='rpn_bbox_pred'))

#========= RoI Proposal ============
(self.feed('rpn_cls_score')
     .reshape_layer(2,name = 'rpn_cls_score_reshape')
     .softmax(name='rpn_cls_prob'))

(self.feed('rpn_cls_prob')
     .reshape_layer(len(anchor_scales)*3*2,name = 'rpn_cls_prob_reshape'))

(self.feed('rpn_cls_prob_reshape','rpn_bbox_pred','im_info')
     .proposal_layer(_feat_stride, anchor_scales, 'TRAIN',name = 'rpn_rois'))

(self.feed('rpn_rois','gt_boxes')
     .proposal_target_layer(n_classes,name = 'roi-data'))


#========= RCNN ============
(self.feed('conv5_3', 'roi-data')
     .roi_pool(7, 7, 1.0/16, name='pool_5')
     .fc(4096, name='fc6')
     .dropout(0.5, name='drop6')
     .fc(4096, name='fc7')
     .dropout(0.5, name='drop7')
     .fc(n_classes, relu=False, name='cls_score')
     .softmax(name='cls_prob'))

(self.feed('drop7')
     .fc(n_classes*4, relu=False, name='bbox_pred'))
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152315.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • RHEL7/Centos7 i686/32bit glibc/stdc++ lib

    RHEL7/Centos7 i686/32bit glibc/stdc++ lib[hushui@HikvisionOSyum.repos.d]$sudoyuminstallglibc.i686Loadedplugins:fastestmirrorDeterminingfastestmirrorslocal|3.6kB00:00(1/2):local/group_gz…

    2022年6月5日
    44
  • android 设置标题栏背景颜色_状态栏菜单栏都在哪

    android 设置标题栏背景颜色_状态栏菜单栏都在哪android中沉浸式状态栏的文章已经满大街了,可是在实现某些效果时,还是得各种搜索,测试一通后,最后还常常满足不了要求,即使好不容易在一部手机上满足了需求,放在另外一手机上,发现效果差强人意。今天把自己这几天学到的关于沉浸式状态栏知识进行总结下。问题比如我想实现以下效果:1.同一个Activity需要动态变换标题栏和状态栏文字字体色值,该如何实现?2.一个Activity包含多个F

    2022年10月20日
    0
  • pycharm中安装第三方库出现错误_pycharm常用第三方库

    pycharm中安装第三方库出现错误_pycharm常用第三方库我在命令行窗口用pipinstall库名的时候,ModuleNotFoundError:Nomodulenamed‘pip._internal.cli.main’这是在pycharm里报的错Traceback(mostrecentcalllast):File“f:\python\lib\runpy.py”,line193,in_run_module_as_main“main”,mod_spec)File“f:\python\lib\ru

    2022年8月26日
    3
  • netty服务端 JVM优化[通俗易懂]

    netty服务端 JVM优化[通俗易懂]java-jar-server-Xms4G-Xmx4G-XX:NewSize=3584m-XX:PermSize=64m-XX:SurvivorRatio=1-XX:+UseParallelGC-XX:-UseAdaptiveSizePolicy这是我的linux服务端,针对netty的配置硬件配置是Intel(R)Core(TM)i3-21203.30G…

    2022年5月24日
    37
  • MS17010原生打法

    MS17010原生打法1、针对入口跳板机已经CS上线但是因为目标所在区域代理出来的流量卡慢、扫描会导致代理隧道崩溃、MSF的17010不成功但是原生利用工具成功的场景。此工具是由最原版调用fb.py那版提取出来的(原生版是最为稳定,并且能利用的版本)。项目地址:https://github.com/TolgaSEZER/EternalPulsemsfvenom-pwindows/x64/meterpreter/reverse_tcpLHOST=192.168.3.128LPORT=4443-fdll>x

    2022年6月14日
    61
  • pycharm最新激活码2021【2021.8最新】

    (pycharm最新激活码2021)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlS32PGH0SQB-eyJsaWNlbnNlSW…

    2022年3月26日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号