萌新的机器学习

计算机视觉-目标检测

2018-05-03  本文已影响1人  初七123

CNN

CNN的反向传播

https://blog.csdn.net/login_sonata/article/details/77488383

R-CNN

算法步骤

训练集
经典的目标检测算法在区域中提取人工设定的特征(Haar,HOG)。本文则需要训练深度网络进行特征提取。可供使用的有两个数据库:
一个较大的识别库(ImageNet ILSVC 2012):标定每张图片中物体的类别。一千万图像,1000类。
一个较小的检测库(PASCAL VOC 2007):标定每张图片中,物体的类别和位置。一万图像,20类。
使用识别库进行预训练,而后用检测库调优参数。最后在检测库上评测。

SPP-net

在R-CNN中,要求输入固定大小的图片,因此需要对图片进行crop、wrap变换。此外,对每一个图像中每一个proposal进行一遍CNN前向特征提取,如果是2000个propsal,需要2000次前向CNN特征提取,这无疑将浪费很多时间。

该论文对R-CNN中存在的缺点进行了改进,基本思想是,输入整张图像,提取出整张图像的特征图,然后利用空间关系从整张图像的特征图中,在spatial pyramid pooling layer提取各个region proposal的特征。

金字塔池化层


使用不同尺寸的池化得到的值拼成一个固定长度的向量

为了能够输入任意大小的图像,在训练网络时,采用了多尺度输入,如:224*224, 180*180,其中,180*180图像是从224*224图像变换的到的。构建两种CNN模型,一种模型的输入大小为224*224,另一种模型的输入大小为180*180,而且这两个模型共享参数。

改进特征提取
这一步就是和R-CNN最大的区别了,这一步骤的具体操作如下:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。而R-CNN输入的是每个候选框,然后在进入CNN,因为SPP-Net只需要一次对整张图片进行特征提取,速度会大大提升。

其他步骤和R-CNN一致

Fast R-CNN

Fast R-CNN主要在下面几个方面做了改进

roi_pool5
roi_pool层将每个候选区域均匀分成M×N块,对每块进行max pooling。将特征图上大小不一的候选区域转变为大小统一的数据,送入下一层。

Loss
分类和回归采用单独的损失函数

Fast R-CNN是end-to-end的算法

Faster R-CNN

Faster R-CNN 把所有步骤都统一到了神经网络中

它主要包括两个模块

RPN

RPN网络的作用是输入一张图像,输出一批矩形候选区域,类似于以往目标检测中的Selective Search一步。网络结构是基于卷积神经网络,但输出包含二类softmax和bbox回归的多任务模型。

RPN的处理流程如下图所示:
(1)使用一个3×3的滑动窗口在Feature map上滑动,在每一个位置的中心点处遍历指定的scale和aspect ratio,提取K类anchor box;
具体方式可以参考 https://blog.csdn.net/sloanqin/article/details/51545125
(2)类似FCN,使用卷积层对anchor box进行分类(前景和背景)和回归;
(3)根据anchor box和标定的真值的重叠情况(IOU, Intersection OverUnion)进行分类,找出正面样本、负面样本和不参与训练的样本(这些样本决定了网络应该怎么学习);
(4)分类任务使用SoftmaxWithLoss层,回归任务使用SmoothL1Loss层,根据Loss调整RPN网络;
(5)RPN网络输出Proposal。

anchor
特征可以看做一个尺度51*39的256通道图像,对于该图像的每一个位置,考虑9个可能的候选窗口:三种面积{128^2, 256^2, 512^2}×三种比例{1:1,1:2,2:1}。这些候选窗口称为anchors。下图示出51*39个anchor中心,以及9种anchor示例。

代价函数
RPN网络训练,那么就涉及ground truth和loss function的问题。对于左支路,ground truth为anchor是否为目标,用0/1表示。那么怎么判定一个anchor内是否有目标呢?论文中采用了这样的规则:1)假如某anchor与任一目标区域的IoU最大,则该anchor判定为有目标;2)假如某anchor与任一目标区域的IoU>0.7,则判定为有目标;3)假如某anchor与任一目标区域的IoU<0.3,则判定为背景。所谓IoU,就是预测box和真实box的覆盖率,其值等于两个box的交集除以两个box的并集。其它的anchor不参与训练。

于是,代价函数定义为:

代价函数分为两部分,对应着RPN两条支路,即目标与否的分类误差和bbox的回归误差,其中Leg(ti,ti) = R(ti-ti)采用在Fast-RCNN中提出的平滑L1函数,作者认为其比L2形式的误差更容易调节学习率。注意到回归误差中Leg与pi相乘,因此bbox回归只对包含目标的anchor计算误差。也就是说,如果anchor不包含目标,box输出位置无所谓。所以对于bbox的groundtruth,只考虑判定为有目标的anchor,并将其标注的坐标作为ground truth。此外,计算bbox误差时,不是比较四个角的坐标,而是tx,ty,tw,th,具体计算如下:

训练
特征提取网络是RPN和 Fasr RCNN共享的


所以作者通过下面四步来训练

1) 单独训练RPN网络,网络参数由预训练模型载入;
2) 单独训练Fast-RCNN网络,将第一步RPN的输出候选区域作为检测网络的输入。具体而言,RPN输出一个候选框,通过候选框截取原图像,并将截取后的图像通过几次conv-pool,然后再通过roi-pooling和fc再输出两条支路,一条是目标分类softmax,另一条是bbox回归。截止到现在,两个网络并没有共享参数,只是分开训练了;
3) 再次训练RPN,此时固定网络公共部分的参数,只更新RPN独有部分的参数;
4) 拿RPN的结果再次微调Fast-RCNN网络,固定网络公共部分的参数,只更新Fast-RCNN独有部分的参数。

测试

YOLO v1

1-stage算法,一次性解决问题
优点 速度快(45fps,小模型快速版本为155fps)


缺点 很明显对位置预测不够精确,对小物体效果不够理想

思想

  1. 将物体检测这个问题定义为bounding box和分类置信度的回归问题。
  2. 将整张图像作为输入,划分成SxS grid,每个cell预测B个bounding box(x, y, w, h)及对应的分类置信度(class-specific confidence score)。分类置信度是 每个类别的概率 和 是物体的概率 以及 IOU 相乘的结果。


Loss

训练
输入N个图像,每个图像包含M个objec,每个object包含4个坐标(x,y,w,h)和1个label。然后通过网络得到7*7*30大小的三维矩阵。每个1*30的向量前5个元素表示第一个bounding box的4个坐标和1个confidence,第6到10元素表示第二个bounding box的4个坐标和1个confidence。最后20个表示这个grid cell所属类别。注意这30个都是预测的结果。然后就可以计算损失函数的第一、二 、五行。至于第二三行,confidence可以根据ground truth和预测的bounding box计算出的IOU和是否有object的0,1值相乘得到。真实的confidence是0或1值,即有object则为1,没有object则为0。 这样就能计算出loss function的值了。

测试
输入一张图像,跑到网络的末端得到7*7*30的三维矩阵,这里虽然没有计算IOU,但是由训练好的权重已经直接计算出了bounding box的confidence。然后再跟预测的类别概率相乘就得到每个bounding box属于哪一类的概率。如下图:是先直接得到后面两个的相乘结果,再和前面一个相乘,前面那一个也是预测出来的。

YOLO9000

https://zhuanlan.zhihu.com/p/35325884

上一篇 下一篇

猜你喜欢

热点阅读