GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

mahyarnajibi

SNIPER – SNIPERは効率的なマルチスケールオブジェクト検出アルゴリズム

投稿日:

SNIPERは効率的なマルチスケールオブジェクト検出アルゴリズムです

SNIPER:効率的なマルチスケールトレーニング

SNIPERは、オブジェクト検出やインスタンスレベルのセグメンテーションなどのインスタンスレベルの認識タスクに対して効率的なマルチスケールのトレーニングアプローチです。 画像ピラミッド内のすべてのピクセルを処理する代わりに、SNIPERは地面真理オブジェクト(別名チップ )周辺のコンテキスト領域を選択的に処理します。 これにより、低解像度のチップで動作するため、マルチスケールのトレーニングが大幅に高速化されます。 メモリ効率の良い設計により、SNIPERはトレーニング中にBatch Normalizationの恩恵を受けることができます。また、単一のGPUでインスタンスレベルの認識タスクを実行できるように、より大きなバッチサイズを実現します。 したがって、GPU間でバッチ正規化の統計情報を同期させる必要はなく、画像の分類と同様にオブジェクト検出器を訓練することができます。

SNIPERについては、次の文書で説明します。

SNIPER: Efficient Multi-Scale Training
Bharat Singh*, Mahyar Najibi*, and Larry S. Davis (* denotes equal contribution)
arXiv preprint arXiv:1805.09300, 2018.

特徴

  1. 8つのV100 GPUにResNet-101バックボーンを装備した160枚のバッチサイズのトレイン
  2. NO PYTHON LAYERS(すべてのレイヤーはCUDA / C ++で大きなバッチサイズに最適化されています)
  3. 正確さを損なうことのないハーフ精密トレーニング
  4. 1つのV100 GPUでの推論中に5画像/秒、セグメンテーションマスクのトレーニングなしでCOCOで47.6 / 68.5
  5. R-FCN-3KブランチはSNIPERによっても動力を与えられます。 ImageNetDetのYOLO-9000より21%優れています。 このブランチでは、サンプル数が非常に少ないオンザフライトレーニング(秒単位)もサポートされています(バウンディングボックスは不要です)。
  6. p3.x16.large AWSインスタンスで3日間でResNet-101でOpenImagesV4(COCOよりも14倍大きい)をトレーニングしましょう!

結果

ここでは、coco trainval setのこのリポジトリで訓練されたSNIPERのcoco test-dev結果と、バウンディングボックスアノテーションのみを使用しています。

事前に訓練されたデータセット ネットワーク構造 地図 mAP@0.5 mapp@0.75 mAP @ S mAP @ M mAP @ L
SNIPER ImageNet ResNet101 46.5 67.5 52.2 30.0 49.4 58.4
SNIPER OpenImages ResNet101 47.8 68.2 53.6 31.5 50.4 59.8

OpenImagesの事前訓練モデルとSNIPER検出器は、それぞれbash scripts/download_pretrained_models.shbash scripts/download_sniper_detector.shます。

ライセンス

SNIPERはApacheライセンスでリリースされています。 詳細については、ライセンスを参照してください。

引用

@article{sniper2018,
  title={{SNIPER}: Efficient Multi-Scale Training},
  author={Singh, Bharat and Najibi, Mahyar and Davis, Larry S},
  journal={arXiv preprint arXiv:1805.09300},
  year={2018}
}
@article{analysissnip2017,
  title={An analysis of scale invariance in object detection-snip},
  author={Singh, Bharat and Davis, Larry S},
  journal={CVPR},
  year={2018}
}

内容

  1. インストール
  2. デモの実行
  3. SNIPERでモデルをトレーニングする
  4. 訓練されたモデルの評価
  5. このレポの他の方法および支店(SSH顔検出器、R-FCN-3K、オープンイメージ)

インストール

  1. リポジトリをクローン:
git clone --recursive https://github.com/mahyarnajibi/SNIPER.git
  1. リポジトリ内で提供されているMXNetフォークをコンパイルします。

CUDACuDNNOpenCV 、およびOpenBLASをインストールする必要があります。 これらのライブラリは、 SNIPER-mxnetリポジトリの提供されたconfig.mkファイルでデフォルトで使用されるように設定されています。 makeコマンドを使ってMXNetライブラリを構築makeことができます:

cd SNIPER-mxnet
make -j [NUM_OF_PROCESS] USE_CUDA_PATH=[PATH_TO_THE_CUDA_FOLDER]

複数のGPUでモデルを訓練する予定がある場合は、オプションですが、 NCCLをインストールし、 NCCLをサポートするMXNetを構築することをお勧めします。

make -j [NUM_OF_PROCESS] USE_CUDA_PATH=[PATH_TO_THE_CUDA_FOLDER] USE_NCCL=1 

この場合、上記のコマンドでNCCLのインストールパスを指すようにUSE_NCCL_PATH変数を設定する必要があります。

MXNetのコンパイル方法の詳細については、 こちらを参照してください

  1. libディレクトリのC ++ファイルをコンパイルします。 次のスクリプトはすべてをコンパイルします。
bash scripts/compile.sh
  1. 必要なPythonパッケージをインストールします。
pip install -r requirements.txt

デモの実行

デモを実行するには、提供されたSNIPERモデルをダウンロードする必要があります。 以下のスクリプトは、SNIPERモデルをダウンロードし、それをデフォルトの場所に抽出します:

bash download_sniper_detector.sh

モデルをダウンロードした後、次のコマンドはSNIPER検出器を提供されているサンプルイメージのデフォルト設定で実行します:

python demo.py

すべてがうまくいくと、サンプル検出はdata/demo/demo_detections.jpgとして保存されdata/demo/demo_detections.jpg

また、スクリプトへのパスを指定することで、任意の画像上で検出器を実行することもできます。

python demo.py --im_path [PATH to the image]

ただし、複数のイメージで検出器を実行する場合は、提供されているマルチプロセスおよびマルチバッチのmain_testモジュールの使用を検討してください。

モデルのトレーニング

COCOのSNIPERを訓練するには、事前にトレーニングされたモデル、ネガティブチップマイニングに使用される事前計算された提案(他の提案セットも使用できます)をダウンロードし、以下に説明するようにデータセットを設定する必要があります。

事前訓練を受けたモデルのダウンロード

次のスクリプトを実行すると、事前にトレーニングされたモデルがダウンロードされ、デフォルトパス( data/pretrained_model )に抽出されます。

bash download_pretrained_models.sh

負のチップマイニングのために事前計算された提案をダウンロードする

次のスクリプトを実行すると、事前計算された提案をダウンロードし、デフォルトのパス( data/proposals )に抽出します。

bash download_sniper_neg_props.sh

COCOデータセットの設定

データセットをダウンロードするには、 公式のCOCOデータセットWebサイトに従ってください。 データセットをダウンロードしたら、次のディレクトリ構造が必要です。

data
  |--datasets
        |--coco
           |--annotations
           |--images

SNIPERとデフォルトのパラメータを使用してモデルをトレーニングするには、次のスクリプトを呼び出すことができます。

python main_train.py

デフォルト設定は、設定ファイルを渡すことによって上書きすることができます(設定ファイルなどのconfigsフォルダを参照)。 設定ファイルへのパスは、上記のスクリプトに--cfgフラグを使用して引数として渡すことができます。

デフォルトの設定ファイルは、リリースされたモデルを訓練するのに使用されているのと同じ設定になっています。 メモリ量の少ないGPUを使用している場合は、トレーニングバッチサイズを小さくすることを検討してください(設定ファイルでTRAIN.BATCH_IMAGESを設定する)。 また、データの処理にはマルチプロセッシングが使用されます。 より少ないメモリ量のために、( TRAIN.NUM_PROCESSTRAIN.NUM_THREAD設定することによって)システムに応じてプロセス数とスレッド数を減らす必要があります。

訓練を受けたモデルの評価

提供されたSNIPERモデルの評価

リポジトリには、事前に訓練された一連のSNIPERモデルが用意されています。これらのモデルは、次のスクリプトを実行してダウンロードできます。

bash download_sniper_detector.sh

このスクリプトはモデルの重みをダウンロードし、それらを予想されるディレクトリに抽出します。 coco test-devでこれらのモデルをデフォルト設定で評価するには、次のスクリプトを実行します。

python main_test.py

デフォルト設定は、パスを設定ファイルに--cfgフラグで渡すことで上書きできます(例は--cfgフォルダを参照してください)。

評価は、バッチおよびパラレルモデルの転送設定ごとに複数イメージで実行されます。 GPUメモリが少ない場合は、( TEST.BATCH_IMAGESを設定して)異なる縮尺のバッチサイズを減らすか、パラレルジョブの数を減らしてください(設定ファイルでTEST.CONCURRENT_JOBSを設定してTEST.CONCURRENT_JOBS )。

このリポジトリで訓練されたモデルの評価

このリポジトリでトレーニングされたモデルを評価するには、トレーニング中に使用したのと同じ設定ファイルを渡して、次のスクリプトを実行します。 テスト設定は、設定ファイルのTESTセクションを更新することで設定できます(例については、 configsフォルダを参照してください)。

python main_test.py --cfg [PATH TO THE CONFIG FILE USED FOR TRAINING]

デフォルトでは、これはtest-dev上の検出を含むjsonファイルを生成し、これは圧縮されてCOCO評価サーバにアップロードされます。

このレポの支店(SSHフェイスディテクタ、R-FCN-3K、ソフトサンプリング)

R-FCN-3K

このレポには、 R-FCN-3k検出器も含まれています。

具体的な手順については、 R-FCN-3k支店に切り替えてください。

ソフトサンプリングによるOpenImagesV4

このレポには、 オープンイメージデータセットを訓練するためのモジュールも含まれています。 具体的な手順については、 openimages2ブランチに切り替えてください。 OpenImagesV4の検出器はソフトサンプリングで訓練されました。

SSHの顔検出器

すぐにSSH顔検出器がこのリポジトリに追加されます。 その間、元のSSHリポジトリで利用可能なコードを使用することができます







-mahyarnajibi
-

執筆者: