Node.jsで暗号資産アービトラージ

ビットコイントレード中心にNode.jsで実際に作るためのレシピ

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

※この記事は2019/6/24に更新されました。

OpenCVの使い方についてまとめた記事です。

すぐに使える! 業務で実践できる! Pythonによる AI・機械学習・深層学習アプリのつくり方を使って機械学習を勉強しています。

第3章ではOpenCVを使って顔検出をしている箇所がありますが、顔以外にも目や口などに使えたらいいなーと思って調べました。

前提としてMacでAnacondaを使用しています。

OpenCV(Haar Cascades)の使い方

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

OpenCVのインストール

Anacondaに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からファイルを取得する

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

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

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

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

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

すぐに使える! 業務で実践できる! Pythonによる AI・機械学習・深層学習アプリのつくり方

すぐに使える! 業務で実践できる! Pythonによる AI・機械学習・深層学習アプリのつくり方