YOLO学习笔记(自用)

YOLO原理

感谢江大白
YOLOv3:https://muzhan.blog.csdn.net/article/details/82660381
YOLOv4:https://blog.csdn.net/nan355655600/article/details/106246625
YOLOv5:https://blog.csdn.net/nan355655600/article/details/107852353

YOLOv5

安装

之前直接pip install -r requirement.txt安装的都是cpu版本的pytorch,这是因为默认下载都是cpu版本的,卸载了以后,cpuonly这个包还在,所以后面即使安装GPU版本的,也会变成cpu版本。正确的解决方法是:先在官网上找好GPU的安装指令,直接安装GPU-pytorch,然后pip requirement.txt里面的其他安装包。

detect.py 源码逐行解读
熟悉代码的推理思路,重点关注dt对应的三个过程:pre-process, inference, NMS。inference得到的pred中存储的是网络的检测头输出,需要经过NMS得到目标框的xywh+conf+label。
dt[2]对应的是NMS操作。首先注意的是,prediction返回的xywh+ obj_conf+cls_conf。conf = obj_conf * cls_conf,将conf置于[:,4]的位置上。然后需要将中心点的xywh转换成左上和右下点的xyxy。最后将box坐标、置信度得分和IOU阈值送入 torchvision.ops.nms。返回得是筛选出的box序号,筛选后的box送回detect.py中。

train.py 源码逐行解读
正样本扩增的代码解读正样本扩增的原理详解
这一步很重要,它将归一化后的bbox分别放大到三个特征图大小上,筛选掉与当前层anchor的长宽比超出阈值的bbox,剩下的进行正样本扩充。所有的这些样本将会一起与网络的输出p计算loss。

源码讲解YOLOv5网络结构
将网络结构分为backbone、neck和detect三部分,这里的图和江大白的图不太一样,这个图来看网络结构更加直观,后者的图更适合分析原理。

YOLOv5网络结构修改
这里提供了两个修改的范例:更改backbone和添加注意力机制。

YOLOX

安装
现在官方的YOLOX和教程里的版本不同,使用教程里的版本部署起来更简单一些。

YOLOX原理讲解
江大白在这部分的原理讲解十分清晰,基于YOLOv5的底子可以直接跳转到它的Decoupled Head介绍部分。在这里就解答了YOLOx和YOLOv5在prediction上的最大区别,前者是经过anchor-free和解耦检测头输出特征向量,后者是通过anchor-based输出特征图。前者的计算量更小,并且基于解耦头的检测对于obj,reg和cls都有所区分。解耦头的结构都比较简单,对于neck的三个输出特征图各设计检测头,将获得的特征向量cat起来。

SimOTA用于动态挑选正样本锚框。这篇博文里对于算法的讲解也是基于代码的,可以结合SimOTA源码讲解来看。SimOTA中的关键是将初筛后的候选框,计算cost和dynamic_k,动态挑选正样本,用于计算loss。

YOLOv6和v7部署起来bug都比较多,并且v6相较于YOLOX,也只是修改了CBL模块,所以后面就不详细看代码了,主要看YOLOX的代码,看懂SimOTA和解耦检测头,方便以后可以移植到其他网络中。数据增强手段,像是mosaic就看YOLOv5吧。

YOLOv6

YOLOv6原理讲解
主要更改了backbone和neck,用RepVGGBlock结构替代了原本的YOLOv5中的CSP模块;同时微微简化了YOLOX的检测头结构。YOLOv6的推理速度要比YOLOv5快很多。

YOLOv7

YOLOv7原理讲解
和v6的方向一样,YOLOv7也重点是在网络结构上进行修改。在backbone和neck部分用ELAN、MPConv代替CSP。检测头上还是使用得YOLOv5的anchor-based,没有加入解耦检测头,但是在标签匹配策略上,既加入了样本扩增策略,又加入了SimOTA。YOLOv7的匹配策略

YOLOv8

YOLOv8讲解
不愧是ultralytics公司的代码,应用起来非常友好。YOLOv8的主要改进体现在主干网络中C2f模块替代C3结构,解耦头的设计以及TaskAlignedAssigner正样本分配策略和新的loss。TaskAlignedAssigner是套用TOOD的样本分配策略,目的是找到分类精度高并且IOU高的anchor TOOD论文

把模型结构代码,检测头,loss函数走一遍。

猜你喜欢

转载自blog.csdn.net/smallbig12/article/details/129030076