PyTorch 1.0でのより高速なR-CNNとマスクR-CNN(個人使用のための翻訳)
前のドキュメントと同じように、プロジェクトを理解するのに便利なgithubのREADME.MDドキュメントの翻訳でもあります。翻訳は少しワイルドです。侵入
maskrcnn-benchベンチマークは非推奨になりました。maskrcnn-benchmarkを使用してモデルを構築するためのすべての実装方法が含まれているdetectron2を参照してください。
このプロジェクトは、Pythorc1.0を使用して検出およびセグメンテーションモデルを作成するために必要なコンポーネントを提供することを目的としています。
ハイライト
- PyTorch 1.0: Detectronの精度と一致するかそれを超えるRPN、より高速なR-CNNおよびMaskR-CNNの実装
- 非常に高速:トレーニング、Detectronよりも2倍高速、mmdetectionの比率が30%高速。詳細については、MODEL_ZOO.mdを参照してください。
- メモリ効率:トレーニング中に使用されるGPUメモリはmmdetectionよりも約500MB少ない
- マルチGPUトレーニングと推論
- 混合精度トレーニング:NVIDIAテンソルコアで使用するGPUメモリが少ないほど、トレーニング速度が速くなります。
- バッチ推論:各GPUの各バッチを使用して、複数の画像を処理して推論を実行できます
- CPUサポートテスト:テストはCPUで実行されます。その他のケースについては、ウェブカメラのデモをご覧ください
- 1xスケジュール構成で、ほぼすべての参照マスクR-CNNおよび高速R-CNNの事前トレーニング済みモデルを提供します。
WebカメラとJupyterノートブックのデモ
推論に「maskrcnn_benchmark」を使用する方法を示す簡単なWebカメラデモを提供します。
cd demo
# by default, it runs on the GPU
# for best results, use min-image-size 800
python webcam.py --min-image-size 800
# can also run it on the CPU
python webcam.py --min-image-size 300 MODEL.DEVICE cpu
# or change the model that you want to use
python webcam.py --config-file ../configs/caffe2/e2e_mask_rcnn_R_101_FPN_1x_caffe2.yaml --min-image-size 300 MODEL.DEVICE cpu
# in order to see the probability heatmaps, pass --show-mask-heatmaps
python webcam.py --min-image-size 300 --show-mask-heatmaps MODEL.DEVICE cpu
# for the keypoint demo
python webcam.py --config-file ../configs/caffe2/e2e_keypoint_rcnn_R_50_FPN_1x_caffe2.yaml --min-image-size 300 MODEL.DEVICE cpu
デモ付きのノートブックは、demo /Mask_R-CNN_demo.ipynbで表示できます。
インストール
インストール手順については、INSTALL.mdドキュメントを確認してください。
モデル動物園とベースライン
Detectronとmmdetectionとの事前訓練を受けたモデル、ベースラインと比較をして見ることができMODEL_ZOO.md。
数行の推論
事前にトレーニングされたモデルを使用して推論パイプラインの記述を簡素化するヘルパークラスを提供します。
これが私たちのやり方です。「デモ」フォルダで実行します。
from maskrcnn_benchmark.config import cfg
from predictor import COCODemo
config_file = "../configs/caffe2/e2e_mask_rcnn_R_50_FPN_1x_caffe2.yaml"
# update the config options with the config file
cfg.merge_from_file(config_file)
# manual override some options
cfg.merge_from_list(["MODEL.DEVICE", "cpu"])
coco_demo = COCODemo(
cfg,
min_image_size=800,
confidence_threshold=0.7,
)
# load image and then run prediction
image = ...
predictions = coco_demo.run_on_opencv_image(image)
CoCoデータセットでトレーニングする
次の例を実行するには、最初にインストールする必要がありますmaskrcnn_benchmark
。
あなたはまた、ココデータセットをダウンロードする必要があります。
私たちは以下のように象徴的に「データセット/」にココのデータセットのパスをリンクすることをお勧めします。
私たちは、使用minivalとvalvenusminivalコレクションからDetectronを
# symlink the coco dataset
cd ~/github/maskrcnn-benchmark
mkdir -p datasets/coco
ln -s /path_to_coco_dataset/annotations datasets/coco/annotations
ln -s /path_to_coco_dataset/train2014 datasets/coco/train2014
ln -s /path_to_coco_dataset/test2014 datasets/coco/test2014
ln -s /path_to_coco_dataset/val2014 datasets/coco/val2014
# or use COCO 2017 version
ln -s /path_to_coco_dataset/annotations datasets/coco/annotations
ln -s /path_to_coco_dataset/train2017 datasets/coco/train2017
ln -s /path_to_coco_dataset/test2017 datasets/coco/test2017
ln -s /path_to_coco_dataset/val2017 datasets/coco/val2017
# for pascal voc dataset:
ln -s /path_to_VOCdevkit_dir datasets/voc
PS COCO_2017_train
= COCO_2014_train
+ valminusminival
、COCO_2017_val
=minival
独自のデータセットパスを構成することもできます。
これを行うにmaskrcnn_benchmark/config/paths_catalog.py
は、データセットが保存されている場所を指すように変更するだけです。同じ2つのクラスのファイルの
新しいpaths_catalog.py
実現を作成し、トレーニングのPATHS_CATALOG
提供中にパラメーターとして構成することもできます。
シングルGPUトレーニング
提供する構成ファイルのほとんどは、8GPUで実行されていることを前提としています。
より少ないGPUで実行できるようにするには、いくつかの可能性があり
ます。1。変更せずに次の操作を実行します。
python /path_to_maskrcnn_benchmark/tools/train_net.py --config-file "/path/to/config/file.yaml"
これは、マルチGPUトレーニングで行う必要があることと非常によく似ており、箱から出してすぐに機能するはずです。
ただし、欠点は、より多くのGPUメモリを使用することです。その理由は、構成ファイルのグローバルバッチサイズをGPUの数で割るためです。したがって、GPUが1つしかない場合、これはGPUのバッチサイズが8倍に増加することを意味し、メモリ不足エラーが発生する可能性があります。
使用可能なメモリがたくさんある場合、これが最も簡単な解決策です。
2.cfgパラメーターを変更します
メモリ不足エラーが発生した場合は、グローバルバッチサイズを減らすことができます。
ただし、これは、学習率、反復回数、および学習率計画も変更する必要があることを意味します。以下は、1xプランのマスクR-CNN R-50FPNの例です。
python tools/train_net.py --config-file "configs/e2e_mask_rcnn_R_50_FPN_1x.yaml" SOLVER.IMS_PER_BATCH 2 SOLVER.BASE_LR 0.0025 SOLVER.MAX_ITER 720000 SOLVER.STEPS "(480000, 640000)" TEST.IMS_PER_BATCH 1 MODEL.RPN.FPN_POST_NMS_TOP_N_TRAIN 2000
これは、Detectronのスケジューリングルールに基づいています。
反復回数に8(および学習率プラン)を掛け、学習率を8倍にしたことに注意してください。
テスト中にバッチサイズも変更しましたが、テストに必要なメモリはトレーニングよりも少ないため、通常は不要です。
さらに、MODEL.RPN.FPN_POST_NMS_TOP_N_TRAIN 2000
トレーニングでは、デフォルトで画像ではなくバッチで選択することをお勧めするため、を設定しました。この値は、1000x画像/ GPUとして計算されます。ここでは、各GPUに2つの画像があるため、数値を1000 x 2 = 2000に設定します。GPUごとに8つのイメージがある場合、この値は8000に設定する必要があります。MODEL.RPN.FPN_POST_NMS_PER_BATCH
トレーニング中にFalseに設定されている場合は、適用されないことに注意してください。詳細については、#672を参照してください。
マルチGPUトレーニング
マルチGPUトレーニングtorch.distributed.launch
を開始するために内部で使用します
。マルチGPUトレーニングを開始するために内部で使用しますtorch.distributed.launch
。
Pytorchのこのユーティリティ関数は、使用するGPUの数としてPythonプロセスを生成し、各Pythonプロセスは1つのGPUのみを使用します。
export NGPUS=8
python -m torch.distributed.launch --nproc_per_node=$NGPUS /path_to_maskrcnn_benchmark/tools/train_net.py --config-file "path/to/config/file.yaml" MODEL.RPN.FPN_POST_NMS_TOP_N_TRAIN images_per_gpu x 1000
を設定するには、シングルGPUトレーニングのルールに従う必要があることに注意してくださいMODEL.RPN.FPN_POST_NMS_TOP_N_TRAIN
。
混合精密トレーニング
最近、APEXを使用して自動混合精度のサポートを追加しました。これを有効にするには、シングルGPUまたはマルチGPUのトレーニングを実行して設定するだけDTYPE "float16"
です。
export NGPUS=8
python -m torch.distributed.launch --nproc_per_node=$NGPUS /path_to_maskrcnn_benchmark/tools/train_net.py --config-file "path/to/config/file.yaml" MODEL.RPN.FPN_POST_NMS_TOP_N_TRAIN images_per_gpu x 1000 DTYPE "float16"
より詳細なロギングが必要な場合はAMP_VERBOSE
、Trueに設定されます。詳細については、混合精度トレーニングガイドを参照してください。
評価
単一または複数のGPUでモデルを直接テストできます。これは、1xスケジュールに基づいて8GPUでトレーニングされたマスクR-CNNR-50FPNの例です。
export NGPUS=8
python -m torch.distributed.launch --nproc_per_node=$NGPUS /path_to_maskrcnn_benchmark/tools/test_net.py --config-file "configs/e2e_mask_rcnn_R_50_FPN_1x.yaml" TEST.IMS_PER_BATCH 16
各クラスのmAPを計算するには、coco_eval.pyの数行を変更するだけです。詳細については、#524を参照してください。
抽象化
実装におけるいくつかの主要な抽象化の詳細については、ABSTRACTS.mdを参照してください。
独自のデータセットを追加する
この実装方法により、COCOスタイルのデータセットの
サポートが追加されます。ただし、新しいデータセットのトレーニングのサポートを追加するには、次のようにします。
from maskrcnn_benchmark.structures.bounding_box import BoxList
class MyDataset(object):
def __init__(self, ...):
# as you would do normally
def __getitem__(self, idx):
# load the image as a PIL Image
image = ...
# load the bounding boxes as a list of list of boxes
# in this case, for illustrative purposes, we use
# x1, y1, x2, y2 order.
boxes = [[0, 0, 10, 10], [10, 20, 50, 50]]
# and labels
labels = torch.tensor([10, 20])
# create a BoxList from the boxes
boxlist = BoxList(boxes, image.size, mode="xyxy")
# add the labels to the boxlist
boxlist.add_field("labels", labels)
if self.transforms:
image, boxlist = self.transforms(image, boxlist)
# return the image, the boxlist and the idx in your dataset
return image, boxlist, idx
def get_img_info(self, idx):
# get img_height and img_width. This is used if
# we want to split the batches according to the aspect ratio
# of the image, as it can be more efficient than loading the
# image from disk
return {
"height": img_height, "width": img_width}
それでおしまい。セグメンテーションマスク
(使用済みstructures.segmentation_mask.SegmentationMask
)や独自のインスタンスタイプなどのフィールドをボックスリストに追加することもできます。
以下のためにCOCODataset
全体の例を参照、実現する方法ですmaskrcnn_benchmark/data/datasets/coco.py
。
データセットを作成したら、それをいくつかの場所に追加する必要があります。
maskrcnn_benchmark/data/datasets/__init__.py
:に追加する__all__
maskrcnn_benchmark/config/paths_catalog.py
:DatasetCatalog.DATASETS
および対応するif
句DatasetCatalog.get()
テスト
前述の例はトレーニングに使用できますが、テスト中の精度を計算するためにcocoApiを使用します。したがって、テストデータセットは現在cocoApiに従う必要があります。
データセットをテスト用に有効にするにはmaskrcnn_benchmark/data/datasets/evaluation/__init__.py
、対応するifステートメントを次の場所に追加してください。
if isinstance(dataset, datasets.MyDataset):
return coco_evaluation(**args)
Detectronに従って、カスタムデータセットの重みを微調整します
ここのtools/trim_detectron_model.py
ような新しいスクリプトを作成します。
スクリプトを変更することで、削除するキーと保持するキーを決定できます。
次に、構成ファイルで変更を渡すだけですMODEL.WEIGHT
。
詳細については、#15を参照してください。
トラブルシューティング
このコードの実行またはコンパイル中に問題が発生した場合は、TROUBLESHOOTING.mdに一般的な問題のリストをまとめました。
質問がそこに表示されない場合は、新しい質問を開いてください。
引用
それがあなたの研究に役立つなら、あなたの出版物でこのプロジェクトを引用することを検討してください。以下はBibTeXリファレンスです。BibTeXエントリには、「url」LaTeXパッケージが必要です。
@misc{massa2018mrcnn,
author = {Massa, Francisco and Girshick, Ross},
title = {
{maskrcnn-benchmark: Fast, modular reference implementation of Instance Segmentation and Object Detection algorithms in PyTorch}},
year = {2018},
howpublished = {\url{https://github.com/facebookresearch/maskrcnn-benchmark}},
note = {Accessed: [Insert date here]}
}
maskrcnn-benchmarkを使用するプロジェクト
- RetinaMask:マスクの予測を学ぶことで、最先端のシングルショット検出が無料で向上します。
Cheng-Yang Fu、Mykhailo Shvets、およびAlexanderC.Berg。
技術レポート、arXiv、1901.03353。 - FCOS:完全畳み込みワンStageオブジェクト検出。
志ティエン、春華シェン、ハオ陳とトン氏。
技術レポート、arXivの、1904.01355 [コード] - MULAN:関節病変の検出、タグ付け、およびセグメンテーションのためのマルチタスクユニバーサル病変分析ネットワーク。
Ke Yan、Youbao Tang、Yifan Peng、Veit Sandfort、Mohammadhadi Bagheri、Zhiyong Lu、およびRonaldM.Summers。
MICCAI2019。[コード] - ディープオブジェクト検出器のトレーニングにはサンプリングヒューリスティックが必要ですか?
Joya Chen、Dong Liu、Tong Xu、Shilong Zhang、Shiwei Wu、Bin Luo、Xuezheng Peng、EnhongChen。Techreport
、arXiv、1909.04868。[コード]
ライセンス
maskrcnn-benchmarkはMITライセンスの下でリリースされています。詳細については、ライセンスを参照してください。