Raspberry Pi でカメラをつなぎ顔検出

目次
  1. 前準備
  2. Python 仮想環境の作成
  3. Picamera2 を使って Raspberry Pi でカメラを動かす
  4. dlib を使って顔検出してみる

【サイト内の Raspberry Pi OS 関連ページ】

小型コンピュータ Raspberry Pi について: 別ページ »にまとめ

関連する外部ページ

Raspberry Pi カメラの公式ドキュメント: https://www.raspberrypi.com/documentation/computers/camera_software.html

前準備

Raspberry Pi OS のシステム更新

Raspberry Pi OS のシステム更新を行っておく。

次のコマンドを実行。

# パッケージリストの情報を更新
sudo apt update
sudo apt -yV upgrade
sudo apt -yV full-upgrade
sudo apt -yV autoremove
sudo apt autoclean
sudo shutdown -r now

カメラの接続

  1. Raspberry Pi の電源を切った状態で、カメラモジュールのフラットケーブルを CSI コネクタに接続する

    ケーブルの金属端子の向きに注意する

  2. Raspberry Pi を起動する

Raspberry Pi OS Bullseye 以降のカメラは libcamera ベースのソフトウェアスタックで動作し、 接続したカメラは自動的に認識される。raspi-config でカメラを有効にする操作は不要である。

カメラが認識されていることを、次のコマンドで確認する。

rpicam-hello --list-cameras

コマンドで静止画を撮影して、カメラの動作を確認する。

rpicam-still -o test.jpg

Python 仮想環境の作成

Raspberry Pi OS では、システムの Python 環境が externally-managed-environment として保護されており、 「sudo pip install」による導入は行えない。 Python パッケージは venv による仮想環境に導入する。

カメラを扱う Picamera2 は apt でシステムに導入されるため、 仮想環境の作成時に --system-site-packages を指定して、 システムのパッケージを参照できるようにする。

python3 -m venv --system-site-packages $HOME/py-cam
source $HOME/py-cam/bin/activate
python -m pip install -U pip setuptools wheel

仮想環境から抜けるときは「deactivate」を実行する。 仮想環境を使うときは、端末を開くたびに「source $HOME/py-cam/bin/activate」を実行する。

Picamera2 を使って Raspberry Pi でカメラを動かす

Python からカメラを扱うライブラリは Picamera2 である。 以前使われていた picamera(バージョン 1 系)は、libcamera ベースの現在の Raspberry Pi OS では動作しない。

  1. Picamera2 のインストール

    Raspberry Pi OS(デスクトップ版)には Picamera2 が標準で入っている。入っていない場合は、次のコマンドを実行する。

    sudo apt install -y python3-picamera2
    
  2. インストールの確認

    端末で、次のコマンドを実行

    source $HOME/py-cam/bin/activate
    python -c "from picamera2 import Picamera2; print(Picamera2.global_camera_info())"
    
  3. カメラの動作確認

    Python で、次の Python プログラムを実行してみる

    * 画像ファイルは jpg でも png でも保存できる。ここでは「1.jpg」としている。

    from picamera2 import Picamera2
    picam2 = Picamera2()
    picam2.start_and_capture_file("1.jpg")
    picam2.close()
    exit()
    
  4. ImageMagick を使って画像表示してみる

    * インストールは「sudo apt install -y imagemagick」

    display 1.jpg
    
  5. 画像ファイル名に、日時を含める

    Python で、次の Python プログラムを実行してみる

    from picamera2 import Picamera2
    import datetime
    picam2 = Picamera2()
    picam2.start_and_capture_file(datetime.datetime.now().strftime("%y%m%d%H%M%S") + ".jpg")
    picam2.close()
    exit()
    

    ImageMagick を使って画像表示してみる

dlib を使って顔検出してみる

  1. ビルドに必要なパッケージのインストール

    dlib は C++ で書かれており、Raspberry Pi では CMake によるビルドを伴う。

    sudo apt install -y build-essential cmake pkg-config python3-dev libopenblas-dev libx11-dev
    
  2. dlib のインストール

    端末で、次のコマンドを実行

    * ビルドには数十分かかる。メモリの少ない機種ではビルドが失敗することがある。その場合はスワップ領域を拡大する(/etc/dphys-swapfile の CONF_SWAPSIZE を増やし、「sudo systemctl restart dphys-swapfile」を実行)

    source $HOME/py-cam/bin/activate
    pip install dlib
    
  3. インストールの確認
    source $HOME/py-cam/bin/activate
    python -c "import dlib; print(dlib.__version__)"
    
  4. 顔検出の実行

    撮影した画像「1.jpg」に対して、dlib の get_frontal_face_detector による顔検出を行う。 次の Python プログラムを face_detect.py の名前で保存し、実行する。

    import dlib
    
    img = dlib.load_rgb_image("1.jpg")
    detector = dlib.get_frontal_face_detector()
    dets = detector(img, 1)
    print("顔の数:", len(dets))
    for i, d in enumerate(dets):
        print(i, d.left(), d.top(), d.right(), d.bottom())
    
    win = dlib.image_window()
    win.set_image(img)
    win.add_overlay(dets)
    dlib.hit_enter_to_continue()
    
    source $HOME/py-cam/bin/activate
    python face_detect.py
    
  5. 顔の特徴点(ランドマーク)の検出

    学習済みモデルのファイルをダウンロードし、展開(解凍)する。

    wget http://dlib.net/files/shape_predictor_5_face_landmarks.dat.bz2
    bzip2 -d shape_predictor_5_face_landmarks.dat.bz2
    ls -la *.dat
    

    次の Python プログラムを face_landmark.py の名前で保存し、実行する。

    import dlib
    
    img = dlib.load_rgb_image("1.jpg")
    detector = dlib.get_frontal_face_detector()
    predictor = dlib.shape_predictor("shape_predictor_5_face_landmarks.dat")
    dets = detector(img, 1)
    
    win = dlib.image_window()
    win.set_image(img)
    for d in dets:
        shape = predictor(img, d)
        win.add_overlay(shape)
    dlib.hit_enter_to_continue()
    
    source $HOME/py-cam/bin/activate
    python face_landmark.py