OpenCVのカスケードファイルを利用して顔や目、口などを検出する方法を紹介します。
コードはPythonで書いています。
Contents
OpenCV(Haar Cascades)の使い方
OpenCVのインストール
Pythonのオープンソースの画像処理ライブラリOpenCV(Open Source Computer Vision Library)を利用して顔や目、口などのパーツを検出します。
まずはOpenCVをインストールします。
pip install opencv-python
通常の顔検出のサンプル
import matplotlib.pyplot as plt
#OpenCVを利用する(cv2をインポート) import cv2
#カスケードファイルの読み込み cascade_file = "./haarsample/haarcascade_frontalface_alt2.xml"
#カスケードファイルを利用した検出器を定義 cascade = cv2.CascadeClassifier(cascade_file)
#画像ファイルを読み込み image_file = cv2.imread("IMG_7674.jpg")
#GrayScaleに変換 img_gray = cv2.cvtColor(image_file, cv2.COLOR_BGR2GRAY)
#detectMultiScaleで検出 face_list = cascade.detectMultiScale(img_gray, minSize=(100,100))
#検出できた顔の数 print(len(face_list))
#顔部分に枠を作成 for (x,y,w,h) in face_list: point_from = (x, y) point_to = (x + w, y + h) color = (255,0,0) cv2.rectangle(image_file,point_from,point_to,color,thickness=5)
plt.imshow(cv2.cvtColor(image_file, cv2.COLOR_BGR2RGB)) plt.show()
カスケードファイルのダウンロード
Opencvではカスケードファイルを利用して顔や目、口を検出できます。 顔、目などのパーツごとにカスケードファイルが用意されています。
カスケードファイルはOpenCVのGithubからダウンロードできます。
OpenCVのカスケードファイル
https://github.com/opencv/opencv/tree/master/data/haarcascades
リポジトリのトップページから写真右下の緑色のボタン「clone or download」をクリックしてzipファイル形式でソースコードをダウンロードできます。
zipファイルを解凍して、Pythonのソースコードのプロジェクトフォルダに格納しておきます。
gitをインストール済みであれば以下のコマンドでOpenCVのモジュールを取得することもできます。
git clone https://github.com/opencv/opencv.git
目や鼻(顔のパーツ)を検出したいときに使うカスケードファイル
目を検出したい場合は「haarcascade_eye.xml」を利用するとできます。
鼻や口はGithubのopencv_contribのリポジトリにある拡張版のカスケードファイルを使うことで検出可能です。(使い方は同じです)
opencv_contribのカスケードファイル(OpenCVの拡張版)
https://github.com/opencv/opencv_contrib/tree/1311b057475664b6af118fd1a405888bad4fd839/modules/face/data/cascades
- 口のカスケードファイル:haarcascade_mcs_mouth.xml
- 鼻のカスケードファイル:haarcascade_mcs_nose.xml
OpenCV(Haar Cascades)で検出できない場合の対処法
顔検出できない場合の対処
画像によっては上手く顔検出できない場合がありますが、その場合はインストールできるカスケードファイルを変更すると上手くいきます。
インストールできる顔検出のカスケードファイルは複数あります。
- haarcascade_frontalface_alt.xml
- haarcascade_frontalface_alt_tree.xml
- haarcascade_frontalface_alt2.xml
- haarcascade_frontalface_default.xml
私は集めた画像で「_alt.xml」だと上手くいかない画像があったので、「_alt2.xml」に変更しました。
自分の集めた画像に合うものを試してみてください。
顔のパーツ(目、鼻、口)で複数検出されてしまう際の対処
写真のように複数検出されてしまう場合があります。
その場合、detectMultiScaleのminSizeに与えるサイズを大きくすることで上手くいきました。
上記サンプルのminSize=(100,100)の箇所です。
face_list = cascade.detectMultiScale(img_gray, minSize=(100,100))
顔のパーツで100×100だと大きすぎるので、50×50あたりから少しずつ増やす調整をしていくことで1つだけ検知することができます。
以下は5×5から5ずつ増やして調整するコードです。
for i in range(1,20): minValue = i * 5 face_list = cascade.detectMultiScale(img_gray, minSize=(minValue,minValue)) # 1になったら検出完了(顔、鼻、口の場合。目の場合は == 2に修正) if len(face_list) == 1: break
また、顔検出を実施して、その後顔の座標の中という判定を加えることでより正確性を上げることもできます。
OpenCVを使って顔や目、口などを検出する方法まとめ
OpenCVを使って顔や目、口などを検出する方法として、カスケードファイルを使用する方法を紹介しました。
少し難しい分野ですが、試してみてくださいね。
AI、機械学習は習得難易度が高いのでオンライン学習も有効。
機械学習にはPCのスペックが必要です。コスパ重視なら中古PCも活用できます。