GitHubじゃ!Pythonじゃ!

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

CSAILVision

semantic-segmentation-pytorch – MIT ADE20Kデータセットのセマンティックセグメンテーション/シーン解析のためのPytor..

投稿日:

MIT ADE20Kデータセットのセマンティックセグメンテーション/シーン解析のためのPytorch実装 http://sceneparsing.csail.mit.edu/

PyTorchにおけるMIT ADE20Kデータセットのセマンティックセグメンテーション

これは、MIT ADE20Kシーン解析データセット上のセマンティックセグメンテーションモデルのPyTorch実装です。

ADE20Kは、セマンティックセグメンテーションとシーン解析のための最大のオープンソースデータセットであり、MIT Computer Visionチームによってリリースされました。 CaffeとTorch7のデータセットと実装のリポジトリを見つけるには、以下のリンクを参照してください: https : //github.com/CSAILVision/sceneparsing

事前トレーニングされたモデルはhttp://sceneparsing.csail.mit.edu/model/で見ることができます。

[左から順に、テスト画像、グラウンドトゥルース、予測結果]

ハイライト[NEW!]

PyTorchでのシンクロナイズバッチ正規化

このモジュールは、PyTorch BatchNormとは異なり、平均と標準偏差はトレーニング中にすべてのデバイスで減少します。 MegDet:Large Mini-Batch Object Detectorの広範な分析により、物体検出における同期化されたバッチ正規化の重要性が最近証明されており、セグメント化にとっても重要であることが経験的に分かっている。

実装は次の理由により妥当である:

  • この実装は純粋なPythonで行われています。 C ++の拡張ライブラリはありません。
  • 使いやすい。
  • PyTorchの実装と完全に互換性があります。 具体的には、不偏分散を使用して移動平均を更新し、sqrt(var + eps)の代わりにsqrt(max(var、eps))を使用します。

最善の知識のために、PyTorchのsync-bnの最初のpure-python実装であり、PyTorchと完全に互換性がある最初のPython実装です。 また、効率的で、同期化されていない同期よりもわずか20%〜30%遅いです。 私たちは特に彼の種類の貢献のためにJiayuan Maoに感謝します。 実装と使用方法の詳細については、 Synchronized-BatchNorm-PyTorchを参照してください。

複数のGPUを使用したトレーニング用入力の動的スケール

入力画像が224×224などの固定スケールにリサイズされる画像分類タスクとは異なり、セマンティックセグメンテーションおよびオブジェクト検出ネットワークの入力画像の元のアスペクト比を維持する方がよい。

そこで、私たちはDataParallelモジュールを再実装し、Python dictで複数のGPUにデータを配布することをサポートします。 同時に、データローダーも異なる動作をします。 データローダーのバッチサイズは常にGPUの数に等しいので 、各要素はGPUに送られます。 マルチ処理にも対応しています。 マルチプロセッシングデータローダーのファイルインデックスはマスタプロセスに格納されていることに注意してください。これは、各ワーカーが独自のファイルリストを管理するという我々の目標に反しています。 だから、マスタプロセスが__getitem__関数のインデックスを与えているにもかかわらず、そのような要求を無視してランダムなバッチを送信するというトリックを使用します。 また、データローダーによってフォークされた複数のワーカーはすべて同じシードを持ちます。上記のトリックを直接使用すると、複数のワーカーが正確に同じデータを生成します。 したがって、dataloaderで複数のワーカーをアクティブ化する前にnumpy.randomのデファクトシードを設定するコードを1行追加します。

効率的かつ効果的なフレームワーク:UPerNet

(FPN)とピラミッドプーリングモジュール(PPM)をベースにしたUPerNet。ダウンサンプリングレートは4,8,16です。時間とメモリを消費する演算子である拡張畳み込みは不要です。 ベルやホイッスルなしでは、PSPNetに匹敵する、あるいはそれ以上に優れていますが、トレーニング時間が大幅に短縮され、GPUメモリが少なくて済みます。 たとえば、PSPNet-101をTITAN Xp GPUで12GBのメモリでトレーニングすることはできませんが、そのようなGPUでUPerNet-101をトレーニングすることはできます。

効率的なネットワーク設計のおかげで、すぐに通常のGPUで実行できるResNeXtに基づくUPerNetのより強力なモデルを公開します。

サポートされているモデル

私たちはモデルをエンコーダとデコーダに分割しました。エンコーダは通常、分類ネットワークから直接変更され、デコーダは最終的なコンボリューションとアップサンプリングから構成されています。

エンコーダ:(resnetXX_dilatedYY:拡張された畳み込みでカスタマイズされたresnetXX、出力フィーチャマップは入力サイズの1 / YYです)

  • ResNet18:resnet18_dilated16、resnet18_dilated8
  • ResNet50:resnet50_dilated16、resnet50_dilated8
  • ResNet101:resnet101_dilated16、resnet101_dilated8

近日公開予定

  • ResNeXt101:resnext101_dilated16、resnext101_dilated8

デコーダ:

  • c1_bilinear(1 conv + bilinear upsample)
  • c1_bilinear_deepsup(c1_blinear +深い監視トリック)
  • ppm_bilinear(ピラミッドプーリング+バイリニアアップサンプリング、詳細はPSPNetの論文を参照)
  • ppm_bilinear_deepsup(ppm_bilinear +深い監視トリック)
  • upernet(ピラミッドプーリング+ FPNヘッド)

パフォーマンス:

重要:私たちは、ImageNetで自習式ベースモデルを使用しています。 モデルはPyTorchのデフォルトの実装で使用されているように、RGB形式の代わりにBGR形式(opencvと一貫性があります)で入力を受け取ります。 必要に応じて基本モデルが自動的にダウンロードされます。

建築 MSテスト 平均IoU ピクセル精度 総合評点 トレーニングの時間
ResNet18_dilated8 + c1_bilinear_deepsup いいえ 33.82 76.05 54.94 0.42 * 20 = 8.4時間
ResNet18_dilated8 + ppm_bilinear_deepsup いいえ 38.00 78.64 58.32 1.1 * 20 = 22.0時間
ResNet50_dilated8 + c1_bilinear_deepsup いいえ 34.88 76.54 55.71 1.38 * 20 = 27.6時間
ResNet50_dilated8 + ppm_bilinear_deepsup いいえ 41.26 79.73 60.50 1.67 * 20 = 33.4時間
はい 42.04 80.23 61.14
ResNet101_dilated8 + ppm_bilinear_deepsup いいえ 42.19 80.59 61.39 3.82 * 25 = 95.5時間
はい 42.53 80.91 61.72
UperNet50 いいえ 40.44 79.80 60.12 1.75 * 20 = 35.0時間
はい 41.55 80.23 60.89
UperNet101 いいえ 41.98 80.63 61.34 2.5×25 = 62.5時間
はい 42.66 81.01 61.84
UPerNet-ResNext101(近いうちに!) – 時間

8つのNVIDIA Tesla P40 GPUS(22GB GPUメモリ)を搭載したサーバーでベンチマークされたResNet-101_dilated8 を除き、 8つのNVIDIA Pascal Titan Xp GPU(12GB GPUメモリ)を搭載したサーバーでは、メモリの問題が原因で速度がベンチマークされます非常に深いネットワーク上で拡張されたconvを使用している場合

環境

このコードは、以下の構成で開発されています。

  • ハードウェア:2〜8個のGPU(12G以上のGPUメモリを搭載)(対応する[--num_gpus NUM_GPUS]
  • ソフトウェア:Ubuntu 16.04.3 LTS、CUDA 8.0、 Python> = 3.5PyTorch> = 0.4.0

警告:古いPython 2はサポートしていません。 コードを実行するにはPyTorch 0.4.0以上が必要です。

クイックスタート:訓練を受けたモデルを使用して画像をテストする

  1. ここでは、単一のイメージについての推論を行う簡単なデモを示します。
chmod +x demo_test.sh
./demo_test.sh

このスクリプトはトレーニングされたモデルとテストイメージをダウンロードし、テストスクリプトを実行し、予測されたセグメンテーション(.png)を作業ディレクトリに保存します。

  1. 入力引数:(python3の完全な入力引数を参照してくださいtest.py -h)
usage: test.py [-h] --test_img TEST_IMG --model_path MODEL_PATH                                                                                                                  [--suffix SUFFIX] [--arch_encoder ARCH_ENCODER]
               [--arch_decoder ARCH_DECODER] [--fc_dim FC_DIM]
               [--num_val NUM_VAL] [--num_class NUM_CLASS]
               [--batch_size BATCH_SIZE] [--imgSize IMGSIZE [IMGSIZE ...]]
               [--imgMaxSize IMGMAXSIZE] [--padding_constant PADDING_CONSTANT]
               [--segm_downsampling_rate SEGM_DOWNSAMPLING_RATE]
               [--result RESULT] [--gpu_id GPU_ID]

トレーニング

  1. ADE20Kシーン解析データセットをダウンロードします。
chmod +x download_ADE20K.sh
./download_ADE20K.sh
  1. デフォルトネットワークを訓練する(ResNet50_dilated8 + ppm_bilinear_deepsup)。 トレーニング中に、チェックポイントはフォルダckpt保存されます。
python3 train.py --num_gpus NUM_GPUS

UPerNetをトレーニングする(例えば、エンコーダとしてResNet50またはResNet101)

python3 train.py --num_gpus NUM_GPUS --arch_encoder resnet50 --arch_decoder upernet 
--segm_downsampling_rate 4 --padding_constant 32

または

python3 train.py --num_gpus NUM_GPUS --arch_encoder resnet101 --arch_decoder upernet 
--segm_downsampling_rate 4 --padding_constant 32
  1. 入力引数:( python3 train.py -hによる完全入力引数を参照)
usage: train.py [-h] [--id ID] [--arch_encoder ARCH_ENCODER]
                [--arch_decoder ARCH_DECODER]
                [--weights_encoder WEIGHTS_ENCODER]
                [--weights_decoder WEIGHTS_DECODER] [--fc_dim FC_DIM]
                [--list_train LIST_TRAIN] [--list_val LIST_VAL]
                [--root_dataset ROOT_DATASET] [--num_gpus NUM_GPUS]
                [--batch_size_per_gpu BATCH_SIZE_PER_GPU]
                [--num_epoch NUM_EPOCH] [--epoch_iters EPOCH_ITERS]
                [--optim OPTIM] [--lr_encoder LR_ENCODER]
                [--lr_decoder LR_DECODER] [--lr_pow LR_POW] [--beta1 BETA1]
                [--weight_decay WEIGHT_DECAY]
                [--deep_sup_scale DEEP_SUP_SCALE] [--fix_bn FIX_BN]
                [--num_class NUM_CLASS] [--workers WORKERS]
                [--imgSize IMGSIZE] [--imgMaxSize IMGMAXSIZE]
                [--padding_constant PADDING_CONSTANT]
                [--segm_downsampling_rate SEGM_DOWNSAMPLING_RATE]
                [--random_flip RANDOM_FLIP] [--seed SEED] [--ckpt CKPT]
                [--disp_iter DISP_ITER]

評価

  1. 検証セットで訓練されたネットワークを評価する。 teaserに示すように、ビジュアライゼーションを出力するための--visualizeオプションを追加してください。
python3 eval.py --id MODEL_ID --suffix SUFFIX

UPerNetを評価する(例:UPerNet50)

python3 eval.py --id MODEL_ID --suffix SUFFIX 
--arch_encoder resnet50 --arch_decoder upernet --padding_constant 32

また、マルチGPU評価スクリプトも提供しています。 それは非常に使いやすいです。 たとえば、8 GPUで評価コードを実行するには、単に--device 0-7追加--device 0-7ます。 --device 0,2,4,6ように、使用するGPUを選択することもできます。

python3 eval_multipro.py --id MODEL_ID --suffix SUFFIX --device DEVICE_ID
  1. 入力引数:( python3 eval.py -hによる完全入力引数を参照)
usage: eval.py [-h] --id ID [--suffix SUFFIX] [--arch_encoder ARCH_ENCODER]
               [--arch_decoder ARCH_DECODER] [--fc_dim FC_DIM]
               [--list_val LIST_VAL] [--root_dataset ROOT_DATASET]
               [--num_val NUM_VAL] [--num_class NUM_CLASS]
               [--batch_size BATCH_SIZE] [--imgSize IMGSIZE]
               [--imgMaxSize IMGMAXSIZE] [--padding_constant PADDING_CONSTANT]
               [--ckpt CKPT] [--visualize] [--result RESULT] [--gpu_id GPU_ID]

参照

コードまたは事前訓練されたモデルが有用であると分かっている場合は、次の論文を引用してください。

ADE20Kデータセットによるシーン解析。 B.Zhou、H.Zhao、X.Puig、S.Fidler、A.BarriusoおよびA.Torralba。 コンピュータビジョンとパターン認識(CVPR)、2017年( http://people.csail.mit.edu/bzhou/publication/scene-parse-camera-ready.pdf

@inproceedings{zhou2017scene,
    title={Scene Parsing through ADE20K Dataset},
    author={Zhou, Bolei and Zhao, Hang and Puig, Xavier and Fidler, Sanja and Barriuso, Adela and Torralba, Antonio},
    booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition},
    year={2017}
}

場面理解のための統一された知覚解析。 T. Xiao、Y. Liu、B.Zhou、Y. Jiang、and J. Sun。 arXivプレプリント

@article{xiao2018unified,
  title={Unified Perceptual Parsing for Scene Understanding},
  author={Xiao, Tete and Liu, Yingcheng and Zhou, Bolei and Jiang, Yuning and Sun, Jian},
  journal={arXiv preprint},
  year={2018}
}

ADE20Kデータセットによる場面の意味理解。 B.Zhou、H.Zhao、X.Puig、S.Fidler、A.BarriusoおよびA.Torralba。 arXiv:1608.05442。 https://arxiv.org/pdf/1608.05442.pdf

@article{zhou2016semantic,
  title={Semantic understanding of scenes through the ade20k dataset},
  author={Zhou, Bolei and Zhao, Hang and Puig, Xavier and Fidler, Sanja and Barriuso, Adela and Torralba, Antonio},
  journal={arXiv preprint arXiv:1608.05442},
  year={2016}
}







-CSAILVision
-, , ,

執筆者: