Closed38

ラズパイ + OpenCVで画像AI

いばらきいばらき

pythonのバージョンを3.11にする

pyproject.toml
[project]
name = "hack-opencv"
version = "0.1.0"
description = "Add your description here"
dependencies = []
readme = "README.md"
- requires-python = ">=3.8"
+ requires-python = ">=3.11,<3.12"

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.rye]
managed = true
dev-dependencies = []

[tool.hatch.metadata]
allow-direct-references = true
いばらきいばらき

エラー

Traceback (most recent call last):
  File "/home/pi/hack-opencv/src/hack_opencv/camface.py", line 2, in <module>
    import picamera
  File "/home/pi/hack-opencv/.venv/lib/python3.11/site-packages/picamera/__init__.py", line 72, in <module>
    from picamera.exc import (
  File "/home/pi/hack-opencv/.venv/lib/python3.11/site-packages/picamera/exc.py", line 41, in <module>
    import picamera.mmal as mmal
  File "/home/pi/hack-opencv/.venv/lib/python3.11/site-packages/picamera/mmal.py", line 49, in <module>
    _lib = ct.CDLL('libmmal.so')
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/pi/.rye/py/cpython@3.11.6/install/lib/python3.11/ctypes/__init__.py", line 376, in __init__
    self._handle = _dlopen(self._name, mode)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^
いばらきいばらき

エラー

Traceback (most recent call last):
  File "/home/pi/hack-opencv/src/hack_opencv/camface.py", line 2, in <module>
    import picamera
  File "/home/pi/hack-opencv/.venv/lib/python3.11/site-packages/picamera/__init__.py", line 72, in <module>
    from picamera.exc import (
  File "/home/pi/hack-opencv/.venv/lib/python3.11/site-packages/picamera/exc.py", line 41, in <module>
    import picamera.mmal as mmal
  File "/home/pi/hack-opencv/.venv/lib/python3.11/site-packages/picamera/mmal.py", line 49, in <module>
    _lib = ct.CDLL('libmmal.so')
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/pi/.rye/py/cpython@3.11.6/install/lib/python3.11/ctypes/__init__.py", line 376, in __init__
    self._handle = _dlopen(self._name, mode)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^
いばらきいばらき

32bitのbullseyeで作り直す。。。

ここまでの学び : 安易に最新OSを使うのはやめよう

いばらきいばらき

手順まとめ

  • Raspberry Pi OSは、Bullseye 64bit を使用

    • 最新のbookwormはカメラを認識しないので駄目
    • 32bitは、opencvのインストールが上手く行かないので駄目
      • あと、ryeも動かない
  • 各種ソフトウェアの更新

sudo apt-get update
sudo apt-get upgrade
  • カメラ有効化
sudo raspi-config

Interface Options -> Legacy Camera

  • センサーの型番を読み込ませる
    • /boot/config.txtの最後に追記する
/boot/config.txt
[all]
dtoverlay=imx708
  • カメラの動作確認
libcamera-jpeg -n -o test.jpg
  • ryeのインストール

https://rye-up.com

  • opencvのインストール
  • pycameraのインストール
rye add opencv-python
rye add picamera
rye sync
ゆーとゆーと

ラズパイOS

  • bookworm64bit: カメラが読み込まれない。
  • bookworm32bit: カメラが読み込まれない。
  • bullseye32bit: カメラは読み込める。が、OpenCVがinstallできない。ryeが対応していない。
  • bullseye32bit: カメラもOpenCVもインストールOK。
いばらきいばらき
  • 新しいカメラのインターフェスを使うにはpicameraでなく、picamera2を使う
  • picamera2はpipでインストールできない(なぜ?)
  • 直接ラズパイのパッケージに放り込まれているので、仮想環境を使わないければ取り敢えず動きそう
ゆーとゆーと

ryeを使わずに、素のpythonと apt-get pipを使用してpicamera2とopencvをインストールするとエラーは無くなって実行(pythonファイル実行してカメラ映ること確認)できた。

→pipだとpicamera2がインストールできない?
pipで両方インストールできたので、aptでのライブラリ管理では無くpipで管理した。
→仮想環境で管理できない?依存関係の解決が難しそう

いばらきいばらき

pythonで、ラズパイ4 + ラズパイカメラ3 + OpenCV動かなかった要因。

  • 最新のOS (bookworm) を使う ✗
    • カメラを認識してくれない。1個前のBullseyeを使うのが正解
  • 32bit OSを使う ✗
    • OpenCVのインストールでハマる。64bit OSが正解
  • カメラをレガシーモードで使う ✗
    • カメラは認識するが動画を取得出来ない。新しい方(libcamera)を使う
  • OpenCVのVideoCaptureで画像を取得する✗
    • libcameraに対応していない。picamera2を使う
  • picamera (pythonのライブラリ) で画像を取得する✗
    • 64bitに対応していない。picamera2を使う
  • ryeを使って、仮想環境でpythonを動かす✗
    • なぜかpicamera2がインストールできない。素の環境にはインストールできる。
ゆーとゆーと

rye add picamera2を実行して、rye syncを実行するとエラーになる。
pip install picamera2を実行するとインストールできる。

→仮想環境だとpicamera2がなんか無理そう。
※picameraはそもそも64bitが対応してなさそう。

いばらきいばらき

pythonで、ラズパイ4 + ラズパイカメラ3 + OpenCVが動くには

  • ラズパイOSは、Bullseye 64bit版
  • /boot/config.txt に以下の記載を追加することで、libcameraを使えるようにする
[all]
dtoverlay=imx708
  • pythonは、仮想環境では動かさない。直接インストールする

  • picamera2を使ってカメラ画像を取得し、opencvで画像処理をする

いばらきいばらき

まともなパッケージ管理すると動かない罠があるので、requirements.txtを残しておく
pythonは、3.9.2

requirements.txt
opencv-python
picamera2
streamlit
streamlit-webrtc
streamlit_server_state
ゆーとゆーと

パッケージ管理(memo)

  • pyenv:Pythonのバージョン管理ツール。

  • pip:Pythonのライブラリ管理ツール。pyenv毎に独立したpip環境を持つ。

  • rye:pyenvとpipのセット版みたいなイメージ

  • apt:OSやコアアプリケーションを含む、ライブラリやソフトウェアのバージョン管理ツール。
    LinuxやUbuntuで使用できるコマンド。

ゆーとゆーと
  • ラズパイOSの焼き込み時にSSH接続有効にする
  • VSCodeの拡張機能「Remote Exploere」をインストール
  • VSCodeからSSH接続
  • 撮影画像とかをディスプレイ表示したい場合のみ、ラズパイ上で実行する必要あり
  • ラズパイ用のディスプレイ、キーボード、マウスは必須
ゆーとゆーと

【料金】

  • AWS Rekognition Video
    • Amazon Rekognition ストリーミング動画イベントは、新規または既存の Kinesis Video Streams からの動画を処理します。Rekognition は、動画分析を開始するための通知を送信した場合にのみ、Kinesis Video ストリームの処理を開始し、イベントごとに最大 120 秒の動画を分析できます。Amazon Rekognition によって処理された動画の量に対してのみ支払います。注: Amazon Kinesis Video Streams サービスは別途お支払いいただきます。

    • 顔検索 : 0.15USD/1 分
    • リアルタイム動画60分 → ≒1300円 / 1h → ≒ 31,200円/24h
    • 動画は高い。画像での検索ならそこまで。
    • Kinesis Video Streamsと併用するなら、Kinesis Video Streamsの料金もかかる。(これはかなり安めなのでそこまで負荷にならなそう)
  • ラズパイ
    • 基本の動画からの検索費用は無料。
    • 本体代と冷却装置とかの物理的な管理はかかる。初回のみ。
    • 故障とかの場合どうする?とかの他の観点の懸念点はAWSと違って発生するが、、

顔認証とかだと基本的には上記二つは同様のことが可能なはず。
運用方法や要件次第だが、値段だけを考えるならラズパイの方が安い。
 
備考
公式の料金シミュレート例には画像の顔認証しかなく、動画は無かった。
https://aws.amazon.com/jp/cdp/#ml

このスクラップは2023/12/13にクローズされました