cascade rcnn原理解析
图像提取出f,经过rpn网络得到固定宽高的bbox的f1(这个f1是f的局部部分);
f1送入head1,得到cls1和bbox1(假设训练时使用到iou>0.5);
根据得到的bbox1,在f上提取局部特征,记为f2;
f2送入head2,得到cls2和bbox2(假设训练时使用到iou>0.6);
根据得到的bbox2,在f上提取局部特征,记为f3,;
f3送入head3,得到cls3和bbox3(假设训练时使用到iou>0.7);
把cls3和bbox3作为最终结果。
Sparse Rcnn
看配置文件中过了backbone和neck之后是几个head,这个地方有点容易混淆。尤其是proposal feature和roi feature,理解了好半天。
-
第一个rpn_head使用的是EmbeddingRPNHead,这里返回的是proposal box和proposal feature,这里的proposal box默认是100个,大小是原图的大小。proposal box和proposal feature都是可学习的。
看代码细节,可知proposal_box是100 * 4的嵌入模型,proposal_feature是100 * 256的嵌入模型tips: torch.nn.Embedding(embedding_num, embedding_dim)的意思是创建一个词嵌入模型,embedding_num代表一共有多少个词, embedding_dim代表你想要为每个词创建一个多少维的向量来表示它;
-
第二个SingleRoIExtractor这个头是用来生成roi feature的,通俗来讲就是:前面网络提取到feature,根据预测出来的bbox框(因为参考了cascade网络结构,所以这个预测出来的bbox框可以参照上面讲的去对应一下),在feature map上选取局部的特征,这个局部特征就是roi feature
-
第三个是DIIHead,这个头的输出是三个:proposal feature,cls,bbox预测框。在这个头里面,roi feature和proposal feature需要做交互处理
-
连续6个SparseRoIHead(bbox_roi_extractor[stage](ROI align) + bbox_head[stage] (DIIHead))
使用cascade rcnn的思想串联这6个head。
不理解的话可以再手动画图看一下,看看源码,个人感觉确实是有点绕。。。
参考: