YOLOv6 プロ
YOLOv6
ヒント: このプロの名前は、このフレームワークが公式の yolov6 よりも強力でパフォーマンスが優れているという意味ではなく、ネットワーク構造を簡単に置き換えることが本来の目的です 。なぜなら、yolov5 が提案されてから 2 年以上が経過し、yolov5 をベースにした改良案が次々と出てきているため、より斬新な改良案を提案することは難しくなるでしょう。機能は、より強力ではなく、よりプロフェッショナルなフレームワークなので、皆さん、軽く考えてください。!
このフレームワークをオープンソース化した理由は、yolov6 ネットワークを変更するときに遭遇した落とし穴です。yolov6 アルゴリズムを改良したとき、6 のコード スタイルは 5 のコード スタイルよりもはるかに明確であり、非常に理解しやすいですが、問題: あるネットワーク構造を変更した後、以前のネットワーク構造を置き換えるのは簡単ですが、何度も変更すると、以前のネットワーク構造が何であったかを忘れがちです (たとえば、p6 モデルを改良した場合、色々と場所を変えなければならないのですが、一週間くらいはすっかり内容を忘れていました…)
yolov5 のコードは乱雑ではありますが、ユニークです。彼の yaml ファイルがネットワークを構築する方法、ネットワーク全体も明確で、それぞれの変更は互いに独立しています。各モジュールはカスタマイズでき、自由に組み合わせることができます。これは、より魅力的な場所。
yolov5 に詳しい友人は yaml ファイル内のモジュールを改善する方法をすでによく知っていると思います。そのため、同じ操作を使用して yolov6 pro で独自のネットワークを構築できるようになります。
要約すれば:
· YOLOv6 Pro は、公式の全体的なアーキテクチャに基づいており
YOLOv6
、YOLOv5
ネットワーク構築手法 を使用してYOLOv6
、backbone
、neck
、effidehead
構造を含むネットワークを構築します。 ·ファイル内のモジュールを任意に変更または追加でき、変更された各ファイルは独立して実行可能です。目的は科学研究を促進することです
。 · 今後 、モジュールに基づいてネットワーク構造の改善がさらに追加される予定です。· 事前にトレーニングされた重みは、一致することを保証するために公式の重みから変換されています。yaml
yolov5
yoloair
・先行発売された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