Webデータレポート

株式会社ルーターのデータレポートブログです

モンスターBOXのモンスター名をTensorFlowで特定してみた

▼モンスター画像がたくさん転がってる国、日本

機械学習で何かと進化したのが画像認識。人間の顔の認識は古くから研究されつくされてる感もあるので、それとは別にソーシャルメディア上にアップされている画像を特定してみたいと思います。

特に日本だと、Twitterにゲームのキャプチャをアップしている人が多いから、ゲームのキャプチャを解析すれば、その人のレベル感が分かるし、誰と何を交換すればいいかなどの特定がしやすくなどいろいろ可能性は広がりそうです。

▼実装環境

ubuntu 14.04
python 2.7.6
opencv 3.1.0

▼モンスターBOXからモンスターを取り出す

機械学習ではいつも「この屏風からトラを取り出していただければ退治してみせましょう」というシーンに出くわします。今回もモンスターBOXのたくさん並んでいるモンスターを直接学習させても、パターンが膨大すぎる。だからモンスターアイコンだけを取り出したい。

今回はOpenCVの特徴点を取り出す方法を採用します。特徴点をピックアップするとその画像の中で「ごちゃごちゃしているところ」が特定できます。

特徴点を取り出すにもいろいろアルゴリズムがありますが、今回はFASTというアルゴリズムを使いました。
FASTの詳しい説明(http://www.vision.cs.chubu.ac.jp/CV-R/jpdf/RostenECCV2006.pdf

FASTで検出した特徴点をプロットすると、これが

f:id:webdatareport:20160701094750j:plain

こうなる

f:id:webdatareport:20160701094753j:plain

こんな感じに。
特徴点がモンスター部分に密集しています。
OpenCVには他にも特徴点アルゴリズムがありますが、このFASTが一番モンスター部分に密集してくれました。

この特徴点をヒストグラム化してみます。
X軸方向(横)のヒストグラムがこちら

f:id:webdatareport:20160701094755j:plain

 

山が5個できています。
この山の部分がモンスター部分で、谷が背景部分です。
谷部分で切り取ってあげればモンスター画像が綺麗にトリミングされているのではないか。

山谷部分がわかりやすくなるようグラフを平滑化します。
pandasで移動平均をとってみます。
参考(http://blanktar.jp/blog/2015/12/python-pandas-moving-average.html)

f:id:webdatareport:20160701094757j:plain

青い点は、ピーク解析を行って極小値であると判定された部分です。
SciPyでピーク点を検出することができます。
参考(http://org-technology.com/posts/scipy-peak-finding.html)

これだと両端のモンスター部分は切り取れないので
x座標の先頭と末端から、ピーク解析で得た極小値リストの最小値に一番近い座標をプロットしてみます。

f:id:webdatareport:20160701094759j:plain

うまく切り取れそう。
Y軸方向も同様に

f:id:webdatareport:20160701094800j:plain

試しに、プロットした座標に線を引いてみます。

f:id:webdatareport:20160701094802j:plain

思いのほか綺麗に境界線が引けています。

 

▼分類機作成

いよいよTensorFlowで分類機を作ってみます。
モデル生成~学習まで一通りこちらを参考にしました。
http://kivantium.hateblo.jp/entry/2015/11/18/233834

教師データはこちら(http://monst.appbank.net/monster/archives/1.html)のモンスター図鑑のモンスター画像を使用しました。
また手作業でモンスターの額を取り除いた画像用意して、枠周辺はあんまり気にするなということを教え込みたいなと。

使用した教師画像はこの2パターン。

f:id:webdatareport:20160701094805j:plain

f:id:webdatareport:20160701094806j:plain

それと先程トリミングした際に出た切れ端を負例画像として使用して、モンスターじゃない!ってことを教えます


ということで、使用した教師データは以下の通り。
正例画像:モンスター1981種 × 2枚=3962枚
負例画像:54枚

▼結果

Tensorflowで作った分類機にトリミングしたモンスター画像を入れて分類結果を返す一連の流れを試してみました。

f:id:webdatareport:20160701094750j:plain

トリミングした画像番号,モンスター番号,モンスター名
000,344,マチルダⅡ
001,1538,宇宙の伝達者 ナスカ
002,1226,通天大聖 孫悟空
003,1040,張飛 益徳
004,844,ヴィシャス
005,335,エール・ソレイユ
006,1739,黄泉津大神 イザナミ
007,1523,ハートの女王
008,1202,ロックガール ガーゴイル
009,1038,非天 阿修羅
010,736,レルネーの主 ヒュドラ
011,915,タランチュラス・ウェポン
012,1739,黄泉津大神 イザナミ
013,1472,ちゃす
014,1181,ヒーロー ドラえもん
015,1038,非天 阿修羅
016,563,黄泉津大神 イザナミ
017,1981,水瓶座黄金聖闘士 カミュ
018,1617,リリム
019,1464,灼夏の巨人 スルト
020,1139,護法善神 羅刹
021,1036,除夜を射る将軍 徳川吉宗
022,563,黄泉津大神 イザナミ
023,1965,白鳥星座の青銅聖闘士 氷河
024,1584,情熱の爆音シンガー エナ
025,1266,輝石の美将 雲母大佐
026,1040,張飛 益徳
027,900,MDT チェリーウィンガー
028,460,炎狼の赤ずきん ノンノ
029,1881,白馬の騎士 のび太

 

 

30枚中28枚が正解。教師データのバリエーションは大してないのですが、文字などのノイズが含まれた画像を分類機に入れても結構な精度で分類できていることがわかります。これだけ雑な学習でもまぁまぁ特定できてる。

▼まとめ

TensorFlow自体は、特にこれといったチューニングめいたものは使っておらず、ポイントは前処理。そして前処理に使ってるのは、OpenCVの特徴点抽出のみってところです。