CS231n Lecture11 目标检测和图像分割笔记
Fractionally strided convolution(分数步长卷积):
在图像分割问题中,我们需要将图像分割成多个部分分别进行识别,但是在普通的CNN网络中,进行了若干的conv和pooling后,特征图的size会变得很小,导致图像分割无法进行,或者无法进行地很精细,这个时候就需要使用上采样方法,将特征图的size扩大
上采样常用方法:
对原始图片的每行、每列之间进行若干个0填充,然后对0填充后的输入进行一定步长和一定size的kernel的卷积,使卷积后的结果的size符合标准
目标检测:
要求在图像中,同时识别出目标物的类别信息和位置信息,也就是说要求从背景中分离出感兴趣的目标,并确定这一目标的描述
R-CNN:
先通过Selective Search算法,在图像中提取中2000个左右可能包含物体的候选区域(Region Proposal)
由于获取到的region proposal大小各不相同,需要将其缩放为统一的大小,然后将缩放后的图像输入到CNN中,提取出特征图,最后将特征图输入到SVM中进行分类。
R-CNN需要对所有由selective search算法选取出来的region proposal进行CNN提取特征,导致计算量很大,因此我们可以在这里进行一些优化,也就是只对原始图像进行一次CNN特征提取,然后将region proposal在原图的位置映射到特征图上,最后只需要对特征图的截取部分进行分类操作即可
Fast R-CNN:
主要改进了以下部分:
将分类和检测的部分融入到CNN中,不再使用额外的SVM,减少了计算量
selective search后不再对得到的2000个retion proposal进行截取输入,而是采用上述的优化方法,即ROI Project,将region proposal映射到CNN处理后的特征图上
使用ROI pooling 将在特征图上不同尺度大小的region of interest(ROI)归一化成相同大小以通过FC层
ROI Pooling:
对每一个ROI在特征图上截取后,通过Max Pooling到相同的维度,具体操作为:将每个大小的ROI都平均划分成的网格(一个网格包含的像素点可能不是整数,这个时候要进行四舍五入之类的操作),然后在一个网格内所包含的像素点们进行max pooling,使这个网格最后只保持最大的像素值,则这样最后就能够pooling成
的size
最后将每个ROI pooling后输出的块通过FC层生成ROI特征向量,最后用softmax进行分类预测,以及Localization回归进行边界框的预测,得到Bbox坐标,从而和真实的候选框坐标作比较
Fast R-CNN的损失是多任务的,一个是分类损失,分为n(种类)+1(背景)类,使用交叉熵+softmax的损失函数;另一个是Bbox的Locolization回归,损失函数使用的是Smooth L1 Loss,在下文会讲到
Faster R-CNN:
在Fasst R-CNN的基础上又做了两个改进:
在Region Proposal阶段使用RPN(Region Proposal Network)来代替Selective Search
使用了Anchor
Anchor:
Anchor是图像检测领域一个常用的结构,是在特征图上以某个点为中心形成的矩形框,该框有3种size(size是对应原始图像输入而言,比如原始图像的)和3种比例(1:1, 2:1, 1:2),共9种框,这样可以充分地考虑被检测物体的大小和形状,保证物体都能由anchor来生成region proposal,具体效果如图:
RPN网络结构:
RPN是一个全卷积的神经网络
首先特征图会经过一个的卷积核的卷积,得到k个channel,其中k是ahchor种类数,这样每一个channel所对应的卷积后的特征图编码了当前滑动窗口中心位置以及其对应的anchor范围的信息
之后,会进行2个并行的卷积,作用于两个任务
1.分类分支,最终输出2k个channel,表示每个anchor所框选的的范围是目标的概率以及不是目标的概率
2.回归分支,最终输出4k个channel,预测每个channel需要进行怎么样的微调(平移和缩放),才能更好地贴合真实目标框,每个anchor有4个信息(dx,dy:中心点坐标的偏移量, dw,dh:宽高的对数尺度缩放因子)
最后生成region proposal,对于特征图上的每个位置,以及k个anchor,最终会输出
个候选框,对每个候选框,需要使用其对应的dx,dy,dw,dh得到调整后的候选框坐标。对于数量如此多的候选框,且很多会有重叠/得分偏低,可以通过其是目标的概率筛选出一部分候选框,然后对筛选出的候选框进行非极大值抑制,即合并掉那些与最高分框重叠度(IoU)超过某个阈值(如0.7)的其他框,从而移除高度重叠的冗余框,最后保留分数最高的M个(如300或1000)候选框作为最终的region proposal输出
RPN的训练:
对于每个anchor,需要确定它是正样本(目标,又前景)、负样本(背景)还是忽略样本
正样本:与某个真实目标框的IoU最高,或大于某个阈值(如0.7)
负样本:与所有真实目标框的最大IoU小于阈值(如0.3)
忽略样本:IoU介于高低阈值之间的
Loss:分为两个部分
分类Loss:采用交叉熵损失,即预测的目标分数和标签之间的差异
回归损失:使用Smooth L1 Loss,由于L2 Loss对离群点非常敏感,L1 Loss在误差接近0时的优化效率较差,而对于候选框来说,很有可能会出现较多的离群点,因此我们使用Smooth L1 Loss,即对小误差使用L2 Loss, 对大误差使用L1 Loss,具体公式如下:
通常取
训练样本采样规则(共采样256个):
先从正样本中随机采样,个数不超过128个
再从负样本中随机采样,补足256个样本
这样采样的原因是因为正负样本通常极不平衡(背景anchor远多于前景anchor)
ROI Align:
上述提到的fast R-CNN使用的是ROI Pooling,但是它要进行两次四舍五入量化调整边界,从而导致ROI在特征图上可能会有1到2个像素的误差,映射到原始图像后可能误差会大于10个像素,甚至会大于整个物体,这导致对小目标的检测效果很差,因此,我们将ROI Pooling优化成为ROI Align
具体工作原理:
先将ROI project和ROI Pooling是计算出的ROI带小数的坐标储存起来,不直接量化成像素坐标,随后,依旧是在ROI上划分grid,但不是取grid的最大值,而是将grid的每一个网格再划分成的小网格,在每个小网格中找到其对应的中心点坐标,将离这个中心点最近的4个点的值进行双线性插值,从而求得中心点的值, 最后再对每个grid的4个中心点使用max pooling,得到grid的值
Bbox Head:
图像经过CNN得到特征图,再通过RPN得到region proposal,又经过ROI Align得到候选框的特征图后,最后通过Bbox Head的两个分支预测出标签及其边界框偏移量
1.分类分支:给候选区域进行n+1类的标签分类
2.边界框精调:预测每个候选框的边界框偏移量(dx,dy,dw,dh)
与RPN的区别:RPN的偏移量调整是类别无关的,也就是说所有类的目标共用一个偏移量预测,而Bbox Head的偏移量调整是类别特定的,每个类别标签都有其独立的回归器,从而得到更精细的偏移量调整
因此这里的正负样本的阈值均以0.5为标准
采样规则(共采样512个):
从正样本中随机采样不超过128个样本
再从负样本中随机采样补足512个样本
将比例保持在1:3