2回目?の自作アプリケーションを作成しました。
Contents
何が出来るの?
Webカメラに映った顔を自動で検出し、目標の矩形の中に指定された表情で中に顔を入れれば正解となります。
といっても堅苦しいのでここで画像を見せます。

見てもらえるとわかりやすいと思います。説明に書いてあるとおりで、青い枠が自分の顔で黄色い枠か緑の枠が目標の矩形となっています。
黄色い枠 → 笑顔
緑の枠 → 怒った顔
になっています。
とりあえず実行してみて
ここにGitHubのリンクを貼っておきました。README通りにやれば実行するはずです。
何かあったら(何でも)issueか僕のTwitterに連絡してください。プルリクも待ってます!
技術的背景(ここがメイン)
EmoPy
これがメインかもしれません。
https://github.com/thoughtworksarts/EmoPy
EmoPyのリンクは上に貼りました。簡単にまとめると「顔の画像から表情を予測する」機械学習ライブラリです。
ここには学習済みモデルがあるので、それを実行するだけで予測ができます。このアプリでも学習済みモデルを走らせるだけです。
ここで問題!
かなしい😢 事件が発生。



README通りに実行すると少し不可解なところが……
predict関数を実行しただけで予測結果が表示されている……しかもmodel.predictは変数に代入していないからもしかして返り値が無い!?!?!?
ライブラリの中身を見てみましょう。(EmoPy/model/fermodel.py)



ここはpredict関数があるんですけど……returnが無い……
絶望しました。



悲しかったのでライブラリを改良しました。
予測ラベルとラベルの確率?(softmaxのアレ)が返ってくるようになっています。
OpenCV
顔認識
こちらも学習済みモデルを走らせるだけです。
というかモデルと呼ぶのが正しいかわかりません。デジカメに搭載されているような顔認識技術です。ディープラーニング要素一切ないです。
詳しくは調べてもらえると嬉しいです。
1 2 3 4 5 6 7 | import cv2 path = "path" cascade = cv2.CascadeClassifier(path) face_list = cascade.detectMultiScale(img, minSize=(100, 100)) |
たったこれだけのコードで出来ます。
window
今回、GUI化させたんですけど何のGUIライブラリを使うかはとても悩みました。
最終的にはWebカメラを使うということでcv2に搭載されているwindowを使うことにしました。(初めて)
1 2 3 4 5 6 7 8 9 10 | import cv2 # 定義 cv2.namewindow(WINDOW_NAME) # 矩形の描画 cv2.rectangle(image_display, (x, y), (w, h), color, thickness=3) # テキスト追加 cv2.putText(image_display, "aaaa") |
何だかんだcv2は矩形を作ったりテキストを追加するのが簡単でした。(テキストを日本語化すると文字化けしてしまうのが難点だったが)
Argparse
コード公開後、issueで教えてくださったものなんですがこれはコマンドライン引数を使うためのライブラリだそうです。
1 2 3 4 5 6 7 8 9 | import argparse parser = argparse.ArgumentParser() parser.add_argument("-g", "--gpu", action="store_true", help="TF gpu版を使用しているかどうか") args = parser.parse_args() if args.gpu: """gpuを使用する場合はgpuの指定をしなければならないので""" from core.face_emotions import use_gpu use_gpu() |
実際に使ったのが、TF gpu版とcpu版での動作を変える(gpu sessionの定義をするかしないか)という処理です。
前まではクラスの引数を変えるだけだったんですけど、いちいちコードの中身を変えるのは面倒だろうと教えてくれました。
python main.py –gpu
又は
python main.py -g
をコマンドライン上で実行することによってgpuで動作するということを確認しています。(Torchみたいに機械学習ライブラリで一発で確認できる関数があれば便利だけどTFはわからなかった)
開発してみて
大変だったけど楽しかった っていうのが簡単な感想です。
実際にデバッグは非常に大変でした。単純なミスで数時間もデバッグに時間を費やしてしまったけれども、ようやく動いた時の嬉しさは半端じゃないです。
アプリケーションとして動いたときには今までの努力が報われたような気がして最高でした。
ドキュメント書いてみたいけど、こんなアプリケーションでは書ける量も少ないだろう……
気が向いたら次はライブラリ開発をしてみたいです。(ドキュメントはsphinxで)
これから
このアプリケーションは文化祭で展示する予定なのでそれまで細かいバグを修正しようと考えています。(ほとんどやることがないけど)
Webアプリケーションとしても動作するようにしてみたいと考えています。
とはいえ、フロントエンドの技術は皆無なのでいつかちゃんと書けるようになるまで勉強しようと思います。
お読みいただきありがとうございました。