サンプルコード・画像付き!OpenCV + Python で顔認識をしてみよう

2021年10月31日日曜日

Python

t f B! P L

スポンサーリンク

はじめに

画像処理ライブラリとして有名な OpenCV を使って、画像の中から人物の顔認識を行います。

顔を認識するための分類器は、OpenCV 公式から提供されているため、非常に少ないコードで、顔認識を実装することができます。

環境

今回、使用する環境は以下のとおり。

  • Anaconda : Python の仮想環境
  • Python:3.9
  • OpenCV:4.5.3
  • Matplotlib:3.4.3 (画像やデータを視覚的に表示するライブラリ)
  • VSCode+Jupyter:開発ツール

Anaconda と Python のインストール方法は、以下の記事をご覧ください。

【関連記事】
Anacondaのインストール (Mac OS編)

OpenCV のインストール方法は、以下の記事をご覧ください。

【関連記事】
Anaconda に「OpenCV」をインストール

顔認識のカスケード分類器をダウンロード

顔認識などを行う物体検出の処理では、まず、検出対象の物体が写っている画像と、写っていない画像を用意して特徴を抽出し、集めた「特徴量」を機械学習し、学習データしてまとめたものが「カスケード分類器」です。

このカスタード分類器を1から作ろうと思うと多くの手間と時間が必要ですが、今回試す顔認識であれば、OpenCV 公式 の GitHub で 学習済のカスケード分類器が配布されているため、今回はそれを使用します。

opencv/data/haarcascades at master · opencv/opencv

リンクにアクセスすると、顔認識、瞳認識、体認識などのカスケード分類器が置いてあります。今回は顔認識に挑戦したいので、リストの中から「haarcascade_frontalface_alt.xml」をダウンロードしましょう。

スポンサーリンク

コーディング

準備が整ったので、Python で顔認識をするコードを書いていきます。

まず、OpenCVと、Matplotlib のモジュールをインポートします。

import cv2
import matplotlib.pyplot as plt

先ほど Github からダウンロードした顔認識のカスケード分類器を読み込みます。

face_cascade = cv2.CascadeClassifier("path/to/haarcascade_frontalface_alt.xml")

顔認識を行うテスト用の画像を読み込みます。

src = cv2.imread('path/to/sample_face_image.jpg')

<使用する画像>
今回はヤング?な感じの人物が写っているフリーフリー素材を使います。

enter image description here

認識を行う前に一旦、画像をグレースケールに変換します。

src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

カスケード分類器の detectMultiScale を使って、グレースケールに変換した画像から顔認識を行い、検出されたエリアの周りに四角の線を引きます。

faces = face_cascade.detectMultiScale(src_gray)
for x, y, w, h in faces:
    cv2.rectangle(src, (x, y), (x + w, y + h), (255, 0, 0), 2)
    face = src[y: y + h, x: x + w]
    face_gray = src_gray[y: y + h, x: x + w]

最後に色空間を BGR から RGB に変換し Matplotlib で表示します。

img_rgb = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)  #BGR -> RGB変換
plt.imshow(img_rgb)

実行結果

以上で、顔認識を行うコードの完成です。OpenCV を使えば、少ないコードで簡単に画像認識の処理を組むことができます。

上のコードを実行すると次のような結果になります。6人中4人の認識には成功していますね。

画像認識の結果

別のカスタード分類器のファイルを使ってみると、また違った結果になります。以下は「haarcascade_frontalface_default.xml」を使って顔検出を行った結果です。
enter image description here

コード全文

import cv2
import matplotlib.pyplot as plt

#カスタード分類器の読み込み
face_cascade = cv2.CascadeClassifier("path/to/haarcascade_frontalface_alt.xml")

#画像の読み込み
src = cv2.imread('path/to/sample_face_image.jpg')

#グレースケール変換
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

#顔を検出
faces = face_cascade.detectMultiScale(src_gray)

#検出された顔に四角の線を引く
for x, y, w, h in faces:
    cv2.rectangle(src, (x, y), (x + w, y + h), (255, 0, 0), 2)
    face = src[y: y + h, x: x + w]
    face_gray = src_gray[y: y + h, x: x + w]

img_rgb = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)  #BGR -> RGB変換
plt.imshow(img_rgb)

まとめ

OpenCV で顔認識を行う方法を紹介しました。

画像認識では、認識する画像が鮮明であることはもちろんのこと、カスタード分類器の精度が結果を大きく左右します。

スポンサーリンク

QooQ