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

検出 Python3で機械学習

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

OpenCVを使うと画像を利用した機械学習の前処理を行えるようになります。

機械学習は最初のハードルが高いので、慣れていない方にもわかりやすいように基本的な使い方とハマりやすいポイントをまとめてみました。

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

スポンサーリンク

OpenCV(Haar Cascades)の使い方

Pythonのオープンソースの画像処理ライブラリOpenCV(Open Source Computer Vision Library)を利用して顔や目、口などのパーツを検出します。

OpenCVのインストール

まずは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の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

OpenCV(Haar Cascades)で目や口を検出したいときに使うカスケードファイル

目を検出したい場合は「haarcascade_eye.xml」を利用するとできます。
鼻や口はGithubのopencv_contribのリポジトリにある拡張版のカスケードファイルを使うことで検出可能です。(使い方は同じです)

opencv_contribのカスケードファイル(OpenCVの拡張版)
https://github.com/opencv/opencv_contrib/tree/master/modules/face/data/cascades

口のカスケードファイル:haarcascade_mcs_mouth.xml
鼻のカスケードファイル:haarcascade_mcs_nose.xml

顔検出できない場合の対処

画像によっては上手く顔検出できない場合がありますが、その場合はインストールできるカスケードファイルを変更すると上手くいきます。

インストールできる顔検出のカスケードファイルは複数あります。

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))
  if len(face_list) == 1:
    break

目の場合は4行目のface_listの個数を2にする必要があります。

また、顔検出を実施して、その後顔の座標の中という判定を加えることでより正確性を上げることもできます。

機械学習の勉強にオススメの本

機械学習は初学者のハードルが高い分野です。

機械学習の知識に加えてPythonや数学、統計学が前提となっていることも多く、アプリケーションを作りながらも各分野の基礎力を上げていくことをオススメします。

入門向けにオススメの本を紹介します。

機械学習でアプリケーションを作ってみる

すぐに使える! 業務で実践できる! Pythonによる AI・機械学習・深層学習アプリのつくり方では機会学習の実践例を交えて学べるので入門者でも実際の機械学習の完成系をイメージしやすくおすすめです。

scikit-learnの機械学習

Pythonでscikit-learnの機械学習を始めるならこちらがおすすめです。少し難しいですが、入門書として人気の本です。

Pythonの知識

機械学習はPythonが前提になっているためPythonを多少覚えておくと勉強がスムーズになります。(変なとこで止まらなくなる)

Paizaのゲームもおすすめです。
Python3にPaizaのゲームで入門(エンジニアが死滅シタ世界) – Node.jsで暗号資産アービトラージ

数学の知識

機械学習は数学の知識もあると理解が深まります。機械学習の数学の入門書として理解しやすい本です。

まとめ

OpenCVを使って顔や目、口などを検出する方法を紹介しました。

また、機械学習に入門する際の参考資料も紹介しています。

少し難しい分野ですが、試してみてください。

Python3にPaizaのゲームで入門(エンジニアが死滅シタ世界)
はじめにプライベートで機械学習をPython3でやることになったので、Python3を入門することにしました。今回は「エンジニアが死滅シタ世界 〜アンドロイドとふたりぼっちで生きろ〜 - Paiza」で習得することにしました。エンジ...

コメント

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