PyTorch 1.0でのより高速なR-CNNとマスクR-CNN(個人使用のための翻訳)

PyTorch 1.0でのより高速なR-CNNとマスクR-CNN(個人使用のための翻訳)

前のドキュメントと同じように、プロジェクトを理解するのに便利なgithubのREADME.MDドキュメントの翻訳でもあります。翻訳は少しワイルドです。侵入
maskrcnn-benchベンチマークは非推奨になりました。maskrcnn-benchmarkを使用してモデルを構築するためのすべての実装方法が含まれているdetectron2を参照してください。

このプロジェクトは、Pythorc1.0を使用して検出およびセグメンテーションモデルを作成するために必要なコンポーネントを提供することを目的としています。
[外部リンク画像の転送に失敗しました。ソースサイトにアンチホットリンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-vOM0TqMI-1597029193008)(demo / demo_e2e_mask_rcnn_X_101_32x8d_FPN_1x.png "http:// cocodatasetから。 org /#explore?id = 345434 ")]

ハイライト

  • 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+ valminusminivalCOCO_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

データセットを作成したら、それをいくつかの場所に追加する必要があります。

テスト

前述の例はトレーニングに使用できますが、テスト中の精度を計算するために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を使用するプロジェクト

ライセンス

maskrcnn-benchmarkはMITライセンスの下でリリースされています。詳細については、ライセンスを参照してください。

おすすめ

転載: blog.csdn.net/qq_42946328/article/details/107907862