YOLOv6 pro
tips:取这个pro的名字并不是说明这个框架比官方yolov6更强,性能更好,初衷是让 YOLOv6
更换网络结构更为便捷。因为yolov5早已提出两年多,基于yolov5的改进也已经层出不穷,要想提出比较有新意的改进会更加困难,如果以今年提出的yolov6为基础做改进可能也算是一个独到之处,不是更强大更专业的框架,所以各位大佬轻喷啊!!
开源这个框架的原因是我在改yolov6网络的时候遇到的一个坑,我在改进yolov6算法的时候,虽然6的代码风格比5清晰很多,也非常容易看懂,但是有一个问题在于:如果更改了某个网络结构,很容易把之前的网络结构替换掉,改了很多次之后就很容易忘记之前的网络结构是什么,(比如我改进一个p6模型,就需要更改很多地方,改完过一个礼拜,完全忘记原来是啥样了····)
yolov5的代码虽然比较乱,但是有独到之处,他的yaml文件构建网络的方式,网络的整体同样清楚明了,并且每个改动之间相互独立,每个模块可以自定义和自由组合,这就是比较吸引人的地方了。
相信熟悉yolov5的朋友们已经对改进yaml文件中的模块方式相当熟悉啦,那么现在你在yolov6 pro中也可以用相同的操作来搭建你自己的网络!
综上所述:
· YOLOv6 Pro 基于官方
YOLOv6
的整体架构,使用YOLOv5
的网络构建方式构建一个YOLOv6
网络,包括backbone
,neck
,effidehead
结构。
· 可以在yaml
文件中任意修改或添加模块,并且每个修改的文件都是独立可运行的,目的是为了助力科研。
· 后续会基于yolov5
和yoloair
中的模块加入更多的网络结构改进。
· 预训练权重已经从官方权重转换,确保可以匹配。· 预先发布了p6模型(非官方)
我们使用的 yoloair
和 YOLOv6 pro
框架在 IEEE UV 2022 "Vision Meets Alage" 目标检测竞赛中取得第一名!
项目链接:https://github.com/yang-0201/YOLOv6_pro
感兴趣的小伙伴们可以点点Star和Fork,有问题可以及时反馈,项目初期,有一些功能意见会进行采纳和开发,也欢迎提PR,项目后续会持续更新,敬请关注!
已经支持的模型:
- YOLOV6l_yaml
- YOLOV6m_yaml
- YOLOV6s_yaml
- YOLOV6t_yaml
- YOLOV6n_yaml
- 大尺寸模型,四个输出层:
- YOLOV6l6_p2_yaml
- YOLOV6l6_yaml
- YOLOV6n6_yaml
- 增加 DAMO YOLO 中的 neck:GiraffeNeckV2
已在 yolov6l, yolov6t 中替换
这篇文章先做一个简单的教程,后续会对yolov6网络结构的搭建做一个详述。
训练自己的数据集:
1. 数据集配置
data/images/train 中放入你的训练集图片
data/images/val 中放入你的验证集图片
data/labels/train 中放入你的训练集标签(标签格式为yolo格式)
data/labels/val 中放入你的验证集标签
根据你的数据集将训练集、验证集和测试集放入对应的文件夹,注意标签需要是yolo格式,目录格式如下:
├── data
│ ├── images
│ │ ├── train
│ │ └── val
│ ├── labels
│ │ ├── train
│ │ ├── val
2. 更改你的data.yaml文件
在data/目录下,以data.yaml为例
train: data/images/train # 训练集路径
val: data/images/val # 验证集路径
test: data/images/test # 测试集路径
is_coco: False # 不是coco则为False
nc: 3 # 设置为你的类别数量
names: ["car","person","bike"] # 你的类别名称
3. 下载预训练权重
根据需求选择,权重在项目里新建一个weights目录,并放入
4. 选择你的yolov6基线模型
以yolov6l,使用预训练模型为例:
模型需要两个配置文件,第一个为configs/model_yaml/yolov6l_yaml.py:
# YOLOv6l model
model = dict(
type='YOLOv6l_yaml',
pretrained="weights/yolov6l_yaml_new.pt", # 指定预训练权重的路径
build_type = 'yaml', # 搭建模型的形式,使用yaml搭建
yaml_file = 'configs/yaml/yolov6l.yaml', # 搭建模型yaml文件的路径
depth_multiple=1.0,
width_multiple=1.0,
head=dict(
type='EffiDeHead',
num_layers=3, # 输出的层数
anchors=1,
strides=[8, 16, 32], # 模型的步长
iou_type='giou', # iou的类别,可以更换为 ciou siou giou diou
use_dfl=True, # 是否使用dfl loss
reg_max=16, #if 使用dfl损失 默认为16,不使用则为0
distill_weight={
'class': 2.0,
'dfl': 1.0,
},
)
)
solver = dict( # 训练超参设置
optim='SGD', # 优化器,可以为adam
lr_scheduler='Cosine',
lr0=0.0032,
lrf=0.12,
momentum=0.843,
weight_decay=0.00036,
warmup_epochs=2.0,
warmup_momentum=0.5,
warmup_bias_lr=0.05
)
data_aug = dict( # 数据增强超参数
hsv_h=0.0138,
hsv_s=0.664,
hsv_v=0.464,
degrees=0.373,
translate=0.245,
scale=0.898,
shear=0.602,
flipud=0.00856,
fliplr=0.5,
mosaic=1.0,
mixup=0.243,
)
training_mode = "conv_silu" # 使用silu激活函数
# use normal conv to speed up training and further improve accuracy.
第二个为configs/yaml/yolov6l:
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple
backbone:
# [from, number, module, args]
[[-1, 1, ConvWrapper, [64, 3, 2]], # 0-P1/2 # 基础卷积块,下采样,使用silu
[-1, 1, ConvWrapper, [128, 3, 2]], # 1-P2/4
[-1, 1, BepC3, [128, 6, "ConvWrapper"]], # yolov6的BepC3模块
[-1, 1, ConvWrapper, [256, 3, 2]], # 3-P3/8
[-1, 1, BepC3, [256, 12, "ConvWrapper"]],
[-1, 1, ConvWrapper, [512, 3, 2]], # 5-P4/16
[-1, 1, BepC3, [512, 18, "ConvWrapper"]],
[-1, 1, ConvWrapper, [1024, 3, 2]], # 7-P5/32
[-1, 1, BepC3, [1024, 6, "ConvWrapper"]],
[-1, 1, SPPF, [1024, 5]]] # 9
neck:
[[-1, 1, SimConv, [256, 1, 1]], # 基础卷积块
[-1, 1, Transpose, [256]], # 上采样
[[-1, 6], 1, Concat, [1]], #768
[-1, 1, BepC3, [256, 12, "ConvWrapper"]],
[-1, 1, SimConv, [128, 1, 1]],
[-1, 1, Transpose, [128]],
[[-1, 4], 1, Concat, [1]], #384
[-1, 1, BepC3, [128, 12, "ConvWrapper"]], #out
[-1, 1, SimConv, [128, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 1, BepC3, [256, 12, "ConvWrapper"]], # 20 (P4/16-medium)
[-1, 1, SimConv, [256, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 1, BepC3, [512, 12, "ConvWrapper"]]] # 23 (P5/32-large)
effidehead:
[[17, 1, Head_layers, [128, 16]], # yolov6 efficiency 解耦头
[20, 1, Head_layers, [256, 16]],
[23, 1, Head_layers, [512, 16]],
[[24, 25, 26], 1, Out, []]]
使用预训练权重的训练命令:
python tools/train.py --conf-file configs/model_yaml/yolov6l_yaml.py --data data/data.yaml --device 0 --img 640 --batch-size 4
不使用预训练权重的训练命令:
python tools/train.py --conf-file configs/without_weights/yolov6l_yaml.py --data data/data.yaml --device 0 --img 640 --batch-size 4
5. 验证你的模型
python tools/eval.py --weights best_ckpt.pt --data data/data.yaml