先说些题外话,YOLOv5没有论文,其作者是Mosaic Augmentation 的创造者,YOLO V5 在性能上稍弱于YOLO V4,但是在灵活性与速度上远强于YOLO V4,在模型的快速部署上具有极强优势。相对于YOLOv4,分别从以下三个方面简析YOLOv5的改进:
1.1 Data Augmentation主要采用的是Mosaic数据增强 其做法就是对图片使用随机缩放、随机裁剪、随机排布的方式进行拼接。优点是丰富了检测物体的背景和小目标,并且在计算Batch Normalization的时候一次会计算四张图片的数据,使得mini-batch大小不需要很大,一个GPU就可以达到比较好的效果。 1.2 自适应锚框计算 在YOLOv3和YOLOv4中,都需要提前通过K-means聚类的方法计算出anchor,此anchor是固定的。但是在YOLOv5中,虽然也提前设置了anchor,但是在训练时可以自适应的计算不同训练集中的最佳anchor,从而更新anchor值。此功能也可以手动关闭,在train.py中更改,设置为False即可。 1.3 自适应图片缩放 在常用的目标检测算法中,不同的图片长宽都不相同,因此常用的方式是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。比如Yolo算法中常用416×416,608×608等尺寸,比如对下面800*600的图像进行变换。 但Yolov5代码中对此进行了改进,也是Yolov5推理速度能够很快的一个不错的trick。作者认为,在项目实际使用时,很多图片的长宽比不同。因此缩放填充后,两端的黑边大小都不同,而如果填充的比较多,则存在信息冗余,影响推理速度。 因此在Yolov5代码中datasets.py的letterbox函数中进行了修改,对原始图像自适应的添加最少的黑边。 2. Backbone 2.1 Focus结构 2.2 CSP结构 Yolov4网络结构中,借鉴了CSPNet的设计思路,在主干网络中设计了CSP结构。 Yolov5与Yolov4不同点在于, Yolov4中只有主干网络使用了CSP结构 ,而 Yolov5中设计了两种CSP结构,以Yolov5s网络为例,以CSP1_X结构应用于Backbone主干网络,另一种CSP2_X结构则应用于Neck中。 3. Neck Yolov5现在的Neck和Yolov4中一样,都采用FPN+PAN的结构,但在Yolov5刚出来时,只使用了FPN结构,后面才增加了PAN结构,此外网络中其他部分也进行了调整。 但如上面CSPNet中讲到, Yolov5和Yolov4的不同点在于,Yolov4的Neck中,采用的都是普通的卷积操作。而Yolov5的Neck结构中,采用借鉴CSPNet设计的CSP2结构,加强网络特征融合的能力。 4. prediction 4.1 Bounding box 损失函数 YOLOv5中Bounding box的损失函数提供了IOU、GIOU、DIOU、CIOU,目前效果最好的是CIOU,如果有兴趣的可以试试去年新出的alpha-IOU,这是在CIOU的基础上进行改进的。 4.2 NMS YOLOv5提供了多种NMS,例如weight-nms,diou-nms,soft-nms等,这些在一定程度上都可以解决遮挡问题,但是可能会带来一些推理时延。YOLOX也是使用了NMS,一开始YOLOX的作者使用的是end2end方式(即无nms),最后发现会掉点。 5. Yolov5四种网络结构的不同点 Yolov5代码中的四种网络,和之前的Yolov3,Yolov4中的cfg文件不同,都是以yaml的形式来呈现。 而且四个文件的内容基本上都是一样的,只有最上方的depth_multiple和width_multiple两个参数不同。