R-FCN通过减少每一个roi的处理时间提速.下面是伪代码
feature_maps = process(image) ROIs = region_proposal(feature_maps) score_maps = compute_score_map(feature_maps) for ROI in ROIs V = region_roi_pool(score_maps, ROI) class_scores, box = average(V) # Much simpler! class_probabilities = softmax(class_scores)考虑一个5*5的feature map,其中蓝色部分的feature构成了我们想要检测的object.我们将蓝色部分划分为3*3的区域.现在我们可以创建一个新的feature map,仅仅用来检测object的top left corner(TL).如下:
由于我们将object分成了9个部分,我们从整幅图的feature map中得到9个feature map,每一个feature map负责检测object的相应区域.这些feature map我们称之为position-sensitive score maps,因为每个map都只detect(scores)一个object的子区域.
假设下图的红色虚线框是ROI.我们将其划分成3*3的区域,然后考虑每个区域包含目标的对应位置的可能性.例如,top-left ROI区域包含左眼的可能.我们把结果存储在一个3*3的vote array里.比如,vote_array[0][0]存储了一个score,表示我们是否发现了目标的top-left region.
这个依据score map和ROI得到vote array的过程称之为position-sensitive ROI-pool.这个过程和前文提过的ROI pool很类似.
计算出所有的值以后,取平均,就得到了class score.
假设我们有C种目标待检测.我们扩展为C+1种,即包含一种class for the background(non-object).每一种目标都有自己的3*3个score map.所以一共有(C+1)*3*3个score maps.使用这些score maps我们可以为每一个类别都算出一个class score.然后用softmax可以计算出每一个类别的class probability.
整体流程如下,下图中k=3.
R-FCN的一个示例
原文link:https://medium.com/@jonathan_hui/what-do-we-learn-from-region-based-object-detectors-faster-r-cnn-r-fcn-fpn-7e354377a7c9