Docker環境からカメラを扱う
本記事ではRaspberry Pi 5でDockerコンテナを立ち上げ、そこからカメラを扱う方法と、実際に動かしてみたソースコードを紹介します。
本記事では、以下を中心に解説します
- Dockerでアプリケーションを作成するメリット
- Raspberry Pi 5 上で Dockerコンテナからカメラを制御・利用する方法
- AIカメラを活用した サンプルアプリケーション(物体検出・姿勢推定) の紹介
Dockerでアプリケーションを作成するメリット
Raspberry Piとカメラを組み合わせてシステムを構築するときにDockerベースでアプリケーションを実装することは複数のメリットがあります。
✅ 1. 環境構築が簡単&再現性が高い
- 同じ環境を複数台にコピーできる
- 開発者・利用者で動作環境がブレない
✅ 2. アプリケーションの起動・停止・更新が簡単
- システムの再起動にも強い
- エラー時の切り分けができるのでデバッグしやすい
docker-compose up -d # 起動
docker-compose down # 停止
docker-compose up --build # 更新して再起動
✅ 3. CI/CDやGitHubと連携しやすい
- DockerイメージをGitHub ActionsやGitHub Container Registryに登録すれば、更新のたびに自動でビルド・デプロイが可能になります。
動作環境
Raspberry Pi 5
Raspberry Pi OS (64bit, Raspberry Pi OS Bookworm)
カメラモジュール(Raspberry Pi AI カメラ IMX500)
Dockerコンテナからカメラを制御・利用する方法
Raspberry Pi OSのBullseye以降(2021年11月〜)では、以下のような仕様変更があります。
-
従来のraspistillやraspividは非推奨
-
新たに libcamera ベースのシステムに移行
これにより、Docker環境下でカメラを使うにはいくつかの対策が必要になっています。
1️⃣ Dockerホストのudevをコンテナに共有する
カメラアクセスには/dev/video0やudevマウントが必要になります。
Dockerからlibcameraを利用する場合、ホスト側のカメラデバイスにアクセスできるよう、以下を設定します。
devices:
- /dev/video0:/dev/video0
volumes:
- /run/udev:/run/udev:ro
/dev/video0
はlibcameraやPiCamera2で使用されるV4L2インターフェースです。
udevはLinuxのデバイス管理機構で、カメラなどのハードウェアの状態を管理しています。
libcameraはこの情報を参照してカメラを検出するため、Dockerでもudevの情報を共有する必要があります。
以下のように /run/udev を読み取り専用でマウントします。
volumes:
- /run/udev:/run/udev:ro
カメラのデバイス制御(実際の通信・初期化・ドライバ管理)に関しては、ホスト側の役割になります。
Dockerコンテナからカメラを使うために、ホスト側で最低限カメラが正しく認識・制御されている状態である必要があります。
そのためドライバのインストールに関してはホスト側で済ませておく必要があります。
ドライバのインストールは以下で行うことができます。
sudo apt update && sudo apt full-upgrade
sudo apt install imx500-all # ドライバのインストールを実施。再起動が必要
- [参考] 公式セットアップ手順
2️⃣ コンテナを「特権モード」で起動する
Dockerは通常、ホストのハードウェアに直接アクセスできないよう制限されています。
カメラのような物理デバイスを使うには、「特権モード(privileged: true)」を有効にする必要があります。
privileged: true
これにより、コンテナは /dev/video0 や /dev/media* などのデバイスにアクセスできるようになります。
Dockerと組み合わせた実装例
AIカメラを活用したサンプルアプリケーションを2つ作成したので紹介します。
1️⃣ リアルタイム物体検出 + Web UI(Flask)
このアプリでは検出結果を左側のビューに表示しつつ、右側のグラフで検出結果を時系列で可視化します。
- Githubレポジトリ
https://github.com/SonySemiconductorSolutions/aitrios-rpi-sandbox/tree/main/examples/docker_webui
このアプリでは、Raspberry Piに接続されたAIカメラ(IMX500)から映像を取得し、リアルタイムで物体検出を行いながらWebブラウザで表示します。
Web UIを通じて、AIカメラの映像+検出結果を手軽に確認できます。
- Dockerの環境構築
FROM debian:bookworm
# Install gnupg and add Raspberry Pi repository
# Raspberry Pi用パッケージを取得するためのリポジトリを追加します。
RUN apt update && apt install -y --no-install-recommends gnupg && \
echo "deb http://archive.raspberrypi.org/debian/ bookworm main" > /etc/apt/sources.list.d/raspi.list && \
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 82B129927FA3303E
# Upgrade packages
RUN apt update && apt -y upgrade
# Install required packages and clean up
# 必要なライブラリをインストールします。imx500-allをインストールすると/usr/share配下にサンプルモデルが自動的にダウンロードされます。
RUN apt install -y --no-install-recommends \
python3-pip \
python3-picamera2 \
imx500-all && \
apt-get clean && \
apt-get autoremove && \
rm -rf /var/cache/apt/archives/* && \
rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Copy application files
COPY app/ /app/
# Install Python dependencies
RUN pip install --break-system-packages --no-cache-dir -r requirements.txt
# Expose port 5000
EXPOSE 5000
# Run the application
CMD ["python3", "app.py"]
実行方法(物体検出)
1.環境構築
レポジトリをダウンロードします。
git clone https://github.com/SonySemiconductorSolutions/aitrios-rpi-sandbox.git
cd aitrios-rpi-sandbox/examples/docker_webui
2.Raspberry Pi5へDocker環境のインストール
コンテナを実行するためにDocker環境を構築します。
./install_docker
3.Dockerコンテナの実行
以下を実行すると、コンテナが起動しアプリケーションを自動で起動します。
docker-compose up --build
4.結果の確認
ブラウザからRaspberry Piの持つIPアドレスにアクセスすると、実行結果を確認することができます。
http://<your_rpi_ip>:5000/
あるいは
http://raspberrypi.local:5000/
2️⃣ 姿勢推定(骨格のみ表示)+Web UI(Flask)
- Githubレポジトリ
https://github.com/SonySemiconductorSolutions/aitrios-rpi-sandbox/tree/main/examples/docker_pose_estimation
このアプリは、リアルタイムで姿勢推定(Pose Estimation)を行うDocker化されたWeb UIアプリケーション実装例です。
映像はブラウザから確認可能で、人物の骨格のみを背景に重ねて表示するため、プライバシーを保護した状態でモニタリングが可能です。
✅ メタデータ(骨格情報)のみを検出・表示することで、プライバシーに配慮
✅ 骨格情報を描画する画像は動的に変更可能(事前に用意した背景画像を用いることで意図しない人の写り込みを防ぐことが可能)
実行方法(姿勢推定)
すでに1️⃣ で実施したDocker環境の構築が済んでいる場合、以下で実行することが可能です。
cd aitrios-rpi-sandbox/examples/docker_pose_estimation
docker-compose up --build
ブラウザからRaspberry Piの持つIPアドレスにアクセスすると、実行結果を確認することができます。
http://<your_rpi_ip>:5000/
あるいは
http://raspberrypi.local:5000/
まとめ
この記事では、Raspberry Pi 5とIMX500 AIカメラを使って、Docker上で映像処理や姿勢推定アプリを動かす方法を紹介しました。
Dockerからカメラを使うためのいくつかの設定(udev共有や特権モード)が必要になるので、Dockerファイルでの対処方法について紹介しました。
ぜひこれらのサンプルアプリケーションを活用して、Dockerを用いたRaspberry Pi AI Cameraの活用、プライバシーに配慮した映像処理アプリケーションの開発に役立てていただければと思います。
困った時は
もし、記事の途中でうまくいかなかった場合は、気軽にこの記事にコメントいただければと思います。
もしRaspberryPiに関連する疑問がある場合は下記フォーラムもご確認、ご活用ください。