ひさふぃの日記

DjangoとPythonとLaravelが好き。大阪でフリーランスエンジニアやってます。

PythonでOpenCV|haar-like cascade分類器で顔認識

デジカメなどに搭載されている顔認識。OpenCVを用いると簡単に使用できます。

今回も先人達の知恵を借りつつ、前回導入したJupyter Notebookの試運転も兼ねて顔認識を試してみました。

Jupyter NotebookもOpenCVも本当に便利。すごい世の中ですね!

とりあえず試す

細かい部分はいいから顔認識したい方・コードの説明がなくてもわかるという方は、githubに上げていますのでご参照ください。

github.com

ただ、一点だけ注意点があります。Anacondaの仮想環境を作成するときにPythonのバージョンを3.5に指定するのを忘れないようにしましょう。

OpenCVがPython3.6に対応していないようなので、ハマるかもしれません。

環境構築

macOS Sierra==10.12.6
pyenv==1.0.8-28-gcd22737
anaconda3==4.3.0
python==3.5.3
opencv==3.1.0

先ほど言っていたようにAnacondaの仮想環境を作成する際、pythonのバージョンを3.5に指定します。

それ以外は前回の記事の通りです。

もしくはgithubのページを参照ください。

conda create -n haarcascade_env python=3.5 jupyter matplotlib

仮想環境に入りOpenCVをインストール。jupyter notebookを立ち上げます。

activate haarcascade_env
conda install -c https://conda.anaconda.org/menpo opencv3
jupyter notebook

コードの解説

OpenCVをインポートする際はcv2。ついでに、matplotlibのマジックコマンドとインポートも行なっています。

%matplotlib inline
import matplotlib.pyplot as plt
import cv2

OpenCVのメソッドを簡単に説明しておきます。

imreadは画像を読み込む。引数に画像のパスを含めた名前を記述。

cvtColorは画像を色変換する。引数はimreadで読み込んだ変数と行いたい色変換。haar-like cascade分類器を適用する際に、グレーに変換する必要があります。

rectangeleは画像に四角形を描き込む。引数は、imreadで読み込んだ変数・四角形の左上と右下の座標・線の色や太さ。

CascadeClassifierは分類器を生成。引数に分類器のパスを含めた名前を記述。

detectMultiScaleは分類器を適用して、顔の座標を返します。引数は、imreadで読み込んだ変数と分類器のステータスです。

img_name = "girls.jpg"
img = cv2.imread(img_name) 

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # グレースケール化

cascade_path = "./haarcascades/haarcascade_frontalface_alt.xml"
cascade = cv2.CascadeClassifier(cascade_path) # detectorを作成
facerect = cascade.detectMultiScale(img_gray, scaleFactor=1.1, minNeighbors=1)

img_result = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
rect_color = (0, 255, 0)
if len(facerect) > 0:
    for rect in facerect:
        x = rect[0]
        y = rect[1]
        width = rect[2]
        height = rect[3]
        cv2.rectangle(img_result, (x, y), (x + width, y + height), rect_color, thickness=2)

plt.figure(figsize=(16,10))
plt.imshow(img_result)

img_nameがgirls.jpgになっているのはキュートなガールズ画像を用いたからです。おっさんの顔認識するよりも、可愛い女の子でやった方が身が入りますよねー!

気になる方はgithubのページへ

さいごに

OpenCVが用意してくれている分類器を用いることで手軽に顔認識ができます。また、先人達のコードをかなり参考にさせてもらいました。いつも感謝!

最後までお読みいただきありがとうございました。それじゃ!

Pythonで始めるOpenCV 4プログラミング

参考にしたサイト

とりあえずWindows上のIPython Notebook + OpenCV環境構築 - Qiita

大量の画像から顔の部分のみトリミングして保存する方法 | AI coordinator