版本 | 作者 | 时间 | 备注 |
---|---|---|---|
V1.0.0 | Zhe Chen | 2021.1.27 | YOLO系列学习笔记 |
文章目录
- 前言
- YOLO
-
- YOLOv1-开山之作
- YOLOv2-Better,Faster,Stronger
-
- 性能对比
- YOLOv2中的各种尝试 -- Better
-
- Batch Normalization(批量归一化)-- improve 2% in mAP
- High Resolution Classifier(更好分辨率的分类器)-- improve 4% in mAP
- Convolutional with Anchor Boxes(引入anchor)
- Dimension Clusters(维度的集群)
- Direct location prediction(方向位置预测) -- improve 5% in mAP
- Fine-grained features(细粒度特性) -- improve 1% in mAP
- Multi-scale training(多尺度训练)
- YOLOv2中的各种尝试 -- Faster
- YOLOv2中的各种尝试 -- Stronger
- 总结
- YOLOv3 -An Incremental Improvement(做大做强,再创辉煌)
- YOLOv4
- YOLOv5
- 总结
- 参考文献
前言
什么是目标检测?
**目标检测 **的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核心问题之一。由于各类物体有不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测一直是机器视觉领域最具有挑战性的问题。
计算机视觉中关于图像识别有四大类任务:
- 分类-Classification:解决“是什么?”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标。
- 定位-Location:解决“在哪里?”的问题,即定位出这个目标的的位置。
- 检测-Detection:解决“是什么?在哪里?”的问题,即定位出这个目标的的位置并且知道目标物是什么。
- 分割-Segmentation:分为实例的分割(Instance-level)和场景分割(Scene-level),解决“每一个像素属于哪个目标物或场景”的问题。
目标检测中的核心问题?
除了图像分类之外,目标检测要解决的核心问题是:
-
目标可能出现在图像的任何位置。
-
目标有各种不同的大小。
-
目标可能有各种不同的形状。
如果用矩形框来定义目标,则矩形有不同的宽高比。由于目标的宽高比不同,因此采用经典的滑动窗口+图像缩放的方案解决通用目标检测问题的成本太高。
基础知识
- IoU(Intersect over union): 交并比。指目标预测框与真实框的交集和并集的比例。后续的CIoU、DIoU、GIoU都是IoU的变种优化。
- mAP(mean Average Precision): 所有类别的平均精度求和除以所有类别。
YOLO
目标检测架构分为两种,一种是two-stage(R-CNN),一种是one-stage(YOLO),区别就在于 two-stage 有候选框提取(region proposal) 过程,类似于一种海选过程,网络会根据候选区域生成位置和类别,而 one-stage 直接从图片生成位置和类别。
相对于R-CNN系列的"看两眼"(候选框提取与分类),YOLO只需要Look Once。YOLO统一为一个回归问题,而R-CNN将检测结果分为两部分求解:物体类别(分类问题),物体位置即bounding box(回归问题)。
YOLO的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别。
之前刚开始接触物体检测算法的时候,老是分不清deep learning中,物体检测和图片分类算法上的区别,弄得我头好晕,终于在这篇paper上,看到了解释。
物体检测和图片分类的区别:图片分类不需要定位,而物体检测需要定位出物体的位置,也就是相当于把物体的bbox检测出来,还有一点,物体检测是要把所有图片中的物体都识别定位出来。
YOLO
YOLOv1-开山之作
统一检测
作者将目标检测的流程统一为单个神经网络。该神经网络采用整个图像信息来预测目标的bounding boxes的同时识别目标的类别,实现端到端实时目标检测任务。
- 将一幅图像分成SxS个网格(grid cell),如果某个object的中心 落在这个网格中,则这个网格就负责预测这个object。
- 每个网络需要预测B个BBox的位置信息(x, y, w, h)和confidence(置信度)信息,一个BBox对应着四个位置信息和一个confidence信息。confidence代表了所预测的box中含有object的置信度和这个box预测的object有多准的两重信息:
而YOLOv1中的S=7, B=2, Pascal VOC有20个类别标签,C=20,所以最终的预测是一个7×7×30的张量。
网络结构
YOLOv1采用卷积神经网络,开始由卷积层提取图像特征,全连接层预测输出概率。模型结构类似于GoogleNet,如图3所示。作者还训练了YOLO的快速版本(fast YOLO)。Fast YOLO模型卷积层和filter更少。最终输出为7×7×30的tensor。
训练方法
作者采用sum-squared error为目标函数来优化,下图为总的loss训练:
作者在PASCAL VOC2007和PASCAL VOC2012数据集上进行了训练和测试。训练135轮,batch size为64,动量为0.9,学习速率延迟为0.0005. Learning schedule为:第一轮,学习速率从0.001缓慢增加到0.01(因为如果初始为高学习速率,会导致模型发散);保持0.01速率到75轮;然后在后30轮中,下降到0.001;最后30轮,学习速率为0.0001.
作者还采用了dropout和 data augmentation来预防过拟合。dropout值为0.5;data augmentation包括:random scaling,translation,adjust exposure和saturation。
- 这里有一个小的细节问题:作者为什么设置定位损失的宽和高为开根号的平方和呢?
这里,作者用到了一个trick,稍微缓解了yolo对大目标和小目标检测精度的平衡。这就是后续作者要进行改进的地方。
预测
对于PASCAL VOC数据集,模型需要对每张图片预测98个bounding box和对应的类别。对于大部分目标只包含一个box;其它有些面积大的目标包含了多个boxes,采用了Non-maximal suppression(非最大值抑制)来提高准确率。
- NMS(非最大值抑制): 抑制目标框中的重合框。目的就是要去除冗余的检测框,保留最好的一个。
缺点
- YOLOv1的每一个网格只预测两个Boxes和一个类别,这导致了模型对相邻近的目标预测准确率下降。因此YOLOv1对成群结队的目标(比如:一群鸟)识别准确率较低。
- YOLOv1是从数据中学习预测bounding boxes,因此,对新的尺寸或者不常见角度的目标无法识别。
- YOLOv1的loss函数对small bounding boxes 和large bounding boxes的error平等对待,影响了模型识别的准确率,因此yolov1对小目标检测不适用。
- 所有的误差来源是来自定位不准确的原因。
效果比对
如表4-1所示,在准确率保证的情况下,YOLO速度快于其它方法,下表 PASCAL VOC 2007数据集测试
总结
- YOLOv1每个小方格只能预测一类物体,对于小目标检测很难。
- 在损失函数中,对小物体变化的置信度和大物体变化的置信度惩罚相同,实际小物体变化应该加大惩罚。
- YOLOv1在2007+2012上训练,mAP为63.4%,45fps。
- Faster R-CNN ZF在2007+2012上训练,mAP为62.1%,18fps。
- YOLOv1比Faster R-CNN有更多的定位错误。
- YOLOv1比Faster R-CNN有更少的背景错误。
- YOLOv1具有一定的鲁棒性,具有普适性,可以适用于实时目标检测。
YOLOv2-Better,Faster,Stronger
性能对比
从测试效果来看,YOLOv2在当时主流框架的对比下,生命力还是很强的。
YOLOv2中的各种尝试 – Better
Batch Normalization(批量归一化)-- improve 2% in mAP
批量归一化使得在收敛方面得到了显著改进,同时消除需要其他形式的正则化。通过对YOLO中所有卷积层添加批量归一进行标准化,我们在mAP上得到了超过2%的改进。批量正常化也有助于使模型规范化。使用批量归一化,我们删除dropout,也可以防止过度拟合。
High Resolution Classifier(更好分辨率的分类器)-- improve 4% in mAP
- YOLO1中的输入尺寸是224×224,
- YOLO2中采用448×448,可以得到4%的mAP提升。
Convolutional with Anchor Boxes(引入anchor)
- YOLO1中采用bounding box通过卷积层直接得到坐标。
- YOLO2中采用预测anchor offset能够简化这个问题,使得网络更容易去学习。
- 不采用Anchor时,得到69.5mAP和81% recall;采用anchor时,得到69.2mAP和88% recall。虽然mAP有一定的下降,但是召回率有7%的提升。
Dimension Clusters(维度的集群)
采用k-means聚类的方法来获得anchor的个数。
Direct location prediction(方向位置预测) – improve 5% in mAP
-
作者发现:如果直接采用anchor boxes的方式运用到yolo时,模型会很不稳定,因为没有对 t x 和 t y t_x和t_y tx和t