要点:
- Faster_R-CNN = RPN + 高速 R-CNN
GitHub地址:メインでのvision/torchvision/models/detection · pytorch/vision · GitHub
スリーファスター_R-CNN
Faster R-CNN アルゴリズムのプロセスは 3 つのステップに分割できます
- 画像をネットワークに入力して、対応する特徴マップを取得します
- RPN 構造を使用して候補フレームを生成し、RPN によって生成された候補フレームを特徴マップに投影して、対応する特徴行列を取得します。
- ROI プーリング層を介して各特徴行列を 7x7 特徴マップにスケーリングし、その後、完全に接続された一連の層を介して特徴マップを平坦化して、予測結果を取得します
3.1 損失ロジック
特徴マップ上の 3x3 スライディング ウィンドウごとに、元の画像の中心点に対応するスライディング ウィンドウの中心点を計算し、k 個のアンカー ボックスを計算します(提案との違いに注意してください)。
- 3 つのスケール (面積) { 1282 、 2562 、 5122 }
- 3 つの比率 { 1:1、1:2、2:1 }
- 各位置 (各スライディング ウィンドウ) は、元の画像上の 3x3=9 のアンカーに対応します。
1000x600x3 の画像の場合、約 60x40x9 (20k) のアンカーがあり、境界を越えるアンカーを無視すると、約 6k のアンカーが残ります。RPN によって生成された候補フレーム間には多くの重複があります。候補フレームの cls スコアに基づいて、非最大抑制が使用され、IoU が 0.7 に設定されるため、ピクチャごとに 2k の候補フレームのみが残ります。 。
3.2 RPN マルチタスク損失
3.3分類損失
3.4境界ボックス回帰損失
3.5 より高速な R-CNN トレーニング
RPN Loss + Fast R-CNN Loss の共同トレーニング方法を直接採用
元の論文では、RPNとFast R-CNNをそれぞれ学習させる方法
(1) imageNet の事前トレーニング済み分類モデルを使用して、事前畳み込みネットワーク層のパラメーターを初期化し、 RPNネットワーク パラメーターのトレーニングを個別に開始します。
(2) RPN ネットワークの固有の畳み込み層と全結合層パラメータを修正し、marelNet 事前トレーニング分類を使用して事前畳み込みネットワーク パラメータを初期化し、RPN ネットワークによって生成されたターゲット候補ボックスを使用して、 FastRCNN ネットワークパラメータ
(3) Fast RCNN によってトレーニングされた事前畳み込みネットワーク層パラメーターを修正し、RPN ネットワークの固有の畳み込み層と全結合層パラメーターを微調整します。
(4)また、事前畳み込みネットワーク層のパラメータを固定したままにし、FatRCNN ネットワークの全結合層のパラメータを微調整します。最後に、RPN ネットワークと FastRCN ネットワークは、事前畳み込みネットワーク層のパラメーターを共有して、統合ネットワークを形成します。
3.6高速なR-CNNフレームワーク
構造比較:
3.7 FPNネットワーク
- 物体検出タスク用
- cocoAP 2.3ポイント増加
- PascalAP が 3.8 ポイント増加
3.7.1 異なる予測特徴層に対するRPNとFast RCNNの重み共有
3.8 ソースコードの解釈
環境構成:
- Python3.6/3.7/3.8
- Pytorch1.7.1 (注: 公式混合精度トレーニング 1.6.0 を使用した後でのみサポートされるため、1.6.0 以降である必要があります)
- pycocotools(Linux:
pip install pycocotools
; Windows:pip install pycocotools-windows
(vs をインストールする必要はありません)) - トレーニングには GPU を使用するのが最適
- 詳細な環境構成については、を参照してください。
requirements.txt
ファイル構造:
§── バックボーン: 特徴抽出ネットワーク、独自の要件に応じて選択できます
§── network_files: 高速 R-CNN ネットワーク (高速 R-CNN および RPN モジュールを含む)
§── train_utils: トレーニングおよび検証関連モジュール (cocotools を含む) )
§── my_dataset.py: VOC データセットを読み取るためのカスタム データセット
§── train_mobilenet.py: バックボーンとして MobileNetV2 を使用したトレーニング
§── train_resnet50_fpn.py: バックボーンとして resnet50+FPN を使用したトレーニング
§── train_multi_GPU .py:複数の GPU を使用するユーザー
§── detect.py: シンプルな予測スクリプト、予測テストにトレーニング済みの重みを使用します
§── validation.py: トレーニング済みの重みを使用してデータの COCO インジケーターを検証/テストし、record_mAP.txt ファイルを生成します
━── pascal_voc_classes.json: pascal_voc ラベルファイル
トレーニング前ウェイトのダウンロード アドレス(ダウンロード後、バックボーン フォルダーに置きます):
- MobileNetV2 バックボーン: https://download.pytorch.org/models/mobilenet_v2-b0353104.pth
- ResNet50+FPN バックボーン: https://download.pytorch.org/models/fasterrcnn_resnet50_fpn_coco-258fb6c6.pth
- ダウンロードした事前トレーニングの重みの名前を忘れずに変更してください。たとえば、ファイルは train_resnet50_fpn.py では
fasterrcnn_resnet50_fpn_coco.pth
なく、 train_resnet50_fpn.py で読み取られます。fasterrcnn_resnet50_fpn_coco-258fb6c6.pth
このプロジェクトでは PASCAL VOC2012 データセットが使用されています。
- Pascal VOC2012 train/val データ セットのダウンロード アドレス: http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
- データ セットがわからない場合、またはトレーニングに独自のデータ セットを使用したい場合は、前のコースで PASCAL VOC データ セットを紹介し、独自のデータ セットを作成するコース ビデオをご覧ください。
- ResNet50+FPN と転移学習を使用して、VOC2012 データセットの重みを取得します: リンク: Baidu Netdisk 抽出コードを入力してください 抽出コード: vixt
トレーニング方法:
- 必ず事前にデータセットを準備してください
- 対応する事前トレーニング済みモデルの重みを必ず事前にダウンロードしてください。
- mobilenetv2+fasterrcnn をトレーニングするには、train_mobilenet.py トレーニング スクリプトを直接使用します。
- resnet50+fpn+fasterrcnn をトレーニングするには、train_resnet50_fpn.py トレーニング スクリプトを直接使用します。
予防:
- トレーニング スクリプトを使用するときは、「--data-path」(VOC_root) を「VOCdevkit」フォルダーを保存するルート ディレクトリに設定するように注意してください。
- FPN 構造を備えた高速 RCNN は大量のビデオ メモリを消費するため、GPU ビデオ メモリが十分でない場合 (batch_size が 8 未満の場合)、create_model 関数でデフォルトの Norm_layer、つまり Norm_layer を使用することをお勧めします。変数は渡されず、FrozenBatchNorm2d がデフォルトで使用されます (つまり、更新されません。パラメーターの bn 層) が使用されており、その効果は非常に優れていることがわかります。
- 予測スクリプトを使用する場合は、「train_weights」を独自に生成したウェイト パスに設定します。
- 検証ファイルを使用する場合は、検証セットまたはテスト セットに各カテゴリのターゲットが含まれていることを確認してください。また、変更する必要があるのは「--num-classes 」、「 --data-path 」、「 --weights 」のみです。はい、他のコードは変更しないようにしてください。