GitHubじゃ!Pythonじゃ!

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

fizyr

keras-retinanet – RetinaNetオブジェクト検出のKeras実装

投稿日:

RetinaNetオブジェクト検出のKeras実装。

Keras RetinaNet

Tsung-Yi Lin、Priya Goyal、Ross Girshick、Kaiming He、およびPiotr Dollarによる密集物体検出の焦点損失に記載されているRetinaNetオブジェクト検出のKeras実装。

インストール

  1. このリポジトリをクローンします。
  2. リポジトリでpip install . --user実行しますpip install . --user pip install . --user tensorflowインストール方法の不一致により、このパッケージではインストールしようとするtensorflow依存しないことが定義されています。 システム要件に応じてtensorflowがインストールされていることを確認してください。 また、Keras 2.1.3以上がインストールされていることを確認してください。
  3. 必要に応じて、 pip install --user git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI pycocotoolsを実行して、MS COCOデータセットをトレーニング/テストする場合は、 pycocotools pip install --user git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI

テスト

このノートブックでは、ネットワークのテストの例を見ることができます。 一般に、ネットワークの推論は次のように機能する。

boxes, scores, labels = model.predict_on_batch(inputs)

(x1, y1, x2, y2) )の場合、形状は(None, None) (分類スコア)、ラベルの形状は(None, None)スコア)。 3つの出力すべてにおいて、第1の次元は形状を表し、第2の次元は検出のリストを示す。

モデルをロードするには、次のようにします。

from keras_retinanet.models import load_model
model = load_model('/path/to/model.h5', backbone_name='resnet50')

NVIDIA Pascal Titan Xの実行時間は、形状が1000x800x3画像の場合、およそ75msecです。

トレーニングモデルを推論モデルに変換する

keras-retinanetのトレーニング手順はトレーニングモデルで動作します これらは、 推論モデルと比較して削除されたバージョンであり、トレーニングに必要なレイヤー(回帰と分類値)のみを含んでいます。 モデルの推論(画像上のオブジェクト検出を実行する)を行うには、訓練されたモデルを推論モデルに変換する必要があります。 これは次のように行われます。

# Running directly from the repository:
keras_retinanet/bin/convert_model.py /path/to/training/model.h5 /path/to/save/inference/model.h5

# Using the installed script:
retinanet-convert-model /path/to/training/model.h5 /path/to/save/inference/model.h5

ほとんどのスクリプト( retinanet-evaluate )は--convert-model引数を使ってオンザフライで変換をサポートしています。

トレーニング

keras-retinanetこのスクリプトを使用し訓練することができます。 trainスクリプトはkeras_retinanetパッケージ内にあるので、相対インポートを使用することに注意してください。 このリポジトリの外で独自にスクリプトを調整する場合は、絶対インポートを使用するようにスクリプトを切り替える必要があります。

keras-retinanet正しくインストールした場合、trainスクリプトはretinanet-trainとしてインストールされます。 ただし、 keras-retinanetリポジトリをローカルで変更する場合は、リポジトリから直接スクリプトを実行する必要があります。 それはあなたのローカル変更が電車のスクリプトによって使用されることを保証します。

デフォルトのバックボーンはresnet50です。 これは、実行中のスクリプトで--backbone=xxx引数を使用して変更できます。 xxxは、resnetモデル( resnet50resnet101resnet152 )、mobilenetモデル( mobilenet128_1.0mobilenet128_0.75mobilenet160_1.0など)、densenetモデルまたはvggモデルのバックボーンの1つです。 さまざまなオプションは、対応するpythonスクリプト( resnet.pymobilenet.pyなど)で各モデルによって定義されています。

訓練されたモデルは、推論のために直接使用することはできません。 訓練されたモデルを推論モデルに変換するには、 ここで確認してください

使用法

Pascal VOCのトレーニングの場合は、次を実行します。

# Running directly from the repository:
keras_retinanet/bin/train.py pascal /path/to/VOCdevkit/VOC2007

# Using the installed script:
retinanet-train pascal /path/to/VOCdevkit/VOC2007

MS COCOのトレーニングのために、以下を実行してください:

# Running directly from the repository:
keras_retinanet/bin/train.py coco /path/to/MS/COCO

# Using the installed script:
retinanet-train coco /path/to/MS/COCO

事前トレーニングされたMS COCOモデルはここでダウンロードできます cocoapiを用いた結果を以下に示す(注:論文によれば、この構成は0.357のmAPを達成するはずである)。

 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.350
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.537
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.374
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.191
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.383
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.472
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.306
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.491
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.533
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.345
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.577
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.681

Open Images Dataset OIDのトレーニング、またはOIDの課題への対応については、次を実行してください。

# Running directly from the repository:
keras_retinanet/bin/train.py oid /path/to/OID

# Using the installed script:
retinanet-train oid /path/to/OID

# You can also specify a list of labels if you want to train on a subset
# by adding the argument 'labels_filter':
keras_retinanet/bin/train.py oid /path/to/OID --labels_filter=Helmet,Tree

KITTIのトレーニングのためには、

# Running directly from the repository:
keras_retinanet/bin/train.py kitti /path/to/KITTI

# Using the installed script:
retinanet-train kitti /path/to/KITTI

If you want to prepare the dataset you can use the following script:
https://github.com/NVIDIA/DIGITS/blob/master/examples/object-detection/prepare_kitti_data.py

[カスタムデータセット]のトレーニングでは、CSVファイルを使用してデータを渡すことができます。 これらのCSVファイルの形式の詳細については、以下を参照してください。 あなたのCSVを使用してトレーニングするには、以下を実行してください:

# Running directly from the repository:
keras_retinanet/bin/train.py csv /path/to/csv/file/containing/annotations /path/to/csv/file/containing/classes

# Using the installed script:
retinanet-train csv /path/to/csv/file/containing/annotations /path/to/csv/file/containing/classes

一般に、自分のデータセットを訓練する手順は次のとおりです。

  1. インスタンスkeras_retinanet.models.resnet50_retinanetを呼び出してモデルを作成し、コンパイルします。 経験的に、以下のコンパイル引数がうまくいくことが判明しました。
model.compile(
    loss={
        'regression'    : keras_retinanet.losses.smooth_l1(),
        'classification': keras_retinanet.losses.focal()
    },
    optimizer=keras.optimizers.adam(lr=1e-5, clipnorm=0.001)
)
  1. データのトレーニングとテストのためのジェネレータを作成します(例はkeras_retinanet.preprocessing.PascalVocGenerator示されていkeras_retinanet.preprocessing.PascalVocGenerator )。
  2. model.fit_generatorを使用してmodel.fit_generatorを開始します。

CSVデータセット

CSVGeneratorを使用すると、独自のデータセットを簡単に定義できます。 注釈を含む1つのファイルと、クラス名からIDへのマッピングを含む1つのファイルが、2つのCSVファイルを使用します。

アノテーションの形式

注釈付きのCSVファイルには、1行に1つの注釈が含まれている必要があります。 複数のバウンディングボックスがあるイメージは、バウンディングボックスごとに1つの行を使用する必要があります。 ピクセル値のインデックスは0から始まることに注意してください。各行の予想される形式は次のとおりです。

path/to/image.jpg,x1,y1,x2,y2,class_name

一部の画像にはラベル付きオブジェクトが含まれていない場合があります。 負の例としてこれらの画像をデータセットに追加するには、 x1y1x2y2およびclass_nameがすべて空であるアノテーションを追加します。

path/to/image.jpg,,,,,

完全な例:

/data/imgs/img_001.jpg,837,346,981,456,cow
/data/imgs/img_002.jpg,215,312,279,391,cat
/data/imgs/img_002.jpg,22,5,89,84,bird
/data/imgs/img_003.jpg,,,,,

これは、3つの画像を持つデータセットを定義します。 img_001.jpgには牛が含まれています。 img_002.jpgには猫と鳥が含まれています。 img_003.jpgには興味深いオブジェクト/動物は含まれていません。

クラスマッピングの形式

クラス名からIDへのマッピングファイルには、1行に1つのマッピングが含まれている必要があります。 各行は次の形式を使用する必要があります。

class_name,id

クラスの索引付けは0から始まります。暗黙的なので、バックグラウンド・クラスは含めないでください。

例えば:

cow,0
cat,1
bird,2

デバッグ

独自のデータセットを作成しても、必ずしもすぐに使用できるわけではありません。 よくある間違いを見つけるのに役立つdebug.pyツールがあります。

特に有用なのは、データセットの画像にアノテーションを表示する--annotationsフラグです。 注釈は使用可能なアンカーがある場合は緑色で表示され、使用可能なアンカーがない場合は赤色で表示されます。 アノテーションに利用可能なアンカーがない場合、それはトレーニングに寄与しないことを意味します。 少量の注釈が赤で表示されるのは正常ですが、大部分またはすべての注釈が赤色である場合は、懸念の原因となります。 最も一般的な問題は、注釈が小さすぎるか、または奇妙な形になっている(伸びている)ことです。

結果

MS COCO

状態

keras-retinanetを使用した出力画像の例を以下に示します。

keras-retinanetを使ったプロジェクト

  • Anno-Mage keras-retinanet COCOモデルからの入力を提案として使用して、画像に注釈を付けるのに役立つツール。
  • Telenav.AI keras-retinanetを用いた交通標識の検出。
  • 深部胎盤組織学の表現型に向けて この研究プロジェクトでは、細胞レベルで胎盤を分析するためにケラチン – レチナネットを使用しています。
  • 4kビデオの例 このデモでは、keras-retinanetを4k入力ビデオに使用する方法を示します。
  • ボーリング検出器 私はすべてのプロジェクトが人生の最大の問題を解決する必要があるとは思わない。 このプロジェクトでは、ビデオの「ボーリングカンパニー」の帽子が検出されます。
  • comet.ml 対話的に実験を比較して比較するために、keras-retinanetをcomet.mlと組み合わせて使用する。

あなたがkeras-retinanet基づいたプロジェクトを持っていて、ここにそれを公開したいのであれば、Slackで私にメッセージを撃ってください。

ノート

  • このリポジトリには、Keras 2.1.3以降が必要です。
  • このリポジトリはOpenCV 3.4を使用してテストされています。
  • このリポジトリは、Python 2.7および3.6を使用してテストされています。

このプロジェクトへの貢献は大歓迎です。

ディスカッション

議論や質問のために#keras-retinanet Slackチャンネルに参加しても#keras-retinanetん。

よくある質問

  • UserWarning: No training configuration found in save file: the model was not compiled. Compile it manually. UserWarning: No training configuration found in save file: the model was not compiled. Compile it manually. 、私は心配する必要がありますか? この警告は、推論の際には無視しても問題ありません。
  • 私はエラーを取得ValueError: not enough values to unpack (expected 3, got 2)推測中ValueError: not enough values to unpack (expected 3, got 2) 、何をしますか? これは、推論を行うために列車モデルを使用しているためです。 詳細については、 https://github.com/fizyr/keras-retinanet#converting-a-training-model-to-inference-modelをご覧ください。
  • 私はどのようにして移転学習をしますか? 最も簡単な解決策は、トレーニングの際に--weights引数を使用すること--weights Kerasはクラスの数が一致しなくてもモデルをロードします(不一致があった場合は重みの読み込みをスキップします)。 たとえば、 retinanet-train --weights snapshots/some_coco_model.h5 pascal /path/to/pascalを実行して、COCOモデルからPascalVOCトレーニングセッションにウェイトを転送します。 データセットが小さい場合は、 --freeze-backbone引数を使用してバックボーン層をフリーズすることもできます。
  • アンカーの数/形状を変更するにはどうすればよいですか? これを行うための(まだ)簡単な方法はありません。 現在、これを行う方法については、 https://github.com/fizyr/keras-retinanet/issues/421ご覧ください
  • 私は0損失を得る、何が起こっているのですか? これは、ほとんどの場合、アンカーがどれもオブジェクトに「フィット」していないときに発生します。 これはデバッグツールを使用して確認できます。
  • 私は古いモデルを持っていますが、keras-retinanetのアップデート後に使用できますか? これは何が変わったかによって異なります。 それがウェイトに影響を与えない変更であれば、新しいレチナネットモデルを作成し、 model.load_weights(weights_path, by_name=True)を使用して古いウェイトをロードし、このモデルを保存することでモデルを更新できます。 変更があまりにも重大であった場合は、モデルを再トレーニングする必要があります(トレーニングを開始するときに古いモデルのウェイトをロードしようとすることができますが、これはImageNetよりも良いスタートポジションです)。







-fizyr
-

執筆者: