这篇文档主要介绍《基于 YOLOv8 的农田病虫害检测与分析》的代码实现部分,整篇论文的目的主要是改进 YOLOv8 的网络结构,使其在检测病虫害的精度和实时性上有所提升。接下来,我将介绍如何从零开始搭建起本项目。
# 安装 Python
到 python 的官方网站:https://www.python.org/ 下载,安装
安装完成后,在命令行窗口运行:python,查看安装的结果,如下图:
至此,Python 安装完成,接下来还需要安装 anaconda,这是一个 python 虚拟环境,特别适合管理 python 的环境。
# 安装 anaconda
到 anaconda 的官方网站:https://www.anaconda.com/download/success 下载,并安装:
安装成功后,会在开始菜单出现如下图所示:
anaconda 安装完成,接下来安装 pycharm,主要用来编写代码。
# 安装 Pycharm
学生可以申请教育版
支持,所有的软件安装完成。
# YOLOv8 目录结构介绍
首先介绍整个项目的目录:
和原来的 YOLOv8 相比,根目录新增一些训练的脚本和测试的脚本,比如 train.py 和 Detect.py,当然也可以直接通过命令行的方式来实现,两者效果都是一样的。
重点是 ultralytics/nn 目录,所有的改进模块都是在这里进行,在这里我新建了一个 Addmodules 的目录,里面是改进的各种模块,包括主干网络,颈部网络和检测头的改进。
需要修改的部分我都已经作了修改,不用再做其他的改动
还有一个重要的目录:ultralytics/cfg/models/Add,这里面放的都是 yaml 文件,其中改进的 yaml 文件都已经写好,不需要改动。
以下是一个 yaml 文件的示例,其它的都是类似的结构,只是参数不同:
# 安装项目的环境(非常重要)
环境配置非常重要,我当时配环境换了一周左右的时间,中间经历了各种报错,软件包不兼容的问题和显卡驱动匹配的问题,总之就是不好搞。为了方面复现工作,我已经把 anaconda 的环境导出为 environment.yml,位于项目的根目录里面,创建虚拟环境的时候直接使用就可以
# anaconda 虚拟环境
再 anaconda prompt 终端输入 conda env create -f environment.yml,就可以根据 environment.yml 文件创建虚拟环境,创建好后,通过 conda env list 查看环境是否存在,如下图所示就表明创建成功:
如果安装的时候出现 torch 相关的错误,大概率是你的显卡驱动和这里面的 torch 包版本不匹配,这个问题需要自行修改即可,网上关于这方面的资料很多。
# 使用虚拟环境
虚拟环境创建完成之后,就可以在 pycharm 中使用,点击右下角,切换 conda 环境,选择刚才创建的虚拟环境。如果到了这一步还没有报错的话,恭喜你,已经完成了 80% 的工作。
运行 Detect.py 脚本,测试检测效果,如果没有报错,接下来就是训练模型。
# 训练脚本 train.py
找到根目录的 train.py 文件,注释已经写的很清楚,如下图:
1 | import warnings |
model = YOLO (‘yolov8-HSFPN.yaml’),把里面的 yaml 文件换成自己的 yaml 文件,我这里用的是 yolov8-HSFPN.yaml,data=r’D:/Downloads/YOLOv8/datasets/data.yaml,同理,换成自己数据集的 yaml 文件,我这里的数据集是 yolo 格式。其它的参数可以按照自己的任务自行调整。
还有一个检测的脚本,Detect.py:
1 | import warnings |
同理,把 best.pt 换成你自己训练好的模型,source 里面输入检测图片的路径,运行该脚本就可以开始检测,结果保存在 runs/detect 目录。
# 开始训练
准备好数据集,最好是 yolo 格式的,我的数据集项目里自带了,不需要重新下载:
datasets 目录里面就是我的数据集:有 train,test,valid 三个目录,分别存放训练集,测试集和验证集的图像和标签:
准备这些之后,运行 train.py 文件,开始训练。如果报错的话,请自行上网查找,无非就是找不到数据集,某个包的版本不对,或者是 GPU 用不了,只能用 CPU。
# 训练结果
训练结果会保存在 runs/train 目录下,exp1,exp2,exp3 的顺序,表示每一次的训练结果。
上图就是训练完成后目录的结构,weights 目录里面就是我们需要的模型:best.pts 是效果最好的,最后也是需要这个,last.pt 是最后一次的训练结果。
# 总结
整个项目的改进工作我已经做好,复现的话只需装好对应的环境,修改 train.py 的参数,运行 train.py 就可以开始训练;修改 Detect.py 的参数,就可以检测。目前项目只针对检测任务,对于分割和分类没有做改进。
# 经验之谈
(1)以下为两个重要库的版本,必须对应下载,否则会报错
python == 3.9.7
pytorch == 1.12.1
timm == 0.9.12 # 此安装包必须要
mmcv-full == 1.6.2 # 不安装此包部分关于 dyhead 的代码运行不了以及 Gold-YOLO
(2)mmcv-full 会安装失败是因为自身系统的编译工具有问题,也有可能是环境之间安装的有冲突
推荐大家离线安装的形式,下面的地址中大家可以找找自己的版本,下载到本地进行安装。
https://download.openmmlab.com/mmcv/dist/cu111/torch1.8.0/index.html
https://download.openmmlab.com/mmcv/dist/index.html
(3)basicsr 安装失败原因,通过 pip install basicsr 下载如果失败,大家可以去百度搜一下如何换下载镜像源就可以修复
# 针对一些报错的解决办法在这里说一下
(1) 训练过程中 loss 出现 Nan 值.
可以尝试关闭 AMP 混合精度训练.
(2) 多卡训练问题,修改模型以后不能支持多卡训练可以尝试下面的两行命令行操作,两个是不同的操作,是代表不同的版本现尝试第一个不行用第二个
python -m torch.distributed.run --nproc_per_node 2 train.py
python -m torch.distributed.launch --nproc_per_node 2 train.py
(3) 针对运行过程中的一些报错解决
1. 如果训练的过程中验证报错了 (主要是一些形状不匹配的错误这是因为验证集的一些特殊图片导致)
找到 ultralytics/models/yolo/detect/train.py 的 DetectionTrainer class 中的 build_dataset 函数中的 rect=mode == 'val’改为 rect=False
1 | 2.推理的时候运行detect.py文件报了形状不匹配的错误 |
(4) 针对 yaml 文件中的 nc 修改
不用修改,模型会自动根据你数据集的配置文件获取。
这也是模型打印两次的区别,第一次打印出来的就是你选择模型的 yaml 文件结构,第二次打印的就是替换了你数据集的 yaml 文件,模型使用的是第二种。
(5) 针对环境的问题
环境的问题每个人遇见的都不一样,可自行上网查找。