【決定版】Raspberry PiとOpenCVで学ぶ、リアルタイム顔認識システムの作り方

Raspberry Pi

導入

このブログのキャッチコピーは「未来の自分のための技術メモ、時々あなたのためのヒント。」ですが、今回は未来を感じさせる技術「顔認識」を、手のひらサイズのコンピューター「Raspberry Pi」で実現する、そんなヒントをお届けします。

「AIの画像認識って、なんだかすごく難しそう…」

「映画やアニメみたいに、カメラで人の顔を見つけるシステムを自分でも作ってみたい!」

この記事では、そんなあなたのための、Raspberry PiとOpenCVを使ったリアルタイム顔認識の入門ガイドです。電子工作やプログラミングが初めての方でも理解できるよう、その仕組みから実践的なコード、そしてパフォーマンスを改善するコツまで、徹底的に解説します。


そもそも「顔認識」ってどういう仕組み?

プログラムが「顔」を認識するためには、まず「顔とは何か」を教えてあげる必要があります。今回は、OpenCVという画像処理ライブラリに搭載されている「Haar Cascade(ハールカスケード)分類器」という仕組みを使います。

顔の特徴を学習した「分類器」

「Haar Cascade分類器」は、顔の“特徴”を大量に学習した、賢いフィルターのようなものです。

  • 学習データ:何万枚もの「顔が写っている画像」と「顔が写っていない画像」をAIに見せて、「目と鼻はこういう位置関係にある」「口は顔の下半分にある」といった無数のパターンを学習させます。
  • XMLファイル:その学習結果が、haarcascade_frontalface_default.xmlといったファイルにまとめられています。私たちは、この学習済みファイルを使うことで、複雑なAI理論を一から学ばなくても、すぐに顔認識を試すことができるのです。

Step 1: 準備するものと環境構築

まずは、プロジェクトに必要なものを揃え、Raspberry Piの準備をしましょう。

  • ハードウェア:
    • Raspberry Pi 本体(Pi 3, 4, 5などがおすすめです)
    • USBカメラ または Raspberry Pi カメラモジュール
  • ソフトウェアのインストール:Raspberry Pi OSのターミナル(黒い画面)を開き、以下のコマンドで画像処理ライブラリ「OpenCV」と、学習済みデータ「opencv-data」をインストールします。Bash# まずはシステムを最新の状態にします sudo apt update && sudo apt upgrade # OpenCVと関連パッケージをインストール sudo apt install python3-opencv opencv-data

Step 2: Pythonコードで顔認識を実装する

いよいよ、顔認識を実行するPythonスクリプトを作成します。一行ずつ、コードが何をしているのか丁寧に見ていきましょう。

# 必要なライブラリ「OpenCV」をインポートします
import cv2

# --- 初期設定 ---
# 使用するカメラのID (通常は0)
CAM_ID = 0
# 顔認識に使う学習済みファイル (インストールした場所のパス)
CASCADE_FILE = "/usr/share/opencv4/haarcascades/haarcascade_frontalface_default.xml"

# --- メインの処理 ---
def main():
    # カメラを準備します
    cap = cv2.VideoCapture(CAM_ID)
    
    # 顔認識のフィルター(分類器)を読み込みます
    cascade = cv2.CascadeClassifier(CASCADE_FILE)
    
    print("顔認識を開始します... (ウィンドウを選択して'q'キーを押すと終了します)")

    # 無限ループでカメラの映像を処理し続けます
    while True:
        # カメラから1枚の画像(フレーム)を読み込みます
        ret, frame = cap.read()
        if not ret:
            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)

        # 結果の画像に「Face Recognition」という名前のウィンドウで表示します
        cv2.imshow('Face Recognition', frame)

        # 'q'キーが押されたら、無限ループを中断します
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # --- 終了処理 ---
    # カメラを解放します
    cap.release()
    # 全てのウィンドウを閉じます
    cv2.destroyAllWindows()
    print("顔認識を終了します。")

# このスクリプトが直接実行された場合に、main()関数を呼び出します
if __name__ == '__main__':
    main()

Step 3: パフォーマンス改善で、カクカクをなくす

Raspberry Piは小さなコンピューターなので、高画質なカメラ映像をリアルタイムで処理するのは少し大変です。実行してみて映像がカクカクする場合は、以下の改善策を試してみてください。

1. 解像度を下げる(最も効果的!)

処理する画像のサイズを小さくすれば、CPUの負担は劇的に減ります。大きな絵を描くより、小さな絵を描くほうが速いのと同じです。

# cap = cv2.VideoCapture(CAM_ID) の直後に追加
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)

この設定だけで、見違えるほどスムーズに動くことがあります。

2. 顔検出のパラメータを調整する

detectMultiScale()メソッドの引数を調整することでも、速度と精度のバランスを取ることができます。

  • scaleFactor: 画像をどれだけ縮小しながら顔を探すかの度合いです。1.11.2のように少し大きくすると、チェックが粗くなる分、処理は速くなります。
  • minNeighbors: 顔候補の四角がいくつ重なったら「顔」と判断するかの基準です。値を大きくすると、誤検出は減りますが、本当に顔なのに見逃す可能性も出てきます。

まとめ

今回は、Raspberry PiとOpenCVを使って、リアルタイム顔認識システムを構築する手順を、その仕組みから詳しく解説しました。

一見すると複雑な「AIによる画像認識」も、OpenCVのような優れたライブラリを使えば、意外と短いコードでその第一歩を体験できることがお分かりいただけたかと思います。

このプロジェクトは、

  • 人感センサーと組み合わせて、人が来た時だけ顔認識を起動する
  • 顔を検出したら、特定の音声ファイルを再生するなど、他のDIYプロジェクトとの連携も非常に楽しいです。

この記事が、あなたの「モノづくり」の世界をさらに広げる「ヒント」になれば幸いです。

コメント

タイトルとURLをコピーしました