首先看代码:

meta_architectures/faster_rcnn_meta_arch.py/

def _predict_second_stage(self, rpn_box_encodings,

rpn_objectness_predictions_with_background,

rpn_features_to_crop,

anchors,

image_shape):

第二阶段的计算流程:

1 输入:region proposal feature maps

2 处理:region proposal 和block4叠加而成

extract_box_classifierfeatures 把resnet中的层(block4)拿出来和ROI的结果做stack,在extract_box_classifier_features函数中,利用如下函数resnet_utils.stack_blocks_dense(proposal_feature_maps, blocks),然后输出box_classifier_features。

3 对boxclassifierfeatures 进行fc 得到 bbox和 class confidence(faster rcnn的做法)

对boxclassifierfeature 进行conv2d 得到一个feature maps,然后在feature maps上,用region 去把bbox和class confidence选择出来(rfcn的做法)

对boxclassifierfeature 进行conv2d 得到bbox和class confidence(ssd的做法)

faster rcnn在第二阶段使用的函数是mask_rcnn_box_predictor.predict,

mask_rcnn_box_predictor的父类是MaskRCNNBoxPredictor,

下面的这个类对调用方法的的跟踪:

box_predictions ->

self.mask_rcnn_box_predictor.predict->

second_stage_box_predictor.predict->

box_predictor_builder.build->

box_predictor.MaskRCNNBoxPredictor.predict->

from object_detection.core import box_predictor->

class MaskRCNNBoxPredictor(BoxPredictor):_predict

对应到rfcn的类是class FRCNBoxPredictor(BoxPredictor):_predict

在这个函数中,在构建rfcn最后阶段的预测时,用了 ops.position_sensitive_crop_regions

box_encodings = ops.position_sensitive_crop_regions(

location_feature_map,

boxes=tf.reshape(proposal_boxes, [-1, self._box_code_size]),

box_ind=get_box_indices(proposal_boxes),

crop_size=self._crop_size,

num_spatial_bins=self._num_spatial_bins,

global_pool=True)

这个函数的作用?这个函数就是rfcn与faster rcnn的区别,faster rcnn最后是:

box_encodings = slim.fully_connected(

flattened_image_features,

self._num_classes * self._box_code_size,

activation_fn=None,

scope='BoxEncodingPredictor')

class_predictions_with_background = slim.fully_connected(

flattened_image_features,

self._num_classes + 1,

activation_fn=None,

scope='ClassPredictor')

全连接预测类别和框的,

所以,ops.position_sensitive_crop_regions是干嘛用的?

When global_pool is True, this function implements a differentiable version

of position-sensitive RoI pooling used in

When global_pool is False, this function implements a differentiable version

of position-sensitive assembling operation used in

所以,这个函数只是进行了输入feature的各种维度变换,最终变换成了bbox的x,y,width,heith的形式,也就是说,输入的location_feature_map中就含有了位置平移和缩放的信息,这个函数只是将这些信息用region剪切出来,然后在矩阵维度上变换一下而已。

详细来说,rfcn的stage2在将feature map作为输入时:

先进行了一次conv2d,1*1,depth自己设定,这里节点存为net,

然后在net基础上进行了 1*1,depth=xbin*ybin*class_num*4的conv2d,得到bbox的回归值,然后在ops.position_sensitive_crop_regions对这些与位置敏感的回归值进行了box_crop和pool,又经过reshape最终得到 [n,1,class_num,4] 的bbox预测结果

同步在net基础上进行了1*1,depth=xbin*ybin*class_num的conv2d,得到class的置信度,然后在ops.position_sensitive_crop_regions函数中对这些置信度进行了box_crop和pool,又经过reshape,最终得到了 [n,1,class_num]的预测结果

所以在第二阶段,rfcn与faster rcnn的区别是:

faster rcnn 拿到 候选区域feature map,经过roi pooling将大小不一的feature map同一大小,然后用一个全连接预测bbox位置,另外一个全连接预测类别。这里不同候选区域的roipooling,全连接计算位置,全连接计算类别是独立计算的,

rfcn 还是用原来的整张图的featuer map做了一次conv2d,1*1,depth的卷积,得到feature_map0,然后在feature_map0的基础上,做了一次xbin*ybin*num_classes*4,1*1的卷积,得到feature_map1,然后将feature_map1和候选区域的坐标,一起输入进了ops.position_sensitive_crop_region,进行了box_crop和pooling,又经过reshape就得到了bbox位置。这里,对所有的候选区域的操作都是一次完成的,没有单独计算。

在feature_map0的基础上,做了一次xbin*ybin*num_classed,1*1的卷积,得到了feature_map2,然后通过候选区域,对feature_map2进行了crop和pool(由函数ops.position_sensitive_crop_region实现),得到每个框的类别置信度。这里所有框的卷积计算也是共享的。

所以,再详细说下就是:

一个用了roipooling和全连接,每个框的位置和类别信息的计算是不能并行的。对每个框预测了一组位置和一个类别置信度

一个用了conv2d,没有用roi pooing和fc,每个框的位置和类别计算是并行进行的。还对每个框进行了密集预测,每个框预测了k*k组位置和k*k个类别。而这里进行这么密集的预测,正是得益于前面的并行计算接省了计算复杂度。

讨论:感觉frcn这个结构,代替了faster rcnn中的 roi pooling和 fc,怎么说呢?roi pooling把feature map分成k*k个区域,然后flatten成等长的vector,进行全连接,预测一个结果。而rfcn就将featuremap通过卷积操作,把k*k个区域的信息映射到depth的维度,然后又crop和pooling得到最终结果。

试想,如果直接将roi pooling用卷积代替了,把卷积的结果作为位置信息和分类信息如何?除了rfcn的方式?难道就没有其他方式了?好像没有了,检测类的全卷积方式,就这样被他们搞定了。

那么stage1呢?stage1的候选区域的求解,还是有全连接的,这部分可以用全卷积的,anchor用来crop最终的的预测值,那么不同尺度的anchor呢?操作办法可以跟stage2一样。这样做是可行的。

这个就有点像ssd了,不过ssd是一步的,

那要是这么看的话,ssd的一步的,rfcn可以看作是两步的(前景,然后各类别),那可以3步么?(前景,大类别,小类别)

faster rcnn和rfcn这种,两步的,感觉有点多任务,多loss的思路,一边训练让网络区分出前景,然后再训练让网络区分出各个类别。那我也可以这样设计网络,第7层用来分类大类别,第8层用来做第8层的子类别,第9层用来分类再子的类别,按照这个目录结构来训练,或许可以更快收敛。如果这种结构去分类imagenet呢?这种结构是不是也相当于包含了逻辑推理?这种树形状的多loss多任务模型,自带了推理功能。其实也不用写那么多loss,就是规定好哪些节点的具体意义,然后在loss与其相关时,对这些节点之前的节点的权重进行更新即可。是否相关这个,可以人工设定,也可以设计另外一个网络,来决定相关节点有哪些。这样的连接方式,又有dense和resnet的影子了。但是还是有区别的,区别就是dense和resnet时以层为单位进行直连的,并且正向有连接。而我的思路时从loss值,直接连到某个层的某个depth的feature map上,而正向时没有连接的。要有反向,是不是必须有正向?也不一定。因为多任务就相当于只有反向,没有正向。按照这个思路,设计网络,应该可以超过目前的网络,并且这个网络更像人脑。(我觉得人脑正向计算(判断时)和反向时(学习时)用的脑回路时不太一样的,所以设计网络应该正向和反向通路有所不同,这句话是瞎吹)

反向传播也要有个权重,这个权重也要学习得到,要学习这个权重,可以种机器学习放方式,概率型的,最小二乘,也可以继续用梯度下降,那么loss函数如何设计?目标函数是什么?目标是希望利用这个反向权重,更新完正向权重后,正向的loss能更快速的减小,所以目标函数可以是向量loss减少的幅度?或者叫正向loss的梯度为负?如果正向loss的下降的越来越快,那么不用调整反向weight,如果正向loss下降变慢了,就需要就需要调整一下了。

其实还有个思路,就是利用反向权重更新完正向权重后,再进行下一次正向计算的loss,倒是可以用来更新反向的权重。就是一批数据,计算两次,一次用来更新正向权重,一次用来计算反向权重。

最后说一句,这样的网络,最终应用时,用正向就可以了,反向的权重最终代表的是每个节点对当前节点的贡献关系

可以做的事情太多了

rfcn 共享_rfcn第二阶段计算解析 含与faster和ssd的对比相关推荐

  1. rfcn 共享_RFCN by hs

    一.简介 1.在Faster rcnn之后比较有代表性的检测网络就是R-FCN了,通过学习之前经典的检测网络来熟悉检测模型的大体发展过程和创新思路,该网络主要的贡献在于提升了检测网络的训练效率. 2. ...

  2. rfcn 共享_RFCN 精简讲解

    一.前言 之前的Faster RCNN对Fast RCNN产生region porposal的问题给出了解决方案,并且在RPN和Fast RCNN网络中实现了卷积层共享. 但是这种共享仅仅停留在第一卷 ...

  3. rfcn 共享_RFCN理解,不完整待补全

    RFCN的核心是通过修改roi pooling的位置,来增加共享参数的层,减少运算时间: roi pooling位置的影响如下: 越靠近 Input - 对应 ROI-Wise 检测子网越深,准确度也 ...

  4. rfcn 共享_rfcn卷积网络

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  5. 崩坏3卡池模拟器及毕业期望概率计算(含保底)

    目录 崩坏3卡池模拟器及毕业期望概率计算(含保底) 简介 程序演示 得出的一些有趣结果 readme code 崩坏3卡池模拟器及毕业期望概率计算(含保底) 简介 最近学概率论要求写论文,没什么好写的 ...

  6. 处理数字_8_计算不含最大/小值的均值

    计算不含最大/小值的均值 需求描述 需求:计算EMP表按照deptno分组,计算每组的SAL均值,这里不包含最大和最小值. 解决方法:通过每组踢除最大/小值再AVG的方式来实现. 注: 数据库数据集S ...

  7. matlab中频域信号IFFT,MATLAB中ifft函数用法、性质、特性-以及与fft的组合应用全面深入解析(含程序)...

    MATLAB中ifft函数用法.性质.特性,以及与fft的组合应用全面深入解析(含程序) 前言 在我之前的<MATLAB中fft函数用法.性质.特性.缺陷全面深入解析(含程序)>中,我已经 ...

  8. apollo7.0------浅谈激光雷达运动补偿(二)--计算解析

    背景介绍 运动补偿相关介绍参考第一篇博客:apollo7.0------浅谈激光雷达运动补偿_龙性的腾飞的博客-CSDN博客_lidar运动补偿 本篇博客主要解释一下上篇博客中运动补偿的计算部分,简单 ...

  9. 小亮在使用计算机计算208,新苏教版数学四年级下册第四单元用计算器计算测试(含答案)...

    苏教版数学四年级下册第四单元用计算器计算测试(含答案) 一.计算. 1.直接写出得数. 352+48= 25×20= 31×40= 0÷29= 46-35= 120×9= 48×25= 24×500= ...

最新文章

  1. java 将整型数组内容写入txt文件_Java自学-I/O 字节流
  2. iOS-响应上下左右滑动手势
  3. 为Liferay Server分配Perm,Heap Size
  4. python爬取百度百科搜索结果_用Python抓取百度搜索结果,python,爬取,的
  5. 敏捷测试与普通测试的区别
  6. php多线程操作同一文件
  7. java小游戏 : 飞翔的小鸟 (完整版)
  8. nodejs下载配置环境下载依赖包
  9. 520表白网页代码html 爱心网页制作
  10. linux安装CacheCloud
  11. 基于verilog的uart协议实现
  12. WebSocket网页聊天室
  13. 我用Python实现自动化办公,美女同事投来羡慕的眼神,而后···
  14. c++实现高速缓存Cache
  15. 使用 commit tran 需注意
  16. 做DSP应该懂的56个问题,反正我已经收藏了!
  17. Java虚拟机--Java虚拟机栈
  18. Qt Creator打造VScode one dark pro主题配色
  19. 初来乍到,zynq的ps端之hello world
  20. 基于差分进化算法(DE)改进的jDE2 处理约束优化问题

热门文章

  1. 别让坏情绪毁掉你的人生
  2. c语言程序设计考试a答案,C语言程序设计考试A答案.doc
  3. mysql 导入导出数据库
  4. 1. Windows 10 - Node与Vue - 安装 Vue 2.x 及 3.x 框架 - 项目创建要点
  5. 植物叶片——抗氧化物酶
  6. 因果推断合集-12(因果推断在哈啰出行的实践探索)
  7. SpringBoot校园二手市场
  8. 从零开始搭建HTTPS服务
  9. 玩守望先锋2老是死机的解决办法
  10. Unity3D游戏开发之换装方法