Python+OpenCVで30行で顔認識する方法

f:id:karaage:20160718230400j:plain:w640

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

 実行結果は以下のとおり f:id:karaage:20151124224426j:plain:w640

f:id:karaage:20151124224443j:plain:w640

 それでは、恒例のロンスタさん(id:lonestartx)提供のフリー素材でも試してみましょう。 f:id:karaage:20160709132426j:plain:w640

f:id:karaage:20160718230400j:plain:w640

 よい感じですね。

顔認識の仕組み

 参考リンク等によると、OpenCVの顔認識はHarrlike + Adaboostらしいです。一般的に物体認識する際は、特徴量を抽出して、学習器で判定するという流れになるのですが、Harrlikeが特徴量抽出の仕組みで、Adaboostが学習器ですね。仕組みは、以下の中部大学の資料が分かりやすいと思いました。

中部大学の資料

 ちなみに、今回のように顔の位置を特定するのは専門的には、顔認識ではなくて顔検出が正しいらしいです。顔から誰かを判定する場合が顔認識とのこと。へぇー。

 今回のファイル以下のGitHubのリポジトリにもアップロードしました。

 PCにカメラがあればface_detection_camera.pyを使って、以下コマンド実行すればリアルタイムで顔検出を楽しむことが可能です。

$ python face_detection_camera.py

参考リンク

中部大学の資料

python+OpenCVで顔認識をやってみる - Qiita

OpenCVで遊ぼう!

http://www.eml.ele.cst.nihon-u.ac.jp/~momma/wiki/wiki.cgi/OpenCV.html

Pythonで顔検出まとめ - Qiita

関連記事