1 概览
来源:https://www.bilibili.com/video/BV1qA411w7Zg?p=2&share_source=copy_web
参考:一文读懂Faster RCNN - 知乎 (zhihu.com)
参考:令人拍案称奇的Mask RCNN - 知乎 (zhihu.com)
2 CNN BackBone
· 作用:对输入的图像进行初步的特征提取,最终将输出5个不同尺度的特征图
· 采用架构:ResNet + FPN
· Why:
① ResNet的残差结构使得训练大参数深层次的Mask R-CNN成为可能
② FPN利用了卷积的固有特征金字塔,融合了低层和高层的特征(因为特征图大小高层 > 低层,则高层检测小物体,低层检测大物体),构件在不同尺度上都有强语义的模型
3 RPN
· 作用:为已经经过卷积层的特征图像生成大小不同的多个锚框。此处是在特征图生成锚框,生成之后再映射回原图进行采样。这种方式相比于直接从原图像生成锚框的方法,减少了锚框数量,加快了推理速度。
· 采用架构:沿用了Fast R-CNN采用了RPN结构进行锚框生成
· What:
阶段一:利用3*3的卷积核遍历5个不同尺度的特征图,为特征图上每一个像素点生成3种大小不同的以该像素点为中心的锚框(1:1,1:2,2:1)作为图像初始的检测框。锚框的长宽通常按照一定的规则进行生成:
举个例子,原图像800×600,进行16倍下采样得到58×30特征图,假设特征图以每个像素为中心生成9个锚框,则:
阶段二:对于候选的锚框进行前景背景二分类与候选框回归。在分类分支中,对每个特征图进行1*1卷积(生成特征大小为W×H×k×2,k为每个像素点生成的锚框数量),再经过softmax对每个锚框进行前景背景二分类(2k);在回归分支中,对于每个锚框一般采用四维向量[x,y,w,h]表示(中心坐标为(x,y),宽为w,高为h),每个锚框将向真实的目标框进行靠拢(经过平移与缩放),从而生成真实的边框(4k)。
阶段三:经过非极大抑制筛选出合适的锚框得到proposal,作为下一阶段的输入
4 通过proposal切割出RoI
5 Fast R-CNN中的RoI Pooling
· Why:通常网络训练好后的输入值为固定值,如果输入的图像大小不固定,则会遇到麻烦。在RPN中,由于生成的锚框大小也是不固定的,则也会遇到同样的问题。RoI Pooling的诞生则为了解决该问题。
· How:
6 Mask R-CNN中的RoI Align
· RoI Pooling存在的问题:特征图与原始图像是不对准的,所以会影响检测精度。这种情况出现在:当一个RoI的四个顶点是小数时,通常需要舍弃掉小数点,带来了第一处精度损失;resize的时候,如果希望缩小一倍,假设W=3,3/2=1.5,无法整除。通常做法是分为一部分2以及一部分1(如下图),带来第二处精度损失。
· RoI Align的做法:双向线性插值,解决了精度丢失的问题
① 将锚框分割为四块
② 每一块中取四个点(权衡精度与效率)
③ 对四个点进行双向线性插值,如下:
④ 经过上一个步骤后,每个块中的四个点都有对应的数值,此时再继续在四个点中取max,作为最终的结果