📸

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)

2. detectMultiScaleのパラメータを調整する

cascade.detectMultiScale()の引数を調整することでも、パフォーマンスを改善できます。

  • scaleFactor: 少し大きめの値(例: 1.2)にすると、チェックする画像のスケールが粗くなり、処理が速くなります。
  • minNeighbors: 大きい値にすると、顔と判定する基準が厳しくなり、誤検出が減る代わりに処理も少し速くなります。

おわりに

今回は、Raspberry PiとOpenCVを使ったリアルタイム顔認識の基本的な手順と、パフォーマンス改善のヒントをご紹介しました。伝統的ながらも、非常に面白いテーマですよね。

ここからさらに、

  • 検出した顔の人物が誰なのかを判定する(深層学習モデルの利用)
  • 人感センサーと組み合わせて、人が来た時だけ顔認識を起動する
    といった応用も考えられます。ぜひ、あなたのアイデアで発展させてみてください。

この記事で紹介した内容以外にも、技術情報をブログで発信しています。
MyNote by MEANTIX
https://meantix.com/

Discussion