ラベル Tensorflow の投稿を表示しています。 すべての投稿を表示
ラベル Tensorflow の投稿を表示しています。 すべての投稿を表示

2018/04/11

Deep Learningのハリーポッター組分け帽子をLINE Botにしてみた

先日、Deep Learningを使ってハリーポッターの組分け帽子を作りました。

作ったはいいものの、利用するには環境を構築して、試さなければいけません。。。
ですので、作ったソフト"Sorting Deep Hat"をLINE Botにしてみました!

QRコードは下記です。
LINE Botで公開しているので、誰でも利用することができるのですが、
LINE Botのプランはフリーのものを使用しているため、送信数に限度があります。
よって、そのうち利用できなくなる可能性があります。
(MAXになってLINE Botが使えなくなったら、Twitter Botにでもしようかな。)

送信された画像は送り返すために一時ファイルとして保存していますが、
プログラム終了時に消えるようになっています。

また、デバッグ等を行っている時には正常に動作しない場合もありますので、その場合はご了承ください。

LINE Botの使い方

Botに画像を送信すると、すぐに結果を文字と画像で送信してくれるというものです。
文字を送信した場合には同じ文字をオウム返しで送り直してきます。
もしも、画像内に顔が見つからない場合には、「もっと大きく写る写真を使う」よう言われます。
顔認識にはOpenCVを用いていて、模様等をご認識することがよくあるので、顔が大きく写っている画像でないと認識しないよう厳し目にパラメータを設定しています。
大まかに画像の縦1/3程度は顔になるくらい顔が大きく写っているものを送信してください。

HerokuでWebサーバーを立てて、運用していますが、その中のプログラムはGithubで公開しています。

2018/03/31

Deep Learningでハリーポッターの組分け帽子を作りました

ホグワーツには"グリフィンドール"、"レイブンクロー"、"ハッフルパフ"、"スリザリン"という4つの寮があり、映画の作品を見てみると、顔だったり雰囲気だったりになんとなく違いがあると思います。
誰しも「自分はどの寮に入るのかな??」と思ったことがありますよね!

よって、任意の画像から顔を判別し、その人が4つの寮のどれに入るのかをDeep Learningで判断するソフト"Sorting Deep Hat"を作りました!

(調べたところ、全く同じ動機から、全く同じようなソフトを作った人がいらっしゃいますし、そちらのほうがわかりやすいかもしれません。このSorting Deep Hatもこの記事の影響を大きく受けています。)
https://qiita.com/tokkuman/items/aec887ff918fc164567e

ソースはGithubに公開しています。
https://github.com/naonaorange/sorting_deep_hat

動作環境

Deep Learingライブラリとしては、"Keras"を使っています。
  • Ubuntu 16.04 64bit
  • Python 3.6 64bit
  • Jupyter 4.4
  • Tensorflow 1.5
  • Keras 2.1.5
  • OpenCV 3.4

画像集め

映画内で各寮に入っているキャラクターの顔画像を集めます。
学習画像としては各寮100枚ずつの計400枚。
評価画像としては各寮20枚ずつの計80枚を準備しました。

データ集めはDeep Learingにおいて、一番重要で一番大変な作業なので、
他でも参考できるように別記事にします。

下の記事で簡単に説明しました。
「Bing Image Search APIでネット上の画像を集める」
http://kowaimononantenai.blogspot.jp/2018/03/bing-image-search-api.html


モデル作成

CNNで実装していきます。
最終的に全結合層で出力数を4にしています。
Deep Learingについて、始めたばかりなので、パラメータ等もっとよいものがあるのかもしれません。
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Activation
from keras.layers import Conv2D, MaxPooling2D, ZeroPadding2D
from keras import optimizers
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import EarlyStopping, CSVLogger
from keras import backend as K
import matplotlib.pyplot as plt
import numpy as np 


img_width = 100
img_height = 100
train_data_dir = 'data/train'
valid_data_dir = 'data/validation'

datagen = ImageDataGenerator(rescale = 1./255)

train_generator = datagen.flow_from_directory(directory=train_data_dir,
                                              target_size=(img_width,img_height),
                                              classes=['Glyffindor','Hufflpuff','Ravenclaw','Slytherin'],
                                              batch_size=16)

validation_generator = datagen.flow_from_directory(directory=valid_data_dir,
                                                   target_size=(img_width,img_height),
                                                   classes=['Glyffindor','Hufflpuff','Ravenclaw','Slytherin'],
                                                   batch_size=16)

model =Sequential()

model.add(Conv2D(32,(3,3), input_shape=(img_width, img_height, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(32,(3,3), input_shape=(img_width, img_height, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(64,(3,3), input_shape=(img_width, img_height, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(4))
model.add(Activation('softmax'))

model.summary()

model.compile(loss='categorical_crossentropy',optimizer='rmsprop',metrics=['accuracy'])

es = EarlyStopping(monitor='val_loss', patience=2)
training = model.fit_generator(generator=train_generator,
                               steps_per_epoch=400 // 16,
                               epochs=20,
                               validation_data=validation_generator,
                               validation_steps=80//16,
                               callbacks=[es])

model.save('models/sorting_deep_hat.h5')


精度確認

作ったモデルの精度を確認していきます。
最終的には、学習画像については約85%。評価画像については約73%の精度となっています。
まずはこの程度でしょうか。
引き続き精度向上のため変更していきます。

動作確認

任意の画像からOpenCVで顔画像を切り取り、作成したモデルで寮を判別します。
その結果に応じて、顔に矩形と寮名を描画します。
from keras.models import load_model
import cv2
import matplotlib.pyplot as plt
import numpy as np

model = load_model('models/sorting_deep_hat.h5')

image = cv2.imread('data/sample/harrypotter.jpg')

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray, 1.1, 3)

for (x, y, w, h) in faces:
    face_image = image[y:y+h, x:x+w]
    face_image = cv2.resize(face_image, (100, 100))
    
    b,g,r = cv2.split(image)
    i = cv2.merge([r,g,b])
    i = cv2.resize(i,(100, 100))
    i = np.array([i / 255.])
    
    house = np.argmax(model.predict(i))
    if house == 0:
        house_name = 'Glyffindor'
        color = (0, 0, 255)
    elif house == 1:
        house_name = 'Hufflpuff'
        color = (0, 255, 255)
    elif house == 2:
        house_name = 'Ravenclaw'
        color = (255, 0, 0)
    elif house == 3:
        house_name = 'Slytherin'
        color = (0, 255, 0) 
    
    cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)
    cv2.putText(image, house_name, (x, y), cv2.FONT_HERSHEY_PLAIN, 2, color, 4)
    
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.show()

実際にハリーポッターの画像を入力してみると、こんな感じになりました。
きちんとハリーはグリフィンドールに判断されています。
マルフォイはスリザリン。

いろんな人を何枚か試しましたが、確かに間違えるときはありますが、それなりに判断しています。

いろんな人で試してみる

イチローはグリフィンドール。
確かに、勇気とか騎士道精神とかありそうですね。
トランプ大統領はレイブンクロー。
確かに、頭はいいからね!(スリザリンだと思ったのに。。。)
ジョブズはスリザリン。
ちょっと意外ですが、確かに「巧妙さ」とかはあるかなと、自伝を読んで感じました。


ガッキーはグリフィンドール。まあ、どの寮でもかわいいからOK!

参考サイト


2018/03/21

Tensorflowが"Illegal instruction (コアダンプ)"で動かない

Tensorflowをインストールして実行しようとしたところ、エラーで動かなくなってしまいました。
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
Illegal instruction (コアダンプ)
環境は下記です。
  • Tensorflow 1.6
  • Python 3.5
原因はよくわかっていませんが、一応TensorflowのVerを1.5にすることでエラーが出なくなりました。
(Ver 1.5.1では同様のエラーが出てしまいました。)
とりあえずはこれでやっていきます。
pip uninstall tensorflow tensorflow-tensorboard
pip install tensorflow==1.5