交通標識の検出は、交通標識認識システムにおける重要なタスクです。他国の交通標識と比較すると、中国の交通標識には独自の特徴がある。畳み込みニューラル ネットワーク (CNN) は、コンピューター ビジョン タスクで画期的な進歩を遂げ、交通標識の分類で大きな成功を収めました。CCTSDB データセットは、長沙科技大学の関連学者とチームによって作成されており、約 20,000 件の交通標識サンプル画像が含まれており、合計で約 40,000 件の交通標識が含まれていますが、現時点で公開されている画像は 10,000 件のみです。交通標識には、指示標識、禁止標識、警告標識の 3 種類が一般的です。時間の経過とともに、データ セットのさまざまなバージョンが登場しました。この記事の主な目的は、yolov6 に基づいた CCTSDB2021 データ セット上でターゲット検出および認識システムを開発および構築することです。まず、効果の例を見てみましょう:
CCTSDB2021 データセットには、トレーニング セットと陽性サンプル テスト セットに 17856 個の画像があります。画像内の交通標識は、その意味に応じて義務、禁止、警告に分類されています。合計 16356 個のトレーニング セット イメージがあり、00000 ~ 18991 の番号が付けられています。陽性サンプルのテスト セットには、18992 ~ 20491 の番号が付けられた 1500 枚の画像が含まれています。「XML」圧縮パッケージには、トレーニング セットと陽性サンプル テスト セットの XML 形式の注釈ファイルが格納されます。「train_img」圧縮パッケージにはトレーニング セットの画像が保存されます。「train_labels」圧縮パッケージには、トレーニング セットの TXT 形式のアノテーション ファイルが格納されます。「test_img」圧縮パッケージには、ポジティブ サンプル テスト セット イメージが保存されます。「気象および環境ベースの分類」圧縮パッケージには、気象および照明条件に従って分類された陽性サンプル テスト セットの XML 形式の注釈ファイルが保存されます。「交通標識のサイズに基づく分類」圧縮パッケージには、画像内の交通標識のサイズに応じて分類された陽性サンプル テスト セットの XML 形式の注釈ファイルが格納されます。「ネガティブ サンプル」には、500 枚のネガティブ サンプル画像が含まれています。
次にデータセットを見てみましょう。
この記事では、アルゴリズム モデル YOLOv6 を選択します。Yolov6 は Meituan によって開発された軽量検出アルゴリズムです。これまでのところ、アルゴリズムはバージョン 4.0 まで反復されています。各バージョンには、その時点で最高の検出技術と最も高度な検出技術が含まれています。テクノロジー、YOLOv6 のバックボーンCspdarknet は使用されなくなりましたが、Rep よりも効率的な EfficientRep に切り替えられ、Neck も Rep と PAN に基づいて Rep-PAN を構築し、Head は YOLOX と同様に分離され、より効率的な構造が追加されました。YOLOv6 もアンカーフリー方式を採用しており、以前のアンカーベース方式は廃止されています。モデルの構造に加えて、そのデータ拡張は YOLOv5 と一致しており、ラベル割り当ては simOTA を使用した YOLOX と同じであり、新しい境界回帰損失 SIOU が導入されています。
YOLOv5 と YOLOX はどちらもマルチブランチ残差構造 CSPNet を使用しますが、この構造はハードウェアにとってあまりフレンドリーではありません。したがって、GPU デバイスへの適応性を高めるために、バックボーンに ReVGG 構造が導入され、ハードウェアに基づいて改良され、より効率的な EfficientRep が提案されました。RepVGG は、1x1 畳み込みブランチと恒等マッピング ブランチを各 3x3 畳み込みに並行して追加します。この構造はRepVGGブロックを構成します。ResNet との違いは、RepVGG がこの構造をすべてのレイヤーに追加するのに対し、ResNet は 2 つまたは 3 つのレイヤーごとにのみ追加することです。RepVGG 氏は、融合によって形成される 3x3 畳み込み構造は、コンピューティング集約型のハードウェア デバイスに非常に適していると述べました。
トレーニング データ構成ファイルは次のようになります。
# Please insure that your custom_dataset are put in same parent dir with YOLOv6_DIR
train: ./dataset/images/train # train images
val: ./dataset/images/test # val images
test: ./dataset/images/test # test images (optional)
# whether it is coco dataset, only coco dataset should be set to True.
is_coco: False
# Classes
nc: 3 # number of classes
# class names
names: ['mandatory', 'prohibitory', 'warning']
ここでは、次のように最も軽量な n シリーズ モデルが選択されます。
# YOLOv6s model
model = dict(
type='YOLOv6n',
pretrained='weights/yolov6n.pt',
depth_multiple=0.33,
width_multiple=0.25,
backbone=dict(
type='EfficientRep',
num_repeats=[1, 6, 12, 18, 6],
out_channels=[64, 128, 256, 512, 1024],
fuse_P2=True,
cspsppf=True,
),
neck=dict(
type='RepBiFPANNeck',
num_repeats=[12, 12, 12, 12],
out_channels=[256, 128, 128, 256, 256, 512],
),
head=dict(
type='EffiDeHead',
in_channels=[128, 256, 512],
num_layers=3,
begin_indices=24,
anchors=3,
anchors_init=[[10,13, 19,19, 33,23],
[30,61, 59,59, 59,119],
[116,90, 185,185, 373,326]],
out_indices=[17, 20, 23],
strides=[8, 16, 32],
atss_warmup_epoch=0,
iou_type='siou',
use_dfl=False, # set to True if you want to further train with distillation
reg_max=0, # set to 16 if you want to further train with distillation
distill_weight={
'class': 1.0,
'dfl': 1.0,
},
)
)
solver = dict(
optim='SGD',
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,
)
ターミナル実行:
python tools/train.py --batch-size 16 --conf configs/yolov6n_finetune.py --data data/self.yaml --fuse_ab --device 0 --name yolov6n --epochs 100 --workers 8
計算出力は次のようになります。
トレーニング完了結果の詳細は以下のとおりです。
オフライン推論の例は次のとおりです。
興味があればぜひ試してみてください!