web-dev-qa-db-ja.com

独自のデータセットでのTensorflowオブジェクト検出のトレーニング

このタスクを達成するために数日を費やした後、質問への回答をどのように進めたかについての私の経験を共有したいと思います。

TSオブジェクト検出 を使用して、独自のデータセットを使用してトレーニングするにはどうすればよいですか?

25
eshirima

これは、モジュールがすでにインストールされていることを前提としています。そうでない場合は、 documentation を参照してください。

免責事項

この答えは、オブジェクト検出モジュールをトレーニングするrightまたはonly方法ではありません。これは、単に自分の経験と自分に合ったものを共有することです。私はまだ一般的にMLにまだ慣れていないので、私は提案を受け入れ、このことについてもっと学びます。

TL; DR

  1. 独自のPascal VOC形式のデータセットを作成する
  2. TFRecordsを生成します
  3. パイプラインを構成する
  4. 視覚化

この回答の各セクションは、対応する編集で構成されています(以下を参照)。各セクションを読んだ後、明確にするためにその編集も読んでください。各セクションに修正とヒントが追加されました。

使用ツール

LabelImg :Pascal VOC形式の注釈を作成するためのツール。

1。独自のPascal VOCデータセットを作成します

PS:簡単にするために、私の答えのフォルダー命名規則は、Pascal VOC 2012のフォルダー命名規則に従います

2012年5月のデータセット を覗くと、フォルダーが次の構造を持っていることがわかります。

_+VOCdevkit +VOC2012 +Annotations +ImageSets +Action +Layout +Main +Segmentation +JPEGImages +SegmentationClass +SegmentationObject_

とりあえず、以下のフォルダーに修正が加えられました。

Annotations:これは、すべての画像の対応するXMLファイルが配置される場所です。上記のツールを使用して注釈を作成します。 _<truncated>_および_<difficulty>_タグについては心配しないでください。これらのタグは、トレーニングおよび評価バイナリによって無視されます。

JPEGImages:実際の画像の場所。提供されたスクリプトを使用してTFRecordを作成するために現在サポートされているので、それらがJPEGタイプであることを確認してください。

ImageSets-> Main:これは単にテキストファイルで構成されています。各クラスには、対応するtrain.txttrainval.txtおよびval.txtが存在します。以下は、VOC 2012フォルダー内のaeroplane_train.txtの内容のサンプルです。

_2008_000008 -1
2008_000015 -1
2008_000019 -1
2008_000023 -1
2008_000028 -1
2008_000033  1
_

構造は、基本的に画像名とそれに対応するオブジェクトがその画像に存在するかどうかを示すブール値が後に続きます。たとえば、画像2008_000008は飛行機で構成されていないため、-1でマークされていますが、画像 2008_000033します。

これらのテキストファイルを生成する小さなPythonスクリプトを作成しました。単純に画像名を反復処理し、オブジェクトの存在のためにそれらの隣に1または-1を割り当てます。画像名をシャッフルします。

{classname} _val.txtファイルは、 検査 検証データセット。これをトレーニング中のテストデータと考えてください。データセットをトレーニングと検証に分割します。詳細は こちら をご覧ください。これらのファイルの形式は、トレーニングの形式に似ています。

この時点で、フォルダー構造は次のようになります。

+VOCdevkit +VOC2012 +Annotations --(for each image, generated annotation) +ImageSets +Main --(for each class, generated *classname*_train.txt and *classname*_val.txt) +JPEGImages --(a bunch of JPEG images)


1.1ラベルマップの生成

データセットを準備したら、対応するラベルマップを作成する必要があります。 models/object_detection/dataに移動し、Pascal_label_map.pbtxtを開きます。

このファイルは、各アイテムにIDと名前を割り当てるJSONで構成されています。目的のオブジェクトを反映するために、このファイルを修正します。


2。 TFRecordsを生成

特に line のコードを見ると、aeroplane_train.txtのみを明示的に取得しています。好奇心が強い人には、 理由は です。このファイル名をクラストレインテキストファイルに変更します。

VOCdevkitmodels/object_detection内にあることを確認してから、先に進んで TFRecordsを生成 してください。

問題が発生した場合は、まずコードを調べてください。それは自明であり、十分に文書化されています。


3。パイプライン構成

命令 は、このセグメントをカバーするために自明であるべきです。サンプル構成は object_detection/samples/configs にあります。

私のようにゼロからトレーニングしたい人のために、_fine_tune_checkpoint_および_from_detection_checkpoint_ノードを必ず削除してください。 ここにあります 参照用の私の設定ファイルの外観.

ここから tutorial に進み、トレーニングプロセスを実行できます。


4。視覚化

学習プロセスを視覚化できるように、トレーニングと並行してevalを実行してください。引用するには Jonathan Huang

最良の方法は、eval.pyバイナリを実行することです。通常、このバイナリをトレーニングと並行して実行し、トレーニング中のチェックポイントを保持するディレクトリをポイントします。 eval.pyバイナリは、Tensorboardでポイントできる_eval_dir_にログを書き込みます。

最初の数時間でmAPが「解除」されたことを確認し、その後、いつ収束するかを確認します。これらのプロットを見ずに、必要なステップ数を判断するのは困難です。


編集I('17年7月28日):

私は自分の反応がこれほど注目されるとは思っていなかったので、戻って確認することにしました。

ツール

私の仲間Apple=ユーザーの場合、実際には注釈に RectLabel を使用できます。

パスカルVOC

掘り下げた後、私は最終的にtrainval.txtが実際にはトレーニングと検証のデータセットの結合であることに気付きました。

公式開発キット を見て、フォーマットをさらに理解してください。

ラベルマップの生成

執筆時点では、ID 0は_none_of_the_above_を表します。 IDは1から始めることをお勧めします。

視覚化

評価を実行し、テンソルボードを評価ディレクトリに向けると、各カテゴリのパフォーマンスとともに各カテゴリのmAPが表示されます。これは良いことですが、Evalと並行してトレーニングデータを見ることも好きです。

これを行うには、別のポートでテンソルボードを実行し、トレインディレクトリをポイントします

_tensorboard --logdir=${PATH_TO_TRAIN} --port=${DESIRED_NUMBER}
_
48
eshirima

私は ブログ投稿 を自分の経験と同様に、自分のデータセットでTensorflowを使用してオブジェクト検出器(特にRaccoon検出器)をトレーニングした方法について書きました。これは他の人にも役立つかもしれませんし、えしりまの答えを補完するものです。

16
Dat Tran