Raspberry Piで画像認識をやる:その① 環境設定編
Raspberry Pi カメラを買いました。買ったからには何かやります、ええ。ということで、王道、画像認識をやってみるまでの記事です。買ったカメラを並べたのがこちら。
これを組み付けるために、ケースを開き、カメラモジュールを差す端子の、黒い部分を上に軽く引っ張り、開きます。
そしてこの写真の向きにPiカメラを差し込めば完成です。
差し込みが終わったところで、
sudo raspistill -o test.jpg
これでカメラのテストをすることができます。うまくいったので、画像認識をするための環境構築、やっていきましょう。
OpenCVのインストール
RaspberryPiへのOpenCVインストール手順 この記事ではPython3のバージョンが4.1.1でしたが、インストールしてみると、4.4.0でした。こういうのはバージョン違いで何とかなるものだと信じながら…
pi@raspberrypi:~ $ python3
Python 3.7.3 (default, Jul 25 2020, 13:03:44)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.7/dist-packages/cv2/__init__.py", line 5, in <module>
from .cv2 import *
ImportError: libcblas.so.3: cannot open shared object file: No such file or directory
>>>
はい、ダメでしたね。大人しく記事通りやりましょう。先ほどのライブラリをアンインストールし、再チャレンジです。
pi@raspberrypi:~ $ python3
Python 3.7.3 (default, Jul 25 2020, 13:03:44)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.7/dist-packages/cv2/__init__.py", line 3, in <module>
from .cv2 import *
ImportError: libcblas.so.3: cannot open shared object file: No such file or directory
>>>
同じやないかい! 大人しく足りないライブラリを入れていきます。【Raspberry Pi】Raspberry Pi Zero WにOpenCVの環境を構築する という記事に書かれているコマンドを順に実行します。たくさんのライブラリが追加でインストールされるのを見ると、全然ライブラリが足りていませんでしたね…。
そうこうしているうちにこちらの記事を発見。Pythonおよび機械学習勉強用のRaspberryPiの構築 (RaspberryPi4 & Buster版 (RaspberryPi3も可)) 途中まではできているので、
numpy
sudo pip3 install numpy
# scipy
sudo pip3 install scipy
# sklearn
sudo pip3 install scikit-learn
# matplotlib
sudo pip3 install matplotlib
# pandas
sudo pip3 install pandas
# seaborn
sudo pip3 install seaborn
# Tensorflow
sudo pip3 install tensorflow
sudo pip3 install flask flask_cors -U
# OpenCV
sudo pip3 install opencv-python==4.1.1.26
# 環境変数の変更と反映 (← これをやらないと `import cv2` 実行時にエラーになる)
echo "export LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1" | tee -a ~/.bashrc
source ~/.bashrc
ん、最後の行、まさにさっきエラーになったところじゃないですか。むりやりライブラリを入れなくてもうまくいったのかもしれませんね(まあうまくいくことのほうが少ないですが)
jupyter labをインストール
この記事ではjupyter labがいいと書いてあるのでインストールします。jupyter labは初耳ですが、JupyterLabのすゝめ この記事を読めばその素晴らしさに感化されることでしょう。
sudo pip3 install jupyterlab
jupyter notebook --generate-config
python3 -c 'from notebook.auth import passwd;print(passwd())'
ここで使いたいパスワードを入力。
出力はどこかにメモしておく。
ここまでやって、vi ~/.jupyter/jupyter_notebook_config.pyと、設定をいじります。なんかたくさん♯が付いていますが、下のように書き換えます。♯はもちろん消します。
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.password = '<ハッシュ化されたパスワード>'
さて、jupyter labをサービス化するらしいのでやってみます。
sudo vi /etc/systemd/system/jupyter.service から、
[Unit]
Desctiption = Jupyter Lab
After = syslog.target
[Service]
Type = simple
WorkingDirectory = /home/pi
Restart = always
ExecStart = /usr/local/bin/jupyter lab
User = pi
Group = pi
[Install]
WantedBy = multi-user.target
そしていつものやつです。
# サービス有効化
sudo systemctl enable jupyter.service
# サービス開始
sudo systemctl start jupyter.service
そのあとでhttp://<ip_address>:8888/lab にアクセスするとjupyter labが開けるらしいのですが…
はい、これもいつも通り。jupyter labを開くとブラウザが立ち上がるのですが、そもそもさっきのファイルで
c.NotebookApp.open_browser = False
ってやってるからブラウザが開くのもおかしい…。と思ってコマンドラインを見てみると出ましたエラー。
[E 18:59:28.607 LabApp] Exception while loading config file /home/pi/.jupyter/jupyter_notebook_config.py
Traceback (most recent call last):
File "/usr/local/lib/python3.7/dist-packages/traitlets/config/application.py", line 737, in _load_config_files
config = loader.load_config()
File "/usr/local/lib/python3.7/dist-packages/traitlets/config/loader.py", line 616, in load_config
self._read_file_as_dict()
File "/usr/local/lib/python3.7/dist-packages/traitlets/config/loader.py", line 648, in _read_file_as_dict
exec(compile(f.read(), conf_filename, 'exec'), namespace, namespace)
File "/home/pi/.jupyter/jupyter_notebook_config.py", line 286
c.NotebookApp.ip = '*'
^
IndentationError: unexpected indent
Pythonおなじみのタブのインデントエラーです。どうやら大量のコメントアウトをそのままにしているのが問題らしく、~/.jupyter/jupyter_notebook_config.py を
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.token = ''
の3行にしたらアクセスできました。あと、上記のパスワード設定がうまくいかなかったので、トークンを空にして、パスワードなしでアクセスできるようにしています。