YOLOv6 Pro | ネットワークの構築とモジュールの YOLOv6 との置き換えが容易になり、Backbone、Neck、DecoupleHead などの科学研究におけるネットワーク構造の改善に役立ちます (YOLOv5 がネットワークを構築する方法を参照)

YOLOv6 プロ

YOLOv6 ヒント: このプロの名前は、このフレームワークが公式の yolov6 よりも強力でパフォーマンスが優れているという意味ではなく、ネットワーク構造を簡単に置き換えることが本来の目的です 。なぜなら、yolov5 が提案されてから 2 年以上が経過し、yolov5 をベースにした改良案が次々と出てきているため、より斬新な改良案を提案することは難しくなるでしょう。機能は、より強力ではなく、よりプロフェッショナルなフレームワークなので、皆さん、軽く考えてください

このフレームワークをオープンソース化した理由は、yolov6 ネットワークを変更するときに遭遇した落とし穴です。yolov6 アルゴリズムを改良したとき、6 のコード スタイルは 5 のコード スタイルよりもはるかに明確であり、非常に理解しやすいですが、問題: あるネットワーク構造を変更した後、以前のネットワーク構造を置き換えるのは簡単ですが、何度も変更すると、以前のネットワーク構造が何であったかを忘れがちです (たとえば、p6 モデルを改良した場合、色々と場所を変えなければならないのですが、一週間くらいはすっかり内容を忘れていました…)

yolov5 のコードは乱雑ではありますが、ユニークです。彼の yaml ファイルがネットワークを構築する方法、ネットワーク全体も明確で、それぞれの変更は互いに独立しています。各モジュールはカスタマイズでき、自由に組み合わせることができます。これは、より魅力的な場所。

yolov5 に詳しい友人は yaml ファイル内のモジュールを改善する方法をすでによく知っていると思います。そのため、同じ操作を使用して yolov6 pro で独自のネットワークを構築できるようになります。

要約すれば:

· YOLOv6 Pro は、公式の全体的なアーキテクチャに基づいており YOLOv6 、 YOLOv5 ネットワーク構築手法 を使用してYOLOv6 、  backboneneckeffidehead 構造を含むネットワークを構築します。 ·ファイル内のモジュールを任意に変更または追加でき、変更された各ファイルは独立して実行可能です。目的は科学研究を促進することです
。 ·  今後  、モジュールに基づいてネットワーク構造の改善がさらに追加される予定です。· 事前にトレーニングされた重みは、一致することを保証するために公式の重みから変換されています。yaml
yolov5yoloair

・先行発売されたp6モデル(非公式)

私たちが使用した yoloair フレームワークは、  IEEE UV 2022「Vision Meets Alage」物体検出コンペティションYOLOv6 pro で第 1 位を獲得しました。

プロジェクトリンク: https://github.com/yang-0201/YOLOv6_pro

興味のある友達はスターとフォークをクリックして、質問があればすぐにフィードバックしてください。プロジェクトの初期段階では、いくつかの機能的な提案が採用され、開発されます。PR も歓迎です。プロジェクトは今後も更新され続けます。 、お楽しみに!

すでにサポートされているモデル:

  • YOLOV6l_yaml
  • YOLOV6m_yaml
  • YOLOV6s_yaml
  • YOLOV6t_yaml
  • YOLOV6n_yaml
  • 大規模モデル、4 つの出力層:
  • YOLOV6l6_p2_yaml
  • YOLOV6l6_yaml
  • YOLOV6n6_yaml
  • DAMO YOLO で首を増やす: 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. 事前トレーニングされた重みをダウンロードする

要件に応じて選択し、重みをプロジェクト内に新しい重みディレクトリを作成し、そこに置きます

4. yolov6 ベースライン モデルを選択します

事前トレーニングされたモデルを使用する例として yolov6l を取り上げます。

モデルには 2 つの構成ファイルが必要です。1 つ目は 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.

2 番目は 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