Raspberry Pi でカメラをつなぎ顔検出
【サイト内の 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
カメラの接続
- Raspberry Pi の電源を切った状態で、カメラモジュールのフラットケーブルを CSI コネクタに接続する
ケーブルの金属端子の向きに注意する
- 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 では動作しない。
- Picamera2 のインストール
Raspberry Pi OS(デスクトップ版)には Picamera2 が標準で入っている。入っていない場合は、次のコマンドを実行する。
sudo apt install -y python3-picamera2 - インストールの確認
端末で、次のコマンドを実行
source $HOME/py-cam/bin/activate python -c "from picamera2 import Picamera2; print(Picamera2.global_camera_info())" - カメラの動作確認
Python で、次の Python プログラムを実行してみる
* 画像ファイルは jpg でも png でも保存できる。ここでは「1.jpg」としている。
from picamera2 import Picamera2 picam2 = Picamera2() picam2.start_and_capture_file("1.jpg") picam2.close() exit()
- ImageMagick を使って画像表示してみる
* インストールは「sudo apt install -y imagemagick」
display 1.jpg
- 画像ファイル名に、日時を含める
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 を使って顔検出してみる
- ビルドに必要なパッケージのインストール
dlib は C++ で書かれており、Raspberry Pi では CMake によるビルドを伴う。
sudo apt install -y build-essential cmake pkg-config python3-dev libopenblas-dev libx11-dev - dlib のインストール
端末で、次のコマンドを実行
* ビルドには数十分かかる。メモリの少ない機種ではビルドが失敗することがある。その場合はスワップ領域を拡大する(/etc/dphys-swapfile の CONF_SWAPSIZE を増やし、「sudo systemctl restart dphys-swapfile」を実行)
source $HOME/py-cam/bin/activate pip install dlib - インストールの確認
source $HOME/py-cam/bin/activate python -c "import dlib; print(dlib.__version__)"
- 顔検出の実行
撮影した画像「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
- 顔の特徴点(ランドマーク)の検出
学習済みモデルのファイルをダウンロードし、展開(解凍)する。
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