コンテンツへスキップ

YOLOv5モデルの刈り込みとスパース性

このガイドでは、YOLOv5 プルーニングを適用して、パフォーマンスを維持しながら、より効率的なネットワークを作成する方法を説明します。

モデル・プルーニングとは?

モデル刈り込みは、重要度の低いパラメータ(重みと接続)を削除することで、ニューラルネットワークのサイズと複雑さを軽減するために使用されるテクニックです。このプロセスにより、いくつかの利点を持つより効率的なモデルが作成される:

  • リソースに制約のあるデバイスへの展開を容易にするため、モデルサイズを縮小
  • 精度への影響を最小限に抑え、推論速度を高速化
  • メモリ使用量とエネルギー消費量の削減
  • リアルタイム・アプリケーションの全体的な効率を向上

プルーニングは、モデルの性能に最小限の寄与しかしないパラメータを識別して削除することによって機能し、その結果、同様の精度を持つより軽量なモデルが得られる。

始める前に

レポをクローンし、requirements.txtをPython>=3.8.0環境にインストールする。 PyTorch>=1.8.モデルとデータセットは、最新のYOLOv5 リリースから自動的にダウンロードされます。

git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install

テスト・ベースライン・パフォーマンス

プルーニングを行う前に、比較するためのベースライン・パフォーマンスを確立する。このコマンドは、画像サイズ640ピクセルのCOCO val2017でYOLOv5xをテストする。 yolov5x.pt が最も大きく、最も正確なモデルである。その他のオプションは yolov5s.pt, yolov5m.pt そして yolov5l.ptまたは、カスタムデータセットのトレーニングによる独自のチェックポイント ./weights/best.pt.利用可能なすべてのモデルの詳細については、READMEを参照してください。 テーブル.

python val.py --weights yolov5x.pt --data coco.yaml --img 640 --half

出力:

val: data=/content/yolov5/data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, workers=8, single_cls=False, augment=False, verbose=False, save_txt=False, save_hybrid=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True, dnn=False
YOLOv5 🚀 v6.0-224-g4c40933 torch 1.10.0+cu111 CUDA:0 (Tesla V100-SXM2-16GB, 16160MiB)

Fusing layers...
Model Summary: 444 layers, 86705005 parameters, 0 gradients
val: Scanning '/content/datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupt: 100% 5000/5000 [00:00<?, ?it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 157/157 [01:12<00:00,  2.16it/s]
                 all       5000      36335      0.732      0.628      0.683      0.496
Speed: 0.1ms pre-process, 5.2ms inference, 1.7ms NMS per image at shape (32, 3, 640, 640)  # <--- base speed

Evaluating pycocotools mAP... saving runs/val/exp2/yolov5x_predictions.json...
...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.507  # <--- base mAP
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.689
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.552
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.345
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.559
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.652
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.381
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.630
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.682
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.526
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.731
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.829
Results saved to runs/val/exp

YOLOv5xにプルーニングを適用(30%のスパース性)

を使って、モデルにプルーニングを適用することができる。 torch_utils.prune() コマンドを使用する。枝刈りされたモデルをテストするために、次のように更新する。 val.py YOLOv5xを0.3の疎密度(重みの30%をゼロに設定)に刈り込む:

YOLOv5xを30%スパース化するコードを示すスクリーンショット

30%の剪定出力:

val: data=/content/yolov5/data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, workers=8, single_cls=False, augment=False, verbose=False, save_txt=False, save_hybrid=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True, dnn=False
YOLOv5 🚀 v6.0-224-g4c40933 torch 1.10.0+cu111 CUDA:0 (Tesla V100-SXM2-16GB, 16160MiB)

Fusing layers...
Model Summary: 444 layers, 86705005 parameters, 0 gradients
Pruning model...  0.3 global sparsity
val: Scanning '/content/datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupt: 100% 5000/5000 [00:00<?, ?it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 157/157 [01:11<00:00,  2.19it/s]
                 all       5000      36335      0.724      0.614      0.671      0.478
Speed: 0.1ms pre-process, 5.2ms inference, 1.7ms NMS per image at shape (32, 3, 640, 640)  # <--- prune speed

Evaluating pycocotools mAP... saving runs/val/exp3/yolov5x_predictions.json...
...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.489  # <--- prune mAP
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.677
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.537
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.334
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.542
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.635
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.370
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.612
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.664
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.496
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.722
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.803
Results saved to runs/val/exp3

結果分析

この結果から、我々は次のことがわかる:

  • 30%のスパース性を達成:モデルのウェイトパラメーターの30 nn.Conv2d レイヤーがゼロになった
  • 推論時間は変わらない:刈り込みにもかかわらず、処理速度は基本的に変わらない。
  • パフォーマンスへの影響は最小限:mAPは0.507から0.489にわずかに低下(わずか3.6%の低下)
  • モデルサイズの縮小:刈り込まれたモデルは、保存に必要なメモリが少なくて済む。

これにより、プルーニングは、性能にわずかな影響を与えるだけで、モデルの複雑さを大幅に削減できることが示され、リソースに制約のある環境での展開に効果的な最適化手法となっている。

刈り込みモデルの微調整

最良の結果を得るためには、プルーニングされたモデルは、精度を回復するためにプルーニング後に微調整されるべきである。これには次のような方法がある:

  1. 希望するスパースレベルでプルーニングを適用する
  2. 刈り込みモデルを低い学習率で数エポック訓練する。
  3. ベースラインに対する微調整された刈り込みモデルの評価

このプロセスは、除去されたコネクションを補うために残りのパラメーターが適応するのを助け、多くの場合、元の精度のほとんど、あるいはすべてを回復させる。

対応環境

Ultralytics をはじめとする必要不可欠な依存関係がプリインストールされた、さまざまなすぐに使える環境を提供する。 CUDACUDNNPythonそして PyTorchなどがプリインストールされています。

プロジェクト状況

YOLOv5 CI

このバッジは、YOLOv5 GitHub ActionsContinuous Integration (CI) テストがすべて正常にパスしていることを示します。これらのCIテストは、トレーニング検証推論エクスポートベンチマークといったさまざまな重要な側面にわたって、YOLOv5 の機能とパフォーマンスを厳密にチェックします。これらのテストは、macOS、Windows、Ubuntu上で、24時間ごとおよび新しいコミットごとに実施され、一貫した信頼性の高い動作を保証します。

📅作成:1年前 ✏️更新しました 8日前

コメント