【Pythonで画像認識入門 第2回】写真から「顔」を見つけ出せ!OpenCVを使った顔検出の基礎 🧑
「プログラムに、画像の中から特定の『モノ』を見つけさせるにはどうすればいいの?」
「顔認識って、すごく難しいAIの技術じゃないの?」
「OpenCVを使えば、簡単な顔検出プログラムが作れるって本当?」
こんにちは! OpenCV探検隊、隊長のPythonistaです! 前回の第1回では、PythonとOpenCVを使って画像を読み込み、表示し、簡単な加工を施すという、画像操作の基本をマスターしましたね。これで、画像という「素材」を自由に扱う準備が整いました。
シリーズ第2回となる今回は、いよいよその素材から「意味」を読み取る、**物体検出 (Object Detection)** の世界に足を踏み入れます! その最初のターゲットとして、コンピュータビジョンで最も有名でエキサイティングなテーマの一つ、**静止画像の中から人間の「顔」を自動で検出する**プログラムの作成に挑戦します。
「AIなんて難しそう…」と思うかもしれませんが、心配無用です。OpenCVに用意されている、あらかじめ訓練された「賢い分類器」を使えば、驚くほど少ないコードで、あなたのプログラムに顔を見つけ出す能力を与えることができますよ!
1. どうやって「顔」を見つけるの? ハールカスケード分類器の仕組み
本格的な実装に入る前に、OpenCVがどのようにして顔を検出するのか、その基本的な考え方だけを簡単に知っておきましょう。今回私たちが使うのは、**ハールカスケード (Haar Cascade) 分類器**という、非常に有名で古典的な手法です。
これは、あらかじめ何千、何万枚もの「顔の画像」と「顔でない画像」をコンピュータに学習させて作られた、**顔の特徴をまとめた学習済みモデル**です。
このモデルは、画像の中の小さな領域に対して、以下のような非常に単純な質問を何千回も繰り返します。
- 「目のあたりは、鼻筋のあたりより暗いか?」
- 「鼻筋のあたりは、頬のあたりより明るいか?」
これらの単純な特徴(ハール特徴量)の組み合わせを、滝(カスケード)のように連続してチェックしていき、全ての条件をクリアした領域を「これは顔である」と判断するのです。私たちは、この賢いモデルをありがたく使わせてもらうだけでOKです!
2. 準備:学習済みモデル(XMLファイル)の入手
このハールカスケード分類器は、OpenCVの開発チームによって既に作成されており、私たちはそれを**XMLファイル**としてダウンロードするだけで利用できます。
- まず、OpenCVの公式GitHubリポジトリにアクセスします。
https://github.com/opencv/opencv/tree/master/data/haarcascades - たくさんのXMLファイルが並んでいますが、その中から**
haarcascade_frontalface_default.xml
**というファイルを見つけてクリックします。 - 開いたページの右側にある「Download raw file」ボタン(または[Raw]ボタンを右クリックして「名前を付けてリンク先を保存」)をクリックして、ファイルをダウンロードします。
- ダウンロードした
haarcascade_frontalface_default.xml
ファイルを、あなたのPythonスクリプトと同じディレクトリに保存してください。
これで、顔を検出するための「賢い頭脳」の準備が整いました。
3. 実装:顔検出プログラムの作成
それでは、いよいよ顔検出のプログラムを書いていきましょう。顔が写っている適当な画像ファイル(例: `people.jpg`)を、スクリプトと同じディレクトリに用意してください。
import cv2
import sys
# --- 準備 ---
# 画像ファイルのパス
image_path = 'people.jpg'
# カスケード分類器のパス (学習済みモデル)
cascade_path = 'haarcascade_frontalface_default.xml'
# --- ステップ1: カスケード分類器の読み込み ---
face_cascade = cv2.CascadeClassifier(cascade_path)
if face_cascade.empty():
print(f"エラー: カスケードファイル '{cascade_path}' を読み込めませんでした。")
sys.exit()
# --- ステップ2: 画像の読み込みとグレースケール化 ---
img = cv2.imread(image_path)
if img is None:
print(f"エラー: 画像ファイル '{image_path}' を読み込めませんでした。")
sys.exit()
# 処理の高速化と精度の向上のため、白黒画像に変換する
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# --- ステップ3: 顔検出の実行 ---
# detectMultiScaleメソッドが、画像中から顔を検出する
# scaleFactor: 画像を縮小する際のスケール。1.1は10%ずつ縮小して探すという意味。
# minNeighbors: 顔として認識するために必要な、近傍の矩形の数。5程度が一般的。
faces = face_cascade.detectMultiScale(gray_img, scaleFactor=1.1, minNeighbors=5)
print(f"{len(faces)}個の顔を検出しました。")
# --- ステップ4: 検出した顔を矩形で囲む ---
# 検出された顔の数だけループ処理
for (x, y, w, h) in faces:
# 元のカラー画像に、緑色の矩形を描画する
# (x, y)は矩形の左上隅の座標、(x+w, y+h)は右下隅の座標
# (0, 255, 0)は色(BGR)、2は線の太さ
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
# --- 結果の表示 ---
cv2.imshow('Face Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# (任意) 結果をファイルに保存
cv2.imwrite('face_detection_result.jpg', img)
コードのポイント:
cv2.CascadeClassifier()
: 準備したXMLファイルを読み込み、顔検出器を作成します。face_cascade.detectMultiScale()
: この関数が、顔検出の魔法を実行する中心的な役割を果たします。グレースケール画像を渡すと、見つかった顔の「矩形情報(左上のx座標, y座標, 幅, 高さ)」のリストを返します。cv2.rectangle()
: 検出された矩形の情報を元に、元のカラー画像の上に四角形を描画しています。
たったこれだけのコードで、プログラムが画像の中の顔を認識できるようになるなんて、驚きですよね!
まとめと次回予告
今回は、OpenCVを使った画像認識の第一歩として、ハールカスケード分類器を使った顔検出に挑戦しました。
- コンピュータが顔を認識する仕組み(ハールカスケード)の簡単な概念を理解した。
- OpenCVが提供する**学習済みモデル(XMLファイル)**を準備し、読み込む方法を学んだ。
detectMultiScale()
メソッドを使って、画像から**顔の位置とサイズを検出**する方法をマスターした。- 検出した結果を
rectangle()
メソッドで**可視化**する方法を学んだ。
あなたは、単に画像を加工するだけでなく、その中身を「認識」する、より高度なプログラムを書くための大きな一歩を踏み出しました。
さて、静止画で顔を検出できるようになったら、次は何をしたくなるでしょう? そう、動いている映像、つまり**リアルタイムの動画**で同じことをやってみたくなりますよね。
次回、第3回では、この顔検出の技術をさらに一歩進め、PCに接続されたWebカメラの映像から、リアルタイムで顔を検出し続けるアプリケーションの作成に挑戦します!お楽しみに!
コメント
コメントを投稿