OpenCV(Haar Cascades)で目や口を検出できない際の対処法

検出
本記事の内容
OpenCVを使って顔や目、口などを検出する方法を紹介します。
OpenCVを使うと画像を利用した機械学習の前処理を行えるようになります。
機械学習は最初のハードルが高いので、慣れていない方にもわかりやすいように基本的な使い方とハマりやすいポイントをまとめました。

OpenCVで目や口を検出できないかな。
目や口のカスケードファイルを利用すれば検出できるよ。

OpenCVのカスケードファイルを利用して顔や目、口などを検出する方法を紹介します。

コードはPythonで書いています。

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ファイル形式でソースコードをダウンロードできます。

Githubからファイルを取得する

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で使われないと言う理由から2020/5/21にmasterから削除されてしまったため、過去branchからの取得します。
ダウンロードする場合は、opencv_contribのルートフォルダからディレクトリごとzipで取得できます。

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も活用できます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA