前言
本文是博主整理的学习笔记,不是yolo讲解文章,适合有一定yolo基础的同学复盘学习。
长文预告,多图预告。
yolo主要关注两个检测指标:mAP和速度。
mAP:综合衡量检测效果,包括精度和recall(召回率)等,是精度和recall的交点与原点形成的矩形的面积。
召回率:有多少框被检测到了(查全率)
精度:iou(查准率)
精度和召回率互相矛盾,一个高,另一个就低。所以就直接用mAP一个指标了。其实就是iou的阈值设置的原因。
yolo的口号:速度第一,mAP第二。
整个yolo系列,在预测时的速度都是极快的,满足端到端的需求。
YOLOV1
yolov博主学习的较早,这次学习yolo系列没有重点关注这一部分,需要的同学可以移步这里。
网络结构
卷积+全连接
注意,在v1版本中还是有全连接层的,这无疑对输入图像的维度形成了限制,让我们看看后面都是怎么改进的。
指标
速度:45fps;
mAP:63.4
YOLOV2
v2的改进:
让我们具体到每一行的指标去看看。
网络结构
- 加入了Darknet(19,大小可选),输入是416,32×13,奇数13是为了方便定位中心点
- 去掉了全连接;
- 用了5次降采样(/32)
- 采用了1×1.
聚类提取先验框
不按照预先定义的好长宽比例,而是从coco数据集(或自己的数据集)中聚类出5类比例,使用k-means,聚类距离使用的是1-iou。
Batch Normalization
在yolov2中,已经舍弃了全连接层,因此也舍弃了dropout。每一个卷积层都加bn。
高分辨率输入
224改成448,更接近实际图像。
Anchor Box
数量:1313n。这个是为啥?不应该是32吗 v2的网格到底多大,不管它了。想通了。经过5次降采样,剩下的维度就是13×13了,就相当于网格是13×13.
mAP没有提升(微降),但召回率大大提升。
两人最好的人参加比赛,比派十个人去平均成绩更好。但多派人能覆盖更多项目。
Directed Location Prediction(坐标映射与还原)
目的:位置微调,预测偏移量。
方法:限制偏移量,防止在训练的时候它不收敛飘了。使用的相对于网格的偏移量,是一个相对位置。这样怎么飘都飘不出这个格子。
σ \sigma σ是为了回归到[0-1],红色的点是网格位置(cx,cy)pw,ph是原始的宽高等比例缩小后的(/32)
我的理解:预测值都是预测的偏移量。位置偏移,宽高偏移。bw,bh得到的是偏移后的相对网格的大小,还原。
YOLOV3
yolo原作者更新到v3就跑路了。其实是因为他看到yolo被美国军方使用,心里不好受,同时也觉得yolo完成了它的历史使命了。
v3最大的改进就是网络结构,v2是哪个地方都试试。
v3的极度凡尔赛,把自己画到了象限外。
多尺度(scale)
yolo的大改进终于来了,之前对小目标检测效果一直不好,这不,针对小目标的多尺度它就来了。
大中小3×3=9种候选框。网格大小分别是:52.26.13.
在多尺度时使用了特征融合,
Resnet
resnet在网络结构里对应的是shortcut层,注意在v3的网络机构里,shortcut层对应的相加的操作,也就是维度不会有任何改变,是数值上的改变。而route层是拼接的操作,是数值不变,维度相加。
softmax->logistic
因为考虑到多类别时有些物体可能同时属于多类,比如既属于狗,又属于哈士奇。
此时用softmax不大合适,改为对每个类别都判断一个二分类(是与不是)
网络结构
darknet53(就是resnet卷积)
不用池化了,用stride=2的下采样。
YOLOV4
yolov4的作者不是原作者(但是得到了原作者的认可),在4版本没有什么原创内容,但带来的效果比原创更好。作者融合了当下最前沿的一些算法,把效果好的能试的都试了,融合在了网络里。是一个集大成者。
这个图和v3一样,还是学到了原作者的精髓。
v4的两大核心改善:数据层面和网络结构层面。
Bag of Freebies(BOF)
只增加训练成本,不影响推理速度。如:
- 数据增强,v4用到了很多数据增强方法;
- 网络正则化:dropout、dropblock;
- 类别不平衡的损失函数设计。
马赛克数据增强
参考了cutmix
dropblock
直接吃掉一个区域,增加游戏难度.
labelsmothing-标签平滑
[0,1]—>[0.05,0.95]
使用之后的效果,类间间距更大,类内更密集
iou-giou-diou-ciou损失
(1)iou损失
1-iou
问题:不相交的时候iou=0,而且相同的iou也对应着多种情况,网络学习方向不强。
(2)giou损失
做了一个大框,包裹住两个小框,就是图中的C,然后在1-iou的基础上再加上一个相对于大框的损失
但是当原本的一个框本来就在另外一个框里面时就失灵了。
(3)diou
直线距离优化,速度更快,并且解决了giou的问题。
(4)ciou
这个是yolov4最终采用的损失,在diou的基础上,又加了一项宽高比损失。
综合考虑了重叠面积、中心距离、宽高比
soft-nms(diou-nms)
之前yolo用的nms都太生硬了,soft-nms就是对那些和高分框重合度较高的anchor并没有直接杀死,而是下调了得分,然后它又有资格参与计算了。最终会显示出来吗?这个暂时没弄清。
Bag of specials(BOS)
稍微增加推算代价,但能提高模型精度。如:
- 注意力机制
- 特征金字塔(spp)
- 网络细节设计
- 激活函数
SPPNet(spatial pyramid pooling)
在v3中为了更好得满足不同的输入大小,需要在训练的时候改变输入数据的大小。
spp就是用最大池化满足最终输入特征一致。
可以增加感受野。
CSPNet* 核心
将特征图的channel分成两部分,一部分正常走流程,一部分直接拉后面concat,速度会更快,精度不下降。
SAM(CBAM)注意力机制
CBAM是卷积 block attention module,嵌在卷积中的注意力 ,长这样
假设有一个32×32×256的特征层:
channel注意力就是从256个特征图出发,加一些权重,注意一下哪些是重要的,哪些不重要。有点类似一个256个类别的softmax。
spatial注意力就是从32出发,注意空间上哪些地方重要。是空间位置上的注意力。
v4中用的是SAM是空间(spatial)注意力机制,也就是阉割版的CBAM,一切为了速度。
并且,v4也对SAM阉割了,直接删去了pooling,上卷积,得到一个概率参数,然后相乘就完事了。
PAN(path aggregation network)
FPN开始讲起。看这个图,想要提取特征,用了resnet,p2-p5提取的是不同层次的特征。为了融合不同层次的特征,fpn中是自顶向下流动。橙色箭头。
但是这是一个单向的流动,就像是只有大领导问小破民有没有什么困难啊,但是小破民不能向上打报告的那种感觉。
而PAN就是建立了这种双向机制,既可以从p5到p2,也可以从p2到p5.但是从时间成本上,另一条路径并不会经过resnet,而是直接走了捷径,也就是绿色的这条路。
v4中用的PAN又做了一点小改变,上上个图中的那个红色圆圈,是不同层的特征融合,以直接相加的方式,而v4决定使用直接拼接的方式而不是相加。感觉没多大变化
Mish激活函数
relu有点太绝对了,mish更符合实际情况。感觉就是把leaky relu做的更丝滑了
但是计算量确实增加了。
对底层没发挥好的特征没有一棒子打死,而是给一个微小的改过自新的机会。
网络架构
总结:yolov4大的改变没有,但小的改变非常多。并且单gpu也能训练得很好。
YOLOV5
v5版本与前四个版本都不一样,前四个都是偏学术的论文版本,v5没有论文,是一个更偏工程化的代码,相当于是从工程上对yolov4更好的实现.