Raspberry Pi4でpythonの環境を作ってOpenCVをインストールするまで

Raspberry Piの購入

MacBook(USB-C対応)で作業する前提で記載します。
この場合、必要な物品は以下の4点です。

(最近は、Macを買うと電源などでUSB-Cのケーブルが付いていることが多いので周りを見渡せばあるでしょう)
(Raspberry Piは、USBで結線すれば、給電およびsshのログインが可能です。)
ですので、Raspberry Pi用のケースや電源ケーブルは、お好みで大丈夫です。

Raspberry Piの本体は、amazonなどでも売っていますが、今回は正規代理店のKSY経由で、
Pi4のメモリが8Gbyte版を購入しました。

SDカードの選び方は、以下のブログが詳しいです。
blog.soracom.com

Raspberry Piのセットアップ

以下がスタートページで、ここからRaspberry Pi Imagerをダウンロードします。
www.raspberrypi.org

32bit OSが安定版ですが、8Gbyte版を買った身としては、32bitだとメモリが勿体無いことになるので、以下の64bit版をインストールします(今回は、GUIが要らないのでLiteを選択しました)。
www.raspberrypi.org

ダウンロードしたImagerを開き、「Use custom img」から上でダウンロードした64bit版のRaspberry Piを指定して書き込みます。

Raspberry PiMacの接続

基本設定

SSHでログインするために、Raspberry PiSSHサーバを有効にします。
先ほどRaspberry Pi OSを書き込んだSDカードが、/Volumes/boot配下にmountされているとすると、以下のコマンドで空のファイルを作成します。

touch /Volumes/boot/ssh

WiFiに接続するのであれば、WiFiの設定をして終わりです。
しかし、今回はMacからUSB-Cで有線接続するため、以下の設定(1)(2)を行います。

(1)/Volumes/boot直下のconfig.txtの最後に、以下を追記します。

dtoverlay=dwc2

(2)/Volumes/boot直下のcmdline.txt の途中(rootwaitとquietの間)に以下を追記します。

modules-load=dwc2,g_ether

パスワードログインの廃止と証明書ログイン

初期設定では、以下でコマンドの後(ユーザ名が「pi」、ホストがraspberrypi.local)、
パスワードとして、「raspberry」を入れるとログインできます。

ssh pi@raspberrypi.local

この状態だと、raspberrypiにパケットが届く人が全員ログインできてしまうので、証明書を使った認証に切り替えます。
(隣の席に悪戯っ子が座っていると、slコマンドを入れられてしまったりします)

(1)証明書を作成する
以下のコマンドで、コマンドを実行した直下に、秘密鍵(raspi01)と公開鍵(raspi01.pub)が作成されます。

ssh-keygen -t rsa -b 4096 -f raspi01

※fオプションを外すと、デフォルトの位置(/Users/ユーザ名/.ssh 配下)に作成してくれます。
※passphraseをなしにする場合は、2回enterキーを叩きます。

(2)秘密鍵を配置する
以下で、所定のディレクトリへ移動します。

mv raspi01 raspi01.pub ~/.ssh

※公開鍵を移動させなくても動きますが、無くすと面倒なので忘れない所に保存しておいた方が良いと思います。

秘密鍵の権限を自分だけが読み取れる様に書き換えます。

chmod 600 ~/.ssh/raspi01

(3)公開鍵を配置する
以下のコマンドで、Raspberry Pi側へ公開鍵を配置します。
(パスワードは、変えていなければ「raspberry」です。)

ssh-copy-id -i ~/.ssh/raspi01.pub pi@raspberrypi.local

(4)証明書でログインできることを確認する
以下でログインできれば、問題なく設定できています。

ssh -i ~/.ssh/raspi01 pi@raspberrypi.local

(5)パスワードのログインを無効化する。
(Raspberry Piにログインして)/etc/ssh/sshd_config に以下を追記します。
※ 既に、該当行がコメントされているはずなので、以下の様に書き換えます。

PasswordAuthentication no

普通に開くと、read onlyなのでsudoで実行します。

sudo vi /etc/ssh/sshd_config

その後、Raspberry Piを再起動します。

sudo reboot

(6)パスワードでログイン出来なくなっていることを確認する。

ssh pi@raspberrypi.local

だと、こんな感じに弾かれる様になりました。

pi@raspberrypi.local: Permission denied (publickey).

※外部に公開する時は、ちゃんとセキュリティを固めましょう。あくまで隣人対策です。

ssh configの設定による簡単ログイン

~/.ssh/config に以下を追記します。

HOST pi
           HostName raspberrypi.local
           User pi
	   IdentityFile ~/.ssh/raspi01

次回から、以下のコマンドでラズパイにsshでログイン出来る様になります。

ssh pi

Raspberry Piからの(Macを介した)インターネット接続

(Macを介してインターネットに接続します。)

システム環境設定 > 共有 > インターネット共有 を選び
「RNDIS/Ethernet Gadget」にチェックボックスを入れます。

Python環境の構築

Python環境の構築前に、ラズパイ自体をアップデートします。

sudo apt update
sudo apt upgrade -y
sudo reboot

pythonは、既に入っているはずなので、以下で、pipだけインストール/アップデートします。

sudo apt install python3-pip -y
pip3 install --upgrade pip

jupyterのインストール

pip3 install jupyter

ただ、このままだと、Macからラズパイ上で動いているJupyter-notebookに接続できません。
そこで、以下のコマンドで、configファイルを作成します。

jupyter notebook --generate-config

~/..jupyter/jupyter_notebook_config.py の以下の箇所で、リモートのIPを許可します。

## The IP address the notebook server will listen on.                                                                                                                     
#  Default: 'localhost'                                                                                                                                                   
c.NotebookApp.ip = '*'

後は、いつものコマンドでjupyterを起動します。

jupyter-notebook [jupyterで使うディレクトリ]

virtualenvの設定

virtualenvの環境を構築し、プロジェクトごとにpythonのライブラリの依存関係が混らない様にします。\

pip3 install virtualenv
(sudo reboot) # 必要に応じてリブート

※同じものを指しているので上はpipでも可 (whichコマンドで調べてください)

例えば、PoseNet用の環境だと、以下の様な感じです。(例は、「pose_net」名前で作っています)

virtualenv pose_net
source pose_net/bin/activate

※環境外に出る場合は、deactivateです。

OpenCVのインストール

OpenCVのインストールは、以下が詳しいです。
64bit版なので、こちらを参照します。
qengineering.eu
ドキュメントの前の方は、設定の確認になります。
当該のスクリプト(のDLと実行方法)は、「Installation script」の章にありますので、そちらを実施します。
(注意:当該スクリプトの実行には、1時間以上かかりました)

32bit版の場合は、以下です(こちらは、以前、別の32bit版のラズパイで試して動きました)。
qengineering.eu

python(のインタプリタ)を起動して、OpevCVがimportできれば大丈夫です。

>>> import cv2 

以上で、Macからラズパイ上のJupyterに接続して、画像解析ができる様になりました。

Raspberry Piの終了

SSHで接続した状態で以下のコマンドで終了
> sudo shutdown -h now