【画像認識】ポケモン対戦画面抽出システムの概要と課題

# １．記事の内容

この記事では、ポケットモンスター(以下ポケモン)での対戦における課題の1つである
ポケモン対戦画面よりポケモンの自動判別について記載する。

目的としては、ポケモンにおけるこの課題を知ってもらい、
画像認識に関係している方々に意見をもらうことである。
※ちなみにわたくしは画像認識については門外漢であり、独学中。

また最近になって同志が増え始めたため、この記事を記載した。
<div class="blog-card" style="padding:12px;margin:15px 0;border:1px solid #ddd;word-wrap:break-word;max-width:474px;width:auto;border-radius:5px;"><div class="blog-card-thumbnail" style="float:left;"><a href="http://qiita.com/hrs1985/items/118710a673c567a9872c" class="blog-card-thumbnail-link" target="_blank"><img src="http://capture.heartrails.com/120x120/shorten?http://qiita.com/hrs1985/items/118710a673c567a9872c" class="blog-card-thumb-image wp-post-image" alt="12436288584_94d6bc46d2_b.jpg" style="width:100px;height:100px;"></a></div><div class="blog-card-content" style="margin-left:110px;line-height:120%;"><div class="blog-card-title" style="margin-bottom:5px;"><a href="http://qiita.com/hrs1985/items/118710a673c567a9872c" class="blog-card-title-link" style="font-weight:bold;text-decoration:none;color:#111;" target="_blank">HOG特徴量を用いたポケモンのアイコン画像判別 - Qiita</a></div><div class="blog-card-excerpt" style="color:#333;font-size:90%;">xxxxxxxxxx</div></div><div class="blog-card-footer" style="font-size:70%;color:#777;margin-top:10px;clear:both;"><span class="blog-card-hatena"><a href="http://b.hatena.ne.jp/entry/http://qiita.com/hrs1985/items/118710a673c567a9872c" target="_blank"><img border="0" src="http://b.hatena.ne.jp/entry/image/http://qiita.com/hrs1985/items/118710a673c567a9872c" border="0" alt="" /></a></span></div></div>


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">見せ合い画面でのアイコン判定機です。偽トロキャプチャとかで取り込んだ画面に対してしか使えないと思いますが、使える人は試してみてください。判定を行ったパーティの画像は勝手に保存されるので集まったら欲しいです（願望）。<a href="https://t.co/53CsRWBt9l">https://t.co/53CsRWBt9l</a> <a href="https://t.co/DusVSCtGKo">pic.twitter.com/DusVSCtGKo</a></p>&mdash; kiyo㌠ (@hrs1985) <a href="https://twitter.com/hrs1985/status/839116544177164291">2017年3月7日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ポケモンの選出画面の写メから、そこに写っているポケモンを検出するwebアプリを作りました！まだ試行錯誤段階で検出精度は5割程度ですが、データ収集のためにも使ってくださる方を募集しています。<a href="https://t.co/UAGAQECvc5">https://t.co/UAGAQECvc5</a> <a href="https://t.co/ylF2DM96Ts">pic.twitter.com/ylF2DM96Ts</a></p>&mdash; おだんぽよ (@poke_odan) <a href="https://twitter.com/poke_odan/status/838800383321350145">2017年3月6日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

技術的な記事についても次記事以降に記載する。
※わたくしが行ったのはテンプレートマッチングです。


# ２．ポケモン対戦の概要
ポケモンはゲームフリークより発売されているゲームであり、
ポケモンと呼ばれるモンスターを収集し、育成、対戦するRPGである。
特に、現在ではネット上での対戦が可能であり、
レーティングバトルにて全世界のポケモンプレイヤーと競い合うことができる。

ポケモンバトルで勝つためには

1. バトル前のポケモン育成(最大6体をパーティとする)
2. バトル時のポケモン選出(パーティから3体を選出する)
3. バトルでの立ち回り(選出した3体でバトル)

が重要である。
特に１．バトル前のポケモン育成では、
現在のレーティングバトルでの流行によって影響を受けやすい。


レーティングバトルにてどのようなポケモンが流行っているかを知るためには
ポケモングローバルリンクとよばれる公式のHPにて知ることができる。
図は現在2017/03/11のランキング画面である。
![gl.PNG](https://qiita-image-store.s3.amazonaws.com/0/135302/b937057e-01e5-e0d6-88fa-7f5a1f803c75.png)

この画面では全世界のポケモンプレイヤーが使用しているポケモンのうち、
使用頻度の高いポケモンが上位にランキングされる。
この画面から現在のレーティングバトルにて流行しているポケモンを把握することは可能である。

しかしながら、自分がレーティングバトルをした際に
どのようなポケモンと戦ったかを知ることができない。

自分が育成したポケモンと対戦したポケモンを把握し、
負けた試合でどのようなポケモンを相手が使用していたかを把握することは
レーティングバトルで勝ち抜くためには重要である。

そのため、ポケモンバトル時に相手がどのようなポケモンを使用したかを
記録しておくことが重要である。

ポケモンバトルでは2. バトル時のポケモン選出にて
以下の画面が表示される(以下、ポケモン対戦画面とする)
![aaa.PNG](https://qiita-image-store.s3.amazonaws.com/0/135302/7eae84e0-be72-43b7-d482-caf5d6b16214.png)
左が自分のポケモンであり、右が相手のポケモンである。

従来、バトルごとに対戦したポケモンを把握するためには、
1試合ごとに、相手のパーティをメモしたり、ポケモン対戦画面をキャプチャする必要があった。
メモや画面キャプチャにより、データを残した場合、
あとで集計や統計を取る際に手間がかかる。

また、
- 相手のポケモンパーティからどのようなポケモンがでてくるか、
- 相手のポケモンパーティを鑑みて自分はどのようなポケモンを選出するべきか
を確率計算によってある程度補助することができる可能性がある。

そこでポケモン対戦画面から相手のポケモンを自動判別し、
名前をデータとして残すシステムを開発したい。
![aaaa.PNG](https://qiita-image-store.s3.amazonaws.com/0/135302/364616d1-a6b7-b1a3-cedd-f2801f3e6bae.png)

わたくしがこの課題を始めたのは2014.10.21であり、
以下にその経過を記載したブログ記事を載せる。
<div class="blog-card" style="padding:12px;margin:15px 0;border:1px solid #ddd;word-wrap:break-word;max-width:474px;width:auto;border-radius:5px;"><div class="blog-card-thumbnail" style="float:left;"><a href="http://araralabo.blog118.fc2.com/blog-entry-476.html" class="blog-card-thumbnail-link" target="_blank"><img src="http://capture.heartrails.com/120x120/shorten?http://araralabo.blog118.fc2.com/blog-entry-476.html" class="blog-card-thumb-image wp-post-image" alt="12436288584_94d6bc46d2_b.jpg" style="width:100px;height:100px;"></a></div><div class="blog-card-content" style="margin-left:110px;line-height:120%;"><div class="blog-card-title" style="margin-bottom:5px;"><a href="http://araralabo.blog118.fc2.com/blog-entry-476.html" class="blog-card-title-link" style="font-weight:bold;text-decoration:none;color:#111;" target="_blank">ポケモン見せ合い画面キャプチャツールについて : ゲームやってる場合じゃねぇ！</a></div><div class="blog-card-excerpt" style="color:#333;font-size:90%;">xxxxxxxxxx</div></div><div class="blog-card-footer" style="font-size:70%;color:#777;margin-top:10px;clear:both;"><span class="blog-card-hatena"><a href="http://b.hatena.ne.jp/entry/http://araralabo.blog118.fc2.com/blog-entry-476.html" target="_blank"><img border="0" src="http://b.hatena.ne.jp/entry/image/http://araralabo.blog118.fc2.com/blog-entry-476.html" border="0" alt="" /></a></span></div></div>

<div class="blog-card" style="padding:12px;margin:15px 0;border:1px solid #ddd;word-wrap:break-word;max-width:474px;width:auto;border-radius:5px;"><div class="blog-card-thumbnail" style="float:left;"><a href="http://araralabo.blog118.fc2.com/blog-entry-535.html" class="blog-card-thumbnail-link" target="_blank"><img src="http://capture.heartrails.com/120x120/shorten?http://araralabo.blog118.fc2.com/blog-entry-535.html" class="blog-card-thumb-image wp-post-image" alt="12436288584_94d6bc46d2_b.jpg" style="width:100px;height:100px;"></a></div><div class="blog-card-content" style="margin-left:110px;line-height:120%;"><div class="blog-card-title" style="margin-bottom:5px;"><a href="http://araralabo.blog118.fc2.com/blog-entry-535.html" class="blog-card-title-link" style="font-weight:bold;text-decoration:none;color:#111;" target="_blank">【ポケモン】自動判別＆KP集計するポケモン見せ合い画面キャプチャツールの進捗状況【ツール】 : ゲームやってる場合じゃねぇ！</a></div><div class="blog-card-excerpt" style="color:#333;font-size:90%;">xxxxxxxxxx</div></div><div class="blog-card-footer" style="font-size:70%;color:#777;margin-top:10px;clear:both;"><span class="blog-card-hatena"><a href="http://b.hatena.ne.jp/entry/http://araralabo.blog118.fc2.com/blog-entry-535.html" target="_blank"><img border="0" src="http://b.hatena.ne.jp/entry/image/http://araralabo.blog118.fc2.com/blog-entry-535.html" border="0" alt="" /></a></span></div></div>

<div class="blog-card" style="padding:12px;margin:15px 0;border:1px solid #ddd;word-wrap:break-word;max-width:474px;width:auto;border-radius:5px;"><div class="blog-card-thumbnail" style="float:left;"><a href="http://araralabo.blog118.fc2.com/blog-entry-570.html" class="blog-card-thumbnail-link" target="_blank"><img src="http://capture.heartrails.com/120x120/shorten?http://araralabo.blog118.fc2.com/blog-entry-570.html" class="blog-card-thumb-image wp-post-image" alt="12436288584_94d6bc46d2_b.jpg" style="width:100px;height:100px;"></a></div><div class="blog-card-content" style="margin-left:110px;line-height:120%;"><div class="blog-card-title" style="margin-bottom:5px;"><a href="http://araralabo.blog118.fc2.com/blog-entry-570.html" class="blog-card-title-link" style="font-weight:bold;text-decoration:none;color:#111;" target="_blank">【対戦画面の画像募集】画像認識技術によるポケモン対戦画面選出抽出システム : ゲームやってる場合じゃねぇ！</a></div><div class="blog-card-excerpt" style="color:#333;font-size:90%;">xxxxxxxxxx</div></div><div class="blog-card-footer" style="font-size:70%;color:#777;margin-top:10px;clear:both;"><span class="blog-card-hatena"><a href="http://b.hatena.ne.jp/entry/http://araralabo.blog118.fc2.com/blog-entry-570.html" target="_blank"><img border="0" src="http://b.hatena.ne.jp/entry/image/http://araralabo.blog118.fc2.com/blog-entry-570.html" border="0" alt="" /></a></span></div></div>

上記記事では主にテンプレートマッチングを使用している。

# ３．ポケモン対戦画面抽出における問題
主に５つの問題を認識している

### 画像のノイズ

ポケモン対戦画面に限らず、画像認識における問題である。
例えば2章で紹介したポケモン対戦画面はNintendo 3DSから直接画面出力しているため
画像はきれいに取れている。

![aaaa.PNG](https://qiita-image-store.s3.amazonaws.com/0/135302/7c15c89a-fb08-3ba1-bb7d-416a2b83ba74.png)

しかしながらこのようにPC画面に直接Nintendo 3DS等のゲーム画面を出力するためには機材が必要である。
通常はゲーム機にカメラを向けて画像を取得するため以下のような画像が多い。
![unspecified.png](https://qiita-image-store.s3.amazonaws.com/0/135302/1f88de4b-bd4d-ec0e-569a-8eacdee4045c.png)![無題.jpg](https://qiita-image-store.s3.amazonaws.com/0/135302/867b7a5b-0cb5-0766-9eee-cb8676e695ad.jpeg)

このようにカメラで撮影した画像でも、輝度やモアレ縞、コントラストの違い、画面上の汚れなどによって
得られる画像の質にばらつきが生じる。

そのため、画像を取得した際に、ポケモンのアイコンを判別する前に処理が必要である。

### 画面の傾き
上記の画像のノイズで使用した画像でもわかる通り、
画像が真正面からとられているとは限らない。
その場合、アイコンが傾いていたりする。

HOG等の特徴量では画像の傾きなどにロバストではある。
また、Hough変換によってオレンジ色領域を検出し、
台形から長方形に変換することで解決する見通しである。
この場合、オレンジ色領域を囲う部分を正確に抽出する必要はある。
<div class="blog-card" style="padding:12px;margin:15px 0;border:1px solid #ddd;word-wrap:break-word;max-width:474px;width:auto;border-radius:5px;"><div class="blog-card-thumbnail" style="float:left;"><a href="http://qiita.com/YSRKEN/items/ee94c7c22599c2374722" class="blog-card-thumbnail-link" target="_blank"><img src="http://capture.heartrails.com/120x120/shorten?http://qiita.com/YSRKEN/items/ee94c7c22599c2374722" class="blog-card-thumb-image wp-post-image" alt="12436288584_94d6bc46d2_b.jpg" style="width:100px;height:100px;"></a></div><div class="blog-card-content" style="margin-left:110px;line-height:120%;"><div class="blog-card-title" style="margin-bottom:5px;"><a href="http://qiita.com/YSRKEN/items/ee94c7c22599c2374722" class="blog-card-title-link" style="font-weight:bold;text-decoration:none;color:#111;" target="_blank">やさしいハフ(Hough)変換講座 - Qiita</a></div><div class="blog-card-excerpt" style="color:#333;font-size:90%;">xxxxxxxxxx</div></div><div class="blog-card-footer" style="font-size:70%;color:#777;margin-top:10px;clear:both;"><span class="blog-card-hatena"><a href="http://b.hatena.ne.jp/entry/http://qiita.com/YSRKEN/items/ee94c7c22599c2374722" target="_blank"><img border="0" src="http://b.hatena.ne.jp/entry/image/http://qiita.com/YSRKEN/items/ee94c7c22599c2374722" border="0" alt="" /></a></span></div></div>

### ポケモンのアイコン位置の特定
テンプレートマッチングする場合、
6体のポケモンアイコンがどこにあるのかを特定しなければならない
例えば、(前作のポケモン画像であるが)以下の画像があるとする。
![adfadfa.JPG](https://qiita-image-store.s3.amazonaws.com/0/135302/2a62083a-9f30-1698-5c41-dda83d4a9db1.jpeg)
この画像からポケモン6体を抽出した場合、
正解としては
1. フシギバナ
2. ルカリオ
3. マフォクシー
4. メタモン
5. ゲンガー
6. ゴースト
となる。
しかしながら、場所がわからずテンプレートマッチングを6回回してしまった場合、
キャタピーが選出されることがある。
![image_10.png](https://qiita-image-store.s3.amazonaws.com/0/135302/28d72031-7f91-f8ae-f6b4-d9a7517cf972.png)
これは背景色が原因である。
背景色が緑系なので中央部分のアイコンがいない
ところで緑の成分が多いキャタピーとマッチングしてしまう。

一応対策として
- 背景色の除去
- アイコン領域の分割
- アイコン位置の自動特定
がある。
取り組んだ内容については次記事以降に記載したい。

### ポケモンのアイコンの特定
事前に用意したモデル画像から特徴量を抽出し、
アップロードされたポケモン対戦画面から6体のポケモンを抽出する。
特徴量としてはいろいろ考えられるがわたくしはPythonのOpenCVを使用している。
<div class="blog-card" style="padding:12px;margin:15px 0;border:1px solid #ddd;word-wrap:break-word;max-width:474px;width:auto;border-radius:5px;"><div class="blog-card-thumbnail" style="float:left;"><a href="http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_template_matching/py_template_matching.html" class="blog-card-thumbnail-link" target="_blank"><img src="http://capture.heartrails.com/120x120/shorten?http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_template_matching/py_template_matching.html" class="blog-card-thumb-image wp-post-image" alt="12436288584_94d6bc46d2_b.jpg" style="width:100px;height:100px;"></a></div><div class="blog-card-content" style="margin-left:110px;line-height:120%;"><div class="blog-card-title" style="margin-bottom:5px;"><a href="http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_template_matching/py_template_matching.html" class="blog-card-title-link" style="font-weight:bold;text-decoration:none;color:#111;" target="_blank">テンプレートマッチング — OpenCV-Python Tutorials 1 documentation</a></div><div class="blog-card-excerpt" style="color:#333;font-size:90%;">xxxxxxxxxx</div></div><div class="blog-card-footer" style="font-size:70%;color:#777;margin-top:10px;clear:both;"><span class="blog-card-hatena"><a href="http://b.hatena.ne.jp/entry/http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_template_matching/py_template_matching.html" target="_blank"><img border="0" src="http://b.hatena.ne.jp/entry/image/http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_template_matching/py_template_matching.html" border="0" alt="" /></a></span></div></div>

### 計算時間の問題
ポケモンバトルにおいて相手のポケモンを見てから自分のポケモンを選出する際、数分程度しかない。
相手のポケモンをメモする程度ならばよいが、

- 相手のポケモンパーティからどのようなポケモンがでてくるか、
- 相手のポケモンパーティを鑑みて自分はどのようなポケモンを選出するべきか

を確率計算する場合、画像認識の計算時間はできるだけ抑えたい。