Yolo系列
Yolo系列算是目标检测领域的常青树了,从v1到最近的v9,一直都在不断迭代,不断改进,但是细看其各代网络的发展,其实还是有很多一脉相承之处以及算法设计偏好的,总结主要为以下几个方面:
- 网络结构
- 预处理 & 后处理
- 损失函数
- anchor算法:如何将目标检测做成端到端一阶段算法的关键
Yolov1
网络结构
第一代yolo,DarkNet作为backbone,没有neck和backbone部分。
划分grid & anchor
yolov1提出了划分网格来实现目标检测的方案,将一张图片划分为 S × S S\times S S×S个网格,每个网格负责预测中心点在该网格内的目标。
anchor就类似于之前目标检测算法中的待检测框,之前的目标检测算法是使用region proposal来提取待检测框,yolo系列则是使用提取预设好的anchor。yolov1每个grid有5个anchor,在yolov1中称为boundingbox,yolov1中是直接预测bbox的长宽,并没有预设anchor的尺寸。
也有说每个grid预测两个boundingbox的,模型版本不同,参数也可能有变化,这不是重点,重点是这种思想。
正负样本处理 & 损失函数
对于每个grid来说,如果有ground truth的,与GT的IOU最大的框为正样本,其余为负样本,至于正负样本数量不平衡问题,令损失函数中正负样本的损失添加不同的系数。
yolov1把目标检测当作回归问题,所以其损失函数为:
预处理 & 后处理
Yolov1没有预处理,如果说resize也算预处理的话,那就有预处理。
Yolov1的后处理就是将输出的结果进行NMS非极大值抑制,剔除重复的框。
Yolov2
yolov2的主要贡献:
- 在模型中添加了BN层【关于BN层可以看之前的blog:BN层详解】
- 引入了Anchor机制,使用聚类算法来预设Anchor的尺寸,v1中直接预测bbox的宽高,v2中挑一个IOU最大的anchor作为bbox,预测bbox左上角角点的偏差,同时对anchor的宽高进行微调。
正负样本处理 & 损失函数
IOU小于阈值的,统统作为负样本,只考虑置信度误差,IOU最大的,同时考虑置信度误差,类别误差,以及定位误差。和v1一样,同样采用在正负样本前加上参数的方式来平衡正负样本误差。
Yolov3
又是比较经典的一代,主要贡献:
-网络结构基本定型,形成backbone+neck+head的结构,采用darknet-53作为backbone,同时生成三种特征图用于提取不同尺度上的特征。
正负样本 & 损失函数
不再使以grid来负责物体的预测,但是还用grid来分配anchor,只不过计算IOU的时候GT会对所有的anchor都计算IOU,找到一个IOU最大的作为正样本,对于IOU小于阈值的作为负样本,其余的都忽略不算loss。loss的计算依旧是使用正负样本分别添加系数,负样本只计算置信度,正样本计算置信度,类别误差和坐标误差。不过由于三个特征图,所以loss是三个特征图的loss之和。
Yolov5
最经典,最常用的一代,网络结构讲解可以看之前的blog:yolov5
主要贡献:
- 采用bottleneck结构,有效降低计算量
- 采用CSP结构,降低计算量和内存瓶颈,增加梯度路径
- 采用SPP结构,图像金字塔池化,实现全局特征和局部特征的融合
- 采用了FPN结构,图像金字塔,小目标精度更好
- 采用PANet结构【6.0版本后加的】,可以做图像分割。
正负样本处理 & 损失函数
yolov5的正负样本处理相较于v3做了很大改进,提高了正样本的数量。
yolov5中的正样本选择不再使用最大IOU规则,而是先根据shape将GT分到不同的特征层,根据GT的宽高比,将该GT分配到一个特征层,该层内GT中心点所在的grid以及附近的两个grid都负责预测该GT,这三个grid的anchor都作为正样本,其余作为负样本。
xywh的损失采用了CIOU损失,IOU的发展路程可以看:IOU那点事儿
类别和置信度的损失采用了BCEloss,也就是交叉熵损失
所谓经典,其实也不是说他们的效果比别的模型有多出众,而是他们开箱即用,不断更新,更能吸引更多人来使用并不断迭代,这才是为什么yolov3和yolov5一直这么火,这两个是一家公司ultralytics做的,他们实现的yolov5被称为u版,目前已经迭代到了7.0版本。
模型的改进可以分为两点,第一点是对模型本身的改进,也就是结构的改进,第二点是对于整个工程来说,trick的使用和改进,也就是超参的选择方式等,yolov5的模型改进不多,trick改进很多。