代わりにこれを使用してください:https://github.com/facebookresearch/maskrcnn-benchmark

Detectronの前処理された重量を使用したE2E_MASK_RCNN-R-101-FPN_2Xの出力の例。

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

検出前重量を使用したE2E_KEYPOINT_RCNN-R-50-FPN_S1Xの例の出力。
このコードは、Detectronの実装アーキテクチャに従います。機能の一部のみがサポートされています。詳細については、このセクションを確認してください。
このコードを使用すると...
このリポジトリは、もともとJwyang/Faster-Rcnn.pytorchの上に構築されています。ただし、多くの変更の後、構造は大きく変化し、現在ではDetectronにより似ています。私は、公式の事前処理された重量ファイルから直接結果を再現するために、すべてをDetectronの実装と類似または同一に意図的に類似しています。
この実装には、次の機能があります。
純粋なPytorchコードです。もちろん、いくつかのCUDAコードがあります。
マルチイメージバッチトレーニングをサポートします。
複数のGPUトレーニングをサポートします。
3つのプーリング方法をサポートします。 Caffe2の実装に一致するようにROIアライメントのみが修正されることに注意してください。だから、それを使用してください。
メモリ効率が高くなります。データバッチの場合、メモリ使用量を削減するために利用可能な2つの技術があります。1)アスペクトグループ化:バッチで同様のアスペクト比を持つグループ画像2)アスペクトトリッピング:長すぎる作物画像。アスペクトグループはDetectronで実装されるため、デフォルトに使用されます。アスペクトクロップ化は、Jwyang/Faster-Rcnn.pytorchのアイデアであり、デフォルトには使用されていません。
それに加えて、異なるGPUで異なるバッチブロブサイズを有効にするカスタマイズされたnn.DataParallelモジュールを実装します。これの詳細については、私のnn.dataparallelセクションを確認してください。
リポジトリのクローン:
git clone https://github.com/roytseng-tw/mask-rcnn.pytorch.git
Python3でテストされました。
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を使用してGPUを設定する場合、コードをコンパイルするときに少なくとも1つのGPUが表示されることを確認してください。
レポの下にデータフォルダーを作成し、
cd {repo_root}
mkdir data
COCO :CoCo WebサイトからCOCO画像と注釈をダウンロードします。
そして、ファイルを次の構造として必ず配置してください。
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 Mini Annotationsをダウンロードしてください。ミニバルは、最近定義された2017 VALセットとまったく同じであることに注意してください。同様に、Valminusminivalの連合と2014年の列車は、2017年の列車セットとまったく同じです。
必要な場所にデータセットを配置してから、 data/フォルダーの下のデータセットをソフトリンクしてください。
ln -s path/to/coco data/coco
より良いトレーニングパフォーマンスのために、画像をSSDに載せることをお勧めします
バックボーンネットワークには、CaffeのImagENet事前に抑制されたウェイトを使用しています。
それらをダウンロードして、 {repo_root}/data/pretrained_modelに入れます。
次のコマンドをすべてダウンロードできます。
argparse_color_formater 、 colorama 、 requests python tools/download_imagenet_weights.py
注:Caffeの前処理された重量は、Pytorchが前払いしたよりもわずかに優れたパフォーマンスを持っています。上記のリンクからCaffe事前処理されたモデルを使用して、結果を再現することをお勧めします。ちなみに、DetectronはCaffeの前提条件の重量も使用します。
Pytorchの事前訓練モデルを使用する場合は、BGRからRGBに画像を転置することを忘れないでください。また、Pytorchの前処理モデルで使用されているのと同じデータ前処理(マイナス平均と正規化)を使用してください。
上記のResNetに前処理された重みを使用することに加えて、次のようにモデル構成ファイルの対応する行を変更することにより、Detectronの重みを使用することもできます。
RESNETS:
IMAGENET_PRETRAINED_WEIGHTS: 'data/pretrained_model/R-50.pkl'
R-50-GN.PKLおよびR-101-GN.PKLは、GN_BASELINESに必要です。
x-101-32x8d.pkl、x-101-64x4d.pkl、x-152-32x8d-in5k.pklは、snextバックボーンに必要です。
あなたが何をしているのかわからない限り、提供された構成ファイル(configs/**/xxxx.yml)に何も変更しないでください
環境変数CUDA_VISIBLE_DEVICESを使用して、使用するgpusを制御します。
batch_size: NUM_GPUS x TRAIN.IMS_PER_BATCH
expection_batch_size:batch_size x iter_size
何かの変化: new value of something / old value of something
次の構成オプションは、実際のトレーニングセットアップに従って自動的に調整されます。1)GPUS NUM_GPUSの数、2)GPU TRAIN.IMS_PER_BATCH 、3)repute inter_sizeあたりのバッチiter_size
SOLVER.BASE_LR :batch_sizeの変化に直接勧めます。SOLVER.STEPS 、 SOLVER.MAX_ITER :effective_batch_sizeの変更に逆の圧倒的に調整します。たとえば、RES50バックボーンを使用してMask-RCNNを取ります。
python tools/train_net_step.py --dataset coco2017 --cfg configs/baselines/e2e_mask_rcnn_R-50-C4.yml --use_tfboard --bs {batch_size} --nw {num_workers}
--bsを使用して、デフォルトのバッチサイズをGPUに収まる適切な値に上書きします。 --nwのsimliar、データローダースレッドの数は、config.pyで4にデフォルトです。
Tensorboardの損失を記録するには—-use_tfboardを指定します。
注:keypoint-rcnnのトレーニングを行うときは、 --dataset keypoints_coco2017使用します。
--iter_sizeの使用Caffeと同様に、ネットワークを1回( optimizer.step() )すべてのiter_size Iterations(forward + backward)を更新します。このようにして、トレーニングのためのより大きな効果的なバッチサイズを持っています。ステップ数は、ネットワークの更新後にのみ増加することに注意してください。
python tools/train_net_step.py --dataset coco2017 --cfg configs/baselines/e2e_mask_rcnn_R-50-C4.yml --bs 4 --iter_size 4
iter_sizeデフォルトは1です。
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 Optimizerの場合、オプティマイザー状態には、各トレーニング可能なパラメーターの運動量が含まれています。
注: --resume --load_detectronでまだサポートされていません
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
要するに、 train_net_step.pyを使用してください。
in train_net_step.py :
SOLVER.LR_POLICY: steps_with_decayがサポートされています。 (非推奨) train_net.pyでは、いくつかの構成オプションには効果がなく、気付く価値があります。
SOLVER.LR_POLICY 、 SOLVER.MAX_ITER 、 SOLVER.STEPS 、 SOLVER.LRS :今のところ、トレーニングポリシーはこれらのコマンドライン引数によって制御されています。
--epochs :訓練する時代の数。 1つのエポックは、トレーニングセット全体を1回旅行することを意味します。デフォルトは6になります。--lr_decay_epochs :学習率を崩壊させるエポック。腐敗は時代の始まりに起こります。エポックは0インデックスされています。デフォルトは[4、5]になります。コマンドラインの引数については、 python train_net.py --help
SOLVER.WARM_UP_ITERS 、 SOLVER.WARM_UP_FACTOR 、 SOLVER.WARM_UP_METHOD :トレーニングウォームアップはサポートされていません。
たとえば、COCO2017 VALセットでMASK-RCNNをテストします
python tools/test_net.py --dataset coco2017 --cfg config/baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml --load_ckpt {path/to/your/checkpoint}
--load_detectronを使用して、検出区のチェックポイントをロードします。複数のGPUが利用可能な場合は、 --multi-gpu-testingを追加します。
別の出力directry --output_dir {...}指定します。デフォルトは{the/parent/dir/of/checkpoint}/testになります
python tools/infer_simple.py --dataset coco --cfg cfgs/baselines/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 defaults infer_outputsになります。
バックボーン:
ResNet50_conv4_body 、 ResNet50_conv5_body 、 ResNet101_Conv4_Body 、 ResNet101_Conv5_Body 、 ResNet152_Conv5_Body[fpn_]ResNet101_Conv4_Body 、 [fpn_]ResNet101_Conv5_Body 、 [fpn_]ResNet152_Conv5_Bodyfpn_ResNet50_conv5_body 、 fpn_ResNet50_conv5_P2only_body 、 fpn_ResNet101_conv5_body 、 fpn_ResNet101_conv5_P2only_body 、 fpn_ResNet152_conv5_P2only_body 、 fpn_ResNet152_conv5_bodyボックスヘッド: ResNet_roi_conv5_head 、 roi_2mlp_head 、 roi_Xconv1fc_head 、 roi_Xconv1fc_gn_head
Mask Head: mask_rcnn_fcn_head_v0upshare 、 mask_rcnn_fcn_head_v0up 、 mask_rcnn_fcn_head_v1up 、 mask_rcnn_fcn_head_v1up4convs 、 mask_rcnn_fcn_head_v1up4convs_gn
keypoints head: roi_pose_head_v1convX
注:命名は、Detectronで使用されているものに似ています。 prepending add_削除するだけです。
今のところココのみがサポートされています。ただし、データセットライブラリの実装全体は、Detectronのものとほぼ同じであるため、Detectronでサポートされているデータセットを簡単に追加できるはずです。
アーキテクチャ固有の構成ファイルは、構成の下に配置されます。一般的な構成ファイルlib/core/config.pyには、Detectronと同じデフォルト値を持つほぼすべてのオプションがあるため、アーキテクチャ固有の構成をDetectronから変換するのは簡単です。
対応する機能はまだ実装されていないため、 Detectronからのいくつかのオプションは使用されません。たとえば、テストでのデータ増強。
MODEL.LOAD_IMAGENET_PRETRAINED_WEIGHTS = True :イメージネットの前処理された重みをロードするかどうか。RESNETS.IMAGENET_PRETRAINED_WEIGHTS = '' :事前に処理された残留ネットワークの重みへのパス。 '/'で始める場合、それは絶対的な経路として扱われます。それ以外の場合は、 ROOT_DIRへの相対的なパスとして扱います。TRAIN.ASPECT_CROPPING = False 、 TRAIN.ASPECT_HI = 2 、 TRAIN.ASPECT_LO = 0.5 :画像のアスペクト比範囲を制限するためのアスペクトトリッピングのオプション。RPN.OUT_DIM_AS_IN_DIM = True 、 RPN.OUT_DIM = 512 、 RPN.CLS_ACTIVATION = 'sigmoid' :rpnの公式実装には、FG/BGクラスの予測の活性化関数と同じ入力および出力機能チャネルがあり、Sigmoidを使用します。 Jwyangの実装では、出力チャネル番号を512に修正し、SoftMaxをアクティベーション関数として使用します。MODEL.NUM_CLASSESを削除します。 --datasetで指定されたデータセットに従って設定されます。TRAIN.WEIGHTS 、 TRAIN.DATASETS 、 TEST.DATASETSを取り外しますMODEL.CONV_BODY 、 FAST_RCNN.ROI_BOX_HEAD ...)の場合、存在する場合は文字列にadd_を削除します。RESNETS.IMAGENET_PRETRAINED_WEIGHTSを追加して、事前に抑制された重量ファイルを指します。そうでない場合は、 MODEL.LOAD_IMAGENET_PRETRAINED_WEIGHTSをFalseに設定します。OUTPUT_DIR: .最後の行でNUM_GPUSを変更しないでください。トレーニング用の元のバッチサイズを推測するために使用され、学習率はバッチサイズの変更に応じて直線的にスケーリングされます。適切な学習率の調整は、異なるバッチサイズのトレーニングに重要です。RESNETS.USE_GN: Trueを追加します。 benchmark.md