CNN
- 局部感受野
- 共享权重
共享,意味着这一个隐层的所有神经元检测完全相同的特征,在输入图像的不同位置。这说明卷积网络可以很好地适应图片的平移不变性
其次大大减少了参数量 - 池化
我们选择图像中的连续范围作为池化区域,这就意味着即使图像经历了一个小的平移之后,依然会产生相同的 (池化的) 特征,做到了图片的平移不变性
CNN的反向传播
https://blog.csdn.net/login_sonata/article/details/77488383
R-CNN
算法步骤
-
一张图像生成1K~2K个候选区域 (Selective Search)
Selective Search方法从一种图片生成约2000个候选区域,采用一种过分割的手段,将图像分割成小区域,然后bottom-up,合并可能性最高的两个区域,重复合并,直到整张图像上合并成一个区域为止。输出所有曾经存在过的区域,就是候选区域。 -
对每个候选区域,使用深度网络提取特征
-
特征送入每一类的SVM 分类器,判别是否属于该类
对每一类目标,使用一个线性SVM二类分类器进行判别。考察每一个候选框,如果和本类所有标定框的重叠面积都小于0.3,认定其为负样本。 -
使用回归器精细修正候选框位置
做位置精修,因为候选框不够准确,重叠面积很小。输入为深度网络pool5层的4096维特征,输出为xy方向的缩放和平移。

训练集
经典的目标检测算法在区域中提取人工设定的特征(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主要在下面几个方面做了改进
- 整张图像归一化后直接送入深度网络。在邻接时,才加入候选框信息,在末尾的少数几层处理每个候选框(如同 spp-net)
- RCNN中独立的分类器和回归器需要大量特征作为训练样本。
本文把类别判断和位置精调统一用深度网络实现,不再需要额外存储

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

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

Fast R-CNN是end-to-end的算法
Faster R-CNN
Faster R-CNN 把所有步骤都统一到了神经网络中

它主要包括两个模块
- PRN候选框提取模块;
全卷积神经网络,用于提取候选框 - Fast R-CNN检测模块。
基于RPN提取的proposal检测并识别proposal中的目标

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)

缺点 很明显对位置预测不够精确,对小物体效果不够理想
思想
- 将物体检测这个问题定义为bounding box和分类置信度的回归问题。
-
将整张图像作为输入,划分成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属于哪一类的概率。如下图:是先直接得到后面两个的相乘结果,再和前面一个相乘,前面那一个也是预测出来的。
网友评论