首页 > 编程知识 正文

maskrcnn环境搭建,fasterrcnn代码详解

时间:2023-05-04 12:31:48 阅读:26714 作者:3111

如上图所示,Mask R-CNN是在Faster R-CNN中添加了预测分割mask的分支。 其中黑色部分为原Faster-RCNN,红色部分为Faster-RCNN网络中的修改。 用ROI对齐层替换了ROI轮询层; 添加了并行的FCN层(mask层)。

http://www.Sina.com/http://www.Sina.com /

首先,我将介绍投资回报轮询。 其目的是从RPN网络确定的ROI中导出小特征图(a small feature map,eg 7x7 )。 ROI的大小各不相同,但RoIPool后均为7x7的大小。 RPN网络将若干RoI的坐标表示为[x,y,w,h],输入RoI轮询,输出7x7大小的特征图用于分类和定位。 问题是ROI轮询的输出大小为7x7。 当ROI网络输出的ROI大小为8*8时,不能保证输入像素和输出像素一一对应。 首先,他们包含的信息量不同(可能是一对一的,也可能是一对一的),然后他们的坐标无法与输入对应(请参见。 这对分类影响不大,但对分割有很大的影响。 RoIAlign的输出坐标采用插值算法获得,不再量化; 每个grid的值也不再使用max,而是使用差分算法。

如上图所示,为了获得固定大小(7X7 )的特征映射,需要进行两次量化操作:1)图像坐标)特征映射坐标,2 )特征映射坐标)— ROI feature坐标。 让我说明一下具体的细节。 如图所示,输入了800x800的图像。 图像有两个目标(猫和狗),狗的BB大小为665x665,通过VGG16网络可以获得相应的功能图。 当对卷积层执行填充操作时,图像将通过卷积层保持其原始大小,但由于池,因此VGG16使用五个池化操作,每个池化操作为2轮询,因此最终获得的特征贴图的大小为8000 32=25x25 )是整数,但是将狗的BB对应在feature map之上,我们得到的结果是665/32 x 665/32=20.78 x 20.78,结果是浮点数,包括小数,但是我们的像素值也可以没有小数,所以作者也就是说,结果变为20 x 20,这里引入了第一个量化误差; 虽然我们的功能图有不同大小的投资回报,但是我们后面的网络需要固定的输入。 因此,需要将不同大小的ROI转换为固定的ROI feature。 这里使用7x7的ROI feature。 必须将20 x 20 ROI映射到7x7 ROI feature。 结果是20 /7 x 20/7=2.86 x 2.86,同样是浮点数,包含小数点,所以用同样的操作进行整数化吧。 这里引入了第二次量化误差。 实际上,这里导入的误差会造成图像中的像素和特征中的像素的偏差,也就是说,如果使feature空间的ROI与原图像上对应,就会出现大的偏差。 理由是,例如,用我们第二次引入的误差分析,本来是2,86,我们把它量化为2。 在此期间引入了0.86的误差。 看起来像是小误差啊。 但这是feature空间,我们的feature空间和图像空间是成比例关系的。 这里是1:32。 那样的话,与原图上对应的差这个差就不小了吧。 这还是只考虑了第二次量化误差。 这是一个严重的问题,因为它严重影响了整个检测算法的性能。

如上图所示,为了获得固定大小(7X7 )的性能图,ROIAlign技术不使用量化操作。 也就是说,如果不想引入量化误差,如665/32=20.78,则不需要使用20.78,也不需要用20替换,如20.78/7=2.97,这是ROIAlign的初衷。 那么,如何处理这些浮点数,我们的解决办法是使用“双线性插值”算法。 双线性插值是一种相对较好的图像缩放算法,并且利用原始图像中虚拟点周围的四个实际像素值(例如,浮点值(例如,20.56 ),像素位置都是整数值,没有浮点值),来共同确定目标图像中的一个像素值。 即,可以估计与20.56这一虚拟位置点相对应的像素值。

如下图所示,如果蓝色的虚线框表示卷积后得到的feature map,黑色的实线框表示ROI feature,需要最后输出的尺寸为22,则为优点

用双线性插值来估计这些蓝点(虚拟坐标点,又称双线性插值的网格点)处所对应的像素值,最后得到相应的输出。这些蓝点是2x2Cell中的随机采样的普通点,作者指出,这些采样点的个数和位置不会对性能产生很大的影响,你也可以用其它的方法获得。然后在每一个橘红色的区域里面进行max pooling或者average pooling操作,获得最终2x2的输出结果。我们的整个过程中没有用到量化操作,没有引入误差,即原图中的像素和feature map中的像素是完全对齐的,没有偏差,这不仅会提高检测的精度,同时也会有利于实例分割。

 

ROIPooling和ROIAlign对比处理流程如下:

二、Network Architecture

整个的网络结构包含两部分,一部分是backbone用来提取特征,另一部分是head用来对每一个ROI进行分类、框回归和mask预测。

为了产生对应的Mask,文中提出了两种架构,即左边的Faster R-CNN/ResNet和右边的Faster R-CNN/FPN,如下图所示。

对于左边的架构,我们的backbone使用的是预训练好的ResNet,使用ResNet倒数第4层的网络。输入的ROI首先获得7x7x1024的ROI feature,然后将其升维到2048个通道(这里修改了原始的ResNet网络架构),然后有两个分支,上面的分支负责分类和回归,下面的分支负责生成对应的mask。由于前面进行了多次卷积和池化,减小了对应的分辨率,mask分支开始利用反卷积进行分辨率的提升,同时减少通道的个数,变为14x14x256,最后输出了14x14x80的mask模板。

而右边使用到的backbone是FPN网络,这是一个新的网络,通过输入单一尺度的图片,最后可以对应的特征金字塔,如果想要了解它的细节,请参考该链接。得到证实的是,该网络可以在一定程度上面提高检测的精度,当前很多的方法都用到了它。由于FPN网络已经包含了res5,可以更加高效的使用特征,因此这里使用了较少的filters。该架构也分为两个分支,作用于前者相同,但是分类分支和mask分支和前者相比有很大的区别。可能是因为FPN网络可以在不同尺度的特征上面获得许多有用信息,因此分类时使用了更少的滤波器。而mask分支中进行了多次卷积操作,首先将ROI变化为14x14x256的feature,然后进行了5次相同的操作(不清楚这里的原理,期待着你的解释),然后进行反卷积操作,最后输出28x28x80的mask。即输出了更大的mask,与前者相比可以获得更细致的mask。

三、Loss function

 每个ROI的Loss函数如下所示:

每个ROIAlign对应 K * m^2 维度的输出。K对应类别个数,即输出 K个mask,m对应池化分辨率(7*7)。Loss函数定义:Lmask(Cls_k) = Sigmoid (Cls_k),平均二值交叉熵 (average binary cross-entropy)Loss,通过逐像素的Sigmoid计算得到。对应一个属于GT中的第k类的ROI,Lmask仅仅在第k个mask上面有定义(其它的k-1个mask输出对整个Loss没有贡献)。Why K个mask?通过对每个 Class 对应一个 Mask 可以有效避免类间竞争(其他 Class 不贡献 Loss )。

四、实验结果

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。