
まくまく
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 使い方まとめ