post Image
【TensorFlow】機械学習でポケモンずかんを現実化してみた

Qiitaは初投稿です。はじめまして。
普段はちぇだという名前で、主にTwitter(@cheddar_dev)でひっそりと活動しています。

はじめに

皆さん、ポケモンはお好きですか?
私にとってポケモンは、小学生の頃に発売されて以降、私の青春をともに歩いてきたと言っても過言ではないです。通信ケーブルを持っている子の家に集合したり、きんのたまおじさんに怯えたり…。

そんな中、1998年にポケモンずかんのおもちゃが発売されました。(参考:YouTube)
「これがあれば、サトシみたいにポケモンマスターを目指せる!!」
そう思った私は、すぐに両親にねだって誕生日プレゼントに買ってもらいました。が、すぐに絶望しました。

「ピカチュウのぬいぐるみに向けても、ポケモンずかんにピカチュウのデータが表示されない!どうして…」

冷静に考えたら、ポケモンを判別して図鑑に表示するおもちゃは(当時の技術では)商品化できる訳がないのですが、小学校低学年の私にとっては、それはそれはショックでした。

あれから20年、ふとTensorFlowを使った機械学習の取り組みをしている中、思いました。
「機械学習して画像を判別できるのなら、ポケモンずかんを作れるのでは?」

できたもの

スクリーンショット
pipup slowpoke
magikarp pikachu

(全種類のポケモンの画像収集と学習は時間的に辛いので、今のところ見分けられるのは数匹です。)

システム構成

system

1. 学習元となる画像を収集

Google画像検索とChrome拡張(Fatkunバッチダウンロードイメージ)を使って、ポケモン毎に約200枚づつ画像を集めました。200枚という数字に特に意味はないです。試してはいないですが、恐らく最低でも30〜50枚は必要だと思います。

2. 転移学習にて学習

TensorFlowの公式解説(How to Retrain an Image Classifier for New Categories)を参考にしました。特に詰まるところもなくサクサクと進められました :ok_hand:
今回はAndroidアプリで学習結果を使用するため、Android用に変換します。詳しくはこちら3. Optimize the modelに詳しく書かれています。

3. カメラ画像と学習結果を照らし合わせる

こちらに関してはTensorFlowのAndroidサンプルに含まれているTF Classifyパクって参考にして作成しました。

3-1. 作成した学習結果へ置き換え

サンプルアプリのassetsフォルダに2. 転移学習にて学習にて作成した学習結果を配置します。また、コードから学習結果を呼び出している箇所があるため、指定するパスを修正します。

ClassifierActivity.java
  private static final String MODEL_FILE = "file:///android_asset/tensorflow_inception_graph.pb"; // ここを作成した学習結果へのパスに置き換え
  private static final String LABEL_FILE =
      "file:///android_asset/imagenet_comp_graph_label_strings.txt"; // ここを作成したラベルデータへのパスに置き換え

3-2. ポケモンずかんの画像を表示

camera_connection_fragment.xmlを修正して、ポケモンずかんの画面を作成します。ポケモンずかんのメイン画面にカメラ画像とポケモンの説明、サブ画面に類似度を表示するようにレイアウトを調整しました。
layout

余談ですが、私はペイントソフトが苦手なので、ポケモンずかんの画像はKeynoteで作成しました。
keynote.png

4. 類似度の高いポケモンの説明を表示する

収集した画像については特にトリミング等の画像編集はしなかったこともあり、学習結果にばらつきが出てしまいました。そのため、ポケモンごとに類似度のしきい値を調整しました。しきい値を超えた場合に、ポケモンずかんに説明と類似度を表示しています。

まとめ

機械学習の分野は本当に初心者なのですが、簡単に作成することができました。
数年前までは、機械学習はかなり敷居が高いものでしたが…。まさに「かがくのちからってすげー」ですね!! アイデア次第で、面白いものが沢山作れそうです :smiley:

学習結果のみですが、Gitに配置しました。プロジェクトも時間でき次第プッシュしますね。


『 機械学習 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。