画像アノテーションツールを作った。

例えばある画像を入力とし、それが一体なんの画像なのかを判定するってのは深層学習を使えばそれほど難しくない。データセットさえ用意できればね。
ただ、そんなものは世の中の人間がいくらでもやってていくらでも記事になっている。そうではなくて、ある画像を入力とし、その中のどこに何があるのかを判定したい。まぁ、これもやっている人はやっているのだが...。それはさておき、それにあたって画像のどこに何があるのかをアノテートする必要がある。今回はそれを行うプログラムを作成した。

言語はPython3を使用した。全く代わり映えがない。だって簡単だし。GUI用のライブラリはtkinterを使用した。界隈ではQtだのwxPythonだのKivyだのと一体どれを使えばいいのかがわからない。とりあえず適当なワードで検索して一番上にきたからこれにした。多分前にちょろっとGUI作った時もこれだったと思う。直感的にウィジェットを置いていけるから結構いいんじゃないかな。他のライブラリも似たような感じな気もするけど。

構成としてはウィンドウを出す。そこに画像を表示して、囲いたい領域の頂点二つをクリックすると矩形選択ができる。ある画像について全ての矩形を選択し終えたら実際にそのデータをjson形式で保存する。そしたら次の画像について同様にアノテートをしていくといった感じである。
画像のパスとjsonファイルのパスは同じ名前にしておく。あとで読み込むのを簡単にするためだ。

github.com

プログラム本体貼り付けようかと思ったけど思ったより長かったのでやめた。

と、こんな感じでアノテーションツールを作成した。
あくまでこれは下準備であって、最終的なゴールは最初に示した通りなのだが、より具体的に書き下しておく。

SSD(Single Shot Multibox Detector)をVOCのデータセットで学習させる。
使うプログラムはこちらのものである。
tensorflowで実装しているのでこれにした。`
学習させたデータを使ってファインチューニングを行う。
この手順である画像から自由に好きなものを判別できるかを試してみようと思う。
今回判別に使うのはこちらである。

f:id:coil398:20190118101843j:plain

はい、というわけで適当に本編の映像から一枚画像を入力して、メイン5人が判別できるのかどうかを実験する。
ちなみに画像データはアニメ一期一話本編の動画をffmpegで適当に一秒あたり一枚で作成した。実際にメインキャラが映っているかどうかを考えるとデータが少ない気もするが、あまり同じような画像が続いてもダメでは?という過程の元、足りなかったら二話、三話と使っていこうと思う。つまり、地獄のアノテーション作業が待っているということになる。

ちなみに今回のアノテーションツールは、初期ラベルとしてメイン5人が入っているが、囲った枠の色がキャラに応じて変わる仕様である。もちろん好きなものをラベルに入れることで好きなデータセットが作れるだろう。

実際のアノテーションの様子がこんな感じ↓

f:id:coil398:20190118102543p:plain

当初は体全体でやろうと思っていたが、顔だけでいいかなと思い始めた。というか体全体でうまくいく気がしなくなった。
ここまで書いて大きなミスに気づいた。画像の大きさを選択できるようにしていない。まぁ、コードをちょっと書き換えれば動くが...
それとこのプログラムはArch Linux上で書いて動いていたものをmacOSで動かしてスクショ撮って記事にしている。のだがmacOSだとうまく動かん...何故だ。