Raspberry Pi 2 modelB V1.1でstreamlitカメラサーバー動かしてみる

# 動機
　会社でRaspberry Pi 4を触る機会があって、そういえば家に2とカメラがあることを思い出した。機械学習に使えないかと思って購入してセットアップしたが当時まだ使いこなせていなかった。
　最近はstreamlitやpythonの充実でだいぶやりやすくなったと思う。RasbianOS32bit環境もRaspberry Pi Zero関係で需要があるようなので、動くかトライしてみた。

# 環境
いわゆるラズパイ2が話題になった頃の化石環境。

:::note info
Raspberry Pi 2 modelB V1.1
Raspberry Pi Camera Rev1.3 (OV5647)
Rasbian OS 32bit(Bullseye)
:::

カメラの性能は以下である。意外と悪くない。
|Size     |FPS  | 
|:--------|----:|
|1080p    |30|
|720p     |60|
|VGA(480p)|90|

# やったこと
ググると、RaspbianOSの32bitでstreamlitを動かした記事がほとんどない。64bitでやれとか、pyarrowが対応してないとか絶望的な記事が多い。

結論から言うと動いた。バージョンを合わせたビルド済みパッケージのみで根性ビルドは不要。

streamlitのインストール時のポイントはprotobufをダウングレードすること。
下記をバージョン指定で入れてOpenCV、streamlitともにちゃんと動いた。
OpenCVはビルドしなおさなくてもpip installのみでOK。
OpenCVはlibcameraでは使用できないため、レガシーカメラとして設定する。
(この内容はこの記事に書くには長すぎるので省略)
OpenCVから使う場合、「vcgencmd get_camera」コマンドの結果が下記となるようにする。

:::note info
supported=1 detected=1, libcamera interfaces=0
:::

なお、ラズパイではvenvは使用しないで素のpipインストールをする。いろいろ動かない。

記事末尾にpip freezeの結果を書きました。参考まで。

:::note info
主要なライブラリのバージョン
numpy : 1.24.1
OpenCV : 4.6.0.66
streamlit : 0.62.0
protobuf : 3.19.0
:::

# protobufについてのフォーラム
https://discuss.streamlit.io/t/streamlit-run-with-protobuf-error/25632

# サンプルコード
Sleep無くしても全く30FPSで表示されないが、とりあえずタイムラプス配信みたいにはできる。

```main.py
import streamlit as st
import cv2
import time

cap = cv2.VideoCapture(0)

# キャプチャサイズとフレームレート設定
cap.set(cv2.CAP_PROP_FRAME_WIDTH,640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
cap.set(cv2.CAP_PROP_FPS, 30)

# 一応オートで焦点、露出、ホワイトバランス設定しておく
cap.set(cv2.CAP_PROP_AUTOFOCUS, 1)
cap.set(cv2.CAP_PROP_AUTO_EXPOSURE, 1)
cap.set(cv2.CAP_PROP_AUTO_WB, 1)

imgst = st.empty()
# アプリ終了ボタン
exit_app = st.sidebar.button("終了")

while True:
    ret, img = cap.read()
    if ret:
        # OpenCVで得られる画像はBGRなのでstremlit表示用にRGBに
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        # streamlitに流す
        imgst.image(img)

    if exit_app:
        # ボタン押下で抜ける
        break

    # あんまりサッサカ取得すると固まるので待つ
    time.sleep(1)

cap.release()
cv2.destroyAllWindows()
print("End streamlit application.")

```

```
streamlit run main.py　--browser.gatherUsageStats false
```
※ラズパイで確認用のブラウザが立ち上がるとうざいので引数追加

# こんな感じ
逆光だとなかなかひどい画で。
定点カメラとしては優秀か。streamlitのいい点はスマホで簡単にアクセスできるところ。

![cap_streamlit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283529/5552ab25-717e-b70a-eec9-903bdab84166.png)



# requirements参考
動作したpipのrequirements一式を書き出しておく。(関係ないのも交じってますが)

<details open><summary>requirements.txt</summary>

```requirements.txt
altair==5.5.0
appdirs==1.4.4
arandr==0.1.10
astor==0.8.1
astroid==2.5.1
asttokens==2.0.4
attrs==24.2.0
autobahn==17.10.1
Automat==20.2.0
automationhat==0.2.0
backcall==0.2.0
base58==2.1.1
bcrypt==3.1.7
beautifulsoup4==4.9.3
blinker==1.4
blinkt==0.1.2
boto3==1.35.81
botocore==1.35.81
buttonshim==0.0.2
cachetools==5.5.0
Cap1xxx==0.1.3
cbor==1.0.0
certifi==2020.6.20
chardet==4.0.0
click==7.1.2
colorama==0.4.4
colorzero==1.1
constantly==15.1.0
cryptography==3.3.2
cupshelpers==1.0
cycler==0.10.0
Cython==0.29.21
dbus-python==1.2.16
decorator==4.4.2
distro==1.5.0
dnspython==2.0.0
docutils==0.16
drumhat==0.1.0
enum-compat==0.0.3
envirophat==1.0.0
ExplorerHAT==0.4.2
Flask==1.1.2
fourletterphat==0.1.0
gpg===1.14.0-unknown
gpiozero==1.6.2
guizero==1.1.1
html5lib==1.1
hyperlink==19.0.0
idna==2.10
incremental==17.5.0
ipykernel==5.4.3
ipython==7.20.0
ipython_genutils==0.2.0
isort==5.6.4
itsdangerous==1.1.0
jedi==0.18.0
Jinja2==2.11.3
jmespath==1.0.1
jsonschema==4.23.0
jsonschema-specifications==2024.10.1
jupyter-client==6.1.11
jupyter-core==4.7.1
kiwisolver==1.3.1
lazy-object-proxy==0.0.0
logilab-common==1.8.1
lxml==4.6.3
lz4==3.1.3+dfsg
Markdown==3.3.4
MarkupSafe==1.1.1
matplotlib==3.3.4
mccabe==0.6.1
microdotphat==0.2.1
mock==4.0.3
mote==0.0.4
motephat==0.0.3
mpi4py==3.0.3
mypy==0.812
mypy-extensions==0.4.3
narwhals==1.18.3
nudatus==0.0.5
numpy==1.24.1
oauthlib==3.1.0
opencv-python==4.6.0.66
packaging==24.2
pandas==2.2.3
pantilthat==0.0.7
parso==0.8.1
pbr==5.5.0
pexpect==4.8.0
pgzero==1.2
phatbeat==0.1.1
pianohat==0.1.0
picamera==1.13
picamera2==0.3.12
pickleshare==0.7.5
pidng==4.0.9
piexif==1.1.3
piglow==1.2.5
pigpio==1.78
Pillow==8.1.2
prompt-toolkit==3.0.14
protobuf==3.19.0
psutil==5.8.0
py-ubjson==0.16.1
pyasn1==0.4.8
pyasn1-modules==0.2.1
pycairo==1.16.2
pycodestyle==2.6.0
pycups==2.0.1
pydeck==0.9.1
pyflakes==2.2.0
pygame==1.9.6
Pygments==2.7.1
PyGObject==3.38.0
PyHamcrest==1.9.0
pyinotify==0.9.6
PyJWT==1.7.1
pylint==2.7.2
PyNaCl==1.4.0
PyOpenGL==3.1.5
pyOpenSSL==20.0.1
pyparsing==2.4.7
pypng==0.0.20
PyQRCode==1.2.1
PyQt5==5.15.2
PyQt5-sip==12.8.1
pyserial==3.5b0
pysmbc==1.0.23
python-apt==2.2.1
python-dateutil==2.9.0.post0
python-prctl==1.7
python-snappy==0.5.3
PyTrie==0.2
pytz==2024.2
PyYAML==5.3.1
pyzmq==20.0.0
QScintilla==2.11.6
qtconsole==5.0.2
QtPy==1.9.0
rainbowhat==0.1.0
referencing==0.35.1
reportlab==3.5.59
requests==2.25.1
requests-oauthlib==1.0.0
requests-toolbelt==0.9.1
responses==0.12.1
roman==2.0.0
rpds-py==0.22.3
RPi.GPIO==0.7.0
RTIMULib==7.2.1
s3transfer==0.10.4
scipy==1.6.0
scrollphat==0.0.7
scrollphathd==1.2.1
semver==2.10.2
Send2Trash==1.6.0b1
sense-emu==1.2
sense-hat==2.6.0
service-identity==18.1.0
simplejpeg==1.6.4
simplejson==3.17.2
six==1.16.0
skywriter==0.0.7
sn3218==1.2.7
soupsieve==2.2.1
spidev==3.5
ssh-import-id==5.10
streamlit==0.62.0
thonny==4.0.1
toml==0.10.1
tornado==6.1
touchphat==0.0.1
traitlets==5.0.5
Twisted==20.3.0
twython==3.8.2
txaio==20.4.1
typed-ast==1.4.2
typing_extensions==4.12.2
tzdata==2024.2
tzlocal==5.2
u-msgpack-python==2.3.0
uflash==1.2.4
unicornhathd==0.0.4
urllib3==1.26.5
v4l2-python3==0.3.2
validators==0.34.0
watchdog==6.0.0
wcwidth==0.1.9
webencodings==0.5.1
Werkzeug==1.0.1
wrapt==1.12.1
wsaccel==0.6.2
zope.interface==5.2.0
```
</details>