作者:fivetrees
https://zhuanlan.zhihu.com/p/75106112
本文已获作者授权,未经允许,不得二次转载
YOLOv1
https://pjreddie.com/media/files/papers/yolo.pdf
1. 基本思想
2. 网络结构
3. 损失函数
-
YOLOv1对位置误差,confidence误差,分类误差均使用了均方差作为损失函数。
-
三部分误差损失(位置误差,confidence误差,分类误差),在损失函数中所占权重不一样,位置误差权重系数最大,为5。
-
由于一副图片中没有目标的网格占大多数,有目标的网格占少数,所以损失函数中对没有目标的网格中预测的bbox的confidence误差给予小的权重系数,为0.5。
-
有目标的网格中预测的bbox的confidence损失和分类损失,权重系数正常为1。
-
由于相同的位置误差对大目标和小目标的影响是不同的,相同的偏差对于小目标来说影响要比大目标大,故作者选择将预测的bbox的w,h先取其平方根,再求均方差损失。
-
一个网格预测2个bbox,在计算损失函数的时候,只取与ground truth box中IoU大的那个预测框来计算损失。
-
分类误差,只有当单元格中含有目标时才计算,没有目标的单元格的分类误差不计算在内。
-
4. 激活函数
-
最后一层全连接层用线性激活函数
-
其余层采用leak RELU
5. YOLOv1的缺陷
-
首先,每个单元格只预测2个bbox,然后每个单元格最后只取与gt_bbox的IOU高的那个最为最后的检测框,也只是说每个单元格最多只预测一个目标,若单个单元格有多个目标时,只能检测出其他的一个,导致小目标漏检,因此YOLOv1对小目标检测效果不好。
-
其次,虽然YOLOv1中损失函数中位置误差,对预测的w,h取平方根处理再求均方差,来缓解相同位置误差对大目标,小目标影响不同的弊端,但是作用甚微,没有根本解决问题对于小物体。小的目标的 置信度误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。
-
由于输出层为全连接层,因此在检测时,YOLO 训练模型只支持与训练图像相同的输入分辨率的图片。
YOLOv2
1. 介绍
2.相比于v1的改进
-
Anchor:引入了Faster R-CNN中使用的Anchor(猜想,Anchor是我们作目标检测的载体,最后预测的检测框位置是在Anchor的基础上进行回归的,作者认为可能比v1中的无Anchor回归效果更好,不过最近也有大量的Anchor Free文章出现,过段时间我再总结一下),注意这里作者在YOLOv2中设计的Anchor并不是像Faster R-CNN中人为事先设计的尺寸和高宽比一级个数,作者通过在所有训练图像的所有边界框上运行k-means聚类来选择锚的个数和形状(k = 5,因此它找到五个最常见的目标形状)。因此,YOLO的锚是特定于您正在训练(和测试)的数据集的。k-means算法找到了将所有数据点划分聚类的方法。这里的数据点是数据集中所有真实边界框的宽度和高度。但5个锚是否最佳选择?我们可以在不同数量的聚类上多次运行k-means,并计算真实标签框与它们最接近的锚框之间的平均IOU。毫无疑问,使用更多质心(k值越大)平均IOU越高,但这也意味着我们需要在每个网格单元中使用更多的检测器,并使模型运行速度变慢。对于YOLO v2,他们选择了5个锚作为召回率和模型复杂度之间的良好折衷。
-
坐标预测:在这里作者虽然引入了Faster R-CNN中类似的anchor,但是作者并没有像其意义,对bbox中心坐标的预测是基于anchor坐标的偏移量得到的,而是采用了v1中预测anchor中心点相对于对于单元格左上角位置的偏移,如下图:
-
损失函数:
-
Darknet19: 与v1不同采用的是全卷积网络,取掉了v1中的全连接层,改用全局平均池化,去掉v1中最后一个池化层,增加特征的分辨率。网络共19个卷积层,5个最大池化层,具体结构见下图
-
训练图像分辨率:v1在ImageNet上预训练时用的224x224尺寸的图片,正式训练时用448x448,这需要模型适应新的分辨率。YOLOv2是直接使用448x448的输入训练,随着输入分辨率的增加,模型提高了4%的mAP。
-
使用了WordTree:通过WordTree来混合检测数据集与识别数据集之中的数据,使得这一网络结构可以实时地检测超过9000种物体分类。
-
联合训练算法:使用这种联合训练技术同时在ImageNet和COCO数据集上进行训练。YOLO9000进一步缩小了监测数据集与识别数据集之间的代沟。联合训练算法的基本思路就是:同时在检测数据集和分类数据集上训练物体检测器(Object Detectors ),用检测数据集的数据学习物体的准确位置,用分类数据集的数据来增加分类的类别量、提升健壮性。分类信息学习自ImageNet分类数据集,而物体位置检测则学习自COCO检测数据集。
-
多尺度训练:为了提高模型的鲁棒性,在训练的时候采用了多尺度的输入进行训练,由于网络的下采样因子是32,故输入尺寸选择32的倍数288,352,...,544
-
多尺度检测,reorg层:作者将前一层的26*26的特征图做一个reorg操作,将其变成13*13但又不破坏其大特征图的特征,然后和本层的13*13的1特征图进行concat。
-
Batch Normalization:使用Batch Normalization对网络进行优化,让网络提高了收敛性,同时还消除了对其他形式的正则化(regularization)的依赖。通过对YOLO的每一个卷积层增加Batch Normalization,最终使得mAP提高了2%,同时还使model正则化。使用Batch Normalization可以从model中去掉Dropout,而不会产生过拟合。
YOLOv3
改进点
-
网络:Darknet53,采用简化的residual block 取代了原来 1×1 和 3×3的block; (其实就是加了一个shortcut,也是网络加深必然所要采取的手段)。这和上一点是有关系的,v2的darknet-19变成了v3的darknet-53,为啥呢?就是需要上采样啊,卷积层的数量自然就多了,另外作者还是用了一连串的3*3、1*1卷积,3*3的卷积增加channel,而1*1的卷积在于压缩3*3卷积后的特征表示。
-
分类损失:在YOLOv3中,每个框用多标签分类来预测边界框可能包含的类。该算法将v2中的softmax替换成了逻辑回归loss,在训练过程中使用二原交叉熵损失来进行类别预测。对于重叠的标签,多标签方法可以更好的模拟数据。
-
跨尺度预测:YOLOv3采用多个尺度融合的方式做预测。原来YOLOv2中有一个层叫:passthrough layer,假设最后提取的特征图尺度是13*13,那么这个层的作用就是将前面一层的26*26的特征图和本层13*13的特征图进行连接,有点像ResNet。这样的操作是为了加强YOLO算法对小目标检测的精度。在YOLOv3中,作者采用了类似与FPN的上采样和融合做法(最后融合了3个尺度,其他2个尺度分别是26*26和52*52),在多给尺度的特征图上做预测,对于小目标的提升效果还是非常明显的。虽然在YOLOv3中每个网格预测3个边界框,比v2中的5个要少,但v3采用了多个尺度的特征融合,所以边界框的数量也比之前多很多。
与其他网络对比
-
mAP和相同GPU下的单张图片所需时间
-
Darknet53与其他backbone对比(256×256的图片,并进行单精度测试。运行环境为Titan X)
尝试,但效果不好的工作
-
Anchor box坐标的偏移预测。作者尝试了常规的Anchor box预测方法,比如利用线性激活将坐标x、y的偏移程度预测为边界框宽度或高度的倍数。但发现这种做法降低了模型的稳定性,且效果不佳。 用线性方法预测x,y,而不是使用逻辑方法。我们尝试使用线性激活来直接预测x,y的offset,而不是逻辑激活,还降低了mAP。
-
focal loss。我们尝试使用focal loss,但使我们的mAP降低了2%。 对于focal loss函数试图解决的问题,YOLOv3从理论上来说已经很强大了,因为它具有单独的对象预测和条件类别预测。因此,对于大多数例子来说,类别预测没有损失?或者其他的东西?我们并不完全确定。
-
双IOU阈值和真值分配。在训练期间,Faster RCNN用了两个IOU阈值,如果预测的边框与ground truth的IoU>0.7,那它是个正样本;如果在[0.3,0.7]之间,则忽略;如果和ground truth的IoU<0.3,那它就是个负样本。作者尝试了这种思路,但效果并不好。
总结
从6万用户评论中,选出23门全世界最好的CS免费课
GRE作文用AI打分,已经20周年了:AI给中国考生的分数,远高于人类打分
本篇文章来源于: 深度学习这件小事
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
内容反馈