本記事では、Pythonのライブラリの一つであるOpenCVで用意されている物体検出の機械学習モデル「カスケード分類器」を利用して、入力した人物、犬・猫画像から顔検出の結果についてまとめました。顔検出という言葉から難しいことイメージする方もいるかもしれませんが、本記事に記載されているサンプルコードを利用することで初心者の方でも簡単に顔検出を行うことができます。
OpenCV
OpenCV(Open Source Computer Vision Library)は、インテルによって開発された無料の画像処理・画像解析ライブラリです。豊富な機能を備えており、専門知識がない方でも高度な処理を実行することができます。
カスケード分類器
カスケード分類器(Cascade Classifier)は複数の識類器をつなげて結果を判別する分類器です。カスケード分類器のメリットは、処理が高速であるためリアルタイムでの物体検出に向いている点が挙げられます。また環境構築が容易なので、初めての方でも構築が可能です。
検証までの準備
環境
今回は以下のような環境で検出を行いました。
- Windows11 Education
- VisuialStadioCode2022
- Python3.12.6
- OpenCV4.10.0
コード
カスケード分類器のファイル
OpenCVで用意されている、人物の顔の正面を検出できる学習済みカスケード分類器のファイル haarcascade_frontalface_default.xml をGitHubからダウンロードして face.py と 同じディレクトリの中に入れて使用しました。
URL:https://github.com/opencv/opencv/tree/master/data/haarcascades
サンプルコード
chatGPTで生成したコードを元に face.py という名前のコードを作成し使用しました。 ※ここのコードのみをコピーして使用します。
import cv2
import sys
# カスケード分類器の読み込み
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 画像の読み込み
image = input("input:")
img = cv2.imread(image)
# ファイル名を指定
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
if img is None: print("Image load failed")
sys.exit()
# 顔検出
faces = face_cascade.detectMultiScale(gray)
# 結果を描画
for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow('Face Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
この部分でカスケード分類器の読み込みをしているため、画像ファイル名を入力するだけで検出できるようになっています。
# カスケード分類器の読み込み
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
画像
画像は無料でフリー画像が手に入る「ぱくたそ」からダウンロードしたものを使用します。こちらもカスケード分類器と同じく、face.py と同じディレクトリ内に置きます。 今回は人物画像以外にも、犬・猫の画像も使用しました。
human1.jpg
human2.jpg
human3.jpg
cat.jpg
dog.jpg
実行
ここからは実際に試していきます。
はじめに、画像の読み込みをします。 ここでは画像ファイル名を入力することで、読み込むファイルを指定します。
# 画像の読み込み
image = input("input:")
img = cv2.imread(image) # ファイル名を指定
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
コンソール内はこのようになっています。 inputの部分にhuman1.jpgという画像ファイル名の入力を行いました。 残りのhuman2.jpg、human3.jpg、cat.jpg、dog.jpgも同じようにそれぞれ入力して実行していきます。
input:human1.jpg
ここでは結果を描画してFace Detectionという名前で画像が表示されます。
# 結果を描画
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow('Face Detection', img)
実行結果
画像をそれぞれ試した結果がこちらになります。
human1.jpg
human2.jpg
human3.jpg
cat.jpg
dog.jpg
検証してみて
<人物画像の場合>実行結果から、
- 正面に向いていない人物
- 顔付近に手などがあることで遮られている状態
の顔検出されないことが分かりました。
今回使用したカスケード分類器は正面に人物の顔が向いているときに検出されるものなので、ある程度遠くにいる状態でも正面を向いていれば検出されるということが理解できます。手によって遮られている状態では検出されませんでしたが、メガネをかけた状態では顔検出されることが結果から分かりました。 また、犬・猫の画像の顔検出も行ってみて、今回使用したカスケード分類器は人物の顔のみを検出するので本来であれば何も検出されないはずですが、精度が低いことで毛並みや色などから顔として誤認識し検出されてしまったと考えられます。良かった部分としては処理速度が高速であり、実装が簡単にできるという点が挙げられるため、改めて初心者の方には取り組みやすい検出方法だと思いました。
本記事をご覧いただきありがとうございました。
以下のサイトを参考にさせていただきました。
「写真から顔検出をする(人間、猫)-Pythonでいろいろやってみる」 URL:https://tat-pytone.hatenablog.com/entry/2019/03/14/212442
コメント