1. 基础解读
detect/train.py中有DetectionTrainer类,继承自BaseTrainer类,并实现了诸如get_dataloader, get_model等接口。
setup_model接口用于准备模型,首先会检查self.model是否是torch.nn.Module,即已经是导入的模型。如果不是,检查当前从配置文件导入的模型是pt模型还是yaml模型。之后,会调用get_model接口进行模型的创建(包含load checkpoint)。
2. 配置
配置文件位于./ultralytics/yolo/cfg/default.yaml
(1)训练配置
在Train settings部分,配置model, data, model_save_dir,enable_log
和log_dir路径。分别表示训练的算法网络、数据路径、模型存储路径、是否开启日志和日志存储路径。
(2)推理、测试配置
在Prediction settings部分,配置
predict_model, source, result_dir,此外在Val/Test settings部分配置conf, iou等。
3. 运行记录
运行如下指令训练:
python3 ultralytics/yolo/v8/detect/train.py
(1)错误1
No module named 'ultralytics'
解决:
事实上,YOLOv8源代码中已经包含了ultralytics的一些东西,无需再安装,因此这个时候可以在ultralytics/yolo/v8/detect/train.py文件的起始位置加上如下代码即可。
import os
import sys
sys.path.append("/2T/001_AI/1003_YOLOv8/001_AL/001_YOLOv8")
(2)错误2:
遇到错误:No module named 'git'
解决:
pip3 install gitpython
(3)错误3:
No module named 'thop'
解决:
pip3 install thop
4. 按照示例代码运行
如果想使用官方代码直接运行,在解决完成上述问题后,直接运行如下代码即可。
python3 ultralytics/yolo/v8/detect/train.py
此时,终端打印如下:
5. 训练自己的数据
训练自己的数据时,需要根据自己的数据标注格式修改部分代码,主要是ultralytics/yolo/data/datasets/路径下的yaml文件,如添加VOC_Power48.xml。
在配置数据yaml文件之前,需要通过几个步骤预处理,获取train、val、test数据集。本处以VOC数据标注转coco数据格式进行举例说明。
(1)VOC转YOLO格式数据集
YOLO格式仅是一种叫法,形式如下,不必深究。
[class_id, Xcenter, Ycenter, Width, Height]
VOC数据集普遍以LabelImg软件进行标注,获取一份与图像数据同名的标注文件。如000000.jpg对应000000.xml。为了便于YOLO系列使用,普遍会将VOC数据标注转换为YOLO标注形式,即000000.jpg对应000000.txt标注文件。
运行转换脚本:step_1_voc2yolo_convert.py
(2)划分train、val、test
在上一步制作完成YOLO格式的标注文件后,需要将数据集按照一定的比例划分为训练集(train.txt)、评估集(val.txt)和测试集(test.txt)。
划分数据集运行脚本:step_3_split_train_val_test.py
有两点需要注意:
a. 为了尽量增多训练和评估样本数量,测试集可使用未标注的文件;
b. 经过当前脚本生成的是txt文件,内容为路径列表,如图1所示。训练时在VOC_Power48.xml导入该txt文件路径即可(如图2)。
图1 训练数据集(train.txt)样例
图2 数据文件配置
(3)测试数据
经过第一步的转换(step_1_voc2yolo_convert.py)以后,可通过脚本step_2_optional_draw_for_validate.py指定文件名(.jpg)和标注文件(.txt)进行数据的测试
6. Finetune
执行finetune的时候,只需要将default.py中的model替换成已有的pt模型即可。
7. 训练策略
训练的数据增强部分最后10 epoch关闭Mosaic增强更有利于模型收敛的稳定,同时训练epoch数从300增大到500使得模型训练更充分。
从上面可以看出,YOLOv8集合了之前提出的诸如YOLOX、YOLOv6、YOLOv7和PPYOLOE等算法的相关设计,尤其是Head标签分配和Loss部分以及PP-YOLOE非常相似。YOLOv8集百家所长达到了实时检测界的一个新高度。
8. 继续训练与恢复训练
继续训练是指使用已保存的ckpt中的weights、optimizer和其他等参数,从头开始训练,一般情况下epoch从0开始。
恢复训练是指使用已保存的ckpt中的weights、optimizer和epoch等参数作为(pretrained weights)继续训练,一般情况下epoch>0。
工程中,在resume_training阶段做了修改,当执行resume训练时,start_epoch接上次,当Finetune训练时,start_epoch从0开始。
配置文件中(default.yaml, 或由DEFAULT_CFG_PATH指定的其他配置文件)有以下几个可选的配置:
(1)model为yaml文件(resume==False)
执行Training from scratch。
(2)model为pt模型文件(resume==False)
执行Finetune training。
(3)resume为指定的pt模型文件(忽略model指定内容)
当resume为指定的pt时,执行resume训练。
特别说明:
代码初始运行时会有check_amp操作,此时会自动下载yolov8n.pt用于检查。