python + OpenCVで30行で顔認識
今更ながらpython + OpenCVで顔認識(正確には顔検出)をやってみたのでメモです。以下のように30行もあれば顔検出ができてしまいます。汎用性とか気にしなければ20行でもいけそうですね。
# -*- coding: utf-8 -*- import cv2 import sys cascade_path = "./haarcascade_frontalface_alt.xml" color = (255, 255, 255) # color of rectangle for face detection def face_detect(file): image = cv2.imread(file) image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) cascade = cv2.CascadeClassifier(cascade_path) facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1)) print "face rectangle" print facerect if len(facerect) > 0: for rect in facerect: cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2) return image if __name__ == '__main__': param = sys.argv if (len(param) != 2): print ("Usage: $ python " + param[0] + " sample.jpg") quit() output_img = face_detect(param[1]) cv2.imwrite('facedetect_' + param[1], output_img)
pythonの設定は以下参照下さい。
haarcascade_frontalface_alt.xml
というファイルが必要なので注意。OpenCVをインストールすれば自動的に一緒に入ってくるはずなので、以下のコマンドで探して、ファイルと同じ場所にコピーして下さい。
$ sudo find / -name haarcascade_frontalface_alt.xml
顔認識に必要な画像は、以下の標準画像とかから探すとよいかもしれません。 標準画像
有名なLennaさんLenna.jpg
を使用してみましょう。以下コマンドで顔認識できます。
$ python face_detect.py Lenna.jpg
実行結果は以下のとおり
それでは、恒例のロンスタさん(id:lonestartx)提供のフリー素材でも試してみましょう。
よい感じですね。
顔認識の仕組み
参考リンク等によると、OpenCVの顔認識はHarrlike + Adaboostらしいです。一般的に物体認識する際は、特徴量を抽出して、学習器で判定するという流れになるのですが、Harrlikeが特徴量抽出の仕組みで、Adaboostが学習器ですね。仕組みは、以下の中部大学の資料が分かりやすいと思いました。
ちなみに、今回のように顔の位置を特定するのは専門的には、顔認識ではなくて顔検出が正しいらしいです。顔から誰かを判定する場合が顔認識とのこと。へぇー。
今回のファイル以下のGitHubのリポジトリにもアップロードしました。
PCにカメラがあればface_detection_camera.py
を使って、以下コマンド実行すればリアルタイムで顔検出を楽しむことが可能です。
$ python face_detection_camera.py
参考リンク
python+OpenCVで顔認識をやってみる - Qiita
http://www.eml.ele.cst.nihon-u.ac.jp/~momma/wiki/wiki.cgi/OpenCV.html