黑色目标检测论文
黑色目标检测论文
|声明:遵循CC 4.0 BY-SA版权协议
建立在YOLOv1的基础上,经过Joseph Redmon等的改进,YOLOv2和YOLO9000算法在2017年CVPR上被提出,并获得最佳论文提名,重点解决YOLOv1召回率和定位精度方面的误差。在提出时,YOLOv2在多种监测数据集中都要快过其他检测系统,并可以在速度与精确度上进行权衡。
YOLOv2采用Darknet-19作为特征提取网络,增加了批量标准化(Batch Normalization)的预处理,并使用224×224和448×448两阶段训练ImageNet,得到预训练模型后fine-tuning。
相比于YOLOv1是利用FC层直接预测Bounding Box的坐标,YOLOv2借鉴了FSR-CNN的思想,引入Anchor机制,利用K-Means聚类的方式在训练集中聚类计算出更好的Anchor模板,在卷积层使用Anchor Boxes操作,增加Region Proposal的预测,同时采用较强约束的定位方法,大大提高算法召回率。同时结合图像细粒度特征,将浅层特征与深层特征相连,有助于对小尺寸目标的检测。
下图所示是YOLOv2采取的各项改进带了的检测性能上的提升:
YOLO9000 的主要检测网络也是YOLO v2,同时使用WordTree来混合来自不同的资源的训练数据,并使用联合优化技术同时在ImageNet和COCO数据集上进行训练,目的是利用数量较大的分类数据集来帮助训练检测模型,因此,YOLO 9000的网络结构允许实时地检测超过9000种物体分类,进一步缩小了检测数据集与分类数据集之间的大小代沟。
下面将具体分析YOLOv2的各个创新点:
BN概述:
对数据进行预处理(统一格式、均衡化、去噪等)能够大大提高训练速度,提升训练效果。BN正是基于这个假设的实践,对每一层输入的数据进行加工。
BN是2015年Google研究员在论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》一文中提出的,同时也将BN应用到了2014年的GoogLeNet上,也就是Inception-v2。
BN层简单讲就是对网络的每一层的输入都做了归一化,这样网络就不需要每层都去学数据的分布,收敛会更快。YOLOv1算法(采用的是GoogleNet网络提取特征)是没有BN层的,而在YOLOv2中作者为每个卷积层都添加了BN层。
使用BN对网络进行优化,让网络提高了收敛性,同时还消除了对其他形式的正则化(regularization)的依赖,因此使用BN后可以从模型中去掉Dropout,而不会产生过拟合。
BN优点:
神经网络每层输入的分布总是发生变化,加入BN,通过标准化上层输出,均衡输入数据分布,加快训练速度,因此可以设置较大的学习率(Learning Rate)和衰减(Decay);
通过标准化输入,降低激活函数(Activation Function)在特定输入区间达到饱和状态的概率,避免梯度弥散(Gradient Vanishing)问题;
输入标准化对应样本正则化,BN在一定程度上可以替代 Dropout解决过拟合问题。
BN算法:
在卷积或池化之后,激活函数之前,对每个数据输出进行标准化,方式如下图所示:
公式很简单,前三行是 Batch内数据归一化(假设一个Batch中有每个数据),同一Batch内数据近似代表了整体训练数据。第四行引入了附加参数 γ 和 β,此二者的取值算法可以参考BN论文,在此不再赘述。
fine-tuning:用已经训练好的模型,加上自己的数据集,来训练新的模型。即使用别人的模型的前几层,来提取浅层特征,而非完全重新训练模型,从而提高效率。一般新训练模型准确率都会从很低的值开始慢慢上升,但是fine-tuning能够让我们在比较少的迭代次数之后得到一个比较好的效果。
YOLO模型分为两部分,分类模型和检测模型,前者使用在ImageNet上预训练好的模型,后者在检测数据集上fine-tuning。
YOLOv1在预训练时采用的是224*224的输入(在ImageNet数据集上进行),然后在检测的时候采用448*448的输入,这会导致从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变。
YOLOv2则将预训练分成两步:先用224*224的输入在ImageNet数据集训练分类网络,大概160个epoch(将所有训练数据循环跑160次)后将输入调整到448*448,再训练10个epoch(这两步都是在ImageNet数据集上操作)。然后利用预训练得到的模型在检测数据集上fine-tuning。这样训练得到的模型,在检测时用448*448的图像作为输入可以顺利检测。
YOLOv1将输入图像分成7*7的网格,每个网格预测2个Bounding Box,因此一共有98个Box,同时YOLOv1包含有全连接层,从而能直接预测Bounding Boxes的坐标值,但也导致丢失较多的空间信息,定位不准。
YOLOv2首先将YOLOv1网络的FC层和最后一个Pooling层去掉,使得最后的卷积层可以有更高分辨率的特征,然后缩减网络,用416*416大小的输入代替原来的448*448,使得网络输出的特征图有奇数大小的宽和高,进而使得每个特征图在划分单元格(Cell)的时候只有一个中心单元格(Center Cell)。
为什么希望只有一个中心单元格呢?由于图片中的物体都倾向于出现在图片的中心位置,特别是比较大的物体,所以有一个单元格单独位于物体中心的位置用于预测这些物体。
YOLOv2通过引入Anchor Boxes,通过预测Anchor Box的偏移值与置信度,而不是直接预测坐标值。YOLOv2的卷积层采用32这个值来下采样图片,所以通过选择416*416用作输入尺寸最终能输出一个13*13的特征图。若采用FSRCNN中的方式,每个Cell可预测出9个Anchor Box,共13*13*9=1521个(YOLOv2确定Anchor Boxes的方法见是维度聚类,每个Cell选择5个Anchor Box)。
在FSRCNN中,以一个51*39大小的特征图为例,其可以看做一个尺度为51*39的图像,对于该图像的每一个位置,考虑9个可能的候选窗口:3种面积3种比例。这些候选窗口称为Anchor Boxes。下图示出的是51*39个Anchor Box中心,以及9种Anchor Box示例。
YOLOv1和YOLOv2特征图数据结构:
YOLOv1:S*S* (B*5 + C) => 7*7(2*5+20)
其中B对应Box数量,5对应边界框的定位信息(w,y,w,h)和边界框置信度(Confidience)。分辨率是7*7,每个Cell预测2个Box,这2个Box共用1套条件类别概率(1*20)。
YOLOv2:S*S*K* (5 + C) => 13*13*9(5+20)
分辨率提升至13*13,对小目标适应性更好,借鉴了FSRCNN的思想,每个Cell对应K个Anchor box(YOLOv2中K=5),每个Anchor box对应1组条件类别概率(1*20)。
聚类:聚类是指事先没有“标签”而通过某种成团分析找出事物之间存在聚集性原因的过程。即在没有划分类别的情况下,根据数据相似度进行样本分组。
在FSR-CNN中Anchor Box的大小和比例是按经验设定的,然后网络会在训练过程中调整Anchor Box的尺寸,最终得到准确的Anchor Boxes。若一开始就选择了更好的、更有代表性的先验Anchor Boxes,那么网络就更容易学到准确的预测位置。
YOLOv2使用K-means聚类方法类训练Bounding Boxes,可以自动找到更好的宽高维度的值用于一开始的初始化。传统的K-means聚类方法使用的是欧氏距离函数,意味着较大的Anchor Boxes会比较小的Anchor Boxes产生更多的错误,聚类结果可能会偏离。由于聚类目的是确定更精准的初始Anchor Box参数,即提高IOU值,这应与Box大小无关,因此YOLOv2采用IOU值为评判标准,即K-means 采用的距离函数(度量标准) 为:
d(box,centroid) = 1 - IOU(box,centroid)
如下图,左边是聚类的簇个数和IOU的关系,两条曲线分别代表两个不同的数据集。分析聚类结果并权衡模型复杂度与IOU值后,YOLOv2选择K=5,即选择了5种大小的Box 维度来进行定位预测。
其中紫色和灰色也是分别表示两个不同的数据集,可以看出其基本形状是类似的。更重要的是,可以看出聚类的结果和手动设置的Anchor Box位置和大小差别显著——结果中扁长的框较少,而瘦高的框更多(更符合行人的特征)。
YOLOv2采用的5种Anchor的Avg IOU是61,而采用9种Anchor Boxes的Faster RCNN的Avg IOU是60.9,也就是说本文仅选取5种box就能达到Faster RCNN的9中box的效果。选择值为9的时候,AVG IOU更有显著提高。说明K-means方法的生成的boxes更具有代表性。
直接对Bounding Boxes求回归会导致模型不稳定,其中心点可能会出现在图像任何位置,有可能导致回归过程震荡,甚至无法收敛,尤其是在最开始的几次迭代的时候。大多数不稳定因素产生自预测Bounding Box的中心坐标(x,y)位置的时候。
YOLOv2的网络在特征图(13*13)的每一个单元格中预测出5个Bounding Boxes(对应5个Anchor Boxes),每个Bounding Box预测出5个值(tx,ty,tw,th,t0),其中前4个是坐标偏移值,t0是置信度结果(类似YOLOv1中的边界框置信度Confidence)。YOLOv2借鉴了如下的预测方式,即当Anchor Box的中心坐标和宽高分别是(xa,ya)和(wa,wh)时,Bounding Box坐标的预测偏移值(tx,ty,tw,th)与其坐标宽高(x,y,w,h)的关系如下:
tx = (x-xa)/wa
ty= (y-ya)/ha
tw = log(w/wa)
th = log(h/ha)
基于这种思想,YOLOv2在预测Bounding Box的位置参数时采用了如下强约束方法:
上图中,黑色虚线框是Anchor Box,蓝色矩形框就是预测的Bounding Box结果,预测出的Bounding Box的坐标和宽高为(bx,by)和(bw,bh),计算方式如图中所示,其中:对每个Bounding Box预测出5个值(tx,ty,tw,th,t0),Cell与图像左上角的横纵坐标距离为(cx,cy),σ定义为sigmoid激活函数(将函数值约束到[0,1]),该Cell对应的Anchor Box对应的宽高为(pw,ph)。
简而言之,(bx,by)就是(cx,cy)这个Cell附近的Anchor Box针对预测值(tx,ty)得到的Bounding Box的坐标预测结果,同时可以发现这种方式对于较远距离的Bounding Box预测值(tx,ty)能够得到很大的限制。
YOLOv2通过添加一个转移层,把高分辨率的浅层特征连接到低分辨率的深层特征(把特征堆积在不同Channel中)而后进行融合和检测。具体操作是先获取前层的26*26的特征图,将其同最后输出的13*13的特征图进行连接,而后输入检测器进行检测(检测器的FC层起到了全局特征融合的作用),以此来提高对小目标的检测能力。
为了适应不同尺度下的检测任务,YOLOv2在训练网络时,其在检测数据集上fine-tuning时候采用的输入图像的size是动态变化的。具体来讲,每训练10个Batch,网络就会随机选择另一种size的输入图像。因为YOLOv2用到了参数是32的下采样,因此也采用32的倍数作为输入的size,即采用{320,352,…,608}的输入尺寸(网络会自动改变尺寸,并继续训练的过程)。
这一策略让网络在不同的输入尺寸上都能达到较好的预测效果,使同一网络能在不同分辨率上进行检测。输入图片较大时,检测速度较慢,输入图片较小时,检测速度较快,总体上提高了准确率,因此多尺度训练算是在准确率和速度上达到一个平衡。
上表反映的是在检测时,不同大小的输入图片情况下的YOLOv2和其他目标检测算法的对比。可以看出通过多尺度训练的检测模型,在测试的时候,输入图像在尺寸变化范围较大的情况下也能取得mAP和FPS的平衡。
YOLOv1采用的训练网络是GoogleNet,YOLOv2采用了新的分类网络Darknet-19作为基础网络,它使用了较多的3*3卷积核,并把1*1的卷积核置于3*3的卷积核之间,用来压缩特征,同时在每一次池化操作后把通道(Channels)数翻倍(借鉴VGG网络)。
YOLOv1采用的GooleNet包含24个卷积层和2个全连接层,而Darknet-19包含19个卷积层和5个最大池化层(Max Pooling Layers),后面添加Average Pooling层(代替v1中FC层),而Softmax分类器作为激活被用在网络最后一层,用来进行分类和归一化。
在ImageNet数据集上进行预训练,主要分两步(采用随机梯度下降法):
输入图像大小是224*224,初始学习率(Learning Rate)为0.1,训练160个epoch,权值衰减(Weight Decay)为0.0005,动量(Momentum)为0.9,同时在训练时采用标准的数据增强(Data Augmentation)方式如随机裁剪、旋转以及色度、亮度的调整。
fine-tuning:第1步结束后,改用448*448输入(高分辨率模型),学习率改为0.001,训练10个epoch,其他参数不变。结果表明:fine-tuning后的top-1准确率为76.5%,top-5准确率为93.3%,若按照原来的训练方式,Darknet-19的top-1准确率是72.9%,top-5准确率为91.2%。可以看出,两步分别从网络结构和训练方式方面入手提高了网络分类准确率。
预训练之后,开始基于检测的数据集再进行fine-tuning。
首先,先把最后一个卷积层去掉,然后添加3个3*3的卷积层,每个卷积层有1024个卷积核,并且后面都连接一个1*1的卷积层,卷积核个数(特征维度)根据需要检测的类数量决定。(比如对VOC数据,每个Cell需要预测5个Boungding Box,每个Bounding Box有4个坐标值、1个置信度值和20个条件类别概率值,所以每个单元格对应125个数据,此时卷积核个数应该取125。)
然后,将最后一个3*3*512的卷积层和倒数第2个卷积层相连(提取细粒度特征),最后在检测数据集上fine-tuning预训练模型160个epoch,学习率采用0.001,并且在第60和90个epoch的时候将学习率除以10,权值衰减、动量和数据增强方法与预训练相同。
YOLO9000通过结合分类和检测数据集,使得训练得到的模型可以检测约9000类物体,利用带标注的分类数据集量比较大的特点,解决了带标注的检测数据集量比较少的问题。具体方法是:一方面采用WordTree融合数据集,另一方面联合训练分类数据集和检测数据集。
分类数据集和检测数据集存在较大差别:检测数据集只有粗粒度的标记信息,如“猫”、“狗”,而分类数据集的标签信息则更细粒度,更丰富。比如“狗”就包括“哈士奇”、“金毛狗”等等。所以如果想同时在检测数据集与分类数据集上进行训练,那么就要用一种一致性的方法融合这些标签信息。
用于分类的方法,常用Softmax(比如v2),Softmax意味着分类的类别之间要互相独立的,而ImageNet和COCO这两种数据集之间的分类信息不相互独立(ImageNet对应分类有9000种,而COCO仅提供80种目标检测),所以使用一种多标签模型来混合数据集,即假定一张图片可以有多个标签,并且不要求标签之间独立,而后进行Softmax分类。
由于ImageNet的类别是从WordNet选取的,作者采用以下策略重建了一个树形结构(称为WordTree):
遍历ImageNet的标签,然后在WordNet中寻找该标签到根节点(所有的根节点为实体对象)的路径;
如果路径只有一条,将该路径直接加入到WordTree结构中;
否则,从可选路径中选择一条最短路径,加入到WordTree结构中。
WordTree的作用就在于将两种数据集按照层级进行结合。
如此,在WordTree的某个节点上就可以计算该节点的一些条件概率值,比如在terrier这个节点,可以得到如下条件概率值:
进而,如果要预测此节点的概率(即图片中目标是Norfolk terrier的概率),可以根据WordTree将该节点到根节点的条件概率依次相乘得到,如下式:
其中:
YOLO9000在WordTree1k(用有1000类别的ImageNet1k创建)上训练了Darknet-19模型。为了创建WordTree1k作者添加了很多中间节点(中间词汇),把标签由1000扩展到1369。
训练过程中GroundTruth标签要顺着向根节点的路径传播:为了计算条件概率,模型预测了一个包含1369个元素的向量,而且基于所有“同义词集”计算Softmax,其中“同义词集”是同一概念下的所属词。
现在一张图片是多标记的,标记之间不需要相互独立。在训练过程中,如果有一个图片的标签是“Norfolk terrier”,那么这个图片还会获得“狗”以及“哺乳动物”等标签。
如上图所示,之前的ImageNet分类是使用一个大Softmax进行分类,而现在WordTree只需要对同一概念下的同义词进行Softmax分类。然后作者分别两个数据集上用相同训练方法训练Darknet-19模型,最后在ImageNet数据集上的top-1准确率为72.9%,top-5准确率为91.2%;在WordTree数据集上的top-1准确率为71.9%,top-5准确率为90.4%。
这种方法的好处是有“退而求其次”的余地:在对未知或者新的物体进行分类时,性能损失更低,比如看到一个狗的照片,但不知道是哪种种类的狗,那么就预测其为“狗”。
以上是构造WordTree的原理,下图是融合COCO数据集和ImageNet数据集以及生成它们的WordTree的示意图(用颜色区分了COCO数据集和ImageNet数据集的标签节点), 混合后的数据集对应的WordTree有9418个类。另一方面,由于ImageNet数据集太大,YOLO9000为了平衡两个数据集之间的数据量,通过过采样(Oversampling)COCO数据集中的数据,使COCO数据集与ImageNet数据集之间的数据量比例达到1:4。
对YOLO9000进行评估,发现其mAP比DPM高,而且YOLO有更多先进的特征,YOLO9000是用部分监督的方式在不同训练集上进行训练,同时还能检测9000个物体类别,并保证实时运行。虽然YOLO9000对动物的识别性能很好,但是对衣服或者装备的识别性能不是很好(这跟数据集的数据组成有关)。
YOLO9000的网络结构和YOLOv2类似,区别是每个单元格只采用3个Anchor Boxes。
YOLO9000提出了一种在分类数据集和检测数据集上联合训练的机制,即使用检测数据集(COCO)的图片去学习检测相关的信息即查找对象(例如预测边界框坐标、边界框是否包含目标及目标属于各个类别的概率),使用仅有类别标签的分类数据集(ImageNet)中的图片去扩展检测到的对象的可识别种类。
具体方法是:当网络遇到一个来自检测数据集的图片与标记信息,就把这些数据用完整的损失函数(v2和9000均沿用了v1网络的损失函数)反向传播,而当网络遇到一个来自分类数据集的图片和分类标记信息,只用代表分类误差部分的损失函数反向传播这个图片。
YOLO v2 在大尺寸图片上能够实现高精度,在小尺寸图片上运行更快,可以说在速度和精度上达到了平衡,具体性能表现如下所示。
coco数据集
voc2012数据集
matlab 基于颜色的目标检测
我认为大致就这意思了:自己琢磨琢磨吧
f=imread(‘图片’);
imshow(f)
[m,n]=size(f);
for i=1:m
for j=i:n
。。。。。
F(i,j)=对图像矩阵每个元素f(i,j)进行和红色进行比较啊,一样就留下,不一样就改为黑色
。。。。
end
end
figure;imshow(F)
maskrcnn识别框非常小
maskrcnn简单解析 原创
2022-07-08 10:25:19
曙光_deeplove
码龄5年
关注
最近又开始看了一点detectron2框架中的maskrcnn,因此我这里回忆记录一下maskrcnn的基本原理。
一、基础网络架构
以上两个结构图就非常清晰地展示了maskrcnn网络模型的大致情况!
一、backbone
Backbone采用的是ResNet-50或者ResNet-101,作为特征提取器提取特征,我们将输入图像(大小为 H\times W )通过ResNet后,会得到五层特征图,其尺寸大小依次为:
( )
我们知道,低层特征往往含有较多的细节信息(颜色、轮廓、纹理),但包含许多的噪声以及无关信息。而高层特征包含有充分的语义信息(类别、属性等),但空间分辨率却很小,从而导致高层特征上信息丢失较为严重。因此maskrcnn采用了FPN(特征金字塔网络)的结构,来进行特征的融合。
FPN结构中包括自下而上,自上而下和横向连接三个部分。FPN可以同时利用低层特征图的空间信息和高层特征图的语义信息,它的原理很简单,就是把分辨率较小的高层特征首先通过1×1卷积降维(减少计算量),然后上采样至前一个特征图的相同尺寸,再进行逐元素相加,就能得到融合后的特征。
注:
1)自下而上:从下到上的路径,可以明显看出,其实就是简单的特征提取过程,和传统的没有区别。具体就是将ResNet作为骨架网络,根据feature map的大小分为5个stage。stage2,stage3,stage4和stage5各自最后一层输出conv2,conv3,conv4和conv5分别定义为C2,C3,C4,C5,他们相当于原始图片的stride是{4, 8, 16, 32}。需要注意的是,考虑到内存原因,stage1的conv1并没有使用。
2)自上而下和横向连接:自上而下是从最高层开始进行上采样,这里的上采样直接使用的是最近邻上采样,而不是使用反卷积操作,一方面简单,另外一方面可以减少训练参数。横向连接则是将上采样的结果和自底向上生成的相同大小的feature map进行融合。具体就是对 C2,C3,C4,C5
中的每一层经过一个conv 1x1操作(1x1卷积用于降低通道数),无激活函数操作,输出通道全部设置为相同的256通道,然后和上采样的feature map进行加和操作。在融合之后还会再采用3*3的卷积核对已经融合的特征进行处理,目的是消除上采样的混叠效应(aliasing effect)。
实际上,上图少绘制了一个分支:M5经过步长为2的max pooling下采样得到 P6,作者指出使用P6是想得到更大的anchor尺度512×512。但P6是只用在 RPN中用来得到region proposal的,并不会作为后续Fast RCNN的输入。
总结一下,ResNet-FPN作为RPN输入的feature map是
,而作为后续Fast RCNN的输入则是 。
二、RPN
在得到增强后的特征后,下面要讲的就是我们的RPN(Region Proposal Network)。
首先我们得明白什么叫做RPN?顾名思义,RPN就是区域推荐的网络,用于帮助网络推荐感兴趣的区域。
在说这个之前,我们得清楚什么叫做锚点?其实锚点也就是框,我们知道实例分割是要完成对物体的检测、分类、分割三个任务,而检测需要定位,也就是要得到目标的位置。Maskrcnn与fasterrcnn一样都是先生成一系列锚点,然后通过一定的规则来筛选。
各个框的大小由scale和ratio这两个参数来确定的,比如scale =[64],ratio=[0.5,1,1.5] ,则每个像素点可以产生3个不同大小的框。这个三个框是由保持框的面积不变,来通过ratio的值来改变其长宽比,从而产生不同大小的框。
我们在前面通过backbone和fpn得到了增强后的特征,现在就需要在这个特征上来使用我们的RPN结构。
这里需要说明一点,我们要在这几层特征图之间根据region proposal切出ROI进行后续的分类和回归预测。选择哪个feature map来切出这些ROI区域:我们会选择最合适的尺度的feature map来切ROI。具体来说,我们通过一个公式来决定宽w和高h的ROI到底要从哪个特征图来切:
RPN其原理如下:
注:为何是9个框呢?应该是3个ratio,那应该是3个框才对。后面我们讨论认为他这里面应该是scale给了3个,所以才会是九个
注意:上面各层特征图(p2至p6)之间根据region proposal切出ROI进行后续的分类和回归预测。选择哪个feature map来切出这些ROI区域:我们会选择最合适的尺度的feature map来切ROI。具体来说,我们通过一个公式来决定宽w和高h的ROI到底要从哪个特征图来切。
三、ROI Align
Mask RCNN的构建很简单,只是在ROI pooling(实际上用到的是ROIAlign,后面会讲到)之后添加卷积层,进行mask预测的任务。
通过ROI Align(或者说ROI Pooling)可以将输入的各个不同size的ROI进行fixed,官方是fixed大小为7x7。
3.1 原始ROI Pooling的问题
在Faster-RCNN中ROI Pooling的过程如下图所示:
注意:可以看到上图有两次量化误差,第一次是从图像坐标系转到特征图坐标系:665/32=20.78,取整20的时候出现量化误差;第二次是从特征图坐标系转到特征图中的ROI坐标系:20/7=2.86,取整到2则出现量化误差。
输入图片的大小为800x800,其中狗这个目标框的大小为665x665,经过VGG16网络之后获得的特征图尺寸为800/32 x 800/32 = 25 x 25,其中32代表VGG16中的5次下采样(步长为2)。同样地,对于狗这个目标我们将其对应到特征图上得到的结果是:
665/32 \times 665/32 = 20.78\times 20.78 = 20 \times 20
,因为坐标要保留整数所以这里引入了第一个量化误差即舍弃了目标框在特征图上对应长宽的浮点数部分。
然后我们需要将这个20\times 20的ROI区域映射为7x7的ROI特征图,根据ROI Pooling的计算方式,其结果就是:
20/7 \times 20/7 = 2.86\times 2.86 = 2 \times 2
即同样执行取整操作后ROI特征区域的尺寸为2x2,这里引入了第二次量化误差!
注意:这里表达的“整操作后ROI特征区域的尺寸为2x2”可能很多人会误会最后经过roi pooling的特征图大小是2x2,其实这是误会的,最后经过roi pooling的特征图大小是7x7大小的。而这个2x2是我们的池化区域视野!即每次在这2x2区域大小进行池化,直至扫描完整个20x20的区域!
从上面的分析可以看出,这两次量化误差会导致原始图像中的像素和特征图中的像素进行对应时出现偏差,例如上面将2.86量化为2的时候就引入了0.86的偏差,这个偏差映射回原图就是:
0.86\times 32 = 27.52,可以看到这个像素偏差是很大的!
3.2 ROIAlign
引自:(链接)为了缓解ROI pooling的量化误差过大的问题,hekaiming等人提出了ROIAlign,ROIAligin没有使用量化操作,而是使用了双线性插值。它充分的利用原图中的虚拟像素值如27.52四周的四个真实存在的像素值来共同决定目标图中的一个像素值,即可以将27.52和类似的非整数坐标值像素对应的输出像素值估计出来。这一过程如下图所示:
其中就是VGG16或者其他Backbone网络获得的特征图。黑色实线表示的是ROI划分方式,(最后输出的特征图大小为2\times 2),然后就使用双线性插值的方式来估计这些蓝色点的像素值,最后得到输出,然后再在橘红色的区域中执行Pooling操作最后得到2\times 2的输出特征图。可以看到这个过程相对于ROI Pooling没有引入任何量化操作即原图中的像素和特征图中的像素是完全对齐的,没有偏差,这不仅会提高检测的精度,同时也会有利于实例分割。
详细地讲解ROI Align操作。虚线部分表示feature map,实线表示ROI,这里将ROI切分成2x2的单元格。如果采样点数是4,那我们首先将每个单元格子均分成四个小方格(如红色线所示),每个小方格中心就是采样点。这些采样点的坐标通常是浮点数,所以需要对采样点像素进行双线性插值(如四个箭头所示),就可以得到该像素点的值了。然后对每个单元格内的四个采样点进行maxpooling,就可以得到最终的ROIAlign的结果。
在未引入RoIAlign前,网络中采用的是ROIPooling,采用它的目的是将不同尺寸的ROI特征图转换为相同尺寸的特征图,然后与后续的全连接层连接,但是这里因为使用了两次量化操作,因此会引入两次的量化误差,而RoIAlign是采用了双线性插值算法,因此不会引入量化误差,这样映射到原始图片中像素点对应的原始位置时就不会引入偏差。
为了得到为了得到固定大小(7X7)的feature map,ROIAlign不使用量化操作,然后对于浮点数,采用“双线性插值”算法进行计算,这样可以规避量化误差。双线性插值是一种图像缩放算法,它充分的利用了原图中虚拟点(比如20.56这个浮点数,像素位置都是整数值,没有浮点值)四周的四个真实存在的像素值来共同决定目标图中的一个像素值,即可以将20.56这个虚拟的位置点对应的像素值估计出来。
其中双线性插值的图示和公式如下。
双线性插值计算(x1,y1),(x2,y2)两点间任意一点的公式,这里可以看做是R1的表达式:
同理利用双线性插值计算出R1和R2这两个点的表达式:
然后对于R1和R2两点又可以继续使用双线性插值计算它们中间P点的表达式:
最终用双线性插值计算出的P点的表达公式如下,它是利用周边四个已知的坐标点值计算而来:
双线性插值的物理意义如下图所示:
由上图可知可以得到, 双线性插值本质上是目标像素所相邻的四个像素, 分别以像素对应的对角像素与目标像素的构成的矩形区域为权重,像素大小为值的加权和。
四、网络结构
引自:【从零开始学Mask RCNN】一,原理回顾&&项目文档翻译 - 知乎
4.1 概述
为了证明次网络的通用性,论文构造了多种不同结构的Mask R-CNN,具体为使用不同的Backbone网络以及是否将用于边框识别和Mask预测的上层网络分别应用于每个ROI。对于Backbone网络,Mask R-CNN基本使用了之前提出的架构,同时添加了一个全卷积的Mask(掩膜)预测分支。Figure3展示了两种典型的Mask R-CNN网络结构,左边的是采用ResNet或者ResNext做网络的backbone提取特征,右边的网络采用FPN网络做Backbone提取特征,最终作者发现使用ResNet-FPN作为特征提取的backbone具有更高的精度和更快的运行速度,所以实际工作时大多采用右图的完全并行的mask/分类回归。
4.2 ResNet-FPN (Feature Pyramid Network )
(1)FPN
FPN结构中包括自下而上,自上而下和横向连接三个部分,如下图所示。这种结构可以将各个层级的特征进行融合,使其同时具有强语义信息和强空间信息。
(2) ResNet-FPN
FPN实际上是一种通用架构,可以结合各种骨架网络使用,比如VGG,ResNet等。(这里用的就是ResNet-FPN)
1)自下而上:从下到上路径。可以明显看出,其实就是简单的特征提取过程,和传统的没有区别。具体就是将ResNet作为骨架网络,根据feature map的大小分为5个stage。stage2,stage3,stage4和stage5各自最后一层输出conv2,conv3,conv4和conv5分别定义为C2,C3,C4,C5,他们相对于原始图片的stride是{4,8,16,32}。需要注意的是,考虑到内存原因,stage1的conv1并没有使用。
2)自上而下和横向连接:自上而下是从最高层开始进行上采样,这里的上采样直接使用的是最近邻上采样,而不是使用反卷积操作,一方面简单,另外一方面可以减少训练参数。横向连接则是将上采样的结果和自底向上生成的相同大小的feature map进行融合。具体就是对C2,C3,C4,C5中的每一层经过一个conv 1x1操作(1x1卷积用于降低通道数),无激活函数操作,输出通道全部设置为相同的256通道,然后和上采样的feature map进行加和操作。在融合之后还会再采用3*3的卷积核对已经融合的特征进行处理,目的是消除上采样的混叠效应(aliasing effect)。
实际上,上图少绘制了一个分支:M5经过步长为2的max pooling下采样得到 P6,使用P6是想得到更大的anchor尺度512×512。但P6是只用在 RPN中用来得到region proposal的,并不会作为后续Fast RCNN的输入。
总结一下,ResNet-FPN作为RPN输入的feature map是[P2,P3,P4,P5,P6],而作为后续Fast RCNN的输入则是 [P2,P3,P4,P5] 。
(3)ResNet-FPN+Fast RCNN
将ResNet-FPN和Fast RCNN进行结合,实际上就是Faster RCNN的了,但与最初的Faster RCNN不同的是,FPN产生了特征金字塔[P2,P3,P4,P5,P6],而并非只是一个feature map。金字塔经过RPN之后会产生很多region proposal。这些region proposal是分别由P2,P3,P4,P5,P6经过RPN产生的,但用于输入到Fast RCNN中的是[P2,P3,P4,P5],也就是说要在[P2,P3,P4,P5]中根据region proposal切出ROI进行后续的分类和回归预测。选择哪个feature map来切出这些ROI区域:我们会选择最合适的尺度的feature map来切ROI。具体来说,我们通过一个公式来决定宽w和高h的ROI到底要从哪个Pk来切:
这里224表示用于预训练的ImageNet图片的大小。k0 表示面积为w*h=224*224的ROI所应该在的层级。作者将 k0设置为4,也就是说w*h=224*224的ROI应该从 P4中切出来。假设ROI的scale小于224(比如说是112 * 112),k=k0-1=4-1=3,就意味着要从更高分辨率的P3中产生。另外,k值会做取整处理,防止结果不是整数。
(4)ResNet-FPN+Fast RCNN+mask (得到了最终的Mask RCNN)
总结: (1).骨干网络ResNet-FPN,用于特征提取,另外,ResNet还可以是:ResNet-50,ResNet-101,ResNeXt-50,ResNeXt-101;
(2).头部网络,包括边界框识别(分类和回归)+mask预测。头部结构见下图:
Mask R-CNN中的改进:Faster R-CNN存在的问题是:特征图与原始图像是不对准的(mis-alignment),所以会影响检测精度。而Mask R-CNN提出了RoIAlign的方法来取代ROI pooling,RoIAlign可以保留大致的空间位置。
五、损失函数
Mask分支针对每个ROI区域产生一个K\times m\times m的输出特征图,即K\times m\times m的二值掩模图像,其中K代表目标种类数。Mask-RCNN在Faster-RCNN的基础上多了一个ROIAligin和Mask预测分支,因此Mask R-CNN的损失也是多任务损失,可以表示为如下公式:
L = L_{cls} + L_{box} + L_{mask}
其中L_{cls}表示预测框的分类损失,L_{box}表示预测框的回归损失,L_{mask}表示Mask部分的损失。
对于预测的二值掩膜输出,论文对每一个像素点应用sigmoid函数,整体损失定义为平均二值交叉损失熵。引入预测K个输出的机制,允许每个类都生成独立的掩膜,避免类间竞争。这样做解耦了掩膜和种类预测。不像FCN的做法,在每个像素点上应用softmax函数,整体采用的多任务交叉熵,这样会导致类间竞争,最终导致分割效果差。
下图更清晰的展示了Mask-RCNN的Mask预测部分的损失计算,来自知乎用户vision:
六、训练
在Faster-RCNN中,如果ROI区域和GT框的IOU>0.5,则ROI是正样本,否则为负样本。
L_{mask}只在正样本上定义,而Mask的标签是ROI和它对应的Ground Truth Mask的交集。其他的一些训练细节如下:
采用image-centric方式训练,将图片的长宽较小的一边缩放到800像素。
每个GPU的mini-batch=2,每张图片有N个采样ROIs,其中正负样本比例为1:3。
在8个gpu上进行训练,batch_size=2,迭代160k次,初始学习率0.02,在第120k次迭代时衰减10倍,weight_decay=0.0001,momentum=0.9。
七、测试
试阶段,采用的proposals的数量分别为300(Faster-RCNN)和1000(FPN)
在这些proposals上,使用bbox预测分支配合后处理nms来预测box。然后使用Mask预测分支对最高score的100个检测框进行处理。
可以看到这里和训练时Mask预测并行处理的方式不同,这里主要是为了加速推断效率。然后,Mask网络分支对每个ROI预测K个掩膜图像,但这里只需要使用其中类别概率最大的那个掩膜图像就可以了,并将这个掩膜图像resize回ROI大小,并以0.5的阈值进行二值化。
参考:
1、令人拍案称奇的Mask RCNN - 知乎
2、MaskRCNN结构详解 - 知乎
3、【从零开始学Mask RCNN】一,原理回顾&&项目文档翻译 - 知乎
4、目标检测与分割之MaskRCNN代码结构流程全面梳理+总结 - 知乎
5、实例分割算法(mask rcnn)总结 - 知乎
6、Mask Rcnn 网络结构总结 | jiajie
7、MaskRCNN网络结构 - 知乎
8、实例分割算法(mask rcnn)总结 - 知乎
9、源码解读:Faster RCNN的细节(三) - 知乎
10、Mask R-CNN网络结构理解_画外人易朽的博客-CSDN博客_maskrcnn网络结构
11、MaskRCNN源码解析1:整体结构概述_业余狙击手19的博客-CSDN博客_maskrcnn源码详解
12、目标检测与分割之MaskRCNN代码结构流程全面梳理+总结 - 知乎
13、MaskRCNN源码解析2:特征图与anchors生成_业余狙击手19的博客-CSDN博客
14、MaskRCNN源码解析1:整体结构概述_业余狙击手19的博客-CSDN博客_maskrcnn源码详解
15、锚框(anchor box)/先验框(prior bounding box)概念介绍及其生成_是苍啊!的博客-CSDN博客_anchor box
上一篇:司法学校毕业论文
下一篇:综述论文万能模板