はじめに
この記事は「みゅーもり Advent Calendar 2018」19日目の記事です.
今回は,TL上でよく見る「干物妹!うまるちゃん」のキャラクタたちを画像内から検出します.私自身,物体検出は初めてで何もわからないのでChainerCVのexamples内のFaster R-CNNを借りてやっていきたいと思います.ChainerCVを使った理由は,たまたまChainerCVを見つけて私が普段からChainerを使っていたため.
今回はツールを使って検出しただけで,その検出アルゴリズムなどは理解していません(卒論が終わったら読みたい).
今回使用したプログラムはhttps://gitlab.com/ihatasi/umr_detectionに置いておきます.学習済みモデルは1つ500MBくらいあるので忘れていなければここに置いておきます.
データセット
元画像
今回,ミニうまるちゃんFig1の検出器とうまるちゃんず(うまる・海老名・切絵・シルフィン)Fig2の検出器の2つを作りました.データは,アニメ「干物妹!うまるちゃん」のキャプチャ画像(600x388)をミニうまるちゃんは181枚,うまるちゃんずは398枚用意しました.どちらとも1期1話~2期6話までのものです.
アノテーション
学習させるために教師データ(画像・矩形・ラベル)を作る必要があります.この作業をアノテーションというらしい(?).私はlabelImgというツールを使ってアノテーションをしていきました.これはキャラクタの顔を囲ってラベルをつけていく無の作業です.今回はそんなにデータが多くないので数時間で終わりました.Fig3はツールを使っている様子です. labelImgはxmlファイル(初めて見た)を出力してくれる(設定による)ので,それを読み込んで画像とくっつけて学習に入れられる形にしていきます.
データセット作成
xmlファイルを読み込むのに"xml.etree.ElementTree"を使います.初めて見たものなのでここを参考にしました.データセットの作り方はここを参考にしました.
学習
データセットが作れたので学習させていきます.前述した通り,ChainerCV/examples/faster_rcnnを借りていきます. ただし,データセットはこちらで作ったものなのでいくらか書き換えます.GPUに投げて数時間待つとプログラムが終了します.
結果
demo.pyを書き換えたpred.pyをpython pred.py hoge.jpg -m 1 -e 100
のように実行します.
ミニうまるちゃん学習器
ミニうまるちゃんのみを学習させたものです.Fig4は学習データで,Fig5はそこらへんから取ってきた未知のデータに対する検出です.
Fig4のように,学習器がミニうまるちゃんだと判別したところを矩形で囲み"ラベル"と"ミニうまるちゃん度合い(小数点第3位以下は四捨五入)"を表示してくれます.
Fig5ではうまるちゃんでないところが検出されています(コーラが90%でうまるちゃんと検出).
うまるちゃんず学習器
うまるちゃんずの4人を学習させたものです.Fig6, 8は学習データで,Fig7はそこらへんから取ってきた未知のデータに対する検出です. Fig8のように学習データでも誤検出をしてしまうこともあります.もちろんテストデータでも結構誤検出します.(追記12/19:Fig8の誤検出はsilfinの母親をkirieとして検出している.)
感想
今回は初めて物体検出をやってみましたが,思っていたよりもうまく検出できてて驚きました.プログラムと学習モデルはアップする予定なのでみなさんも手元のうまる画像を入れてみてください(CPU環境でも実行可能だが,pipでChainer, ChainerCVのinstallが必要).この学習器を使ってうまるちゃんの顔を大量に集めて生成モデルでなにかするのもありかもしれない.
「やがて君になる」観てください.アマゾンプライムビデオで観られるので.