最近、ラズパイが入手しづらいのだ。コロナの影響とか半導体不足とかいろいろあるのかもしれないけど、おそらく世界的に需要が増して供給が間に合ってないと思われる。
そんな中でも運良く比較的新しいRaspberry Pi Zero 2 Wを入手できたので、これを活用しようと思って、前々から気になっていたブルーバックス「Raspberry Pi ではじめる機械学習」を購入して勉強してみているのだ。
さてさてこの書籍は当然ながら、実際にRaspberry Piでプログラムを動かしたりしながら、機械学習を理解しようとするものなんだけど、実習に使うラズパイはModel 3Bが推奨されてるのだ。少し前に出版されてるので当時の最新機種ということなので今ならおそらくModel 4Bの4GB版とかを推奨するんじゃないかと思われる。でも今は3Bも4Bも非常に入手しづらいのだ。多分販売サイトで毎日何度も在庫チェックしてあったら即買い!って感じじゃないと入手できない。俺がPi Zero 2 Wを入手できたのはスイッチサイエンスで抽選販売をしてて、当選できたからなのだ。
入手できたので早速勉強を始めようと思って、本に書かれている通り(実際は本じゃなくて、サポートサイトに詳しく手順が出てるんだけどね)にOSのインストールからやってみたんだけど、これが一筋縄では行かなかったのだ。。。
この実習ではディスプレイをつないでmatplotlib(Pythonでグラフを表示するためのライブラリ)で作ったグラフを表示するようになってるのだ。そのためにはRaspberry Pi OSのフルバージョンをインストールする必要がある。で、入手したPi Zero 2 WにOSを入れて動かしてみたんだけど、これがもうね、もっさりしすぎてて使い物にならない感じなんだよね。もしかしたらHDMIで直接ディスプレイをつないだらビデオ処理が軽くなって多少はマシなのかもしれないけど、そうすると専用のディスプレイを用意するか、普段使いのPCのディスプレイを切り替えて使うかってことになる。新たに買うような金はないし、切り替えは面倒。おのずとヘッドレスってことになっちゃうんだよね。
でもヘッドレスだと遅い。遅すぎる。
そこでいろいろと調べて、PCにX Window サーバーを入れて、ラズパイの画面をPCに転送すればラズパイ側はあまり負荷がかからないことが分かってきたので試してみたところ、そこそこの軽さで動くことが分かったので、その手順をメモしておこうと思う。
1.OSインストール
OSインストールはラズパイ界の常識になってる「Raspberry Pi Imager」を使うのだ。
最近のRaspberry Pi Imagerは非常に便利になってるので、ヘッドレスでのインストールがらくちんなのだ。俺は最近はこんな感じで公開鍵認証で接続するようにしてるのだ。まあ、どっちみちLAN内でしか使わないし、そんなにセキュリティを高めても仕方ないんだけどね。
ちなみに、これをやるには次の手順が必要。
(1)キーペアの生成
まず、母艦に「.ssh」ディレクトリがあるか確認する。Windows PowerShellを起動して
ls ~/.ssh
を打ち込む。「.ssh」があればディレクトリ内のファイルとかが表示されるし、なければエラーが吐かれる。
なかったら
mkdir ~/.ssh
でディレクトリを作る。
その後、
ssh-keygen
を打ち込むと、キーの保存先とパスフレーズを聞かれるので、いずれもEnterだけ入力する。もし公開鍵認証でもパスワードを聞いてほしい場合はパスフレーズに何か入れるとよい。
もう一度
ls ~/.ssh
を打ち込むと「id_rsa」と「id_rsa.pub」の2つのファイルができている。
(2)公開鍵をコピー
エクスプローラーを起動して、アドレスバーに%USERPROFILE%\.ssh
をコピペしてEnterを入れると、「.ssh」フォルダが開くので、中にある「id_rsa.pub」をメモ帳で開くとこんな感じの1行があるはず。
この1行の文字列をコピーして、Raspberry Pi Imagerの設定の「authorized_keys」のところに入力するのだ。
他にもWifiのSSIDとかパスワードを入れておけば、ラズパイを起動すると勝手に宅内LANのWifiに接続してくれるので便利だよね。
ロケールを日本にしてくれる機能もあると良いと思うけどまだそれはできないみたい。
2.ラズパイ起動
Imagerで作ったマイクロSDをラズパイにセットして起動するのだ。数分待つとLEDの点滅が落ち着いてOSインストールが終わったことが分かる。PowerShellかコマンドプロンプトから
ssh ユーザー名@ホスト名.local
を入力すると(キーペアを作るときにパスフレーズを指定してなければ)パスワードなしでつながる。
3.日本語化
「Raspberry Pi ではじめる機械学習」ではシェルのエラーメッセージなどが日本語で表示される前提なので、日本語化しておく必要がある。日本語化するのは「raspi-config」を使うのが簡単なので、各自でググるかこのあたりを参考にして日本語化しておく。
4.scikit-learnのインストール
本だけを読んでると、scikit-learnのインストールで躓くことになると思う。インストールできないのだ・・・。でもサポートサイトを見ればすんなり進むはず。scikit-learnのインストールは以下のコマンドで。
sudo apt update sudo apt install python3-sklearn
5.演習用サンプルファイルのダウンロード
日本語化したら、演習で使うプログラムをダウンロードしておくのだ。
mkdir bluebacks cd bluebacks wget https://bluebacks.kodansha.co.jp/books/9784065020524/appendix/attachments/mlbb-sample.zip unzip mlbb-sample.zip ls
wgetするサンプルプログラムのURLは変わってたりする可能性がなくはないので、サポートサイトで確認するのが吉。
6.母艦をX windowサーバーにする
(1)VcZsrvのインストール
このあたりを参考にしてやってみた。
ただし俺の環境ではインストール後に「すべてのアプリ」の中に「XLaunch」はできてなくて、ショートカットはデスクトップにしかなかった。「Start Menu Shortcuts」のチェックを外した覚えはないんだけど。
(2)VcZsrvの設定
↑の参考サイトのとおり、ショートカットから起動して初期設定するのだ。「Save configuration」でデスクトップとかに設定ファイルを保存しておくと、次からはその設定ファイルをダブルクリックすれば良いので便利。
(3)外部からのアクセス許可
↑の参考サイトのとおり、「C:\Program Files\VcXsrv\X0.hosts」のファイルに接続元(ラズパイ)のIPアドレスを書き込む。ちなみにIPアドレスじゃなく、「ホスト名.local」でもいけるみたい。
7.ラズパイをX windowクライアントにする
(1)環境変数の設定
ちょっと順序からするとおかしい感じがするけど、↑の参考サイトにあるので、先にラズパイの環境変数を設定してしまうのだ。
ラズパイにsshで接続した状態で、
cd ~ touch .bash_profile echo export DISPLAY=母艦のホスト名.local:0.0 >> .bash_profile source ~/.bash_profile
(2)X windowクライアント
このあたりを参考にX ウィンドウとやらをインストールする。ちなみにブラウザは要らなそうなので入れないことにしたのだ。
sudo apt-get install libxm4 mwm xserver-xorg xinit x11-xserver-utils xterm x11-apps
(3)設定ファイル
設定ファイルを作る必要があるそうなので、↑の参考サイトのとおりに作る。
touch .xinitrc vi .xinitrc
エディタが開いたら以下を入力。ごめんなさい、内容はちゃんと理解できてません。。。
#!/bin/sh
xset s off
xset -dpms
xset s noblankxsetroot -solid darkslateblue
xeyes -geometry 70×70+5+5 &
xclock -geometry 70×70+105+5 &
xterm -geometry 80×20+100+100 &
exec mwm
(4)X windowクライアントの起動
startx
さてさて、ちゃんとできてるかな・・・・。
ということで、matplotlibを使う実習を実際にやってみるのだ。
cd bluebacks python ml-04-02-2feat2class01.py
タイトルバーにFigure1と書かれた窓が開いたら成功。
8.IDE
それから、本の中ではIDLEという何か(詳しく知らないけどPythonのプログラム開発環境なのかな・・・)でPythonを実行したりしてるけど、開発用のエディタといえばVSCodeだと思うので、俺はVSCodeでラズパイに接続して作業してるのだ。
こんな感じ。
VSCodeについてはこのあたりを参考に。ラズパイに接続する方法はこのあたりを参考にしてね。
実はまだこの本の実習は最後まで終えてないのだ。だから、この環境構築をしても、最後までちゃんと実習できるかどうかは今のところ不明。悪しからず。
9.追記
実習を進めていくと第8章でカメラモジュールを接続して画像処理をするようになってるんだけど、Raspberry Pi OSのLiteバージョンをインストールした場合、Pythonのカメラ用モジュールが入ってないっぽいのだ。
その場合、第8章の最初の実習 ml-08-01-cameracheck.py を実行するとこんな感じのエラーが出る。
Traceback (most recent call last): File "/home/pi/bluebacks/ml-08-01-cameracheck.py", line 2, inimport picamera ModuleNotFoundError: No module named 'picamera'
そんなときはこのあたりを参考に以下のコマンドを実行してみると良いカモ。
sudo apt update sudo apt install python3-picamera
10.追記 その2
実習を進めていくと第9章で音声出力が必要になるんだけど、今回はヘッドレスで使っているのでHDMIでつないだディスプレイから音を出すことができないのだ。どうしようかなーと思ってググってたらこのような記事を見つけたのだ。この方はUSB接続のサウンドカードを購入して音を出してるのだ。だから俺も・・・と思ったら、この方と同じサウンドカードは入手できず、仕方なくLinuxで自動認識されると書かれてるこいつを買ってみた。
これを認識させるまでにやったのはこんな感じ。
sudo apt update sudo apt full-upgrade -y sudo apt autoremove -y sudo apt clean sudo reboot
なんだかこの後、raspi-configが使えなくなったので、意味分からんと思いながらインストール。
sudo apt install raspi-config
そして(イマイチ好きでないnoteの)この記事を参考にしながら、多少格闘しつつ音が出るところまでやってみた。
sudo lsusb
USBサウンドーカードはこんな感じに認識されてる。
Bus 001 Device 002: ID 08bb:2902 Texas Instruments PCM2902 Audio Codec
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
cat /proc/asound/cards
サウンドデバイスはこうなってる。
1 [Device ]: USB-Audio – USB PnP Sound Device
C-Media Electronics Inc. USB PnP Sound Device at usb-3f980000.usb-1, full speed
sudo vi /usr/share/alsa/alsa.conf
14行目くらいの“~/.asoundrc”の頭に#を付けてコメントアウト、「defaults.ctl」を検索して、以下の2つのエントリを0から1に更新。
defaults.ctl.card 1
defaults.pcm.card 1
aplay /usr/share/sounds/alsa/Noise.wav
これでサウンドカードにつないだヘッドホン(またはイヤホン、スピーカー)からノイズが出るはず。