这么讲吧,two-stage比one-stage真正的损耗在于two-stage必须保证input image的resolution,拿以前的Pascal来说,two-stage的FRCN默认setting最短边缩放到600,最长边不超过1000,COCO的默认setting最短边缩放到800,最长边不超过1333,;而one-stage的SSD包括yolo,512*512甚至416*416就可以达到相近的performance,你们算算这里差多少。用低resolution我也跑过two-stage,直接血崩,但是速度和one-stage差距很小。
很多答案说two-stage有RPN,有ROI Pooling,还有后面region-wise的head计算所以慢,其实在RPN提出之后这些计算损耗相比backbone而言我认为是可以忽略不计的了(以前SS的时候2000个proposal确实是很高的损耗,RPN之后300个proposal计算非常小。还有RFCN的PSROI Pooling并没有比ROI Pooling快到哪里去),关键在于(i) input resolution; (ii)特别设计过的那些轻量但是performance不错的darknet 系列。
我个人认为,two-stage由于需要显式的计算region中的feature,所以对于resolution的要求更高,同样对于不同问题的robust更强;而one-stage是非常隐式的用统一的卷积去学习feature进行预测,所以对于resolution的需求不高,同样的robust相比也弱一些,反正我是很讨厌yolo那套东西,放在不同问题上需要精细调参才可以work。
我记得大概19年除了好多bridging one-stage & two-stage的文章,不知道有没有做过那low resolution input的实验。不过意义也不大了,现在的重点不纠结于这一块。
刚一只脚入门,一点愚见。
Two-stage方法是先生成region proposal再将其喂给detect head。detect head 只是一个将二维图的部分区域对应的region feature通过Fully-connected layers 输出softmax结果(分类)和box regressor结果(位置)。这一部分的速度基本上和图像检测这一细分类别没有直接关系,而是由FC layers 处理feature向量的速度所影响的。
那么主要的问题就出现在生成region proposal的过程中。在R-CNN中使用的是selective search 算法,非常耗时。到了Fast R-CNN中不再直接根据图片选择region,而是先让图片经过CNN得到一个convolutional feature map,再利用RoI pooling对feature map筛选region proposals。这相对于R-CNN已经快很多了,单张图片的检测处理速度达到了2.3s(相比较于R-CNN的49s)。但是,Fast R-CNN花费了大约2s的平均时间在生成region proposals这一步。因此,Faster R-CNN正是为了优化这一部分的时间,也就是生成region proposal的过程。Faster 提出了一个新的网络模型Region Proposal Networks(RPN)来选择regions,再将其投影到原本的feature map上,从而进行feature-related proposal的筛选。至此单张图片的检测时间降至198ms(0.2s)。
不得不提的是,这三篇开山之作都是出自Facebook的FAIR组,Ross Grishick & Kaiming He大佬等人。不知道什么时候才可以望其项背:-I
更/
眼一花才看清问题是进一步问faster rcnn的速度慢在哪,权当我的梳理文吧见笑了。关于原问题的回答以后有余力再补充