YOLO V1、V2、V3算法 精要解说
前言
之前无论是传统目标检测,还是RCNN,亦或是SPP NET,Faste Rcnn,Faster Rcnn,都是二阶段目标检测方法,即分为“定位目标区域”与“检测目标”两步,而YOLO V1,V2,V3都是一阶段的目标检测。
从R-CNN到FasterR-CNN网络的发展中,都是基于proposal+分类的方式来进行目标检测的,检测精度比较高,但是检测速度不行,YOLO提供了一种更加直接的思路:
直接在输出层回归boundingbox的位置和boundingbox所属类别的置信度,相比于R-CNN体系的目标检测,YOLO将目标检测从分类问题转换为回归问题。其主要特点是:
?速度快,能够达到实时的要求,在TitanX的GPU上达到45fps;
?使用全图Context信息,背景错误(把背景当做物体)比较少;
?泛化能力强;
YOLO V1 UnifiedDetection(统一检测)核心思想: 1.将输入图像划分为S*S个gridcell(网格单元);如果一个object物体的中心是位于这个gridcell内,那么这个gridcell就负责检测这个物体;如下图 2.每一个gridcell需要预测B个boundingboxes坐标信息(x,y,w,h)以及这些boundingboxes的置信度confidence。 YOLOv1中的坐标信息(x,y,w,h)表示的是boxes中心点坐标相对于当前图像宽度、高度的比值,w、h是boxes的宽度、高度和实际图像的宽度、高度的比值; 置信度confidence反映的是模型对于这个预测的boundingbox中包含物体的可能性大小。 3.每个gridcell还需要预测C个类别的概率(conditionalclassprobability),以判断当前cell属于哪个类别C。 ?NOTE:Confidence置信度表示的是boundingboxes包含物体的概率值,而conditionalclassprobability表示的是每个gridcell属于某个类别的概率值。 4.每个gridcell的class信息和每个boundingbox预测的confidence信息相乘,就可以得到每个boundingbox的class-specificconfidencescore。 论文建议:S=7,B=2,在PASCALVOC数据集中,最终预测值形状为7x7x30的Tensor对象,C=20(该数据集的类别) 这个30的维度是这样的:S*S(B*5+C),5的意思是两个边框的x、y、w、h、confidence。(confidence 代表了所预测的 box 中含有 object 的置信度和这个 box 预测的有多准这两重信息) 主干网络: 其主干网络是Googlenet其想做的事如此看来很清晰,先判断是目标还是背景,若是目标,则再判断是属于这20个类别的哪个类(此VOC数据集是20个类别,别的数据集就是别的类别)
因为论文建议了我们一个grid cell最好是承载着两个边框,即bounding box,那么,这幅7*7个cell的图就有98个边框了,如下图
每个边框都是上面公式计算来的,我有写的,即背景还是物体的概率*20个类哪个类别的概率,如下图
然后呢 ,就是处理这98个框框,如下图
这总共是20个类别,一行行的这么处理,直到20行处理完毕
然后对结果遍历,如果置信度的评分大于0,那这个框就可以代表此物体,如果得分小于0,就不行,如下图
来看一下损失函数吧,我把它分成了三类
总结一下,并分析一下优缺点:
优点: ?运行速度快,因为是一阶段的; ?背景预测错误的情况比较少; 缺点: ?对于实际物体的效果没有FasterR-CNN效果好; ?如果一个gridcell中包含多个相同类别的小物体,那么YOLOv1每个单元格最多可以检测出两个物体(论文的建议设置导致的,因为它建议一个grid cell 里面最好只是两个边框,如果不是两个边框,效果不会好)。如下图YOLO V2
算法的增强正是有了对原来的基础不断改进才得来的,YOLO V2相对于V1主要有三方面变化。
Better,Faster,Stronger: ?1.Better:从精度方面进行改进,让效果从YOLOv1的63.4%mAP上升到YOLOv2的78.6%mAP,基本和FasterR-CNN以及SSD持平。 ?2.Faster:网络结构方面做了更改,让模型速度更快; ?3.Stronger:对这个损失函数做一个变化; ?BatchNormalization: ?在每一个卷积层后加入BatchNormalization,mAP提升2%,BatchNormalization有助于规范化模型,防止过拟合。 ?HighResolutionClassifier: ?一般的目标检测方法中,基本上会使用ImageNet预训练的模型来提取特征,比如使用AlexNet或者VGG网络,那么输入的图片会被resize到不足256*256的大小,这样会导致分辨率不够高,目标检测比较困难;在YOLOv2中自定义了darknet分类网络,将图像的输入分辨率更改为448*448,然后在ImageNet上训练10轮,训练后的网络可以适应高分辨率的输入;应用到检测的时候,对检测部分网络进行finetune,mAP提升4%。ConvolutionalwithAnchorBoxes: ?借鉴FasterR-CNN中的anchor思想,产生多个boundingboxes先验框,通过这种方式可以提升模型的recall召回率。 ?删除全部的全连接层,去掉最后一个池化层,以确保输出的特征图具有更高的分辨率,然后通过缩减网络让图片输入分辨率为416*416,这样最终输出的特征图为13*13; ?DimensionCluster(维度聚类): 相当于考试时你偷看了一眼答案是BADDCDDD,但你不知道是第几道题是这些答案,于是你尽量遇到不会的时候多选D. 这里是基于训练数据的真实框的大小来做的密度的聚类 ?AnchorBoxes的宽高纬度通常需要通过精选的先验框来给定,然后通过网络学习转换系数,最终得到准确的boundingbox候选框;如果可以通过维度聚类一开始就给定更具有代表性的boxes维度,那么网络就会更容易预测位置。 ?使用K-Means聚类方法来训练boundingboxes;采用IoU作为KMeans聚类的距离公式。
下图是聚类的不同标准下的平均IOU值
DirectLocationPrediction(直接位置预测): ?在AnchorBoxes中,模型不是特别稳定,原因是:模型的位置预测值为偏移量的值(在整个图像上的),在模型中相当于anchor可以检测很远目标的box的情况,范围太大,反向传播的就会很慢,这样就会导致模型收敛比较慢。 ?YOLOv2中不采用直接的offset方法,使用了预测相对于grid cell的坐标位置的方法,并且将ground truth通过logistic函数限制在0~1之间,这样的范围更小,有利于反向传播的速度,。 ?通过DimensionCluster+DirectLocationPrediction的改进,mAP提升5%。 具体做法如下:其沿用了Faster RCNN中Anchor box(锚点框)的思想,通过kmeans方法在VOC数据集(COCO数据集)上对检测物体的宽高进行了聚类分析,得出了5个聚类中心,因此选取5个anchor的宽高: (聚类时衡量指标distance = 1-IOU(bbox, cluster))
COCO: (0.57273, 0.677385), (1.87446, 2.06253), (3.33843, 5.47434), (7.88282, 3.52778), (9.77052, 9.16828)
VOC: (1.3221, 1.73145), (3.19275, 4.00944), (5.05587, 8.09892), (9.47112, 4.84053), (11.2364, 10.0071)
这样每个grid cell将对应5个不同宽高的anchor, 如下图所示:(上面给出的宽高是相对于grid cell,对应的实际宽高还需要乘以32(2的5次方),因为这里给出的原图大小是416*416大小的,经过卷积啊池化啊下采样了5次后变成了13*13大小的)
关于预测的bbox的计算:(416*416-------13*13 为例),卷积池化等经历了5次下采样,缩小了2的5次方倍(看下面这三段话的时候,记得看此行往上数第9到12行字,相信你会明白的)
(1) 输入图片尺寸为416*416, 最后输出结果为13*13*125,这里的125指5*(5 + 20),5表示5个anchor,25表示[x, y, w, h, confidence ] + 20 class ),即每一个anchor预测一组值。
(2) 对于每一anchor预测的25个值, x, y是相对于该grid cell左上角的偏移值,需要通过logistic函数将其处理到0-1之间。如13*13大小的grid,对于index为(6, 6)的cell,预测的x, y通过logistic计算为xoffset, yoffset, 则对应的实际x = 6 + xoffset, y = 6+yoffset, 由于0 (3) 由于上述尺度是在13*13下的,需要还原为实际的图片对应大小,还需乘以缩放倍数32 yolo v3在保证实施率(fps>36)的情况下,尽量追求性能,下面是几个主干网络的对比 darknet为论文中使用的,效果不错,resnet在top5的准确率上和darknet一致。但是实时性略差,毕竟它本质是用来分类的网络,若用于目标检测还需要修改修改 下图是特征金字塔的结构与其他几种结构的对比图 下面是yolo v3的具体结构,其中特征金字塔部分参照上图看,就能明白 来看一下损失函数吧,采用了类似YOLOv1的损失函数,其主要更改的地方是将v1中关于confidence和class类别概率部分的损失函数更改为logistic交叉熵损失函数(tf.nn.sigmoid_cross_entropy_with_logits)。 训练操作类似YOLOv1和v2,主要特点如下: ?网络结构darknet; ?输入数据完整图像,不进行hardnegativemining(难负样本的挖掘,当然,我们自己实现代码的时候可以做)或者其它操作; ?多尺度训练multiscale; ?数据增强dataaugmentation; ?批归一化batchnormalization; 致此完毕全部内容,我求求你们关注我好不好,很不容易的,一个人打两份工,晚上还要给别人织毛衣......