【零基础保姆级教程】零基础如何快速进入YOLOv5/v7的科研状态?

本文主要介绍以下几点:

如何寻找合适的数据集。

训练YOLOv5/v7的注意点和易错点。

对比实验的选择。

可用指标的选择。

一、寻找合适自己现有计算资源的合适的数据集

相信大家拥有的资源肯定不一样。有的人或许用的是CPU训练,有的人用的是笔记本LAPTOP训练,显存大部分本科生拥有的电脑应是在4G-8G左右,因此如何选择合适的数据集适配自己的设备是很重要的。

大家确定好自己研究的方向后,选择适合自己的数据集,一般我们对于数据集的选择有两种方式。

1.网上寻找官方开源数据集。

常用的开源数据集地址:

开放数据集-飞桨AI Studio星河社区

和鲸社区 - Heywhale.com

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?

更多文章产出中,主打简洁和准确,欢迎关注我,共同探讨!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值