YOLOv5代码注释版更新啦,注释的是最近的2021.07.14的版本,且注释更全
github: https://github.com/Laughing-q/yolov5_annotations
Backbone
Focus: 网络第一层进行 pixel un-shuffling而不是stride=2的卷积;该模块的设计主要是减少计算量加快速度;
作者原话:https://github.com/ultralytics/yolov5/issues/847
Focus() module is designed for FLOPS reduction and speed increase, not mAP increase.
Also designed for layer count reduction. 1 Focus module replaces 3 yolov3/4 layers.
SPP: 分别采用5/9/13(v5.0采用3/5/7)的最大池化,再进行concat融合,提高感受野;
BottleNeckCSP/C3: Cross Stage Partial Networks,减少计算量,提高卷积神经网络学习能力;
具体网络结构可以查看:Yolov5网络结构
Detection (YOLO) layer
Anchor: 根据超参数中的hyp[‘anchor_t’]来检查默认anchor与数据集标签的契合度,如果<0.98,则根据数据集标签进行聚类重新获得anchor;
默认anchor如下:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/3
v5.0:
anchors:
- [ 19,27, 44,40, 38,94 ] # P3/8
- [ 96,68, 86,152, 180,137 ] # P4/16
- [ 140,301, 303,264, 238,542 ] # P5/32
- [ 436,615, 739,380, 925,792 ] # P6/64
参考:https://github.com/ultralytics/yolov5/issues/471
边框回归: 在进行边框回归 筛选样本对应anchor的时候,就是通过hyp[‘anchor_t’]来筛选,而不是iou;
新的边框回归方式:
标签分配
每个网格除了回归中心点在该网格的目标,还会回归中心点在该网格附近周围网格的目标,
grid(i, j)也会回归grid(i, j+1),grid(i, j-1),grid(i+1, j),grid(i-1, j)中的部分框,如下图中红色部分,
这也契合了上面的边框回归中心点的范围为-0.5~1.5;
笔者尝试过如果改成grid(i, j)仅回归中心点在grid(i, j)的目标(边框回归范围依旧是0.5~1.5),
召回率会下降,准确率会上升,但总体map会下降,也就是说yolov5的标签分配应该会带来一定的map提升,
毕竟一个目标采用了更多的anchor去回归,召回率提高也是有道理的;
(当然笔者只是在自己的数据集上简单的实验了一下)
代码:
off