ポケモントレーナーのためにポケモン図鑑を作る②
二弾、ポケモン図鑑を作っていきます!
前回
ポケモン図鑑の音声を作る
アニメ版では、ポケモン図鑑はポケモンに向けると、その端末自体が自動で喋ってそのポケモンの情報を教えてくれます。なので、ポケモンの判別が終わったら音声でデータをユーザーに伝えられるようにします。
使用ソフト
- cevio体験版
音データ
初代のポケモンのゲームの図鑑の内容をしゃべらせたいと思います。
ポケモン | 台詞 |
---|---|
ヒトカゲ | トカゲポケモン 生まれたときから、尻尾に炎が灯っている。炎が消えたとき、その命は終わってしまう。 |
フシギダネ | 種ポケモン 生まれた時から背中に植物の種があって、少しずつ大きく育つ。 |
ゼニガメ | 亀の子ポケモン 長い首を甲羅の中に引っ込めるとき、勢いよく水鉄砲を発射する。 |
ピカチュウ | ねずみポケモン ほっぺたの両側に小さい電気袋を持つ。ピンチの時には放電する。 |
cevioを用いて、今回判別するポケモン(御三家+ピカチュウ)の図鑑データを音声ファイルにします。
cevio初めて使いましたけど本当にすごいわ。かなり滑らかに発音しますね。
図鑑プログラム
①で作った学習ファイルをKerasに読み込ませて判別します。判別できたら、cevioで作った音声ファイルをpyaudioを用いて再生します。
import keras from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten from keras.layers import Conv2D, MaxPooling2D from keras import backend as K import numpy as np import glob import cv2 import random import math import time import pyaudio import wave import threading import time import datetime import sys args = sys.argv batch_size = 1 num_classes = 2 epochs = 1 img_rows, img_cols = 224, 224 path = args[1] x_train = [] y_train = [] x_test = [] y_test = [] def sound(path): wf = wave.open(path, "r") p = pyaudio.PyAudio() stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True) chunk = 1024 data = wf.readframes(chunk) while data != b"": stream.write(data) data = wf.readframes(chunk) stream.close() p.terminate() def makeData(path): img_src = cv2.imread(path) w,h,c = img_src.shape if w < h: img_src = img_src[:,(h-w)//2:(h+w)//2,:] elif w > h: img_src = img_src[(w-h)//2:(w+h)//2,:,:] dst = img_src[:,:,0] dst = cv2.resize(dst,(img_rows, img_cols)) dst2 = img_src[:,:,1] dst2 = cv2.resize(dst3,(img_rows, img_cols)) dst3 = img_src[:,:,2] dst3 = cv2.resize(dst4,(img_rows, img_cols)) x_train.append([ dst.tolist(), dst2.tolist(), dst3.tolist()] ) makeData(path) x_train = np.array(x_train) if K.image_data_format() == 'channels_first': x_train = x_train.reshape(x_train.shape[0], 3, img_rows, img_cols) input_shape = (3, img_rows, img_cols) else: x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 3) input_shape = (img_rows, img_cols, 3) x_train = x_train.astype('float32') x_train /= 255 print('x_train shape:', x_train.shape) print(x_train.shape[0], 'train samples') from keras.models import model_from_json model = model_from_json(open('cnn.json').read()) model.load_weights('cnn.h5') data = model.predict_classes( x_train , batch_size=1, verbose=0) if data[0] == 0: #ヒトカゲ print("ヒトカゲ") print("とかげポケモン") print("たかさ 0.6m") print("おもさ 8.5kg") print("うまれたときから しっぽに ほのおが") print("ともっている。ほのおが きえたとき") print("その いのちは おわって しまう。") sound("data/hitokage.wav") elif data[0] == 1: #フシギダネ print("フシギダネ") print("たねポケモン") print("たかさ 0.7m") print("おもさ 6.9kg") print("うまれたときから せなかに") print("しょくぶつの タネが あって") print("すこしずつ おおきく そだつ。") sound("data/hushigi.wav") elif data[0] == 2: #ピカチュウ print("ピカチュウ") print("ねずみポケモン") print("たかさ 0.4m") print("おもさ 6.0kg") print("ほっぺたの りょうがわに") print("ちいさい でんきぶくろを もつ。") print("ぴんちのときに ほうでんする") sound("data/pikatyu.wav") elif data[0] == 3: #ゼニガメ print("ゼニガメ") print("かめのこポケモン") print("たかさ 0.5m") print("おもさ 9.0kg") print("ながい くびを こうらのなかに") print("ひっこめるとき いきおいよく") print("みずでっぽうを はっしゃする。") sound("data/zenigame.wav")
図鑑実行
ピカチュウをイラストソフトで描いてみましたw
なんだか生気の薄いピカチュウになってしまいました。このピカチュウを判別にかけたいと思います。
実行結果
きちんと「ピカチュウ」と識別されました。動画が無いとわからないとおもいますが、図鑑の説明の音声も再生されました。
C:\Users\aaaaa\Documents\pokemon>python zukan.py C:\Users\aaaaa\Pictures\pikatyu.jpg Using TensorFlow backend. x_train shape: (1, 224, 224, 3) 1 train samples ピカチュウ ねずみポケモン たかさ 0.4m おもさ 6.0kg ほっぺたの りょうがわに ちいさい でんきぶくろを もつ。 ぴんちのときに ほうでんする
しかし、、
イラストはピカチュウでも、背景がオレンジ色(ヒトカゲの色)だとヒトカゲに認識。
ほかの色(青:ゼニガメ、緑:フシギダネ)の場合では、背景色に惑わされること無くピカチュウに判別してくれたのですが、オレンジ色だとうまく判別してくれませんでした。色の要素でもポケモンの種類を決めているような感じがする。
実行結果
C:\Users\aaaaa\Documents\pokemon>python zukan.py C:\Users\aaaaa\Pictures\b_pikatyu.jpg Using TensorFlow backend. x_train shape: (1, 224, 224, 3) 1 train samples ヒトカゲ とかげポケモン たかさ 0.6m おもさ 8.5kg うまれたときから しっぽに ほのうが ともっている。ほのうが きえたとき その いのちは おわって しまう。
実行動画
こんな感じに動作しました。PCのスペックが貧弱なのでtensorflowの読み込みがとにかく遅いです。
新米ポケモントレーナーのためにポケモン図鑑を作ってみましたhttps://t.co/emXaom962y#作ってみた#ポケモン#ピカチュウ #機械学習 pic.twitter.com/ucbL7ex0kG
— 日向亀 (@hinata_game3) 2017年10月29日
おわりに
今回もコードの解説が無くてすいません。これで一応、ポケモン図鑑の情報を伝えられるようになりました。
Deeplearning初心者なので、アドバイスをいただければ幸いです!