Hello Wor.log

IT系大学生4人による備忘録のようなもの

ポケモンのアイコンを識別するやつ(1)

CPPXのXです。

ポケモン選出画面から、相手の手持ちを識別するやつ をやりたいと思います。

今回はあまり細かい説明はしません。
作ったものの概要程度にまとめたいと思います。

コンセプトは以下な感じです。

  • なるべくデータ収集したくない!!
  • 雑に撮った写真から判別してほしい!!!

予測精度は99%を超えました。

書いたコードはgithubに載せておきます。

github.com

では、目次です。

結果

とりあえず結果を載せておきます。

結果はこんな感じです f:id:cppx:20180827085235j:plain f:id:cppx:20180827085302p:plain f:id:cppx:20180827085247j:plain f:id:cppx:20180827085258p:plain

ほうほう、いい感じ。

環境

importしたもの

import cv2
import numpy as np
from scipy import ndimage
import tensorflow as tf
import pylab
from PIL import Image
import random
import itertools
import functools
import warnings
import math

概要

アイコン切り取り → アイコン識別
の流れで行なっています。

アイコン切り取りは画像処理でいい感じに、
識別はinception-resnet-v2もどき + SENetを使ってます。
色々改造してたらxception + SENetのようなものを2本立てた形になりました。

ソースコードと重みはgithubに載せておきます。

cloneして、ライブラリ揃えて、直下にsample.jpgという名前で選択画面の画像を置いておけば動くと思います。

unzip ../pkcp_data.zip -d ./
python main.py

図鑑番号が出力されると思います。
画像が出てくるようにしておきました。
フォルム違いとか、訓練データに入れていないポケモンもいるので、その辺りはうまく識別されません(メテノとか)。

モデルの読み込みが走るので、ちょっと重いです。 手元のラップトップで動く程度の重さだと思います。

アイコン切り取り

エッジ検出して、輪郭とって、輪郭の大きさと内部の色合いから相手のパーティ切り取って、矩形の傾きを修正して、そこまでいくとアイコン座標が固定なので、座標決め打ちで切り取ります。

学習

こんなf:id:cppx:20180827092117p:plain 元画像を1枚ずつ集めてきて、ノイズを加えて水増ししつつ学習させています。

ノイズは、
変形加工、ガウシアンノイズ、HSV + コントラストの変更、右下にあるアイテムの切り取りをランダム配置
を加えています。

1000epochくらい回します。
1080tiで2時間くらいです。

学習曲線が割と暴れてしまうのですが、だんだんと収束するかと思います。

loss値が0.04切ると、だいたい判別できます。
テストに対しても、訓練に対しても0.01は下回るかと思います。

今後

アプリに落とし込めたらと思うんですが、とてもモチベが低いです。

撮った写真からそのまま自動判別までの流れは作ろうかと思っています。

動かんわい!!とか、何かあればコメント付けてもらえると非常に嬉しいです。

他の記事
ポケモンのアイコンを識別するやつ(1) now
ポケモンのアイコンを識別するやつ(2)
ポケモンのアイコンを識別するやつ(3)