Pokémon GO用のポケモンの個体値を計算するアプリを作っています。
(公開停止しました)
Pokétomoではスクリーンショットを解析して個体値を求めるのですが、今回稀にカイロスがキャタピーと誤認識されてしまう問題についてメモしておきたいと思います。
個体値計算アプリでのポケモン識別について
まぁ、Pokétomo自身が他のアプリの二番煎じだったりするんですけれど、スクリーンショットからポケモン識別をおこなうサービスは他にもたくさんあります。
ざっくりと確認した限り、名前部分をOCRにかけてポケモンの識別をおこなうものが多いようです。
Pokétomoでは諸々の前提があったのもあり、僕には名前から識別する発想が出てきませんでした。例えば、
- Pokémon GOは日本での配信が後発だった
- Pokémon GOは多言語対応されている(言語によってポケモンの名前が一定ではない)
- 僕自身が1匹1匹に名前をつけていた*1
確かに自分が使うために開発しているので、OCRかけて日本語だけに対応しておけばよかったな……と思いましたが、画像処理の勉強になるし、結果的にはよかったのかな……と。
Pokétomoでのポケモン識別について
Pokétomoでは名前ではなくて、ポケモン画像の部分から種族(っていうのか?)を特定しています。
当初、OpenCVのオブジェクト検出のみで対応しようと、適当な分類器を作ってかなり雑な前提で一度テストしてみたのですが、1つの分類器を使って検出させるのに20ミリ秒かかっていました。これだけならば十分に早いのですが、全ポケモン151種類を対応しようと思うと151種類x20ミリ秒(=3,020ミリ秒)もかかってしまうことがわかりました。
CPやらHPやらの解析も必要な中で、スクリーンショット1枚を解析するのに何秒も待たないといけないのは使い勝手が悪いなぁと思ったので、まずは色の頻出度で類似性である程度絞り込みをおこなってから、OpenCVでオブジェクト検出させようと思いました。
ほとんどの場合はこれで十分対応することができたようでしたので、v1.1ではポケモンの識別は色のみでおこなっています。
明らかに他と異なる配色のエレブーは0.9(90%)を超えた類似度で誤認識することが少ないですが、似た背景のポケモンの場合には誤検出してしまいました。やはり色だけでは完全ではないようです。
カイロス-キャタピー類似問題
近所ではカイロスしかでない土地柄なので、自然とカイロスのスクリーンショットを使ってテストすることが多いです。
今回の登場人物(カイロスとキャタピーを知らない人向けの情報)
見た目が全然違います。人間が見るとカイロスとキャタピーとは別のものだと一瞬でわかるのですが、色だけで見ると背景色の緑が強く出てしまって、カイロスをキャタピーと誤認識してしまうことがあります。
左のカイロスは「キャタピー」と認識されます。右のカイロスは「カイロス」と認識されます。
それぞれの類似度は以下のようになりました。正しく認識される時も誤って認識される時も認識率はめっちゃ僅差やねんな……
誤り
- キャタピー:0.7421875
- バタフリー:0.734375
- カイロス:0.72265625
- コンパン:0.6953125
- スピアー:0.67578125
正しい
- カイロス:0.78125
- パラセクト:0.75390625
- バタフリー:0.734375
- コンパン:0.73046875
- キャタピー:0.71875
v1.1ではRGBでヒストグラムを出してるんだけど、HSVでヒストグラムを出したら精度が上がるという話を聞いたので、今度の週末にでも試してみたいと思います。
うまくいけばv1.3あたりで修正の予定です。
*1:ポケモンの乱獲を始める前の話で、今は名前欄には個体値が……