观察
在 Fast R-CNN 中,网络最后部分的 cls reg (分类回归,即对框内实例进行标签分类)和 bbox reg (边界框回归,即对边界框进行平移回归)采用的是 双分支 并行 结构:
而且在 Faster R-CNN 中照搬了这一结构。
甚至在 Mask R-CNN 中,更是将 cls reg 、 bbox reg 和 mask 设计成 三分支 并行 :
思考
anchor中,绝大部分是要被打上 bg 标签 (即 分类为 “背景”)的。而 bbox reg 和 mask 又是很花时间的。
这就意味着:绝大部分被送入 bbox reg 分支 和 mask 分支 的 anchor,不仅是 无用的 anchor,更是 浪费GPU劳动力的 anchor 。
那么为何不把 多分支 并行 改成 多分支 串行 呢?
串行顺序: cls reg 分支 (分类任务) ——> bbox reg 分支 (检测任务) ——> seg 分支 (分割任务)
把 RPN(或FPN)生成的 海量 anchor 首先送入 cls reg 分支 (分类任务) 。既完成了分类任务,同时大浪淘沙,筛选后仅剩下少量的 非背景anchor,大大减少了后续的 bbox reg 分支 (检测任务) 乃至 seg 分支 (分割任务) 的工作量。
附加
但是 Kaiming He 和 Ross Girshick 怎么可能犯这么低级的错误?!所以十有八九是我错了。
后面我会仔细捋清楚 Faster R-CNN 和 Mask R-CNN 的源码实现细节,再回过头来补充。
后记
经过和师兄的讨论,发现如果要是设计为串行,那么就无法实现end-to-end训练了。说明我之前想错了。