Python OpenCV 画像から顔検出を行う方法

まくまく
まくまく
OpenCVを用いて、顔検出をしてみようと思います。

カスケードファイルは以下よりダウンロードする必要があります。
https://github.com/opencv/opencv/tree/master/data/haarcascades

カスケードファイルにより検出の精度が変わるので、色々と試してみるのがいいと思います。今回試してみたのは以下の3つです。

・ haarcascade_frontalface_default
・ haarcascade_frontalface_alt
・ haarcascade_frontalface_alt2

プログラム

import cv2

#画像読み込み、グレースケールに変換
img = cv2.imread("test.jpg")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# カスケードファイル読み込み
cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
#顔検出
faces = cascade.detectMultiScale(img_gray)
#検出した座標に矩形を描く
for x, y, w, h in faces:
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
#検出できた顔の数
print(len(faces))
#検出した座標
print(faces)
#書き出し
cv2.imwrite("face1.jpg", img)

元画像


25人が写っている写真を使用します。



出力

haarcascade_frontalface_default

「haarcascade_frontalface_default」を使用した場合、検出した数は49でした。


誤検出が多すぎです。足下にも顔があると認識してしまっています。

haarcascade_frontalface_alt

「haarcascade_frontalface_alt」を使用した場合、検出した数は30でした。


何名かはネクタイのところも顔だと検出されています。

haarcascade_frontalface_alt2

「haarcascade_frontalface_alt2」を使用した場合、検出した数は27でした。


惜しいところまできましたね。右後ろの二人に誤検出が見られました。

まとめ

今回の結果では、alt2が良さそうに感じました。他の写真を使っても同様の傾向ですし、ネットで調べてもalt2の方が検出精度が高いような気がします。あとは「minNeighbors」や「miniSize」などのパラメーターを調整するとさらに検出精度を上げられると思います。

Python OpenCVを用いた画像処理についてはこちらの記事でまとめています。>>>Python OpenCV 使い方まとめ

タイトルとURLをコピーしました