verilog書く人

自称ASIC設計者です。どなたかkaggle一緒に出ましょう。

物体検出用の画像アノテーション正解データ生成に便利なツール

RCNN (Regional Convolutional newral networks)などの機械学習モデルを使って画像から物体検出するには、"どこ"に"なにが"あるのか、すなわちバウンディングボックスの四角の座標(x, y)および正解ラベルが画像とセットで必要となります。

10000枚単位の画像が欲しい場合、自力で集めるのは大変なので、Pascal VOCのようなコンペで公開されている過去のトレーニング用データセットを流用しますが、それだけでは足りなかったり、自分が検出したい物体がなかったりします。 

 そんなときにPascal VOCに存在しない正解データを自分で追加して、一緒に学習させたい場合は、Pascal VOCのデータセットと同一形式のアノテーションデータを用意すると一緒に処理できて便利です。

 

例えばこの画像だと、黄枠のバウンディングボックスの中に車と人間がいます。

 

f:id:segafreder:20161127100455j:plain

これがPascal VOCのトレーニング用データセットではxmlで 

 

<annotation>
    <object>
        <name>car</name>
        <pose>Left</pose>
        <truncated>1</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>48</xmin>
            <ymin>240</ymin>
            <xmax>195</xmax>
            <ymax>371</ymax>
        </bndbox>
    </object>
    <object>
        <name>person</name>
        <pose>Left</pose>
        <truncated>1</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>8</xmin>
            <ymin>12</ymin>
            <xmax>352</xmax>
            <ymax>498</ymax>
        </bndbox>
    </object>
</annotation>

 

のようにしてアノテーション情報が書き出されています。

データセットはたとえばここでダウンロードできます。(500MBほどあるので注意)

 

ここでxml上で指定されている座標(xmnin, xmax, ymin ,ymax)の単位はピクセルで、最も左上のピクセルが(1,1)です。

各データの定義の詳細はこちら↓。

The PASCAL Visual Object Classes Challenge 2007 (VOC2007) Development Kit

 

自前のデータセットに対してアノテーションxmlを生成したかったのですが、なんかいい感じのツールないかなと思ってネットの海をサーフィンしているといい感じのやつが見つかりました。

 

GitHub - tzutalin/ImageNet_Utils: Utils to help download images by id, crop bounding box, label images, etc.

 

f:id:segafreder:20161127100016p:plain

 

手動でアノテーションした結果が、Pascal VOCと同等の形式のxmlとして吐き出されます。

インストー

まず、下準備として、依存ライブラリをインストールします。

  • Pyqt4

Riverbank | Software | PyQt | PyQt4 Download

  • lxml

Windowsの方は

lxml 3.3.5 : Python Package Index

からインストーラを落とした方が早いです。pipは依存ライブラリが入らないのでめんどくさい。

 

使い方

labelImgGUIディレクトリに入り

$ python labelImg.py

GUIツールを立ち上げます。

後はOpenで画像を開いて、左クリックでアノテーション領域を指定して、Saveでアノテーション結果をxmlで出力します。簡単です。

 

PascalVOCを見ると1クラスあたり数百オーダーの画像なので、人間ディープラーニングとなってしこしこ手作業でアノテーションしてたら1クラス1日くらいでなんとかなる気がします。