R−CNNやYOLO, SSDなど、画像の”どこ”に”何”があるかを識別するタスクのためのラベル付与を支援するソフトウェアをProcessingで作成しました。
主に個人目的で作ったので、ちゃんとしたUIにはなっていないと感じる方もいらっしゃるかもしれませんが、せっかくなので公開したいと思います。
コードおよび開発環境
以下にコードを載せています。
https://github.com/slowsingle/labeling_for_object_detection
MacBookProのProcessing3.3で開発しました。
使用する際には、controlP5ライブラリが必要になります。これはProcessingでGUIのコントローラを作成するのをお手軽にするライブラリです。
以下のサイトが参考になるかと思います。
http://qiita.com/akspect/items/6a574e12181c00125d40
http://www.sojamo.de/libraries/controlP5/
使用方法
今回作成したツールの使用に関するデモ動画がこちらになります。
https://www.youtube.com/watch?v=HXmHYFBqIDM
ツール画面の右側にいくつかボタンがありまして、一番上には[LOAD IMAGE]、すなわち画像を指定するためのボタンがあります。その下にはラジオボタンがいくつかあり、ラベルをそこで選択できます。
画像上でクリックをすると矩形を描画することができ、[SAVE RECT]ボタンを押すと、その矩形領域とラベル情報をセットで記憶します(このとき矩形は消えますが、プログラム内部で情報を保有しているので問題ありません)。矩形を消したい場合は[DELETE RECT]ボタンを押してください。
最後に[OUTPUT XML]ボタンを押すことで、記憶した情報をXMLファイルとして出力します。出力先はprocessingのプログラムがある場所になっていると思われます。
ちなみに、デモ動画の通りに作業を行うと以下のXMLファイルが生成されます。
<?xml version="1.0" encoding="UTF-8"?>
<annotation>
<folder>XXX</folder>
<filename>test.jpg</filename>
<source>
<database>XXX</database>
<annotation>XXX</annotation>
<image>XXX</image>
<flickrid>XXX</flickrid>
</source>
<owner>
<flickrid>XXX</flickrid>
<name>?</name>
</owner>
<size>
<width>500</width>
<height>281</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>Chino</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>1</difficult>
<bndbox>
<xmin>125</xmin>
<ymin>21</ymin>
<xmax>266</xmax>
<ymax>170</ymax>
</bndbox>
</object>
<object>
<name>Shallo</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>1</difficult>
<bndbox>
<xmin>274</xmin>
<ymin>4</ymin>
<xmax>402</xmax>
<ymax>156</ymax>
</bndbox>
</object>
</annotation>
XMLのファイル名は画像ファイル名にxmlの拡張子がついたものとなります。なお、poseやtruncated, difficultの情報はこのツール上からは設定できず、デフォルトの値のままになっているので、この値は教師信号として使わないようにしてください。nameとbndboxの(xmin, ymin, xmax, ymax)がデモ動画における作業で正しく更新された情報になっています。
余談ですが、Chino(チノ)やShallo(シャロ)は画像に写っている女の子の名前です。というか、ごちうさですね。私にも心をぴょんぴょんさせていた時期がありました。
学習
実際にこれで正しくデータセットが構築できているのかを確かめるために、学習を行いました。
以前私が書いた記事(物体検出アルゴリズム(SSD : Single Shot MultiBox Detector)を学習させてみる)を参考にして、今回はごちうさの画像を60枚集めて、本ツールを用いてラベルの割り振りを行いました。
今回はデータセットが正しく作れているかを確かめたいので、訓練画像をそのままネットワークに投げて推論させました。
ちゃんと学習できているようです。ちなみに、訓練時に使っていない画像を試しに投げてみると、ココアとシャロを間違えたりすることが多くなります。髪の色以外は大体同じですからね。。。(とか言うと怒る人がいるかもしれないので、ここら辺にしておきましょう)