论文笔记:目标检测算法(R-CNN,Fast R-CNN,Faster R-CNN,FPN,YOLOv1-v3)

R-CNN(Region-based CNN)

  1. motivation:以前的视觉任务大多数考虑使用SIFT和HOG特征,而近年来CNN和ImageNet的出现使得图像分类问题取得重大突破,那么这方面的成功可否迁移到PASCAL VOC的目标检测任务上呢?基于这个问题,论文提出了R-CNN。
  2. 基本步骤:如下图所示,第一步输入图像。第二步使用生成region proposals的方法(有不少,论文使用的是seletivce search,ImageNet2013检测任务的冠军UVA也使用了该算法)提取约2000个候选区域。因为CNN固定输入大小因此第二步和第三步之间须要作一个warped region。第三步将2000个候选区域分别输入到CNN(AlexNet)计算2000个特征向量,第四步将各个特征向量(4096维,相比于以前经常使用的方法UVA减少了2个量级,4k vs 360k)输入到(类特定的)各个线性SVM中分类(好比VOC的20个类别就有20个SVM)。对于特定类的SVM,因为有2000个候选区域,因此有2000个结果,使用非极大值抑制来得到得分较高的一些候选区。
  3. CNN的训练:使用的CNN在ImageNet2012分类数据集上作了预训练。微调时把最后的1000类改成N+1类,对于VOC而言N为20,对于ImageNet2013检测数据集而言N为200,以IOU大于等于0.5为正样本,其它为负样本,学习率0.001,每次SGD迭代(128的batch size)中用了32个正窗口(因此类上)和96个背景窗口。
  4. SVM的训练:以0.3做为IOU阈值来选取正负样本。因为负样本太多,采用hard negative mining的方法在负样本中选取有表明性的负样本。
  5. R-CNN BB:为了提升定位表现,额外使用了一个bounding box regression。用第五个池化层的特征输入到SVM获取得分,而后(根据最大IOU)构建候选区域和真实区域的数据集,训练一个回归器,能够对候选区域的位置修正。
  6. 结果比较之VOC:在VOC 2007上调参,在VOC 2010-12上进行预测。CNN在VOC 2012训练集上作微调,SVM在VOC 2012的训练验证集上进行训练。超越了其它算法。
  7. 结果比较之ImageNet2013:OverFeat是ImageNet2013定位任务的冠军,对于检测任务在赛后也得到了第一的成绩(24.3%的mAP),是ImageNet2013检测数据集(200类)上表现最好的检测算法(当时),而R-CNN用在ImageNet2013的检测数据集上得到了31.4%的mAP。

Fast R-CNN

  1. R-CNN的三个缺点:多阶段(训练CNN,训练SVM,训练bb回归器);训练时空间和时间代价高(对于SVM和bb回归器须要把每张图像的每一个候选区特征经过CNN提取出来存到磁盘);预测阶段很慢(由于要对每张图像的每一个候选区域提取特征)。
  2. SPPnet的改进:R-CNN预测慢是由于对于每一个候选区域要过一次CNN而不共享计算,而SPPnet则是使用共享计算来加速。以下第一个图所示,SPP输入整张图,计算一个feature map,在feature map上找到候选区对应的一个子图,而后对子图作一个金字塔池化获得一个固定长度的特征向量(下图中获得的是4x4+2x2+1个特征)。 尽管如此,SPPnet仍然有多阶段以及特征写入磁盘的缺点,并且由于SPPnet的特征是从conv5的feature map上池化而来的,因此只fine-tuning金字塔池化层以后的层(这限制了深层网络的准确性)。
  3. motivation:Fast R-CNN修正了R-CNN和SPPnet(Spatial pyramid pooling)的缺点,提高了速度和准确率。它是一个单阶段的算法,使用了multi-task loss,能够对整个网络进行更新,并且不须要把特征存到磁盘上。
  4. 主要步骤:以下第二个图所示,输入为一整张图以及一系列的(selective search生成的)候选区域(映射到conv5的feature map上获得ROI),ROI意为Region of Interest。像SPPnet同样对ROI进行池化,只不过这里是单水平的金字塔池化(以下第一个图是三水平),好比分红7x7个子图对每一个子图取最大获得长度为49个ROI特征。池化后通过FC,而后分红两个分支,一个分支用softmax作分类,一个分支用bb回归器作定位,使用multi-task loss进行训练。
  5. mini-batch sampling:R-CNN和SPPnet在微调训练时每一个batch是从128张图像中分别取一个RoI。而Fast取N个图像,每一个图像取R/N个ROI(论文中使用N=2,R=128),这样来自同一个图像的ROI在前向和后向过程当中就能够共享内存和计算,提升了效率。采样时25%的ROI是从IOU为0.5以上的侯选框选的,剩余的ROI是从IOU为[0.1, 0.5)中的侯选框选的。
  6. SGD超参:softamx和bb回归器的全链接层使用0均值,0.01和0.001的标准差的高斯分布进行初始化。bias为0。全部层的权重学习率为1倍的全局学习率,偏置为2倍的全局学习率,全局学习率为0.001。对于VOC07或者、VOC12的训练,30k次迭代,而后学习率减为0.0001而后训练另外10k次迭代。momentum为0.9,weight decay为0.0005。
  7. 截断的SVD:将庞大的全链接层压缩为截断的SVD能够提升检测速度。
  8. 应该微调哪些层:消融学习(ablation study)中,固定前面的卷积,只微调后面的全链接层(像SPPnet那样)发现mAP降低,说明微调前面的卷积层是重要的。那么是否是说全部的卷积层都应该被微调呢,不是, 经过实验发现conv1对mAP影响不大,对于VGG16,发现只须要更新conv3_1以及之后的层。
  9. 其它实验和讨论:经过实验,发现单尺度能够得到和多尺度差很少的结果,因此论文的实验都是使用单尺度。经过实验,发现更多训练数据能够提升mAP。经过实验,发现softmax比SVM好一点点,差距不大。经过实验,发现随着候选区数量的增长,mAP先增后降,说明不是越多越好。将Fast运行在COCO数据集上创建一个初步baseline。


Faster R-CNN

  1. motivation:Fast R-CNN的瓶颈在于生成候选区域(Selective Search的)的方法很是耗时,Faster提出把生成候选区域也放到卷积网络来作(网络称为RPN,Region Proposal Networks),将RPN和检测网络(Fast R-CNN)结合成一个网络进行统一的训练和检测,这样能够共享卷积操做,减少计算时间。实验也代表了Faster能够提升检测表现。
  2. 主要步骤:以下第一个图所示,在原来网络的最后一层卷积层加入一个RPN来生成ROI,而后根据feature map和ROI进行ROI池化,后面和Fast同样再接全链接,softmax和回归器。
  3. RPN结构:设计以下第二个图,RPN在最后一个卷积层上以nxn的窗口滑动进行卷积(论文中n为3,所对应的感觉野是很大的),每一个窗口(一小块3x3的区域)被映射成低维特征(ZFnet-256d,VGG-512d),而后分为两路接两个1x1卷积获得分类层和回归层。其中k表示事先设计的k个anchor(论文中k为9,3种scale和3种宽高比组合),分类层的2k个单元中的2表示是或不是,回归层的4k个单元中的4表示目标对应的坐标位置。最后会根据这两个层计算一个损失进行训练。
  4. 训练RPN:训练时,和某个grouth truth的IoU值最高的anchor视为正样本,和任意ground truth的IoU超过0.7的anchor也视为正样本。和全部ground truth的IoU低于0.3的视为负样本,其它的忽略,超出原图边界的anchor也忽略(若是测试阶段获得这种anchor,则clip到边界)。一个mini-batch(256)为一张图像的多个anchor,正负比例为1比1。共享卷积层遵循R-CNN的实践进行ImageNet分类的预训练来对参数初始化,对ZFnet调整整个网络,对VGG微调conv3_1以上的层。其它新增层(RPN)用(0,0.01)的高斯分布初始化参数。前60k次mini-batch使用0.001的学习率,后20k次mini-batch使用0.0001的学习率,在VOC数据集上。momentum为0.9,weight decay为0.0005。
  5. RPN和检测网络(Fast R-CNN)的训练:论文采用的是交替训练的方式,第一步按上述步骤训练RPN。第二步用RPN产生的候选区域训练检测网络,检测网络也进行了预训练,到这一步,两者不共享前面的公共卷积层。第三步用检测网络的参数初始化RPN前面的公共卷积层,微调RPN,此时RPN和检测网络共享前面的卷积层。第四步,微调检测网络的后半部分(固定公共卷积层)。另外,RPN产生的区域可能高度重叠,根据RPN的分类分数,使用非极大值抑制(0.7的IOU阈值)来减少候选区域数量。


FPN(Feature Pyramid Networks)

  1. motivation:对不一样尺度的物体进行识别是图像任务的一项基本挑战,以前的作法有以下图(a)(b)(c)三种,这些作法都有各自的缺点,因而本文提出图(d)中的作法,即FPN。
  2. 图(a)特征化的图像金字塔:很自然的想法就是将图像作成不一样的scale,而后不一样scale的图像生成对应的不一样scale的特征,实际上全部在 ImageNet 和 COCO检测任务上取得最好成绩的方法都使用了这种方法进行了多尺度预测(好比像SPP那样预测的时候对多个尺度进行空间金字塔池化)。然而要作这种多尺度训练(很占内存)是不可行的,若是要用也只是用在多尺度预测上,即便是用在预测上也会减慢不少时间,也形成了训练和测试的不一致。
  3. 图(b)单个特征图:因为CNN对尺度改变的鲁棒性(相对传统的手工特征),可使用单尺度图像来进行训练,为了更快,最近的检测系统都采用这种方法(SPP,Fast和Faster)。
  4. 图(c)层次化的金字塔特征:直接重用CNN中不一样层上的多尺度特征图,SSD采用了相似的思想,为了不利用过低层的特征,SSD从偏后的层开始提取特征。可是这样丢失了利用高分辨率的底层特征,而这样的特征对于预测小物体是很重要的。
  5. 图(d)FPN:因而本文提出了FPN,它能够和(b)(c)同样快,可是更准确。具体以下第二个图所示,高层feature map上采样,而后和前层(作1x1卷积后的feature map)作element-wise。经过这种bottom-up与top-down结合的方法能够得到较强的语义特征,提升检测的性能。
  6. 应用:论文把FPN应用到RPN,Fast和Faster上,提高了检测效果。


Yolo(You Only Look Once)v1

  1. motivation:与R-CNN系列算法(产生候选区域,分类,回归修正)不一样,yolo直接用一个单独的卷积网络输入图像,输出bb(bounding box)和分类几率。
  2. 优势:第一是更快(不须要像R-CNN系列那样复杂的步骤)。第二是站在全局的角度(能够看到整张图像)去预测,能够产生更小的背景偏差。第三是能学到泛化能力强的特征(实验代表)。
  3. 缺点:第一是施加了很强的空间限制,致使系统能预测的目标数量有限,并且对靠的很近的物体和很小的物体的检测效果很差。第二是难以泛化到新的不常见的长宽比物体。第三是损失函数对小bb和大bb的偏差同等对待,小偏差对大bb来讲没什么,可是对小bb来讲影响很大,yolo的主要错误就是来源于定位错误。还有一点是准确率没法达到state-of-art的水平。
  4. 主要思想:如下图所示,将输入图像划分为SxS的格子,目标(物体)的中心落在哪一个格子内,就由哪一个格子负责。每一个格子检测B个bb和C个类别的条件几率。每一个bb包含5个值(x, y, w, h, 置信度),其中x和y相对于格子归一化到0到1,w和h相对于整张图像归一化为0到1,置信度定义为\(Pr(Object)*IOU_{pred}^{truth}\),咱们但愿“若是没有物体则置信度为0,若是有物体,Pr为1,置信度表示为IOU"。C个类别的条件几率为\(Pr(Class_i | Object)\)。测试阶段用条件几率乘上置信度,获得一个类相关的置信度。因此最后输出层的单元数字应该为SxSx(Bx5+C),论文中S为7,B为2,C为20类(VOC数据集),因此输出是一个7x7x30的tensor。另外,对于一个大物体,可能出现多个格子对它负责预测,这个时候使用非极大值抑制处理。
  5. 训练:网络结构参考GoogleNet作了修改。在ImageNet上作了1000类分类的预训练,而后增长卷积层和全链接层,把224的输入改为448(检测须要更细粒度的视觉信息)。输出层使用线性激活,其它层使用leaky relu。在VOC07和12的训练集和验证集上训练了135个epochs,在VOC12测试时也使用(加入)了VOC07的测试集进行训练。batch size 为64,momentum为0.9,weight decay为0.0005。学习率在第一个epoch从0.001缓慢升到0.01,若是一开始使用高学习率会因为不稳定的梯度致使模型不收敛。而后0.01训练75个epochs,0.001训练30个epochs,0.0001训练最后30个epochs。为了防止过拟合使用了dropout(第一个链接层以后,0.5)和数据加强。
  6. 损失函数:以下(论文中给出的)式子所示。损失函数把定位偏差和分类偏差平等对待可能不太好,并且一张图像可能不少格子是没有物体的,使得置信度几乎为0,这压制了确实有物体的格子的梯度,使得模型不稳定。因此须要减少不含物体的bb的置信度带来的损失(给予一个0.5的权重\(\lambda_{noobj}\)),增长bb坐标带来的损失(给予一个5的权重\(\lambda_{coord}\))。损失函数把大bb和小bb平等对待也不太好,为了必定程度上弥补这个问题,对于宽度和高度,使用它们的平方根来代替它们自己。
  7. 其它:关于yolo以前在ng深度学习课程中有所了解,具体笔记见:ng-深度学习-课程笔记-目标检测
    \[\lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{obj}[(x_i-\hat{x}_i)^2+(y_i-\hat{y}_i)^2] + \\ \lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{obj}[(\sqrt{w_i}-\sqrt{\hat{w}_i})^2+(\sqrt{h_i}-\sqrt{\hat{h}_i})^2] + \\ \sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{obj}(C_i - \hat{C}_i)^2+ \lambda_{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{noobj}(C_i - \hat{C}_i)^2 + \\ \sum_{i=0}^{S^2}\mathbb{1}_{i}^{obj}\sum_{c \in classes}(p_i(c)-\hat{p}_i(c))^2\]

Yolov2

  1. yolov2:从yolov1到yolov2增长了一系列设定来改善yolo,以下第一个图所示。
  2. hi-res classifier:表示在正式训练检测网络(448x448)以前先使用448x448输入图像的分类网络进行预训练(在这以前已经在ImageNet上进行224输入图像的预训练)。
  3. convolutional和anchor boxes:表示借鉴Faster的作法,去掉回归层以前的全链接和池化,在最后一层卷积层上进行anchor box的预测,此举虽然下降了mAP,可是提升了recall(81到88)。在v1中类别是分配到格子的,因此是最后tensor大小是SxSx(Bx5+C),C是类别。而v2中每一个格子设计多个anchor box(表示每一个格子分配多少个bb),类别分配到了格子的bb中,因此最后tensor大小是SxSxBx(5+C)。
  4. new network:表示使用新的网络结构做为检测的基础网络,借鉴了VGG和NIN,提出了Darknet-19。
  5. dimension prior:表示使用k-means聚类来设计anchor的形状。
  6. location prediction:表示不预测offset(Faster中anchor的预测方式),而是沿用yolov1直接预测相对格子的归一化坐标。
  7. passthrough:表示将最后一层feature map(13x13)和上一层(26x26)调整后的feature map进行concat,由于对于小目标经过层层卷积后可能就不见了,因此链接一下上一层的特征图。
  8. multi-scale:表示的是多尺度训练。
  9. hi-res detector:表示使用更高分辨率的输入图像。
  10. yolo9000:yolo9000以yolov2为主网络,经过联合优化分类和检测的方法,同时训练两个数据集(WordTree结合了ImageNet和COCO的数据集),使得系统可以检测超过9000类的物体,其中WordTree以下第二个图所示。


Yolov3

  1. bb预测:对于每一个bb的objectness score使用逻辑回归。当bb是某个ground truth的最大IOU时则应该预测为1。假如bb并非最高的,只是(跟ground truth的)IOU大于某个阈值,则忽略预测,跟Faster同样。和Faster不同的是,对于ground truth只分配一个bb。若是一个bb没有被分配到ground truth就没有坐标损失和分类损失,只有objectness损失。
  2. 类预测:每一个bb的分类预测使用独立逻辑回归以及binary cross-entropy而不使用softmax。这样有助于迁移到更复杂的领域(好比Open Image Dataset中存在重叠标签,好比女人和人),而softmax假定了一个box只属于某一个类。
  3. 跨尺度预测:借鉴FPN(feature pyramid network)的作法,从三个不一样尺度上提取特征,主要就是把前层的feature map拉过来作上采样而后concat。COCO的实验中,每一个尺度预测3个boxes因此tensor为NxNx[3x(5+80)],80表示类别。
  4. 特征提取:在Darknet-19基础上加入了残差结构,提出了Darknet-53。

参考文献

  1. R-CNN(2014 CVPR):Rich feature hierarchies for accurate object detection and semantic segmentation模型源码-caffe(matlab)实现
  2. Fast R-CNN(2015 ICCV):Fast R-CNN模型源码-caffe实现
  3. Faster R-CNN(2015 NIPS):Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks模型源码-caffe实现
  4. FPN(2017 CVPR):Feature Pyramid Networks for Object Detection模型源码-caffe实现
  5. Yolov1(2016 CVPR):You Only Look Once: Unified, Real-Time Object Detection模型源码-darknet(C和cuda)
  6. Yolov2(2017 CVPR):YOLO9000: Better, Faster, Stronger模型源码-darknet(C和cuda)
  7. Yolov3:YOLOv3: An Incremental Improvement模型源码-darknet(C和cuda)实现
相关文章
相关标签/搜索