Yolov5 (1) 训练过程记录与解析
文章目录0. 前言1. 数据集相关1.1 自定义数据集构建1.2 数据增强策略2. 训练相关2.1 训练基本流程与参数2.2 超参数解析2.2 训练过程与结果解析0. 前言官方文档(官方资料总是最好的,必须先阅读):Train Custom Data:跑通DemoTips for Best Training Results:数据集构建经验,非常推荐阅读,本文不多介绍Multi-GPU Traini
·
0. 前言
- 官方文档(官方资料总是最好的,必须先阅读):
- Train Custom Data:跑通Demo
- Tips for Best Training Results:数据集构建经验,非常推荐阅读,本文不多介绍
- Multi-GPU Training:多卡训练教程
- 记录一下训练过程,老忘了,尴尬。
- 重点关注使用过程,以及相关参数,不关注细节。
1. 数据集相关
1.1 自定义数据集构建
- 要构建的内容包括以下几部分:
- 目标检测 bboxes 标签文件
- 文件目录结构
- Yolov5 数据配置文件
- bboxes 标签文件:
- 是Yolo 形式的。
- 每张图片对应一个同名(除扩展名同名)txt文件
- 每行代表一个bbox,共5个部分,
class_id cx cy w h
,后面四个数字都是 normed 结构,即取值范围在[0, 1]
的浮点数。
- 文件目录结构
- 图片与标签文件不在一个目录下。
- 图片文件目录必须包含
images
。 - 标签文件目录就是图片文件目录中,将最后一个
images
替换为labels
。 - 例如,图片文件目录是
/path/to/images
,那对应的标签文件目录就是/path/to/labels
- Yolov5 数据配置文件
- 本质就是训练时
--data
指定的配置文件 - 这部分内容在官方文档中有详细说明。
- 个人关注的部分记录一下
train/val
有三种方式指定:- 图片文件目录:字符串形式,图片文件夹的相对路径或绝对路径。文件夹包含若干图片。其实在数据处理的时候,会过滤掉文件中非图片的文件。
- 图片路径列表文件:字符串形式,指向一个文本文件,每一行都是一长图片的路径。
- 图片文件目录列表:列表形式,包含若干图片文件目录路径,可以理解为第一种方式的增强版。
nc
和len(names)
必须相等,否则会报错。
- 实例文件如下
- 本质就是训练时
# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: ../VOC/images/train/ # 16551 images
val: ../VOC/images/val/ # 4952 images
# number of classes
nc: 20
# class names
names: [ 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog',
'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor' ]
1.2 数据增强策略
- multi-scale resize
- 训练的时候对原始图像进行随机尺寸变换
- 默认关闭
- 通过命令行参数
--multi-scale
开启
- mosaic
- 模型训练输入图片是由4张原始图片拼接而成
- 根据比例使用,比例是由超参数配置文件(即
--hyp
指定的配置文件)中的mosaic
指定。 - 两个默认的
--hyp
中mosaic默认比例是100%,即轮训练都使用。
- mixup
- 两张图片逐像素叠加,label根据透明度叠加。
- 根据比例使用,比例是由超参数配置文件(即
--hyp
指定的配置文件)中的mixup
指定。
- random_perspective
- 如果没有使用
mosaic
就对原始图像使用该增强。 - mosaic 数据曾庆方式中也有使用该方法对结果进行小变换
- 增强方式就是一些像素级的数字图像变换,如旋转、平移、扭曲等。
- 如果没有使用
- augment_hsv
- 图像色彩变换,亮度、饱和度、对比度啥的。
- 默认开启。
- 翻转
- 包括水平翻转与垂直翻转
- 根据比例使用,比例是由超参数配置文件(即
--hyp
指定的配置文件)中的flipud/fliplr
指定。
2. 训练相关
2.1 训练基本流程与参数
- 训练说白了就是运行
python train.py
,那需要指定哪些参数呢? - 最基本的参数:
- 选择模型:是
yolov5
中的哪一种模型需要训练- 通过
--cfg
指定 - 即
models
目录下的yolov5s/m/l/x.yaml
- 如果训练自己的数据集,注意需要修改其中的
nc
选项,即 number of classes,其他的不用修改。
- 通过
- 选择数据集:数据集信息
- 前一章中构建的
- 通过
--data
指定 - 即
data
目录下的coco.yaml
- 选择模型:是
python train.py --cfg /path/to/yolov5s.yaml --data /path/to/data.yaml
-
其他可选参数还有很多,自己看配置原文件吧。
- 有几个参数看不懂是什么意思,没关系,看不懂的就是不常用的,放着也没事。
-
单机多卡命令如下
- 我只放了自己关心的,方便以后自己复制粘贴
--project
和--name
非常好用,过程文件与权重文件都会放在{project}/{name}
当中。
python train.py \
--device 4,5,6,7 \
--weights weights/yolov5s.pt \
--cfg models/yolov5s.yaml \
--data data/coco.yaml \
--hyp data/hyp.scratch.yaml \
--epochs 300 \
--batch-size 128 \
--img-size 640 \
--project runs/train \
--name exp
- 多卡训练命令如下
- 比官方教程多了
--master_port
选项,如果服务器上训练多个yolov5模型,如果没有改变端口号就会包括,说 address already in use 一类的。
- 比官方教程多了
python -m torch.distributed.launch --nproc_per_node 4 --master_port 23232 train.py \
--device 4,5,6,7 \
--weights weights/yolov5s.pt \
--cfg models/yolov5s.yaml \
--data data/coco.yaml \
--hyp data/hyp.scratch.yaml \
--epochs 300 \
--batch-size 128 \
--img-size 640 \
--project runs/train \
--name exp
2.2 超参数解析
- 训练时会指定
--hyp
参数,即超参数配置文件。 - 默认有两个配置文件:
data/hyp.scratch.yaml
data/hyp.finetune.yaml
- 那超参数配置文件中,都配置了一些啥呢
# 优化器相关
lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.2 # final OneCycleLR learning rate (lr0 * lrf)
momentum: 0.937 # SGD momentum/Adam beta1
weight_decay: 0.0005 # optimizer weight decay 5e-4
# Warmup 相关
warmup_epochs: 3.0 # warmup epochs (fractions ok)
warmup_momentum: 0.8 # warmup initial momentum
warmup_bias_lr: 0.1 # warmup initial bias lr
# 不同损失函数权重,以及其他损失函数相关内容
box: 0.05 # box loss gain
cls: 0.5 # cls loss gain
cls_pw: 1.0 # cls BCELoss positive_weight
obj: 1.0 # obj loss gain (scale with pixels)
obj_pw: 1.0 # obj BCELoss positive_weight
iou_t: 0.20 # IoU training threshold
fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5)
# anchor
anchor_t: 4.0 # anchor-multiple threshold
# anchors: 3 # anchors per output layer (0 to ignore)
# 数据增强相关 - 色彩转换
hsv_h: 0.015 # image HSV-Hue augmentation (fraction)
hsv_s: 0.7 # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4 # image HSV-Value augmentation (fraction)
# 数据增强相关:旋转、平移、扭曲等
degrees: 0.0 # image rotation (+/- deg)
translate: 0.1 # image translation (+/- fraction)
scale: 0.5 # image scale (+/- gain)
shear: 0.0 # image shear (+/- deg)
perspective: 0.0 # image perspective (+/- fraction), range 0-0.001
# 数据增强相关 - 翻转
flipud: 0.0 # image flip up-down (probability)
fliplr: 0.5 # image flip left-right (probability)
# 数据增强相关 - mosaic/mixup
mosaic: 1.0 # image mosaic (probability)
mixup: 0.0 # image mixup (probability)
2.2 训练过程与结果解析
-
训练过程中输出了很多内容,文件、命令行输出等等。
-
result.txt
文件解析:共15列,内容分别是{cur_epoch}/{total_epoch}
- 显存
- 4个训练集损失函数,顺序是 ‘box’, ‘obj’, ‘cls’, ‘total’
- 训练集 bbox 数量
- 图像尺寸(长边尺寸)
- 验证集相关(7项):
- 平均 precision
- 平均 recall
- AP@0.5
- AP@0.5:0.95
- 3个损失函数,顺序是 box, obj, cls
-
训练集图像:
train_batch0.jpg
等 -
权重包括在
weights
中,有最后epoch权重以及最优结果权重。 -
命令行信息:
# 训练过程中的已经非常清晰了,毕竟也输出了每一列的含义
# epoch 训练多少轮,显存占了多少,四类损失函数的数值,bbox的数量,图像长边尺寸
Epoch gpu_mem box obj cls total labels img_size
23/299 8.73G 0.04529 0.05286 0.002293 0.1004 307 640: 0%|▏ | 1/531 [00:06<59:48, 6.77s/it]
# 验证集的结果也比较明确
# P 是 mean precision,R 是 mean Recall,两个mAP就不用解释了
Class Images Labels P R mAP@.5 mAP@.5:.95: 100%|██████████████████████████████████████████████████████████████████████████| 17/17 [00:14<00:00, 1.20it/s]
all 1031 8245 0.426 0.382 0.338 0.183
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献8条内容
所有评论(0)