本文主要介绍以下几点:
如何寻找合适的数据集。
训练YOLOv5/v7的注意点和易错点。
对比实验的选择。
可用指标的选择。
一、寻找合适自己现有计算资源的合适的数据集
相信大家拥有的资源肯定不一样。有的人或许用的是CPU训练,有的人用的是笔记本LAPTOP训练,显存大部分本科生拥有的电脑应是在4G-8G左右,因此如何选择合适的数据集适配自己的设备是很重要的。
大家确定好自己研究的方向后,选择适合自己的数据集,一般我们对于数据集的选择有两种方式。
1.网上寻找官方开源数据集。
常用的开源数据集地址:
Find Open Datasets and Machine Learning Projects | Kaggle
以上的数据集能满足大部分同学需求,我们不多赘述。
2.自己制作数据集。
自己制作数据集比较麻烦,需要先在网络寻找/或购买对应图片,再针对图片进行标注。目前大多数是人工标注,现有的半自动标注软件也不是很好用。本文不多赘述,重点讲述公开数据集的测试。
3.何为合适的数据集?
新冠疫情时,我们说对于疫情的口罩检测会更合适写故事。同理,选择合适的数据集有助于大家对论文的前两个(背景、相关工作部分)会有所帮助。常见的热点比如航空、医学、农业、工业等数据集都是很不错的选择。
4.数据集的数量为多少最为合适?
太少的图片数量训练时若你设置的epoch较小,则会导致曲线不是很平缓,同时太小的小数据集说服力并不强,大家根据自己的设备选取数据集时需要选取合适的数据集,数量一般在600张以上为好。这里的600张也是比较少的数量,所以大家还可以用多个小数据集拼接在一起,只要符合你的研究目的即可。
二、训练YOLOv5/v7时需要注意什么?
1.最好固定随机数种子,使得数据可以复现
固定随机数种子可能会导致采用的CUDA加速算法没有固定前快,对于显存的占用也可能会更大,但好处就是可复现,不需要你多次测试取平均值。此外,笔者有发现开启workers在某些情况会导致数值随机,但随机的范围是很小的,这点给同学们参考。
以下是固定随机数种子的方法:
在你配置好的YOLOv7项目文件下的utils,打开general.py,在首部加入以下代码
import pkg_resources as pkg
def check_version(current='0.0.0', minimum='0.0.0', name='version ', pinned=False, hard=False, verbose=False):
# Check version vs. required version
current, minimum = (pkg.parse_version(x) for x in (current, minimum))
result = (current == minimum) if pinned else (current >= minimum) # bool
return result
def set_seeds(seed=0, deterministic=False):
# Initialize random number generator (RNG) seeds https://pytorch.org/docs/stable/notes/randomness.html
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed) # for Multi-GPU, exception safe
# torch.backends.cudnn.benchmark = True # AutoBatch problem https://github.com/ultralytics/yolov5/issues/9287
if deterministic and check_version(torch.__version__, '1.12.0'): # https://github.com/ultralytics/yolov5/pull/8213
torch.use_deterministic_algorithms(True)
torch.backends.cudnn.deterministic = True
os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8'
os.environ['PYTHONHASHSEED'] = str(seed)
接着在YOLOv7目录下打开train.py,最上方搜索init_seeds并改为set_seeds
ctrl+f搜索init_seeds,再定位到相应行,修改为
set_seeds(1, deterministic=True)
如下图
此时你只需要连续运行train.py两次,观察两次的前几个epoch各项数值是否一致即可。
2.(易错)激活函数的修改
采用YOLOv7-tiny训练的小伙伴,会发现你的yolov7-tiny.yaml的文件内采用的是LeakyReLU激活函数。
而默认的YOLOv7项目采用的是SiLU激活函数,因此我们需要:
打开YOLOv7项目下的models文件夹,打开common.py文件
ctrl+f搜索self.act = nn.
定位到如下图
修改为LeakyReLU激活函数即可,如下图/代码。
self.act = nn.LeakyReLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
除此之外yaml中的激活函数也需要修改,若你的yaml中是引入SiLU,则其优先级高于common.py设置的激活函数,所以若没有修改激活函数的必要,建议将yaml中的激活函数部分删掉。
3.自动锚框文件的修改
打开YOLOv7项目下的utils文件夹,打开autoanchors.py文件
ctrl+f找到def kmean_anchors,修改为自己对应数据集的配置文件。
这一步采用的是Kmeans聚类算法获得新锚框的算法,笔者在大部分时候测试结果都不尽人意。
其实其在你不修改检测头、锚框数量和尺寸大小时是不会启用它的。
三、我们训练结束需要关注什么?
对于目标检测训练,YOLOv5/7一般会产出这五个指标。
Precision、Recall、Map@0.5、Map@0.5:.95,F1分数。
我们需要改进模型前后主要看的是以下这几个指标、曲线,能够帮助我们了解模型性能的好坏,以及其优越性的来源。同时,也是论文中必须叙述的部分。
1. Precision
2.Recall
3.Map@0.5
4.Map@0.5:.95
5.F1分数
6.NMS
7.GFLOPS
8.FPS
9.ROC
10.AUC
还有的同学可能会采用COCO指标,根据需要搜索了解即可,这些也是写论文可能需要的。
四、可用的对比试验有哪些?
笔者建议再确定好研究方向时,可以先测自己数据集的对比试验。经典且流行的对比试验有:
SSD、Faster-RCNN、YOLO系列(如YOLOv3、YOLOR、YOLOX)、RTMDet、GOLD-YOLO、YOLO-MS、PP-YOLO系列、DETR系列等。
有些同学采用CPU训练的也可测试MobileNetV1-3/One系列、PicoDet、GhostNet等。
五、消融实验怎么做?
比方说目前我的模型基于YOLOv5-6.0-s更换了原版的CIOU为SIOU,且更换SiLU激活函数为Mish激活函数,采用ASFYOLO改进颈部网络了。
消融实验则这样作:
ASFYOLO
ASFYOLO+Mish
ASFYOLO+SIOU
ASFYOLO+SIOU+Mish
YOLOv5-6.0-s+SIOU
YOLOv5-6.0-s+Mish
YOLOv5-6.0-s+SIOU+Mish
另外,此处是将颈部网络改进ASFYOLO,若是涉及到改进骨干网,例如将骨干网换成ResNet18,则可以视情况多测试几个不同的骨干网实验(主要是为了证明你换成ResNet18的效果好于34、50等,可以用于增加工作量)。
消融实验则这样作:
ResNet18
ResNet18+Mish
ResNet18+SIOU
ResNet18+SIOU+Mish
YOLOv5-6.0-s+SIOU
YOLOv5-6.0-s+Mish
YOLOv5-6.0-s+SIOU+Mish
替换YOLOv5-6.0-s为ResNet34(浅层网络)、ResNet50(深层网络)、VGG16、Darknet(YOLO系列的主干网如YOLOv3、v7等)
同学们根据以上步骤,即可测试好自己的baseline,明白自己的一个大体方向,进而为自己的模型修改做出依据。
下一篇文章:哪些创新点可以快速改进提升YOLO?
更多文章产出中,主打简洁和准确,欢迎关注我,共同探讨!