Github: https://github.com/endernewton/tf-faster-rcnn
tf-faster-rcnn
Xinlei Chen( xinleic@cs.cmu.edu )によるより高速なRCNN検出フレームワークのTensorflow実装。 このリポジトリは、より高速なRCNNのpython Caffe実装に基づいています 。
注 :フレームワークを再実装する際に、いくつかのマイナーな変更が行われ、改善が得られます。 修正およびアブレーション分析の詳細については、テクニカルレポート「地域サンプリングの調査を使用した高速RCNNの実装 」を参照してください。 元の用紙に結果を再現したい場合は、 正式なコードか半 正式なコードを使用してください。 より高速なRCNNアーキテクチャの詳細については、「 高速R-CNN:地域提案ネットワークによるリアルタイムオブジェクト検出に向けて」を参照してください。
検出性能
現在のコードは、 VGG16 、 Resnet V1 、およびMobilenet V1モデルをサポートしています。 私たちは主に、プレーンなVGG16とResnet101(ありがとう@philokey!)アーキテクチャでテストしました。 ベースラインとして、単一の畳み込みレイヤー上に単一のモデルを使用して数値を報告するので、マルチスケールではなく、多段バウンディングボックス回帰もスキップ接続もなく、余分な入力が使用されません。 唯一のデータ拡張手法は、オリジナルのFaster RCNNに続いてトレーニング中に左右反転することです。 すべてのモデルがリリースされています。
VGG16( conv5_3
)の場合:
- VOC 2007のトレーニングとVOC 2007テストのテスト、 70.8 。
- VOC 2007年+ 2012年のトレーニングとVOC 2007年テストのテスト( R-FCNスケジュール)、 75.7 。
- COCO 2014 trainval35kを訓練し 、 minival (繰り返し:900k / 1190k)、 30.2でテストします。
Resnet101(最後のconv4
)で:
- VOC 2007のトレーニングとVOC 2007テストのテスト、 75.7 。
- VOC2007 + 2012のトレーニングとVOC 2007テスト(R-FCNスケジュール)のテスト、 79.8 。
- COCO 2014 trainval35kでトレーニングし、ミニバン(900k / 1190k)、 35.4でテストします。
より多くの結果:
- COCO 2014 trainval35kでMobilenet(1.0、224)をトレーニングし、minival(900k / 1190k)、 21.8でテストします。
- COCO 2014 trainval35kでResnet50をトレーニングし、ミニバン(900k / 1190k)、 32.4でテストします。
- COCO 2014 trainval35kでResnet152をトレーニングし、ミニバン(900k / 1190k)、 36.1でテストします。
FPNからのおおよそのベースライン 設定 (このリポジトリにはまだFPNのトレーニングコードは含まれていません):
- COCO 2014 trainval35kでResnet50をトレーニングし、ミニバン(900k / 1190k)、 34.2でテストします。
- COCO 2014 trainval35kでResnet101をトレーニングし、ミニバン(900k / 1190k)、 37.4でテストします。
- COCO 2014 trainval35kでResnet152をトレーニングし、ミニバン(900k / 1190k)、 38.2でテストします。
注意 :
- Tensorflowを使用したGPUトレーニング(特にVOC)のランダム性のため、ここでは最良の数値が報告されます(2-3回の試行で)。 私の経験によれば、COCOの場合、ランダム性にもかかわらず、ほぼ常に(0.2%以内の)非常に近い数値を得ることができます。
- 数値は非最大抑制(TEST.MODE nms)を使用して領域プロポーザルを選択するデフォルトのテストスキームで得られます。代替テストスキーム(TEST.MODE top)はパフォーマンスを若干向上させます( レポートを参照してください) 0.X AP)。
- 小さな提案(<16ピクセル幅/高さ)を維持するので、私たちのパフォーマンスは小さなオブジェクトに特に適しています。
- 最終結果に検出を含めるための閾値(0.05ではなく)を設定しないため、リコールが増加します。
- 減量は1e-4に設定されています。
- その他の小さな変更については、 レポートを確認してください。 注目すべきものには、
crop_and_resize
使用、トレーニング中のRoIのグラウンドトゥルーボックスの除外などがあります。 - COCOでは、より多くの反復でパフォーマンスが向上することがわかり、より多くの反復でより良いパフォーマンスを達成できる可能性があります。
- Resnetsでは、ネットワークを微調整するときに最初のブロック(合計4)を修正し、最大プールなしでRoI(7×7)のサイズを変更するために
crop_and_resize
を使用します(特にCOCOでは役に立たない)。 最終的な特徴マップは、分類および回帰のために平均的にプールされる。 すべてのバッチ正規化パラメータは固定されています。 バイアスの学習率は2倍にはなりません。 - Mobilenetsでは、ネットワークを微調整するときに最初の5つのレイヤーを修正します。 すべてのバッチ正規化パラメータは固定されています。 Mobilenet層の減量は4e-5に設定されています。
- おおよそのFPNベースラインセットアップでは、イメージを800ピクセルでサイズ変更し、32 ^ 2のアンカーを追加し、テスト中に1000件のプロポーザルを取ります。
- COCO VGG16モデルとResnetモデルを含む最新モデルについては、 ここ / here / hereをご覧ください。
テンソルボードに表示された地面の真実 | テンソルボードに表示される予測 |
その他の機能
レポートに記載されていない追加機能が追加され、研究の生活が楽になります。
- 電車と検証のサポート 。 訓練中に、妥当性確認データは、プロセスを監視し潜在的な過適合をチェックするために、随時テストされる。 理想的には、訓練と妥当性検証は別々に行う必要があります。このモデルでは、検証のたびにモデルがロードされます。 しかし私は時間とGPUのメモリを節約するためにそれを共同で実装しました。 デフォルトの設定では、テストデータが検証に使用されますが、テストセットのオーバーフィットに特別な試みはありません。
- トレーニングを再開するためのサポート 。 できるだけ多くの情報をスナップショットとして保存しようとしましたが、最新のスナップショットから適切なトレーニングを再開することを目的としています。 メタ情報は、現在の画像インデックス、画像の順列、およびnumpyのランダムな状態を含む。 ただし、トレーニングを再開すると、テンソルフローのランダムシードがリセットされます(テンソルフローのランダムな状態を保存する方法がわからないため)ので、結果が異なります。 現在の実装では、ランダムシードが設定されていても、モデルが確定的に動作するように強制することはできません。 提案/解決策は大歓迎であり、非常に感謝しています。
- 視覚化のサポート 。 現在の実装では、トレーニング中のグランド・トゥルース・ボックス、損失、アクティベーションおよび変数の統計を集計し、テンソル・ボードの視覚化のために別のフォルダにダンプします。 計算グラフはデバッグのために保存されます。
前提条件
- 基本的なTensorflowのインストール。 コードはr1.2形式に従います。 r1.0を使用している場合は、r1.0ブランチでSlice Resnetブロックの問題を修正してください。 古いバージョン(r0.1-r0.12)を使用している場合は、r0.12ブランチを参照してください。 必須ではありませんが、オリジナルのRoIプーリング(テンソルフローでC ++コードを変更する必要があります)を
tf.image.roi_pooling
、テンソルフローフォークをチェックし、tf.image.roi_poolingを探してtf.image.roi_pooling
。 - あなたが持っていないかもしれないPythonパッケージ:
cython
、cython
opencv-python
、easydict
( py-faster-rcnnに似ています )。easydict
ためにあなたが正しいバージョンを持っていることを確認してください。 私は1.6を使用します。 - Dockerユーザー:最近のアップグレード以降、ドッカーハブ( https://hub.docker.com/r/mbuckler/tf-faster-rcnn-deps/ )のドッカーイメージは有効ではなくなりました。 ただし、dockerフォルダにあるdockerfileを使用することで、独自のイメージを構築することができます(tsudorflow r1.0で必要なcuda 8バージョン)。次に、Tensorflowのインストール後にnvidia-docker [ https:// github.com/NVIDIA/nvidia-docker ]。 最後に、コンテナを起動した後、実行中のコンテナ内にCythonモジュールを構築する必要があります。
インストール
- リポジトリのクローン作成
git clone https://github.com/endernewton/tf-faster-rcnn.git
- セットアップスクリプトで-archを更新して、GPUに合わせてください
cd tf-faster-rcnn/lib
# Change the GPU architecture (-arch) if necessary
vim setup.py
GPUモデル | 建築 |
---|---|
TitanX(Maxwell / Pascal) | sm_52 |
GTX 960M | sm_50 |
GTX 1080(Ti) | sm_61 |
グリッドK520(AWS g2.2xlarge) | sm_30 |
Tesla K80(AWS p2.xlarge) | sm_37 |
注意 :コードを他のGPUで正常に動作させた場合、あなたの設定を反映させることは大歓迎です。 また、CPUのテンソルフローだけを使用している場合でも、GPUベースのコード(NMS用)がデフォルトで使用されるため、正しい出力を得るにはUSE_GPU_NMS Falseを設定してください。
- Cythonモジュールを構築する
make clean
make
cd ..
- Python COCO APIをインストールします 。 このコードでは、APIがCOCOデータセットにアクセスする必要があります。
cd data
git clone https://github.com/pdollar/coco.git
cd coco/PythonAPI
make
cd ../../..
セットアップデータ
py-faster-rcnnの指示に従ってVOCとCOCOのデータセットを設定してください (COCOの一部が実行されます)。 この手順では、データをダウンロードし、必要に応じてデータフォルダにソフトリンクを作成します。 早いRCNNはあらかじめ計算された提案に依存しないので、提案の設定手順を無視することは安全です。
それが有用であれば、私の側で作成されたdata/cache
フォルダもここで共有されます 。
事前に訓練されたモデルによるデモとテスト
- 事前訓練を受けたモデルをダウンロードする
# Resnet101 for voc pre-trained on 07+12 set
./data/scripts/fetch_faster_rcnn_models.sh
注意 :リンクを介してモデルをダウンロードできない場合、または他のモデルを試したい場合は、次の解決策をチェックアウトして、オプションでダウンロードスクリプトを更新してください。
- トレーニング済みのモデルを使用するためのフォルダとソフトリンクを作成する
NET=res101
TRAIN_IMDB=voc_2007_trainval+voc_2012_trainval
mkdir -p output/${NET}/${TRAIN_IMDB}
cd output/${NET}/${TRAIN_IMDB}
ln -s ../../../data/voc_2007_trainval+voc_2012_trainval ./default
cd ../../..
- カスタム画像のテストのデモ
# at repository root
GPU_ID=0
CUDA_VISIBLE_DEVICES=${GPU_ID} ./tools/demo.py
注 :Resnet101テストにはおそらく数ギガバイトのメモリが必要なため、メモリ容量の問題が発生した場合は、CPUサポートのみでインストールしてください。 問題25を参照してください。
- トレーニング済みのResnet101モデルでのテスト
GPU_ID=0
./experiments/scripts/test_faster_rcnn.sh $GPU_ID pascal_voc_0712 res101
注 :報告された番号(私の側で79.8)を取得できない場合、NMS機能が不適切にコンパイルされている可能性があります。 問題5を参照してください。
あなた自身のモデルを訓練する
-
事前にトレーニングされたモデルと重量をダウンロードしてください。 現在のコードは、VGG16とResnet V1モデルをサポートしています。 事前トレーニングされたモデルはスリムで提供されています。 ここで事前にトレーニングされたモデルを入手し、
data/imagenet_weights
フォルダに設定することがdata/imagenet_weights
ます。 たとえば、VGG16モデルの場合、次のように設定できます。mkdir -p data/imagenet_weights cd data/imagenet_weights wget -v http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz tar -xzvf vgg_16_2016_08_28.tar.gz mv vgg_16.ckpt vgg16.ckpt cd ../..
Resnet101では、次のように設定できます。
mkdir -p data/imagenet_weights cd data/imagenet_weights wget -v http://download.tensorflow.org/models/resnet_v1_101_2016_08_28.tar.gz tar -xzvf resnet_v1_101_2016_08_28.tar.gz mv resnet_v1_101.ckpt res101.ckpt cd ../..
-
列車(およびテスト、評価)
./experiments/scripts/train_faster_rcnn.sh [GPU_ID] [DATASET] [NET]
# GPU_ID is the GPU you want to test on
# NET in {vgg16, res50, res101, res152} is the network arch to use
# DATASET {pascal_voc, pascal_voc_0712, coco} is defined in train_faster_rcnn.sh
# Examples:
./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc vgg16
./experiments/scripts/train_faster_rcnn.sh 1 coco res101
注 :訓練の前に、訓練前のモデルへのソフトリンクを削除したことを再度確認してください。 トレーニング中にNaNが見つかった場合は、 Issue 86を参照してください。 また、マルチgpuサポートをご希望の場合は、 問題121をご確認ください。
- テンソルボードによる可視化
tensorboard --logdir=tensorboard/vgg16/voc_2007_trainval/ --port=7001 &
tensorboard --logdir=tensorboard/vgg16/coco_2014_train+coco_2014_valminusminival/ --port=7002 &
- テストと評価
./experiments/scripts/test_faster_rcnn.sh [GPU_ID] [DATASET] [NET]
# GPU_ID is the GPU you want to test on
# NET in {vgg16, res50, res101, res152} is the network arch to use
# DATASET {pascal_voc, pascal_voc_0712, coco} is defined in test_faster_rcnn.sh
# Examples:
./experiments/scripts/test_faster_rcnn.sh 0 pascal_voc vgg16
./experiments/scripts/test_faster_rcnn.sh 1 coco res101
- 再評価のために
tools/reval.sh
を使うことができます
デフォルトでは、訓練されたネットワークは以下の場所に保存されます。
output/[NET]/[DATASET]/default/
テスト出力は以下の場所に保存されます。
output/[NET]/[DATASET]/default/[SNAPSHOT]/
電車と検証のためのテンソルボードの情報は、
tensorboard/[NET]/[DATASET]/default/
tensorboard/[NET]/[DATASET]/default_val/
訓練の反復のデフォルト数は、VOC 2007の最初のより高速なRCNNと同じに保たれていますが、おそらく画像のバッチサイズが1であるために、長く訓練することが有益です(COCOのレポートを参照)。 VOC 07 + 12では、 R-FCNの後に80k / 110kのスケジュールに切り替わります。 また、現在の実装の非決定論的性質のため、パフォーマンスは多少異なる場合がありますが、一般的にはVOCの報告された数値の約1%以内、COCOの報告された数値の約0.2%以内にある必要があります。 提案/寄稿は大歓迎です。
引用
この実装が見つかった場合や、レポートで分析された分析が役に立つ場合は、
@article{chen17implementation,
Author = {Xinlei Chen and Abhinav Gupta},
Title = {An Implementation of Faster RCNN with Study for Region Sampling},
Journal = {arXiv preprint arXiv:1702.02138},
Year = {2017}
}
または正式な論文のためには、 Spatial Memory Network :
@article{chen2017spatial,
title={Spatial Memory for Context Reasoning in Object Detection},
author={Chen, Xinlei and Gupta, Abhinav},
journal={arXiv preprint arXiv:1704.04224},
year={2017}
}
便宜上、RCNNのより速い引用がここにあります:
@inproceedings{renNIPS15fasterrcnn,
Author = {Shaoqing Ren and Kaiming He and Ross Girshick and Jian Sun},
Title = {Faster {R-CNN}: Towards Real-Time Object Detection
with Region Proposal Networks},
Booktitle = {Advances in Neural Information Processing Systems ({NIPS})},
Year = {2015}
}