Github: https://github.com/matterport/Mask_RCNN
オブジェクトの検出とセグメンテーションのためのマスクR-CNN
これは、Python 3、Keras、TensorFlow上のMask R-CNNの実装です。 このモデルは、画像内のオブジェクトの各インスタンスに対してバウンディングボックスとセグメンテーションマスクを生成します。 Feature Pyramid Network(FPN)とResNet101バックボーンをベースにしています。
リポジトリには、
- FPNとResNet101上に構築されたマスクR-CNNのソースコード。
- MS COCOのトレーニングコード
- MS COCOの事前訓練された体重
- ジュピターのノートブックは、すべてのステップで検出パイプラインを視覚化する
- マルチGPUトレーニング用ParallelModelクラス
- MS COCOメトリクス(AP)の評価
- 自分のデータセットのトレーニングの例
コードは文書化され、拡張が容易になるように設計されています。 あなたの研究でそれを使用する場合は、このリポジトリを参照することを検討してください。 3Dビジョンで作業する場合は、最近リリースされたMatterport3Dデータセットも役立ちます。 このデータセットは、学術利用のために公に利用できるようにすることに合意したお客様の3D再構成空間から作成されました。 ここでもっと例を見ることができます 。
このモデルを使用するプロジェクト
このモデルを他のデータセットに拡張したり、それを使用するプロジェクトを作成したりする場合は、ぜひご連絡ください。
- OSMへの画像 :TensorFlow、Bing、およびOSMを使用して、衛星画像内のフィーチャを検索します。 目標は、高品質の野球、サッカー、テニス、サッカー、バスケットボールのフィールドを追加してOpenStreetMapを改善することです。
- 4Kビデオデモ : 4Kビデオの美しいデモ、Karol Majek
入門
-
demo.ipynb最も簡単な方法です。 これは、MS COCOで事前にトレーニングされたモデルを使用して、自分の画像内のオブジェクトをセグメント化する例を示しています。 任意の画像に対してオブジェクト検出とインスタンスセグメンテーションを実行するためのコードが含まれています。
-
train_shapes.ipynbは、自分のデータセットでMask R-CNNを訓練する方法を示しています。 このノートブックでは、新しいデータセットのトレーニングを実演するためのおもちゃデータセット(図形)を紹介します。
-
( model.py 、 utils.py 、 config.py ):これらのファイルには、メインのRCNN実装が含まれています。
-
inspect_data.ipynb 。 このノートブックでは、さまざまな前処理ステップを視覚化してトレーニングデータを準備しています。
-
inspect_model.ipynbこのノートブックでは、オブジェクトの検出とセグメント化を行うための手順について詳しく説明します。 パイプラインのすべてのステップを視覚化します。
-
inspect_weights.ipynbこのノートブックでは、訓練されたモデルの重みを調べ、異常と奇妙なパターンを探します。
ステップバイステップ検出
モデルのデバッグと理解を助けるために、多くの視覚化を提供する3つのノートブック( inspect_data.ipynb 、 inspect_model.ipynb 、 inspect_weights.ipynb )があり、モデルを段階的に実行して各ポイントの出力を検査することができます。 いくつかの例があります:
1.アンカーのソートとフィルタリング
第1ステージの地域提案ネットワークのすべてのステップを視覚化し、アンカーボックスの洗練と一緒にプラスとマイナスのアンカーを表示します。
2.境界ボックスの細分化
これは、最終検出ボックス(点線)の例であり、第2段階でそれらに適用された細分化(実線)です。
3.マスク生成
生成されたマスクの例 これらの画像は、スケーリングされ、適切な場所に配置されます。
4.レイヤーのアクティベーション
さまざまなレイヤーのアクティベーションを調べて、問題の兆候(すべてゼロまたはランダムノイズ)を探すことはしばしば役に立ちます。
5.体重ヒストグラム
もう1つの有用なデバッグツールは、ウェイトヒストグラムを検査することです。 これらはinspect_weights.ipynbノートブックに含まれています。
6. TensorBoardへのログ記録
TensorBoardは、もう1つの優れたデバッグおよびビジュアライゼーションツールです。 このモデルは、各エポックの終わりに損失を記録し、重みを保存するように構成されています。
6.異なる部分を最終結果に合成する
MS COCOトレーニング
私たちは、MS COCOの開始を容易にするための事前訓練されたウエイトを提供しています。 これらの重みを出発点として使用して、ネットワーク上の独自のバリエーションを訓練することができます。 トレーニングと評価のコードはsamples/coco/coco.py
ます。 このモジュールをJupyterのノートブックにインポートすることもできます(例については、ノートブックを参照してください)。あるいは、コマンドラインから次のように直接実行することもできます。
# Train a new model starting from pre-trained COCO weights
python3 samples/coco/coco.py train --dataset=/path/to/coco/ --model=coco
# Train a new model starting from ImageNet weights
python3 samples/coco/coco.py train --dataset=/path/to/coco/ --model=imagenet
# Continue training a model that you had trained earlier
python3 samples/coco/coco.py train --dataset=/path/to/coco/ --model=/path/to/weights.h5
# Continue training the last model you trained. This will find
# the last trained weights in the model directory.
python3 samples/coco/coco.py train --dataset=/path/to/coco/ --model=last
COCO評価コードは、次のように実行することもできます。
# Run COCO evaluation on the last trained model
python3 samples/coco/coco.py evaluate --dataset=/path/to/coco/ --model=last
トレーニングスケジュール、学習率、およびその他のパラメータは、 samples/coco/coco.py
設定する必要があります。
独自のデータセットのトレーニング
独自のデータセットでモデルをトレーニングするには、2つのクラスをサブクラス化する必要があります。
Config
このクラスにはデフォルト設定が含まれています。 それをサブクラス化し、変更する必要がある属性を変更します。
Dataset
このクラスは、あらゆるデータセットを扱う一貫した方法を提供します。 モデルのコードを変更することなくトレーニング用に新しいデータセットを使用できます。 複数のデータセットを同時にロードすることもできます。これは、検出するオブジェクトが1つのデータセットですべて利用可能でない場合に便利です。
Dataset
クラス自体が基本クラスです。 それを使用するには、それを継承する新しいクラスを作成し、データセットに固有の関数を追加します。 utils.py
基本Dataset
クラスと、 samples/coco/train_shapes.ipynb
とsamples/coco/coco.py
で拡張した例を参照してください。
公式紙との違い
この実装は、ほとんどの場合マスクRCNNの文書に従いますが、コードの単純さと一般化に賛成していない場合がいくつかあります。 これらは我々が認識している違いのいくつかです。 他の違いに遭遇した場合は、お知らせください。
-
画像のサイズ変更:バッチごとに複数の画像を訓練するため、すべての画像を同じサイズにリサイズします。 たとえば、MS COCOでは1024x1024pxです。 アスペクト比は保存されているので、画像が正方形でない場合は、ゼロで埋めます。 この論文では、最小の面が800px、最大の面が1000pxにトリミングされるようにサイズ変更が行われています。
-
バウンディングボックス :一部のデータセットはバウンディングボックスを提供し、一部はマスクのみを提供します。 複数のデータセットのトレーニングをサポートするため、データセットに付属しているバウンディングボックスを無視し、代わりにそれらを生成することにしました。 マスクのすべてのピクセルをカプセル化する最小のボックスを境界ボックスとして選択します。 これにより、実装が簡素化され、イメージの回転など、境界ボックスに適用するのが困難なイメージの拡大を簡単に適用できます。
このアプローチを検証するために、我々は計算されたバウンディングボックスをCOCOデータセットによって提供されるボックスと比較しました。 我々は、境界ボックスの〜2%が1px以上異なっており、〜0.05%が5px以上異なっており、0.01%のみが10px以上異なることを見出した。
-
学習率:この論文では0.02の学習率が使用されていますが、それは高すぎることがわかりました。特に小さなバッチサイズを使用すると、ウェイトが爆発することがよくありました。 これは、CaffeとTensorFlowがどのように勾配を計算するか(バッチとGPUの平均値と平均値)の違いに関連している可能性があります。 または、公式モデルでは、この問題を回避するためにグラデーションのクリッピングを使用するかもしれません。 グラデーションクリッピングを使用しますが、あまりにも積極的に設定しないでください。 いずれにしても、より小さい学習率がより速く収束することが分かりました。
-
アンカーストライド:ピラミッドの最下位レベルは画像に対して4ピクセルのストライドを持つので、アンカーは4ピクセル間隔ごとに作成されます。 計算とメモリ負荷を減らすために、アンカーのストライドを2に設定します。アンカーの数は4で、精度に大きな影響はありません。
貢献する
このリポジトリへの投稿は大歓迎です。 貢献できるものの例:
- スピードの向上。 TensorFlowやCythonでPythonコードを書き直すのと同じように。
- 他のデータセットのトレーニング。
- 精度の向上。
- 視覚化と例。
私たちのチームに参加して、このようなさらに多くのプロジェクトを構築するのに役立てることもできます。
要件
Python 3.4、TensorFlow 1.3、Keras 2.0.8、 requirements.txt
リストされているその他の一般的なパッケージ
MS COCO要件:
MS COCOのトレーニングやテストには、以下のものも必要です。
- pycocotools(以下のインストール手順)
- MS COCOデータセット
- 5K minivalと35K validation-minus-minivalサブセットをダウンロードします。 オリジナルのより高速なR-CNN実装の詳細 。
Dockerを使用する場合、コードはこのDockerコンテナで動作することが確認されています。
インストール
-
依存関係をインストールする
pip3 install -r requirements.txt
-
このリポジトリを複製する
-
リポジトリのルートディレクトリからセットアップを実行する
python3 setup.py install
-
リリースのページから事前にトレーニングしたCOCOの重み(mask_rcnn_coco.h5)をダウンロードしてください 。
-
(オプション)MS COCOでトレーニングまたはテストするには、これらのreposのいずれかから
pycocotools
をインストールします。 Python3とWindowsのための修正を備えたオリジナルのpycocotoolsのフォークです(公式レポはもうアクティブではないようです)。- Linux: https : //github.com/waleedka/coco
- Windows: https : //github.com/philferriere/cocoapi 。 パス上にVisual C ++ 2015ビルドツールが必要です(詳細は、レポを参照してください)