YOLOv5におけるモデルの枝刈りとスパース性
📚 このガイドでは、パフォーマンスを維持しながら、より効率的なネットワークを作成するために、YOLOv5 🚀モデルに枝刈りを適用する方法について説明します。
モデルの枝刈りとは何ですか?
モデルの枝刈りは、重要度の低いパラメータ(重みと接続)を削除することにより、ニューラルネットワークのサイズと複雑さを軽減するために使用される手法です。このプロセスにより、いくつかの利点がある、より効率的なモデルが作成されます。
- リソース制約のあるデバイスへのデプロイを容易にするためのモデルサイズの縮小
- 精度への影響を最小限に抑えながら、より高速な推論速度を実現
- メモリ使用量とエネルギー消費量の削減
- リアルタイムアプリケーション向けの全体的な効率が向上
枝刈り(Pruning)は、モデルのパフォーマンスへの寄与が最小限のパラメータを特定して削除することで機能し、同様の精度でより軽量なモデルを実現します。
始める前に
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_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%をゼロに設定)にプルーニングするには:
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_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%の低下)。
- モデルサイズ削減: 枝刈りされたモデルは、ストレージに必要なメモリが少なくなります
これは、枝刈りによってモデルの複雑さを大幅に軽減できることを示しており、パフォーマンスへの影響はわずかであるため、リソースが限られた環境での展開に効果的な最適化手法となります。
Prunedモデルのファインチューニング
最良の結果を得るには、精度を回復するために、枝刈り後にモデルを微調整する必要があります。これを行うには、以下を実行します。
- 目的のスパース性レベルで枝刈りを適用
- 低い学習率でプルーニングされたモデルを数エポックトレーニングする
- 微調整された枝刈りモデルをベースラインに対して評価
このプロセスは、削除された接続を補うために残りのパラメータを適応させるのに役立ち、多くの場合、元の精度をほぼ完全に回復させます。
サポートされている環境
Ultralyticsは、CUDA、CUDNN、Python、PyTorchなどの必須依存関係がプリインストールされた、すぐに使用できるさまざまな環境を提供し、プロジェクトをすぐに開始できます。
- 無料の GPU Notebooks:
- Google Cloud:GCPクイックスタートガイド
- Amazon: AWS クイックスタートガイド
- Azure: AzureML クイックスタートガイド
- Docker: Dockerクイックスタートガイド
プロジェクトのステータス
このバッジは、すべてのYOLOv5 GitHub Actions継続的インテグレーション(CI)テストが正常に合格していることを示します。これらのCIテストでは、トレーニング、検証、推論、エクスポート、ベンチマークなど、さまざまな重要な側面についてYOLOv5の機能と性能を厳密にチェックします。これらのテストは、macOS、Windows、Ubuntuでの一貫した信頼性の高い動作を保証し、24時間ごと、および新しいコミットごとに行われます。