物体检测

小物体目标检测 小物体检测算法_卷积

物体检测算法,按算法结构,可以分为one-stage和two-stage两类。

two-stage经典算法主要是R-CNN族,以准确度见长,速度稍慢,一般不如one-stage。

one-stage算法主要包括YOLO、SSD、CornerNet等,以速度快见长,准确度一般不如two-stage。下面介绍这些经典网络。

两阶段模型:

【rcnn=region proposals(候选区域) + CNN】

1、用Selective Search(选择性搜索)产生候选区域,是基于像素相似性进行的分割

(1)用论文《Efficient Graph-Based Image Segmentation》得到初始分割区域 R,每个元素是小子图

定义:边的权重是两个节点的像素差

定义:子图C的图内距离INC(C)为该图的最小生成树(=最小连通子图)中所有边的最大权值,如果只有1个节点,则图内距离=0

定义:两个图之间的距离DIF(Ci,Cj)是连接两个图的所有边中的最小权值,没有边连的话就是无穷大

定义:如果子图之间的距离大于图内的距离,则两个图有边界,D(Ci,Cj)=True

该图的每个像素作为1个子图,对于有边界的两个子图,如果他俩的距离小于一个参数,则把两个子图合并,不断迭代,最终图片被分割为几个大的子图

效果:其中同一个颜色是一个子图

小物体目标检测 小物体检测算法_卷积_02

 

(2)计算每个子图与子图之间的相似度,放到相似度集合里面:

相似度分为颜色相似度、纹理相似度、大小相似度、形状交叠相似度,最终的相似度是这四个值取不同的权重相加

颜色相似度:每个颜色通道分为25个bins(范围),总共有75个bins,一个图对应75维向量,每维度是该范围内(bin)的像素点个数,然后向量归一化

对于两个向量,遍历每一个维度,将所有较小的元素相加,例如(1,10)和(2,4)=>1+4=5

纹理相似度:每个颜色通道分为10个bins,图里共3*10=30个bins,每个bin有8个方向,计算该方向的偏导数,所以一个图对应240维度向量,每个维度是个导数,然后向量归一化

对于两个向量,(与上面一样)....

大小相似度:子图面积越小,相似度越大

形状交叠相似度

(3)将最大相似度的两个子图合并生成新子图放到 R 里面(原来的子图不丢弃),再计算两两相似度,再合并...,直到只剩1张子图。最终得到的 R 是原来的小子图+新的更大的子图

2、把步骤1产生的所有候选区域 R 缩放(或裁剪等等)为同一尺寸

3、给候选区域标注,此处假定ground truth有20类,那么候选区域有21类

对于一个候选区域,找到和它重叠面积最大的ground truth(人工标记的框),计算iou(相交的面积/并集的面积,越大则重合度越高)

当 iou<0.5,候选区域对应类别是背景,即负样本;当 iou>0.5,候选区域对应类别是ground truth的类别,即正样本

4、微调

候选区域集由于负样本很多,对正样本过采样制作batch使得正样本:负样本=3:1,对现有的Alexnet改造,把最后一层换成21个神经元的全连接网络,将候选区域集的batch输入训练

注意:RCNN是先取候选区域,然后对每个候选区域做卷积运算

5、特征提取

把候选区域再次输入到训练好的Alexnet中,只要Alexnet中的FC7层输出的4096维向量,该向量就是候选区域的特征向量

注意:因为正样本数据量太少了,而神经网络需要大量训练数据才能精准分类,所以此处Alexnet作用只是提取一下特征向量,它的分类精度太粗,不用它分类

而用基于小规模样本的SVM来真正分类

6、制作SVM训练集

候选区域再标注,当 iou<0.3,候选区域对应类别是背景,即负样本,ground truth做正样本,这是为了提供给SVM更加精准的训练数据,其他候选区域扔掉

7、训练SVM

定义21个SVM,对应21个类别,每个SVM输出候选区域属于该类的概率,一个候选区域可以得到21个概率,对比它的标注,计算交叉熵损失

由于正样本太少,采用hard negative mining:模型训练完一次后,随机取出一个子集让模型预测,取出把负样本(背景)预测错了的样本作为错题集

把错题集加入下一次的训练集,模型进入下一次训练...

8、SVM预测

只挑出来步骤2中的 iou>0.6的候选区域(由于步骤9的修正算法是线性的,对重合度比较高的才管用),用SVM做个分类预测,其他候选区域抛弃

然后把这些候选区域缩放回原图(尺度不变性:候选区域缩放后,特征向量不变)

9、对8的候选区域进行位置精修

每个候选区域对应一个特征向量(之前存过了),对一个位置(Px,Py,Pw,Ph),Px,Py是区域的中心点坐标,Pw,Ph是区域的宽和高

现在需要对位置做个变换,用一个线性神经网络去学习,分别输出4个值

训练时:若A是一个候选区域(Px,Py,Pw,Ph),B是它的gt(Gx,Gy,Gw,Gh),四个神经元分别去拟合:

tx=(Gx−Px)/Pw,这是去掉长宽的影响

ty=(Gy−Py)/Ph,这是去掉长宽的影响

tw=log(Gw/Pw),这是保证缩放比例>0

th=log(Gh/Ph),这是保证缩放比例>0

预测时:若A是一个候选区域(Px,Py,Pw,Ph),精修如下:

先通过神经网络:W*特征向量=t

然后输出新位置:(t0 * Pw+Px,t1 * Ph+Py,Pw*e^t2,Ph*e^t3)

【Fast RCNN】

1、原图归一化为224×224,gt也被放缩了

2、使用selective search选取建议框

在训练阶段,针对一个建议框搜索所有的放缩后的gt

若与它最大的iou>0.5,则标记建议框为该gt的类别,label是用该gt的位置和大小与该建议框的位置和大小算出的tx,ty,tw,th

iou<0.5的标记为背景

3、将图片输入VGG16中,获取它的第5个卷积层输出的特征图

4、将建议框缩放到特征图上制作特征框,注意Fast RCNN是一次卷积,然后在卷积结果上取候选区域

5、ROI池化:将每个特征框分别映射为固定长度向量

此时特征框大小不一,对每个特征框划分为H×W个网格(论文中是7×7),在每个网格内进行最大池化使得一个格输出1个数。

把所有特征框转化为 7×7×C 的矩阵(其中C为特征图厚度),然后拉长为一个长度为  7×7×C 向量

6、遍历每个特征框,将特征框向量分别并行的输入到两个全连接层(称为multi-task)

第一个全连接层用于分类,输出21个值,代表该特征框属于每类的概率

第二个全连接层用于回归,输出4*20=80个值,代表该特征框属于某个类时(20中的1个)的tx,ty,tw,th

训练时,背景只算分类的损失,前景损失=分类+回归损失

作者的回归损失采用了smooth L1损失函数,x是真实值-预测值:

小物体目标检测 小物体检测算法_小物体目标检测_03

 

 

小物体目标检测 小物体检测算法_小物体目标检测_04

 

作者这样设置的目的是想让loss对于离群点更加鲁棒,相比于L2损失函数(最小平方误差),其对离群点(指的是距离中心较远的点)、异常值(outlier)不敏感(因为 loss 变小了),可控制梯度的量级使训练时不容易跑飞。

预测时,取第一个全连接层的最大类概率,得到每个建议框的类别,采用非极大值抑制NMS去掉大多数重合度高的框,得到少数框

非极大值抑制方法:

先假设有6个矩形框都预测为检测到“车”,现在要去掉没用的

小物体目标检测 小物体检测算法_子图_05

根据分类器的类别分类概率做排序,假设从小到大属于车辆的概率 分别为A、B、C、D、E、F。

(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;

(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。

(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。

就这样一直重复,找到所有被保留下来的矩形框。

针对少数框,去第二个全连接层得到该框在该类下的tx,ty,tw,th,对该建议框进行位置修正,背景的话就不修正了,修正后的少数建议框再放缩回原图

【Faster RCNN】

 

小物体目标检测 小物体检测算法_子图_06

 

 

1、原图缩放至固定大小MxN

2、通过VGG16的13个conv(kernel_size=3,pad=1,stride=1,使得卷积后大小没变),13个relu,4个pooling层(kernel_size=2,pad=0,stride=2,使得一次池化造成长宽减半),生成(M/16)x(N/16)x256大小的特征图Feature Map

3、左箭头进入RPN网络,先通过卷积(大小:3x3x256,256个卷积核,padding=1,步长=1)输出还是 (M/16)x(N/16)x256=w*h*256 的特征图,定义每个点有k=9个anchor框(相对于MxN的图)

3.1(上面箭头):通过卷积(大小:1x1*256,2*9=18个卷积核)得到 w*h*18 的特征图,然后算出概率(通过reshape+softmax+reshape),解释:因为1个anchor有两个分类(是物体 / 是背景),对于1个像素点有 18 维的向量,前9维是该点的9个anchor检测到是前景的概率,后9维是背景的概率,用于计算 rpn 的分类loss

3.2(下面箭头):通过卷积(大小:1x1*256,4*9=36个卷积核)得到 w*h*36 的特征图,解释:因为1个anchor对应4个位置变化(delta)的值(相对于MxN的图),目标还是要去拟合对应的tx,ty,tw,th,所以对于1个像素点有 36 维的向量,前4维是该点的第一个anchor需要修正的位置变化值.....,用于计算 rpn 的回归loss

3.3 生成候选框proposals

特征图的每个点生成9个在MxN图上的anchors的具体位置,再利用位置变化(delta)的值对所有的anchors修正

抽一部分有很大可能检测到前景的anchors:对修正后的 anchors 按照前景概率大小降序排列,提取前6000个anchors

针对抽的这些anchors中:超出图像边界的anchors边界设置为图像边界(利用到im_info信息,里面保存了图像缩放比例),再剔除尺寸非常小的anchors,对剩余的anchors进行NMS(nonmaximum suppression),返回处理完的anchors作为候选框proposals

训练时先训练rpn网络,把与某个gt 的 iou>0.7的 proposal 标为正样本,与该 gt 的位置偏移 txywh 作为回归标签,与所有的gt 的iou都 <0.3的 标为负样本,中间的(0.3-0.7的iou的proposal )不参与训练,正样本计算分类 loss 和回归 loss ,负样本只算分类loss,具体公式如下:

小物体目标检测 小物体检测算法_相似度_07

 

4、ROI pooling:将proposals分别映射成7x7的向量
首先将 proposal 映射回(M/16)x(N/16)大小的尺度,再将每个proposal 对应的feature map区域划分为7x7的网格(有时除不尽,可能成了2.86x2.86的格,这时候只能向下取整,导致看的像素范围小了,所以faster rcnn 不好检测小物体,大物体倒是可以),最后对网格的每一份都进行max pooling处理,生成7x7的向量

5、再分类和再位置修正

上下两路分别把7x7向量展平,分类的送入神经网络和softmax,输出该proposal 对应具体的分类,回归的送入神经网络,输出再修正位置变化值

训练时,需要等 RPN网络训练好后,利用它生成的proposal训练整个网络,损失函数是后面的具体分类函数和位置再修正回归函数,训练完后再训练RPN…

6、用MAP评估模型

1个AP对应1个类别,MAP=所有AP的平均值

假定计算狗类别的AP:

针对预测集的所有图片,把GT里面标记为狗的筛出来(下图的绿框),把检测为狗类别的 proposal 筛出来(下图的红色框,置信度 = 检测为狗的概率),即

小物体目标检测 小物体检测算法_小物体目标检测_08

 

若给定一个置信度阈值,小于该阈值的proposal都去掉,只考虑大于该阈值的proposal,若存在 gt 与它的iou>0.5,则该 proposal 算一个TP,否则标记为FP:

 

小物体目标检测 小物体检测算法_小物体目标检测_09

 

 由此可以算出此时整体的精确率和召回率(关于狗的):

按照置信度的值由高到低排序,然后分别计算TP与FP的累计数量,对置信度进行降序排序的操作是为了便于直观地计算不同置信度下的Recall与 Precision值:

小物体目标检测 小物体检测算法_子图_10

 

 一个置信度阈值对应 pr 图上的一个点(若多行置信度一样,则取最下面的置信度,如0.9的那三行),多个置信度阈值对应多个点,连起来形成一条 pr 曲线,该曲线下方的面积就是AP

【mask rcnn】

物体检测+实例分割(比语义分割还细,能区分出1个1个的)

 

小物体目标检测 小物体检测算法_相似度_11

 

1、图像归一化成1024x1024,然后输入到 resnet101 中得到5个阶段的特征图(c1,c2,c3,c4,c5),其中后一个阶段的特征图比前一个阶段看到的信息更全,但会细节会丢失,检测不到比较小的物体,下面就充分利用了这5张图

小物体目标检测 小物体检测算法_相似度_12

  

小物体目标检测 小物体检测算法_子图_13

 

 

2、利用 FPN 融合5张图信息

小物体目标检测 小物体检测算法_卷积_14

 

c2-c5分别经过卷积核个数一致的卷积层,把厚度变一致,P2-P5的厚度都一致,举个例子:C4层经过1*1卷积得到与P5相同的通道,但是P5长宽小,P5经过上采样(线性差值)扩大长宽后得到与C4相同的长和宽,最终加C4,得到了融合层P4,其他的以此类推。P5经过步长为2的max pooling下采样得到 P6,P2-P6又通过了共享的 3x3 卷积网络(512个卷积核),目的是对已经融合的特征进行处理,消除上采样的混叠效应(aliasing effect),形成新的P2-P6,一起作为5个特征图送入到RPN。

 3、RPN生成候选框

训练RPN的时候用P2-P6,预测的时候用P2-P5,假定在训练阶段,遍历5张特征图,每个图的一个像素点产生k=3个anchor(3种不同的长宽比),特征图面积小的 anchor 面积大(低分辨率的feature map上生成大的 anchor ,有利于检测大目标),然后将这些anchor映射回原图大小(1024x1024)

遍历p2-p6,对每张特征图,一边通过1x1卷积生成厚度为 2k=6 的特征图,每个anchor 有前景和背景的检测结果,一个像素点有6个用于形容它的3个anchor的概率值

另一边通过 1x1卷积生成厚度为 4k=12 的特征图,每个anchor 有4个位置变换的预测结果

对前面的 anchor 按照前景的概率降序排列,筛出来一些概率大的anchor,然后根据预测的回归值进行位置修正,再利用NMS过滤掉一些框,最终的候选框传给下一层

(训练阶段)此处产生2个损失函数,训练方式同 faster rcnn

4、候选框再处理以及标注

候选框中用0做padding的去掉

(训练阶段)一个框与GT相比较,若发现框里面包含多个物体,则去掉,这样虽然本质做的是语义分割,但是由于1个框只检测了1个物体,就能实现实例分割

(训练阶段)根据与GT的 IOU 是否大于0.5,判定框为正负样本,然后设置负样本和正样本之间样本数量的比例为3:1,制作训练集

(训练阶段)对所有的正样本(标签是前景的),对一个框,取与GT IOU最大的GT,GT是什么具体类别(猫、狗、羊....),则设置为该框的具体类别标签,与该GT算出位置变换值做回归标签,与框内包含实例mask(GT mask)(比如原图中的一只猫用某种颜色涂上了)的那个部分(框内且属于猫)置为1,其他(框内不属于猫)置为0,作为特定类别(猫)的mask 标签,然后放缩到 28x28 大小

5、ROI Align (ROI pooling 的改进版)+ 预测:把 候选框 处理成一个大小,然后预测

将每个候选框映射到自己对应的特征图上,针对特征图上的框,先用7x7网格进行划分,对其中一个网格(如下图的左上角),生成4个点,每个点是由周围的4个特征图上的点做双线性插值后的结果,然后这四个点取最大值值得到1个点,这样1个网格就1个点了,由于特征图厚度是256,此处是分别对每层处理,每层各自产生 7x7 的矩阵:

小物体目标检测 小物体检测算法_相似度_15

由于ROI是并行的做的,对一个候选框而言

上面箭头:生成 7x7X256 的结果,展成一个长向量然后通过2层 1024 维神经网络,上面生成80个类别的概率,与类别标签计算交叉熵损失,下面生成位置变换的回归值,与回归标签生成回归损失

下面箭头:生成 14x14X256 的结果,经过4层卷积还是14x14x256,再反卷积扩大成 28x28x256,再通过1x1卷积(激活函数是sigmoid)得到的 28x28x80,每层代表一类mask,根据框的特定类别(猫)的mask 标签,取特定层取出预测 mask 矩阵,拿来计算mask的交叉熵损失

这里有3个损失用来训练

预测的时候,先通过上面的箭头预测到类别和回归值,再去下面的箭头输出的 28x28x80 里面根据预测出来的类别找到特定的mask

 

小物体目标检测 小物体检测算法_卷积_16