ハラショー!!今日ハ肉ノ日デスネ!!
というわけで、以下の記事等を参考にWEBカメラの映像をPythonとOpenCVで顔認識して遊んでみました。
- Python+OpenCVでWebカメラの画像を取り込んで処理して表示する話 – EnsekiTT Blog
- Python, OpenCVで顔検出と瞳検出(顔認識、瞳認識) | note.nkmk.me
- Python, OpenCVで画像にモザイク処理(全面、一部、顔など) | note.nkmk.me
- 物体検出(detectMultiScale)をパラメータを変えて試してみる(scaleFactor編) | Workpiles
これらを試したいきさつは最後に書くとして、とりあえず何を作ったのかを書いていきます。
何を作ったのか
- WEBカメラの映像から顔と目を検出して目にはモザイクをかけるやつ
- 目をつぶったら
close your eyes
と表示する
- 目をつぶったら
- 目をつぶったら画面キャプチャを終了するやつ
- 目が開いている時間をカウントダウン表示
- ちょっとしたゲーム感覚
を作りました。
環境
Mac, Windows ともに下記環境で試しました。
Python
- 3系です
$ python -V Python 3.6.6
OpenCV(OpenCVPython)
PythonからOpenCVを使うにはOpenCVPython
なるものが必要なようなのでインストールします。
$ pip install opencv-python
確認
$ pip freeze | grep opencv opencv-python==3.4.2.17
カスケード型分類器
顔認識させるにはカスケード型分類器なるものが必要なようなので
GitHub – opencv/opencv: Open Source Computer Vision Library
をcloneするなり落としてきて、 https://github.com/opencv/opencv/tree/master/data/haarcascades の各種.xmlを用意しておきます。
後述するサンプルでは、
- haarcascades/haarcascade_frontalface_alt2.xml
- haarcascades/haarcascade_eye_tree_eyeglasses.xml
を利用しました。
(カスケードっていうバンド昔いたよね)
WEBカメラの映像から顔と目を検出して目にはモザイクをかけるやつ
こんな感じです
検出した顔の周りに四角を描画、目の部分にモザイク処理を行っています。
少し分かりづらいかもしれませんが、目がつぶられたら画面にclose your eyes
と表示しています。
目をつぶっている状態は、顔の検出が出来ているのに目の検出が出来ていない状態
の時をそれとしました。
ソース
face_and_eye_recognition.py
目をつぶったらキャプチャを終了するやつ
こんな感じです
遊び方
- 起動したら、画面
frame
にフォーカスを合わせておきます - 顔をカメラに向け目を
クワッ
と開けます s
を押します- 顔認識中かつまだスタートしていない場合、少しカクつく(キー入力を待っている)のでキー入力待ちが分かるかと思います
- 目が開いている状態の場合、1秒ずつカウントダウン表示します
- 目が閉じられたら画面キャプチャを終了します
- 目が閉じられたとみなされたタイミングが最後の画面キャプチャとなります
esc
を押して終了です
ソース
blink_game.py
実行方法
こういうディレクトリ構成だとします。
sample/ haarcascades/ haarcascade_frontalface_alt2.xml haarcascade_eye_tree_eyeglasses.xml face_and_eye_recognition.py blink_game.py
- WEBカメラの映像から顔と目を検出して目にはモザイクをかけるやつ
$ python face_and_eye_recognition.py
- 目をつぶったらキャプチャを終了するやつ
$ python blink_game.py
注意点
正直、OpenCVをはじめてさわったのでなんとも言えないですが処理性能はマシンのスペックに依存しそうです。
※ 処理の最適化をしていないとかそういうのは抜きで
あっちのPCではサクサク認識していたのに、こっちのPCだとなんかちょっとモッサリ。みたいな。
特に今回のサンプルでは、目をつぶったのに判定してくれないとか目の開閉判定がマシンのスペックによってチマチマでした。
ですので、サンプルを試して目の開閉判定にストレスがある場合、目の検出に用いているdetectMultiScale()
のscaleFactor
の値を少し大きくしたりするとまぁまぁいい感じになったりします。
※ これでもだめならminSize
も少し大きくしてみたり、顔の位置を変えてみたり(近づく/離れる)、場所を変えてみたり(背景が白いとことか)とかしてみてください
# 顔の部分から目の検出 eyes = eye_cascade.detectMultiScale( face_gray, scaleFactor=1.31, # 1.1から1.31に変更 minNeighbors=3, minSize=(15, 15) )
特に、子供と遊ぼうとなった時に上記には注意が必要です。
(自分がそうだった!!)
追記
上記問題を少し改善したバージョンを書いてみました。
PythonとOpenCVを使ったまばたき検知ゲームの(プチ)改善 – Shimabox Blog
いきさつ
ここ最近、画像認識・画像解析とはどんな感じなのだろうかという名目のもと、Amazon Rekognitionを使って遊んでいます(一応業務)。
Webカメで撮っている映像をcanvasに描画 → サーバーにPOST → 解析 → サーバーから解析結果を返す → 解析結果をcanvasに重ねる
みたいなところまでは簡単にできました。
が、Webカメで撮っている映像に対してほぼリアルタイムで解析(検出)結果を重ねてみたいなぁとなるとちょっとめんどくさそうです。
(定期的にPOSTするん?とか、Amazon Kinesis Video Streamsとか、AWS DeepLensとかを使うん?とかサクッと試せる感が無いし、そもそもリアルタイムが無理じゃね?みたいな)
少し途方に暮れてなんか似た感じのやつないかなぁとpython webカメ 顔認識
で調べてみると、ローカルでやる分には山程サンプルがあるじゃないですか!!みんなすごい!!
※AWS SDK for Python (Boto3)
を使っていたこともあり出来ればPythonで探していた
そもそも、画像認識・画像解析とはどんな感じなのだろうかというふわっとした目的なので、手段は問わず試してみたというのが今回のいきさつです。
少し調べてみると、jsでもリアルタイムで顔認識できるようなので近い内に試してみます。
試してみました
clmtrackr.jsやpico.jsで顔認識して遊ぶ | Shimabox Blog
おわりに
はじめてPython(OpenCVも)をさわったので正直戸惑いましたが、慣れてくるとワクワクするというかなんというか忘れていた何かを思い出したような気がしました。
今回のサンプルは最初にあげた記事を参考(ほぼ丸パクリ)にして書いただけなので自身でイケてるものを作れるように勉強していきたいです。と意識高い系の言葉で締めます。
Python楽しい!!