【Python】OpenCVによる顔認識:画像から顔を検出する方法
 / 
            
本記事ではPythonのOpenCVを利用した、画像から顔を認識(検出)する方法について解説していきます。
OpenCVとは画像処理や動画処理、画像解析に利用されるライブラリです。顔認識や文字認識(OCR)、物体の検出など様々な分野で利用できます。OpenCVについて詳しくは以下記事をご参照ください。

【Python】OpenCVによる画像処理について:基本的なメソッドの使い方
OpenCVを利用することで簡単に顔や目、感情の認識が可能となります。この技術は様々なアプリケーションに応用が利きます。
ぜひ本記事を参考にして、OpenCVによる顔認識の方法について理解を深めてください。
OpenCVで画像から顔を認識(検出)する流れ
OpenCVによる画像から顔認識(検出)するための流れは以下の通りです。
- 画像の読み込み
 - 画像のグレースケール化(白黒)
 - 顔認識用の学習済みモデルを読み込む
 - 読み込んだ画像から顔を検出し位置を取得する
 - 検出した顔の位置に印をつける
 
上記の各項目について、次項より詳しく解説していきます。
画像の読み込み
まずは顔の検出を行いたい画像をOpenCVで読み込みます。画像の読み込みにはimread()メソッドを使います。ここでは次図のgirls.jpgを読み込んでいきます。
  import cv2
path = "girls.jpg"
# 画像の読み込み
img = cv2.imread(path)
  画像のグレースケール化(白黒)
画像からノイズを除去して誤認識を少なくするためにグレースケール化(白黒)します。
グレースケール化するにはcvtColor()メソッドを利用します。以下のようにして読み込んだ画像をグレースケール化しましょう。
import cv2
path = "girls.jpg"
# 画像の読み込み
img = cv2.imread(path)
# 画像のグレースケール化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  顔認識用の学習済みモデルを読み込む
顔の認識(検出)に利用する学習済みモデル
OpenCVには顔認識のための学習済みのモデルがたくさん用意されています。これを利用することで簡単に顔認識を実装できます。もちろん難しいですが個人で学習済みモデルを作成して利用しても大丈夫です。
またここでは機械学習のように学習済みモデルと呼んでいますが、正確にはカスケード分類機と言います。
OpenCVをpipでインストール後、以下のフォルダに学習済みモデルが保存されます。
Pythonのインストールフォルダ\Lib\site-packages\cv2\data
    もし学習済みモデルが保存されているフォルダが見つからない場合は、エクスプローラーの検索窓で「haarcascade」で検索してみてください。
    もし見つからなければOpenCVの公式サイトからダウンロードしてください。公式サイトから学習済みモデルのダウンロード方法は以下の通りです。
- 公式サイト(https://opencv.org/releases/)へアクセスする
 - Release直下の最新のOpenCVから「Sources」をクリック
 - zipファイルがダウンロードされるので展開する
 - 展開したフォルダ内のdata<haarcascadesフォルダ内に学習済みモデルが保存されている
 
      フォルダ内には様々な学習済みモデルであるxmlファイルが用意されています。以下にその一例を記します。
- haarcascade_frontalface_default.xml:正面の顔検出で利用するモデル
 - haarcascade_eye.xml:目の検出で利用するモデル
 - haarcascade_smile.xml:笑顔の検出で利用するモデル
 
作成するアプリケーションで検出したい箇所によって学習済みモデルを使い分けてください。
学習済みモデルの読み込み:CascadeClassifier()
顔認識に利用する学習済みモデルはCascadeClassifier()メソッドを使って読み込みます。ここでは学習済みモデルとして、「haarcascade_frontalface_default.xml」を使用します。
以下のようにして、学習済みモデルを読み込んだら変数にオブジェクトを格納します。
cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
    読み込んだ画像から顔を検出し位置を取得する
画像から顔を検出するためにcv2.CascadeClassifier.detectMultiScaleメソッドを使用します。
cv2.CascadeClassifier.detectMultiScale(image (, パラメーター))
| パラメーター | 説明 | 
|---|---|
| scaleFactor | 縮小量のステップ。数値が大きくなると計算が早くなるが見落としが増える(初期値:1.1) | 
| minNeighbors | 値が大きいほど誤検知が少なくなるが見落としが増える。値が小さいと誤検知は増えるが見落としが減る(初期値:3) | 
| minSize | 検出する物体の最小サイズ | 
detectMultiScale()による返り値は(x, y, width, height)のリストです。xとyは検出した物体の左上の点の座標です。
以下ではdetectMultiScale()で検出した返り値のリストは変数listsに格納しています。
import cv2
path = "girls.jpg"
# 画像の読み込み
img = cv2.imread(path)
# 画像のグレースケール化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 学習済みモデルの読み込み
cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
# 顔を検出する
lists = cascade.detectMultiScale(img_gray, minSize=(100, 100))
  検出した顔の位置に目印の枠をつける
最後に検出した顔の位置情報から、画像にある顔に目印の枠をつけていきます。
以下ではrectangle()メソッドを使って、赤い長方形で検出した顔を囲むようにしています。
import cv2
path = "girls.jpg"
# 画像の読み込み
img = cv2.imread(path)
# 画像のグレースケール化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 学習済みモデルの読み込み
cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
# 顔を検出する
lists = cascade.detectMultiScale(img_gray, minSize=(100, 100))
if len(lists):
    # 顔を検出した場合、forですべての顔を赤い長方形で囲む
    for (x,y,w,h) in lists:
        cv2.rectangle(img, (x,y), (x+w, y+h), (0, 0, 255), thickness=2)
    cv2.imshow('img', img)
    cv2.waitKey(0)
else:
    print('Nothing')
  
まとめ
本記事「【Python】OpenCVによる顔認識:画像から顔を検出する方法」はいかがでしたか。以下に本記事で解説した項目の重要事項を記します。
- 顔認識する画像は認識率を向上させるためにグレースケール化が必要
 - OpenCVには初めから学習済みモデルが用意されている
 - 学習済みモデルの読み込みはCascadeClassifier()メソッドを使用する
 - 画像から顔検出するためにcv2.CascadeClassifier.detectMultiScaleメソッドを使用する
 
OpenCVを利用することで簡単に画像から顔認識が可能です。OpenCVを使いこなせるようになって、顔認識や文字認識、画像処理を使ったアプリケーションを作成できるようになりましょう。
関連記事














