スポンサーリンク
はじめに
画像処理ライブラリとして有名な 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')
<使用する画像>
今回はヤング?な感じの人物が写っているフリーフリー素材を使います。
認識を行う前に一旦、画像をグレースケールに変換します。
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」を使って顔検出を行った結果です。
コード全文
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 で顔認識を行う方法を紹介しました。
画像認識では、認識する画像が鮮明であることはもちろんのこと、カスタード分類器の精度が結果を大きく左右します。
0 件のコメント:
コメントを投稿