※このページではアフィリエイト広告を利用しています

【機械学習入門】OpenCVを用いた顔認識プログラム

Python

ここではOpenCVを用いた顔認識をするためのプログラムについて解説しています。

スポンサーリンク
スポンサーリンク

行ったこと

以下の写真で顔を認識して赤枠を付けることを行いました。

プログラム

import cv2
import sys
from matplotlib import pyplot as plt
plt.axis('off')
#1---ファイル指定
image_file = "women.jpg"
#2---カスケードファイルの指定
cascade = "haarcascade_frontalface_alt.xml"
#3---画像の読込
image = cv2.imread(image_file)
#4---グレースケールに変換
image_gs = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#5---カスケードファイルの読込
cascade = cv2.CascadeClassifier(cascade)
#6---顔認識
face = cascade.detectMultiScale(image_gs,
    scaleFactor=1.1,minNeighbors=1,minSize=(150,150))
#7---認識した場合
if len(face) > 0:
#8---認識した部分を赤で囲む
    color = (0, 0, 255)
    for f in face:
        x,y,w,h = face
        cv2.rectangle(image, (x,y), (x+w, y+h), color, thickness=8)
#9---出力
    cv2.imwrite("cap_women.jpg", image)
#10---認識できなかった場合
else:
    print("nothing")

上記がプログラムになります。

それでは解説していきます。

#1---ファイル指定
image_file = "women.jpg"

1の部分では、ファイル名を指定しています。

#2---カスケードファイルの指定
cascade = "haarcascade_frontalface_alt.xml"

2の部分ではカスケードファイルを指定しています。カスケードファイルは特徴量をすでに学習済みデータの分類器のことです。

カスケードファイルを入手する方法はこちらからダウンロードして下さい。ファイル名は「haarcascade_frontalface_alt.xml」になります。

#3---画像の読込
image = cv2.imread(image_file)

3の部分では、画像を読み込んでいます。opencvで読み込む場合はcv2.imread(ファイル名)と記述します。

#4---グレースケールに変換
image_gs = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

4の部分では読み込んだ画像をグレースケールに変換しています。

#5---カスケードファイルの読込
cascade = cv2.CascadeClassifier(cascade)

5の部分ではカスケードファイルを読み込んでいます。次の6の部分で特徴量を元に顔認識を行う前準備になります。

#6---顔認識
face = cascade.detectMultiScale(image_gs,
    scaleFactor=1.1,minNeighbors=1,minSize=(150,150))

6の部分では顔認識を行っています。detectMultiScale()メソッドを用いて、引数にminiSizeを指定して150×150ピクセル以下の範囲を無視するようにしています。上手く認識されないときは、ここの数値を変更すると上手く認識される場合があります。

#7---認識した場合
if len(face) > 0:
#8---認識した部分を赤で囲む
    color = (0, 0, 255)
    for f in face:
        x,y,w,h = face
        cv2.rectangle(image, (x,y), (x+w, y+h), color, thickness=8)

7の部分では認識した場合の条件を示しています。1個でもあったら8の部分で赤枠を用いて認識した範囲を矩形で描画します。

#9---出力
    cv2.imwrite("cap_women.jpg", image)

9の部分では結果を出力しています。

#10---認識できなかった場合
else:
    print("nothing")

10の部分では認識できなかった場合の合図を出力しています。

結果

上記が結果になります。ちなみに顔と認識した範囲の数値は「[2393 884 1035 1035]」となりました。

モザイク処理など、色々と応用できそうなことが分かります。

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