Raspberry PiとOpenCVではじめるリアルタイム顔認識入門(パフォーマンス改善Tips付き)
はじめに
手のひらサイズのコンピューター「Raspberry Pi」は、IoTや電子工作の分野で無限の可能性を秘めています。今回は、その中でも特に人気の高い**「カメラを使ったリアルタイム顔認識」**に挑戦します。
この記事は、Web上にあるいくつかの優れた先人たちの記事を参考に、自身の知識と合わせて「これ一本で基本がわかる」を目指して再構成したものです。
準備するもの
- Raspberry Pi本体 (Pi 3, 4, 5など)
- USBカメラ または Raspberry Pi カメラモジュール
- MicroSDカード (Raspberry Pi OSをインストール済み)
Step 1: 環境構築
まず、顔認識の処理を行うための心臓部であるOpenCVをインストールします。OpenCVは、画像や動画を処理するための機能が詰まったオープンソースのライブラリです。
# パッケージリストを更新
sudo apt update
sudo apt upgrade
# OpenCVと関連ライブラリをインストール
sudo apt install python3-opencv libopencv-dev
OpenCVには、顔認識のモデルとしてHaar Cascade分類器が含まれています。これもopencv-data
パッケージでインストールしておくと便利です。
sudo apt install opencv-data
Step 2: 顔認識の仕組み(Haar Cascade分類器)
今回は、OpenCVの機能の中でも古くから使われている「Haar Cascade分類器」を利用します。
これは、大量の「顔の画像」と「顔でない画像」を機械学習させることで、顔が持つ特徴(目と鼻の位置関係、輪郭など)を定義したXML形式のファイルです。 この学習済みファイルを使うことで、私たちは難しい理論を知らなくても、簡単に画像から顔を見つけ出すことができます。
Step 3: Pythonコードでリアルタイム顔認識
それでは、実際にカメラを動かして顔を認識するPythonスクリプトを作成します。全体のコードは非常にシンプルです。
import cv2
# 使用するカメラを指定 (0は通常、内蔵または最初に見つかったUSBカメラ)
CAM_ID = 0
# 顔認識用の学習済みモデルファイル(環境に合わせてパスを調整してください)
CASCADE_FILE = "/usr/share/opencv4/haarcascades/haarcascade_frontalface_default.xml"
def main():
# カメラをキャプチャ
cap = cv2.VideoCapture(CAM_ID)
# Haar Cascade分類器をロード
cascade = cv2.CascadeClassifier(CASCADE_FILE)
print("顔認識を開始します... (終了するには'q'キーを押してください)")
while True:
# カメラから1フレーム読み込む
ret, frame = cap.read()
if not ret:
print("エラー: フレームを読み込めませんでした。")
break
# 処理を高速化するため、画像をグレースケールに変換
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 顔を検出
faces = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 検出した顔を矩形で囲む
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 結果をウィンドウに表示
cv2.imshow('Face Recognition', frame)
# 'q'キーが押されたらループを抜ける
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 後処理
cap.release()
cv2.destroyAllWindows()
print("顔認識を終了します。")
if __name__ == '__main__':
main()
このスクリプトを実行すると、カメラの映像が表示され、顔が青い四角で囲まれるはずです!
Step 4: パフォーマンス改善Tips
Raspberry Piは高性能なPCではないため、そのままだと処理がカクカクすることがあります。そんな時は、いくつかのパラメータを調整してパフォーマンスを改善しましょう。
1. 解像度を下げる
処理する画像のサイズを小さくするのが最も効果的です。カメラの解像度を下げて、CPUの負荷を軽減します。
# cv2.VideoCapture(CAM_ID) の直後に追加
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
detectMultiScale
のパラメータを調整する
2. cascade.detectMultiScale()
の引数を調整することでも、パフォーマンスを改善できます。
-
scaleFactor
: 少し大きめの値(例:1.2
)にすると、チェックする画像のスケールが粗くなり、処理が速くなります。 -
minNeighbors
: 大きい値にすると、顔と判定する基準が厳しくなり、誤検出が減る代わりに処理も少し速くなります。
おわりに
今回は、Raspberry PiとOpenCVを使ったリアルタイム顔認識の基本的な手順と、パフォーマンス改善のヒントをご紹介しました。伝統的ながらも、非常に面白いテーマですよね。
ここからさらに、
- 検出した顔の人物が誰なのかを判定する(深層学習モデルの利用)
- 人感センサーと組み合わせて、人が来た時だけ顔認識を起動する
といった応用も考えられます。ぜひ、あなたのアイデアで発展させてみてください。
この記事で紹介した内容以外にも、技術情報をブログで発信しています。
MyNote by MEANTIX
Discussion