ポケモントレーナーのためにポケモン図鑑を作る②

f:id:hinata_game:20171029022209j:plain 二弾、ポケモン図鑑を作っていきます!

前回

hinata-game.hatenablog.com

ポケモン図鑑の音声を作る

 アニメ版では、ポケモン図鑑ポケモンに向けると、その端末自体が自動で喋ってそのポケモンの情報を教えてくれます。なので、ポケモンの判別が終わったら音声でデータをユーザーに伝えられるようにします。

使用ソフト

  • cevio体験版

音データ

 初代のポケモンのゲームの図鑑の内容をしゃべらせたいと思います。

ポケモン 台詞
ヒトカゲ トカゲポケモン 生まれたときから、尻尾に炎が灯っている。炎が消えたとき、その命は終わってしまう。
フシギダネ ポケモン 生まれた時から背中に植物の種があって、少しずつ大きく育つ。
ゼニガメ 亀の子ポケモン 長い首を甲羅の中に引っ込めるとき、勢いよく水鉄砲を発射する。
ピカチュウ ねずみポケモン ほっぺたの両側に小さい電気袋を持つ。ピンチの時には放電する。


 cevioを用いて、今回判別するポケモン(御三家+ピカチュウ)の図鑑データを音声ファイルにします。 cevio初めて使いましたけど本当にすごいわ。かなり滑らかに発音しますね。

f:id:hinata_game:20171026194918p:plain

図鑑プログラム

 ①で作った学習ファイルを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
 なんだか生気の薄いピカチュウになってしまいました。このピカチュウを判別にかけたいと思います。 f:id:hinata_game:20171029012953j:plain

実行結果

 きちんと「ピカチュウ」と識別されました。動画が無いとわからないとおもいますが、図鑑の説明の音声も再生されました。

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
ほっぺたの りょうがわに
ちいさい でんきぶくろを もつ。
ぴんちのときに ほうでんする

しかし、、

 イラストはピカチュウでも、背景がオレンジ色(ヒトカゲの色)だとヒトカゲに認識。
 ほかの色(青:ゼニガメ、緑:フシギダネ)の場合では、背景色に惑わされること無くピカチュウに判別してくれたのですが、オレンジ色だとうまく判別してくれませんでした。色の要素でもポケモンの種類を決めているような感じがする。 f:id:hinata_game:20171029014742j:plain

実行結果

 ヒトカゲと判別したため、ヒトカゲの図鑑情報が表示

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の読み込みがとにかく遅いです。

おわりに

 今回もコードの解説が無くてすいません。これで一応、ポケモン図鑑の情報を伝えられるようになりました。

 Deeplearning初心者なので、アドバイスをいただければ幸いです!