YOLOv6 Pro | 使 YOLOv6 构建网络和更换模块更为便捷,助力科研中的网络结构改进,包括Backbone,Neck,DecoupleHead(参考YOLOv5搭建网络的方式)

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 网络,包括 backboneneckeffidehead 结构。
· 可以在 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

猜你喜欢

转载自blog.csdn.net/qq_43000647/article/details/128212340