最近、アニメを見まくっているIoT開発部の西村です。
こんにちは。
感動シーンでナミダしている僕の横で、犬がうるせーなって顔してるのがたまらないです。
どうぞよろしくお願い致します。
課題・モチベーション
- 去年買ったオライリー本「ゼロから作るDeep Learning」が、半分も読めずに積読状態
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (18件) を見る
- 昨年作った「誰か来たかもよ君」をそろそろバージョンアップしなくては
ということで
人の顔を機械学習で覚えさせ、メンバーが来たかもよ君にバージョンアップだ!
Spookiesメンバーの顔画像認識パターンモデルを作ってみる
顔画像の収集
毎日顔を合わせて一緒に仕事してますが、いざメンバーの顔写真が必要となっても、あまり持っていないもんです。 携帯で何枚か撮ったかもしれませんが、そんなに数は無いですよね。
合宿等の写真を拾い集める
会社の共有フォルダーに、合宿の写真が入ってました。
- 沖縄合宿
- 和歌山合宿
- 淡路島合宿
こちらを使いましょう。
DLしてフォルダを開くと、こんな写真がいっぱいあります。
顔画像のみ抽出
さて、ここから顔画像を取得しましょう。
一つのフォルダの中に全ての画像をぶち込んで、OpenCVを使って画像を切り出しましょう。
OpenCVには、画像から顔を抽出するCascade Classifier=分類器と呼ばれるものが公開されてるので、それを使って顔だけを切り出します。
さらにデータが少ないので、反転・コントラスト調整を行い、画像の水増しを行います。
寺師君の結果
ではこれらのデータを使って、モデルを作ります。
モデルの作成
機械学習ライブラリといえば、TensorFlow
但し、素人にはなかなか扱いづらい為、日本語ドキュメントが完備されているラッパーライブラリの Keras を使いました。
from keras.models import Sequential from keras.layers import Dense, Activation # 画像データ読込(txtファイルは画像パスとラベルを設定した一覧) (X_train, y_train)= train_input.read_data('./face_detect/train.txt') # X_train: 学習データ, y_train: 学習ラベル (X_test, y_test)= train_input.read_data('./face_detect/test.txt') # X_test: テストデータ, y_test: テストラベル ### モデル定義 ### # Sequentialはただ層を積み上げるだけの単純なモデル model = Sequential() model.add(Conv2D(32, (3, 3), padding='same', input_shape=X_train.shape[1:])) # 2次元畳み込み層 model.add(Activation('relu')) # 活性化関数(レイヤをつなぐもの) model.add(Conv2D(32, (3, 3))) model.add(BatchNormalization()) # 誤差・分類性能向上の層 model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) # レイヤ縮小を行い、扱いやすくする層 model.add(Dropout(0.25)) # 過学習の防止 model.add(Flatten()) # 入力を平滑化 model.add(Dense(512)) # 全結合(クラス分類) model.add(Activation('relu')) model.add(BatchNormalization()) model.add(Dropout(0.5)) model.add(Dense(nb_classes)) model.add(Activation('softmax')) # 活性化関数 # compile model.compile(loss='categorical_crossentropy', # 損失関数 optimizer='adam', # 最適化関数 metrics=['accuracy']) # 評価指標のリスト ### 学習させる ### model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch, validation_data=(X_test, Y_test), shuffle=True, callbacks=[csv_logger, cp_cb, stopping]) ...
これでモデル作成です。(MacBookPro で 2時間くらいかかりました)
実験
では、早速できたモデルを使って画像認識してみました。
(パジャマですみません)
oops!!!! takanoになってる!
京都オフィスでも何名か試してもらいましたが、だいたい takano になってしまいました orz
原因
今回、精度が出なかった原因としては
- 元画像の質が悪すぎる
- 学習データ量が圧倒的に少ない
ですかね。
まとめ
残念ながら現在は takano
が来たかもよ君になってしまいましたが、新しい事をするのは凄く楽しいですね。
引き続き精度を向上を図り、ラズパイにも組み込みたいと考えております。
イエェェェイ!