どこから見てもメンダコ

軟体動物門頭足綱八腕類メンダコ科

Object detection APIで自作データセットを訓練する①

はじめに

前回やった”TensorFlowのObject detection APIで東方キャラの顔認識”の手順を記録しておきます。
horomary.hatenablog.com

※基本的に下記リンクで公開されている手順を参考にしています。ありがとうすごい人。 github.com


Object detection APIとは

Tensorflow公式のgithubより https://github.com/tensorflow/models/tree/master/research/object_detection

Creating accurate machine learning models capable of localizing and identifying multiple objects in a single image remains a core challenge in computer vision. The TensorFlow Object Detection API is an open source framework built on top of TensorFlow that makes it easy to construct, train and deploy object detection models.


ある画像の中に、”どこに”、”何が”、”いくつ” 存在するかの計数を自動化する『物体検出』は、もっとも重要な画像処理のタスクのひとつです。 たとえば自動運転のための歩行者認識、たとえば工場における製品の外観検査、たとえばきゅうりのサイズ計測(最近よくCMで見ますね)など、実問題への応用先は無数に存在します。

物体検出の代表的なアルゴリズムにはfaster-RCNNやYoloなどがありますが、これらは単純な画像分類のタスクと異なりtensorflowやkerasで気軽に実装できるようなものではありません。
そこで、Google大先生は一般人でも気軽に物体検出が行えるようなAPIをtensorflowに実装してくれたのでした。

インストール

公式githubに従ってインストールをしましょう。
Anaconda環境でのインストールを強くお勧めします。

models/installation.md at master · tensorflow/models · GitHub

とくに難しい点はありませんが、Protobuf Compilationの項に書いてある以下のコマンド実行が成功していることは確認しておきましょう。

# From tensorflow/models/research/
protoc object_detection/protos/*.proto --python_out=.

object_detection/protos/に末尾が _pb2.py のファイルが生成されればOKです。

画像へのラベル付け

labelImgでタグ付けしましょう。
似たようなラベル付けソフトはいろいろありますが私はlabelImgが一番使いやすいと思います。

github.com f:id:horomary:20181125223930p:plain


RectBoxを作成し、保存すると以下のような形式でアノテーション情報が格納されたxmlファイルが生成されます。

<annotation>
    <folder>test</folder>
    <filename>laugh_1071.jpg</filename>
    <path>C:\Users\owner\Desktop\Project_toho\Object_detection\images\test\laugh_1071.jpg</path>
    <source>
        <database>Unknown</database>
    </source>
    <size>
        <width>800</width>
        <height>600</height>
        <depth>3</depth>
    </size>
    <segmented>0</segmented>
    <object>
        <name>toho_face</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>313</xmin>
            <ymin>182</ymin>
            <xmax>524</xmax>
            <ymax>384</ymax>
        </bndbox>
    </object>
</annotation>



TFrecordの作成

TFrecordとは巨大なデータセットを効率的に扱うためのtensorflow専用バイナリデータ形式です。 上で作成したアノテーション情報と画像ファイルからTFrecordを作成します。

参考元の方がgithubxmlからのTFrecord作成スクリプトを公開してくれているので使わせていただきました。 github.com

xml_to_csv.py でxmlファイルからアノテーション情報をcsvファイルへ書き出し、generate_tfrecord.pyでtfrecordを生成します。このときgenerate_tf_record内のclass_text_to_int()のラベル名を書き換えるのを忘れないようにしましょう。


TFrecordに必要な情報が格納されていないとトレーニング時にOutOfRangeErrorを吐いて止まりますので気を付けましょう。
'image/object/bbox/ymax': dataset_util.float_list_feature(ymaxs), を
'image/object/bbox/yax': dataset_util.float_list_feature(ymaxs), とスペルミスしたことに気づかず不毛な2時間を過ごした私からの忠告です。


訓練済みモデルのダウンロード

fine tuningするために訓練済みのモデルをダウンロードします。

下記リンクにダウンロード可能なモデルのリストがあります。処理速度(Speed (ms))とパフォーマンス(COCO mAP[^1])を見てお好みのモデルを使いましょう。お試しするだけならfaster_rcnn_inception_v2_cocoとか選んでおけばよいと思います。

models/detection_model_zoo.md at master · tensorflow/models · GitHub

これらの訓練済みモデルは動物の種類を分類するデータセットで事前訓練されています。 アニメ顔認識のような事前訓練(動物分類)とまったく関係ないタスクでも、訓練済みモデルでfine turningをした方が圧倒的に早く学習が進みます。
ダウンロードしたら解凍してobject_detectionのフォルダ内にでも置いときましょう。



長くなったのでいったん切ります。

horomary.hatenablog.com

関連

horomary.hatenablog.com

参考

github.com

github.com