论文: Cascade R-CNN Delving into High Quality Object Detection (CVPR 2018)
代码:cascade-rcnn_Pytorch
双阶段网络的典型代表就是Faster RCNN了,先通过RPN网络产生Proposals,然后挑选出正负样本,并分配标签进行训练。训练时选择哪些proposals作为正负样本,一般是根据IoU阈值来界定(一般取0.5),和实际目标框高于该阈值就作为正样本。
从上图(a)还有可以看出很重要的一点就是:大部分时候,曲线都在灰色曲线上方,说明输出IoU一般比输入IoU要高,将输出继续作为输入,相当于调高了Proposals的IoU(下一轮的输入IoU更高),同时适当调高IoU阈值,以得到更高IoU的输出,其结构示意图如下图(d)所示,这便是CascadeRCNN的级联结构
从下图可以看出,每一个阶段的输出的IoU分布明显不同,越到后面输出的质量越高,相当于一个进化的过程,越好的Proposals训练效果越好
相比FasterRCNN,其实就是将后面的FastRCNN部分重复
##################stage1##################
self.RCNN_top = nn.Sequential(
nn.Conv2d(256, 1024, kernel_size=cfg.POOLING_SIZE, stride=cfg.POOLING_SIZE, padding=0),
nn.ReLU(True),
nn.Conv2d(1024, 1024, kernel_size=1, stride=1, padding=0),
nn.ReLU(True)
)
self.RCNN_cls_score = nn.Linear(1024, self.n_classes)
self.RCNN_bbox_pred = nn.Linear(1024, 4 * self.n_classes)
##################stage2##################
self.RCNN_top_2nd = nn.Sequential(
nn.Conv2d(256, 1024, kernel_size=cfg.POOLING_SIZE, stride=cfg.POOLING_SIZE, padding=0),
nn.ReLU(True),
nn.Conv2d(1024, 1024, kernel_size=1, stride=1, padding=0),
nn.ReLU(True)
)
self.RCNN_cls_score_2nd = nn.Linear(1024, self.n_classes)
self.RCNN_bbox_pred_2nd = nn.Linear(1024, 4 * self.n_classes)
##################stage3##################
self.RCNN_top_3rd = nn.Sequential(
nn.Conv2d(256, 1024, kernel_size=cfg.POOLING_SIZE, stride=cfg.POOLING_SIZE, padding=0),
nn.ReLU(True),
nn.Conv2d(1024, 1024, kernel_size=1, stride=1, padding=0),
nn.ReLU(True)
)
self.RCNN_cls_score_3rd = nn.Linear(1024, self.n_classes)
self.RCNN_bbox_pred_3rd = nn.Linear(1024, 4 * self.n_classes)
【1】Cascade RCNN算法笔记
【2】Cascade R-CNN 详细解读
【3】cascade-rcnn_Pytorch