ポケモンのアイコンを識別するやつ(1)
CPPXのXです。
ポケモン選出画面から、相手の手持ちを識別するやつ をやりたいと思います。
今回はあまり細かい説明はしません。
作ったものの概要程度にまとめたいと思います。
コンセプトは以下な感じです。
- なるべくデータ収集したくない!!
- 雑に撮った写真から判別してほしい!!!
予測精度は99%を超えました。
書いたコードはgithubに載せておきます。
では、目次です。
結果
とりあえず結果を載せておきます。
結果はこんな感じです
ほうほう、いい感じ。
環境
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本立てた形になりました。
cloneして、ライブラリ揃えて、直下にsample.jpgという名前で選択画面の画像を置いておけば動くと思います。
unzip ../pkcp_data.zip -d ./ python main.py
図鑑番号が出力されると思います。
画像が出てくるようにしておきました。
フォルム違いとか、訓練データに入れていないポケモンもいるので、その辺りはうまく識別されません(メテノとか)。
モデルの読み込みが走るので、ちょっと重いです。 手元のラップトップで動く程度の重さだと思います。
アイコン切り取り
エッジ検出して、輪郭とって、輪郭の大きさと内部の色合いから相手のパーティ切り取って、矩形の傾きを修正して、そこまでいくとアイコン座標が固定なので、座標決め打ちで切り取ります。
学習
こんな 元画像を1枚ずつ集めてきて、ノイズを加えて水増ししつつ学習させています。
ノイズは、
変形加工、ガウシアンノイズ、HSV + コントラストの変更、右下にあるアイテムの切り取りをランダム配置
を加えています。
1000epochくらい回します。
1080tiで2時間くらいです。
学習曲線が割と暴れてしまうのですが、だんだんと収束するかと思います。
loss値が0.04切ると、だいたい判別できます。
テストに対しても、訓練に対しても0.01は下回るかと思います。
今後
アプリに落とし込めたらと思うんですが、とてもモチベが低いです。
撮った写真からそのまま自動判別までの流れは作ろうかと思っています。
動かんわい!!とか、何かあればコメント付けてもらえると非常に嬉しいです。
他の記事
ポケモンのアイコンを識別するやつ(1) now
ポケモンのアイコンを識別するやつ(2)
ポケモンのアイコンを識別するやつ(3)