GitHubじゃ!Pythonじゃ!

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

roytseng-tw

Detectron.pytorch – DetectronのPytorch実装。 最初から訓練されたものと、事前に測定されたDetectronの重さから直接推..

投稿日:

DetectronのPytorch実装。 最初から訓練されたものと、事前に測定されたDetectronの重さから直接推測されるものがあります。

DetectronのPytorch実装

Detectronの事前計算された重みを使用したe2e_mask_rcnn-R-101-FPN_2xの出力例。

Detectronからの対応する出力例。

Detectronの事前測定重量を使用したe2e_keypoint_rcnn-R-50-FPN_s1xの出力例。

このコードは、Detectronの実装アーキテクチャに従います。 機能の一部のみがサポートされています。 詳細については、 このセクション参照してください。

このコードで、あなたはすることができます…

  1. モデルを最初から訓練する。
  2. Detectronから事前に測定された重量ファイル(* .pkl)を使用する推論。

このリポジトリはもともとjwyang / faster-rcnn.pytorch上に構築されています。 しかし、多くの変更の後、構造が大きく変化し、 Detectronに似ています 私は意図的に、Detectronの実装に似ているか同一であるものをすべて公表し、正式な事前秤量ファイルから直接結果を再現します。

この実装には次の機能があります。

  • それは純粋なPytorchコードです。 もちろん、いくつかのCUDAコードがあります。

  • マルチイメージバッチトレーニングをサポートしています

  • 複数のGPUトレーニングをサポートします

  • 3つのプーリング方法をサポートしています Caffe2の実装に合わせてroi alignのみが改訂されていることに注意してください。 だから、それを使ってください。

  • それはメモリ効率的です。 データのバッチ処理では、メモリ使用量を減らすために2つのテクニックが利用できます。1) アスペクトのグループ化 :アスペクト比が類似したグループイメージをバッチでグループ化する。2) アスペクトクロッピング :長すぎるイメージをトリミングする アスペクトのグループ化はDetectronで実装されているため、デフォルトで使用されています。 アスペクトクロッピングはjwyang / faster-rcnn.pytorchのアイデアであり、デフォルトでは使用されません。

    それ以外にも、カスタマイズされたnn.DataParallelモジュールを実装して、異なるgpus上で異なるバッチBLOBサイズを有効にします。 詳細については、 「nn.DataParallel」セクションを参照してください。

ニュース

  • (2018/05/15)PyTorch0.4が今サポートされています!

入門

レポをクローン:

git clone https://github.com/roytseng-tw/mask-rcnn.pytorch.git

要件

python3でテストされています。

  • Pythonパッケージ
    • Pytorch> = 0.3.1
    • torchvision> = 0.2.0
    • サイモン
    • matplotlib
    • 貧弱
    • サイキー
    • opencv
    • パイラム
    • 梱包
    • pycocotools – COCOデータセットのため、pipからも入手できます。
    • tensorboardX – Tensorboardでロスを記録する
  • NVIDAI GPUおよびCUDA 8.0以上。 いくつかの操作はgpuの実装しかありません。
  • 注意 :異なるバージョンのPytorchパッケージでは、メモリの使用方法が異なります。

編集

CUDAコードをコンパイルする:

cd lib  # please change to this directory
sh make.sh

Volta GPUを使用している場合は、 lib/mask.shこの行のコメントを外し、上記の行にバックスラッシュを後置することを忘れないでください。 CUDA_PATHデフォルトは/usr/loca/cudaです。 別のパスでCUDAライブラリを使用する場合は、この行を適宜変更してください。

NMS、ROI_Pooing、ROI_Crop、ROI_Alignなど、必要なすべてのモジュールをコンパイルします。 (実際にはgpu nmsは使用されません…)

CUDA_VISIBLE_DEVICESを使用してCUDA_VISIBLE_DEVICESを設定する場合は、コードをコンパイルするときにgpuが少なくとも1つ表示されていることを確認してください。

データ準備

レポの下にデータフォルダを作成し、

cd {repo_root}
mkdir data
  • ココ: ココのウェブサイトからココの画像と注釈をダウンロードします

    ファイルを次のような構造にしてください:

    coco
    ├── annotations
    |   ├── instances_minival2014.json
    │   ├── instances_train2014.json
    │   ├── instances_train2017.json
    │   ├── instances_val2014.json
    │   ├── instances_val2017.json
    │   ├── instances_valminusminival2014.json
    │   ├── ...
    |
    └── images
        ├── train2014
        ├── train2017
        ├── val2014
        ├──val2017
        ├── ...
    

    ここからcocoミニ注釈をダウンロードしてください ミニバンは、最近定義された2017年のvalとまったく同じです。 同様に、valminusminivalと2014年の列車の組合は、2017年の列車とまったく同じです。

    データセットを任意の場所に配置し、 data/フォルダの下にあるdata/セットをソフトリンクしてください。

    ln -s path/to/coco data/coco
    

    より良いトレーニングパフォーマンスを得るために、画像をSSDに配置することをお勧めします

事前トレーニングされたモデル

私はバックボーンネットワークのためにCaffeからImageNet事前重み付けを使用しています。

それらをダウンロードして{repo_root}/data/pretrained_modelます。

それらをすべてダウンロードするには、次のコマンドを実行します。

  • 余分な必須パッケージ: argparse_color_formatercoloramarequests
python tools/download_imagenet_weights.py

:Caffe pretrainedウェイトはPytorch pretrainedより少し良いパフォーマンスを持っています。 結果を再現するために上記のリンクからCaffe pretrainedモデルを使用することを提案してください。 ところで、DetectronはCaffeから事前に重み付けされたウェイトも使用しています。

Pytorchの事前訓練モデルを使用したい場合は、BGRからRGBに画像を転置し、Pytorch事前訓練モデルで使用されているのと同じデータ前処理(平均値と標準化を除く)を使用することを忘れないでください。

トレーニング

あなたが何をしているのか分からない限り、提供された設定ファイル(configs / xxxx.yml)の内容を変更しないでください

使用するGPUを制御するには、環境変数CUDA_VISIBLE_DEVICESを使用します。

アダプティブ設定の調整

最初にいくつかの用語を定義しましょう

batch_size: NUM_GPUS x TRAIN.IMS_PER_BATCH
effective_batch_size:batch_size x iter_size
somethiningの変化:何かのnew value of something / old value of something

次の設定オプションは、1)GPU数NUM_GPUS 、2)GPUあたりのバッチサイズTRAIN.IMS_PER_BATCH 、3)更新周期iter_size

  • SOLVER.BASE_LR :batch_sizeの変更に対して直接propotionalに調整します。
  • SOLVER.STEPSSOLVER.MAX_ITER :effective_batch_sizeの変更に反比例して調整します。

最初から列車に乗る

たとえば、res50のバックボーンを使ってmask-rcnnを実行します。

python tools/train_net_step.py --dataset coco2017 --cfg configs/e2e_mask_rcnn_R-50-C4.yml --use_tfboard --bs {batch_size} --nw {num_workers}

デフォルトのバッチサイズをGPUに適合する適切な値に上書きするには、 --bsを使用します。 Simliar –nwの--nw 、データローダスレッドの数はconfig.pyのデフォルトで4です。

—-use_tfboardを指定して、 —-use_tfboardの損失を記録します。

--dataset keypoints_coco2017 -rcnnのトレーニングでは--dataset keypoints_coco2017使用してください。

--iter_sizeの使用

Caffeのように、ネットワークを一度( optimizer.step()iter_size反復(forward + backward)ごとに1回更新します。 これにより、トレーニングに有効なバッチサイズが大きくなります。 ステップカウントは、ネットワークの更新後にのみ増加することに注意してください。

python tools/train_net_step.py --dataset coco2017 --cfg configs/e2e_mask_rcnn_R-50-C4.yml --bs 4 --iter_size 4

iter_sizeデフォルトは1です。

事前に訓練されたチェックポイントからのFinetune

python tools/train_net_step.py ... --load_ckpt {path/to/the/checkpoint}

Detectronのチェックポイントファイルを使用する

python tools/train_net_step.py ... --load_detectron {path/to/the/checkpoint}

同じデータセットとバッチサイズでトレーニングを再開する

python tools/train_net_step.py ... --load_ckpt {path/to/the/checkpoint} --resume

トレーニングを再開すると、 ステップ数オプティマイザの状態もチェックポイントから復元されます。 SGDオプティマイザの場合、オプティマイザ状態には各学習可能パラメータのモメンタムが含まれます。

:– --resume--resumeではまだサポートされていません

コマンドラインで設定オプションを設定する

  python tools/train_net_step.py ... --no_save --set {config.name1} {value1} {config.name2} {value2} ...
  • たとえば、デバッグのために実行します。
    python tools/train_net_step.py ... --no_save --set DEBUG True
    

    注釈を少なく読み込んでトレーニングの進捗状況を確認します。 チェックポイントやログを保存しないようにするには--no_saveを追加してください。

コマンドラインヘルプメッセージを表示する

python train_net_step.py --help

2つのトレーニングスクリプト

要するに、 train_net_step.py使用してtrain_net_step.py

train_net_step.py

(廃止予定) train_net.pyいくつかの設定オプションは効果がなく、気づく価値がありません:

  • SOLVER.LR_POLICYSOLVER.MAX_ITERSOLVER.STEPSSOLVER.LRS :今のところ、トレーニングポリシーは次のコマンドライン引数によって制御されます。

    • --epochsエポック:訓練するエポックの数。 1つのエポックは、1つのトレーニングセット全体を通る1つの移動を意味します。 デフォルトは6です。
    • --lr_decay_epochs :学習率を減衰させるエポック。 崩壊はエポックの始まりに起こる。 エポックは0インデックス付きです。 デフォルトは[4、5]です。

    より多くのコマンドライン引数については、 python train_net.py --helpを参照してください。

  • SOLVER.WARM_UP_ITERSSOLVER.WARM_UP_FACTORSOLVER.WARM_UP_METHOD :ウォームアップトレーニングはサポートされていません。

推論

トレーニング結果を評価する

たとえば、coco2017 val setのmask-rcnnをテストします。

python tools/test_net.py --dataset coco2017 --cfg config/e2e_mask_rcnn_R-50-FPN_1x.yaml --load_ckpt {path/to/your/checkpoint}

Detectronのチェックポイントをロードするには、 – --load_detectronを使用します。 複数のgpusが利用可能な場合は、 --multi-gpu-testing追加し--multi-gpu-testing

--output_dir {...}使用して、別の出力指示を指定し--output_dir {...} デフォルトは{the/parent/dir/of/checkpoint}/test

画像のトレーニング結果を視覚化する

python tools/infer_simple.py --dataset coco --cfg cfgs/e2e_mask_rcnn_R-50-C4.yml --load_ckpt {path/to/your/checkpoint} --image_dir {dir/of/input/images}  --output_dir {dir/to/save/visualizations}

--output_dirデフォルトはinfer_outputsです。

サポートされているネットワークモジュール

  • 背骨:

    • ResNet: ResNet50_conv4_bodyResNet50_conv5_bodyResNet101_Conv4_BodyResNet101_Conv5_BodyResNet152_Conv5_Body
    • FPN: fpn_ResNet50_conv5_bodyfpn_ResNet50_conv5_P2only_bodyfpn_ResNet101_conv5_bodyfpn_ResNet101_conv5_P2only_bodyfpn_ResNet152_conv5_bodyfpn_ResNet152_conv5_P2only_body

    ResNeXtも実装されていますが、まだテストされていません。

  • ボックスヘッド: ResNet_roi_conv5_headroi_2mlp_head

  • マスクヘッド: mask_rcnn_fcn_head_v0upsharemask_rcnn_fcn_head_v0upmask_rcnn_fcn_head_v1up4convsmask_rcnn_fcn_head_v1up

  • キーポイントヘッド: roi_pose_head_v1convX

注記 :命名はDetectronで使用されているものに似ています。 add_の前にあるものを削除してください。

サポートされるデータセット

現在はCOCOのみがサポートされています。 ただし、データセットライブラリの実装全体はDetectronとほとんど同じですので、Detectronでサポートされているデータセットを追加するのは簡単です。

設定オプション

アーキテクチャー固有の構成ファイルはconfigsの下に置かれます。 一般的な設定ファイルlib / core / config.pyに はDetectronのデフォルト値とほぼ同じオプションが用意されているため、Detectronからアーキテクチャ固有の設定を変換するのは簡単です。

Detectronの一部のオプションは 、対応する機能がまだ実装されていないため使用されません。 たとえば、テストでのデータ増強などです。

余分なオプション

  • MODEL.LOAD_IMAGENET_PRETRAINED_WEIGHTS = True :事前に重み付けされたImageNetをロードするかどうかを指定します。
    • RESNETS.IMAGENET_PRETRAINED_WEIGHTS = '' :事前に計算された残余ネットワーク重みのパス。 '/'で始まる場合、絶対パスとして扱われます。 それ以外の場合は、 ROOT_DIRへの相対パスとして扱います。
  • TRAIN.ASPECT_CROPPING = FalseTRAIN.ASPECT_HI = 2TRAIN.ASPECT_LO = 0.5 :画像アスペクト比範囲を制限するアスペクトクロッピングのオプション。
  • RPN.OUT_DIM_AS_IN_DIM = TrueRPN.OUT_DIM = 512RPN.CLS_ACTIVATION = 'sigmoid' :RPNの公式の実装では、入出力機能のチャンネルが同じで、fg / bgクラス予測の起動関数としてsigmoidを使用します。 jwyangの実装では 、出力チャネル番号を512に固定し、 softmaxを起動関数として使用します。

Detectronから構成ファイルを変換する方法

  1. MODEL.NUM_CLASSES削除してMODEL.NUM_CLASSES これは、 – datasetで指定されたデータセットに従って設定され--dataset
  2. TRAIN.WEIGHTSTRAIN.DATASETSおよびTEST.DATASETS削除する
  3. モジュールタイプのオプション( MODEL.CONV_BODYFAST_RCNN.ROI_BOX_HEADなど)の場合は、文字列のFAST_RCNN.ROI_BOX_HEADが存在する場合はそれを削除しadd_
  4. ImageNetの事前に重み付けされた荷重をモデルにロードする場合は、事前計算された荷重ファイルを指すRESNETS.IMAGENET_PRETRAINED_WEIGHTS追加します。 そうでない場合は、 MODEL.LOAD_IMAGENET_PRETRAINED_WEIGHTSFalseに設定します。
  5. [オプション] OUTPUT_DIR: .削除しOUTPUT_DIR: . 最後の行で
  6. 設定ファイルでNUM_GPUSオプションを変更しないでください。 元のバッチサイズを学習用に推測するのに使用され、学習率はバッチサイズの変化に応じて線形に拡大されます。 適切な学習率の調整は、異なるバッチサイズのトレーニングにとって重要です。

私のnn.DataParallel

  • 特定のキーワード入力をCPU上に保持公式DataParallelはすべての入力変数をGPUにブロードキャストします。 しかし、CPUには多くのRPP関連の計算が行われており、これらの入力をGPUに入れる必要はありません。
  • 異なるGPUに異なるBLOBサイズを許可 gpuメモリを節約するために、画像は各GPUごとに別々にパディングされます。
  • 辞書型の戻り値を処理する

基準

BENCHMARK.md







-roytseng-tw
-, , , , ,

執筆者: