2023年3月28日火曜日

書籍で用いたコマンドおよび追加情報(古い情報)

より新しい情報

Raspberry Pi 5 が海外で発表され、それに対応した OS Bookworm がリリースされるに伴い、本ページの内容は古くなっています。下記の新しいページをご覧ください。 以下は、それ以前の古い情報を残しておいたものです。

サンプルプログラムについて

サンプルプログラムおよび付録PDFは下記のリンクからダウンロードしてください。

本ページで表示するコマンドの利用方法

本ページには、本書の演習を実行するために必要なコマンドを全て記し、さらに、本書への追加情報を記していきます。

コマンドを全て本ページに記すことには、二つの目的があります。

一つ目の目的は、ソフトウェアのインストールコマンドが本書刊行後に変更された場合に、最新情報を提供することです。ですから、本書のコマンドと本ページのコマンドが異なる場合は、本ページの情報が最新であるとお考え下さい。実際、書籍では Python2 用のインストールコマンドを記しましたが、本ページでは Python3 用のインスト―ルコマンドに変更しております。本ページのコマンドをコピー&貼り付けによりご利用ください

二つ目の目的は、コマンドの入力がうまくいかないときのために、コマンドをコピーできる形式で提供することです。

本ページのコマンドをコピーにより活用するためには、まずRaspberry Pi上のブラウザ(Chromium)で本ページを開きます。

そして、コピーしたいコマンドをマウスでなぞり色を反転してください。その状態からそのコマンドをコピーするには下記の二つの方法のうちどちらかを実行してください。
  • 色を反転した領域をマウスで右クリックして「コピー」を選択する
  • キーボードの「Ctrl」キーを押しながら「c」キーを押す(Ctrl-c)
そして、コピーされたコマンドをターミナルソフトウェアに貼り付けるには、下記の三つの方法のうちどれかを実行してください。
  • LXTerminalのメニューから「編集」→「貼り付け」を選択する
  • LXTerminal上でキーボードの「Ctrl」キーと「Shift」キーを押しながら「v」キーを押す(Ctrl+Shift+v)
  • LXTerminal上でマウスのホイールを押し込む(ただし、この方法は正確には「コピーされた文字を貼り付ける」のではなく「マウスで色が反転された文字を貼り付ける」という動作になります)
いずれかの方法でLXTerminalにコマンドが貼り付けられたら、そのままキーボードの「Enter」キーを押せばコマンドが実行されます。

なお、2つのコマンドが2行にわたって連続して書かれている場合、コピー、貼り付け、実行はコマンド一つごとに行ってください。

3章

p.66 圧縮されたサンプルファイルの展開に関する注意

NOOBS 3.1.1 (Raspbian 2019-06-20) 以降では、圧縮ファイルを展開するためのソフトウェアのデフォルトの設定が変化しましたので利用の際は注意が必要です。
下図(左)のように、展開先のデフォルトが「/tmp」とされ、また、展開時に自動的にフォルダが作られるようになっています。
これを、下図(右)のように
  • 展開先に「 /home/pi 」または「 /home/pi/bluebacks 」と記入。ただし、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されているため、 この記述の pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「 /home/kanamaru 」や「 /home/kanamaru/bluebacks 」となる、ということです。
  • 「Ensure a containing directory」のチェックを外す
の2点を行ってから「展開」ボタンを押すようにしましょう。展開先に記す文字は、このページからコピー (Ctrl-c) して貼り付ける (Ctrl-v) と安心です。



p.68 インストールできるソフトウェアの一覧を更新するコマンド

sudo apt update

p.68 scikit-learnをインストールするためのコマンド

sudo apt install python3-sklearn
2020年5月より本ページでは Python3 用のインスト―ルコマンドのみを掲載することにしました。Python2 では動かない演習が出てきたためです。そのため、書籍に記されている Python2 用のインスト―ルコマンドではなく、本ページの Python3 用のインスト―ルコマンドをご利用ください。上で紹介したように、本ページのコマンドをコピーしてターミナルに貼り付けて実行するのが簡単です。

引き続き、以下の Thonny Python IDE に関する注釈もお読みください。

p.70:開発環境IDLEの代替としてThonny Python IDEを用いる方法

2019年11月現在、本書で解説した開発環境IDLEはデフォルトでRaspbianに含まれていません。IDLE を別途インストールして利用する方法もあるのですが、より簡単にPythonプログラムを実行する方法として、デフォルトでインストール済の「Thonny Python IDE」を用いる方法をここで紹介します。

Thonny Python IDEはpython3用のプログラムを実行するための環境です。本書のプログラムはPython3での実行をサポートしていますので問題なく実行できます。 本ページに記したコマンドのコピー&貼り付けにより本書の演習を行うと、自然と Python 3 で演習を行うことになります。

さて、メニューの下図に示されている「Thonny Python IDE」をマウスでクリックするとThonny Python IDEが起動します。


次図のように、「LOAD」がファイルの読み込み、「RUN」がプログラム実行、「STOP」がプログラム停止であることを理解すれば問題なく利用できるでしょう。

プログラムの停止は、「STOP」ボタンによる方法以外に、「Shell」と書かれた領域の上でキーボードの「Ctrl-c」によりプログラムを終了するという方法もあります。なお、Thonnyには「時々Ctrl-cが効かなくなる」という不具合があるようなので、そういうときは「STOP」ボタンでプログラムを停止すると良いでしょう。


Thonny Python IDEを用いると、8~10章で取り扱うOpenCVを用いたプログラムもIDEから実行できるというメリットがあります(IDLEでは画像処理プログラムのみコンソールから起動させたのでした)。

ただし、Thonny Python IDEを用いるとコマンドライン引数が必要なプログラムの実行に注意が必要になりますのでここで注意しておきます。

コマンドライン引数は、8章で初めて登場するものです。プログラム実行時のコマンドで例えば「python3 ml-08-03-learn.py result.pkl」のように、ファイル名「ml-08-03-learn.py」の後に付加する「result.pkl」の部分のことを指します。
この場合は、学習後の結果を保存するファイル名を「result.pkl」とするためにこのコマンドライン引数を与えています。 Thonny Python IDEでコマンドライン引数を用いるには下記の手順に従ってください。

  • 右上の「Switch to regular mode」というリンクをクリックすることで、ユーザーインターフェースをシンプルモードからレギュラーモードに変更する(Thonny Python IDEの再起動が必要)
    (後で元に戻したいときはTools→Option→General→UI modeを「simple」に)
  • レギュラーモードにしかないメニューが現れるので、「View」→「Program arguments」にチェックする(Program argumentsとはコマンドライン引数のことを表す)
  • 右上に現れた小窓に必要なコマンドライン引数を記入してからプログラムを実行
    (ml-08-03-learn.pyの場合は学習後の結果を保存するファイル名「result.pkl」を記す)

以上で、下図のように「python3 ml-08-03-learn.py result.pkl」というコマンドを実行したのと同じ効果がThonny Python IDEで得られます。なお、「Program arguments」の部分はコマンドライン引数が不要なプログラムでは空欄に戻して実行してください。



p.70:Python2とPython3について

さて、上で紹介した Thonny Python IDEを用いるということは、Python バージョン 3 を用いることを意味します。本書で利用法を解説していた Python バージョン 2 は 2020年1月1日にサポートが切れました。そのため、2020年5月より本ページでは Python3 用のインスト―ルコマンドのみを掲載することにしました。本ページに記したコマンドのコピー&貼り付けにより本書の演習を行うと、自然と Python 3 で演習を行うことになります。

なお、コマンドによりプログラムを実行する場合は、Python 2とPython 3および対応コマンドが下記のように異なりますので参考にしてください。

項目Python2用コマンドPython3用コマンド
プログラム実行コマンドpython または python2python3
IDLE実行コマンドidle-python2.7idle-python3.7
Thonny実行コマンドなしthonny
Python用プログラムインストールコマンドpipまたはpip2pip3

以下、本ページでは Python3 用のコマンドでインストール&実行を行う方法を解説していきます。

p.70:NOOBS 2.8.2 (Raspbian 2018-06-27) 以降でのIDLEの通常起動について

NOOBS 2.8.2 (Raspbian 2018-06-27) から、デスクトップのメニューから開発環境IDLEの項目が削除されています。そのため、その代替としてThonny Python IDEを用いる方法を上で解説しました。通常はこのThonny Python IDEを用いてください。
ここでは、それでも敢えてIDLEを用いたいという方のためにその方法を解説します。

ターミナル LXTerminal を起動し、下記の 2 つのコマンドを順に実行してください。Python 3 用のIDLEがインストールされます。
sudo apt update
sudo apt install idle-python3.7
Python 3 用のIDLEを起動するためには、ターミナル上で
idle-python3.7 &
を実行してください。

p.75 ml-03-01-version.pyの実行コマンド

本ページではPythonプログラムの実行コマンドも掲載しますが、本書で記したように、「TAB」キーによる補完機能をマスターすることをお勧めします。 Python3での実行コマンドはこちらです。
python3 ml-03-01-version.py
なお、Python3 でプログラムを実行すると下記のような警告が現れることがあります。
/usr/lib/python3/dist-packages/sklearn/externals/joblib.py:1: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
  import imp
この警告はプログラムに対してではなく、プログラムが用いているライブラリ内の処理に対して出力されています。ライブラリの今後のバージョンアップに伴い消えることが期待される警告です。そのためこのような警告(DeprecationWarning や FutureWarning など)は気にする必要はありません。

4章

p.117 古いバージョンのscikit-learnでml-04-04-2feat3class.pyを実行すると

3章で解説したように、本書ではStretchと呼ばれるバージョンのRaspbianのみをサポートしています。Jessieという古いバージョンのRaspbianでは、インストールされるscikit-learnのバージョンが0.14.1と古いため、ml-04-04-2feat3class.pyを実行したきに
TypeError: __init__() got an unexpected keyword argument 'decision_function_shape'
というエラーが出てプログラムが終了します。119ページで解説したdecision_function_shapeというパラメータはscikit-learnのバージョン0.17で導入されたためです。そのため、Stretchというバージョン以降のRaspbianをお使いください。

5章

p.143 古いバージョンのscikit-learnでml-05-01-2feat3class-nn.pyを実行すると

3章で解説したように、本書ではStretchと呼ばれるバージョンのRaspbianのみをサポートしています。Jessieという古いバージョンのRaspbianでは、インストールされるscikit-learnのバージョンが0.14.1と古いため、ml-05-01-2feat3class-nn.pyを実行したきに
ImportError: cannot import name MLPClassifier
というエラーが出てプログラムが終了します。3章の73ページで解説したように、多層ニューラルネットワーク MLPClassifier の機能はscikit-learnのバージョン0.18で導入されたためです。そのため、Stretchというバージョン以降のRaspbianをお使いください。

p.153 ml-05-01-2feat3class-nn.pyを実行すると書籍と異なる図が現れる

ml-05-01-2feat3class-nn.pyは毎回同じ乱数系列を利用するため、常に同じ結果を返すとp.153で述べました。 そのこと自体は正しいのですが、2019年7月にリリースされたRasbpian Busterではscikit-learnのバージョンが 0.20.2へとアップデートされたため、書籍の図5-7と異なる図が皆さんに表示されるようになりました。

その理由は、scikit-learnのバージョンが変わり学習の終了の判定条件が変更されたからと考えられますが、これは p.153で「将来のscikit-learnのバージョンアップにより結果が変わる可能性がないとは言えません」と記した通り、 予想されていたことです(より細かく言えば、tol=0.00002 とすると、書籍の図5-7とほぼ同じ図が現れます)。

ですので、図5-7の違いについては気にせずにお読みいただいて構いません。

p.168 変更するmax_iterの値について

168ページにて、 ml-05-02-4feat3class-nn.pyで長時間実験を行うために、max_iterとtolを変更します。 このうち、max_iterにセットする値は、書籍に記したように 100000 (0が5個) ですのでご注意ください。
max_iter を 10000 (0が4個) としてしまうと、正解率100%に達しません

p.169 ml-05-02-4feat3class-nn.pyで長時間実験を行う際の警告について

ml-05-02-4feat3class-nn.pyで長時間実験を行う際、コンソールには 「Stochastic Optimizer: Maximum iterations reached and the optimization hasn't converged yet.」 という警告が現れます。
158ページに記しましたように、これは「tolの条件が満たされる前に最大エポックに達してしまった」ことを示す警告ですが、 それを意図した実験でしたので、158ページの長時間実験と同様にこの警告は無視して構いません。

6章

p.195 ImageTKのインストール用コマンド

2つの命令がありますので、1つずつ順番に実行してください。2020年5月より Python3 用のコマンドのみを記しています。
なお、2023年10月にリリースされた OS Bookworkm ではこのプログラムはインストール済だと言われますが、気にする必要はありません。
sudo apt update
sudo apt install python3-pil.imagetk

8章

p.243, Bookworm (2023-10-10 以降) および Bullseye (2021-10-30 以降) でのカメラの利用について

Raspberry Pi OS 2023-10-10 以降の OS である Bookworm および、
Raspberry Pi OS 2021-10-30 以降の OS である Bullseye では、
カメラモジュールの利用方法に大きな変更が加えられ、libcamera というライブラリを用いるようになりました。 これは、本書でカメラを用いるプログラムは、そのままでは動かなくなるということを意味します。

ただし、Bullseye では「Legacy Camera」という、これまでと互換性のあるカメラの利用方法が可能になっています。この Lecgacy Camera を用いれば本書でカメラを用いるプログラムはそのまま動作しますが、 その後にリリースされた Bookworm では Legacy Camera は廃止されています。

以上を踏まえて現状をカメラの利用方法について整理すると、以下のようになります。 32-bit 版 OS と、64-bit 版 OS とで違いがあることもわかるでしょう。

32-bit 版 Bookworm 本書の演習を picamera2 (libcamera) で実行する方法」で配布しているサンプルファイルを利用する。ただし、10章の演習を実行できないので、Bookworm を用いる場合は 64-bit 版 OS を推奨
64-bit 版 Bookworm 本書の演習を picamera2 (libcamera) で実行する方法」で配布しているサンプルファイルを利用する
32-bit 版 BullseyeLegacy Cameraモードを有効にした上で、本書付属のサンプルファイルを用いる。これが一番簡単。 またはLegacy Cameraモードを無効にした上で「本書の演習を picamera2 (libcamera) で実行する方法」で配布しているサンプルファイルを利用可
64-bit 版 BullseyeLegacy Cameraモードを有効にした上で、「本書の演習をウェブカメラで実行する方法」で配布しているサンプルファイルを利用する。 またはLegacy Cameraモードを無効にした上で「本書の演習を picamera2 (libcamera) で実行する方法」で配布しているサンプルファイルを利用可

さて、上記の方法のうち、Bullseye でのみ使える Legacy Camera モードを有効にする方法を記します。以下の方法で「Legacy Camera」のサポートを有効にすることができます(デフォルトは無効です)。

ターミナルを開いて以下の手順に従うことで、raspi-config により Legacy Camera を有効にします。
  1. 「 sudo raspi-config 」を実行することで raspi-config を起動
  2. キーボードの「↓」キーを2回押し、「Interface Options」を選択してから「Enter」キーを押す
  3. 「I1 Legacy Camera Enable/Disable」があらかじめ選択されているので、「Enter」キーを押す
  4. 「Would you like to enable legacy camera support?」と聞かれるので「←」を一回押すことで「はい」を選択し、「Enter」キーを押す
  5. 「非推奨 (deprecated) であり将来サポートされない」という趣旨のことを言われるが、「了解」が選択された状態で「Enter」キーを押す
  6. raspi-configを起動した状態の画面に戻るので、「TAB」キーを二回クリックし、「Finish」を選択した状態で「Enter」キーを押す
  7. 再起動を促されるので、「はい」が選択された状態で「Enter」キーを押す
以上で、Legacy Camera モードが有効になりますので、あとは上の表に従ってプログラムを利用してください。

p.243 カメラについて

公式カメラモジュールをまだ購入しておらず、市販のウェブカメラをお持ちだという方は、まず「本書の演習をウェブカメラで実行する方法」を試してみるのも良いでしょう。

p.243 Pi Zeroシリーズでの公式カメラモジュールの利用

Pi Zeroシリーズを用いる場合、公式カメラモジュールに専用ケーブルを用いる必要があります。Pi Zero用のケーブルは例えばこちらで購入できます。

接続例を示したのが下図です。


ケーブルを取り付ける際、金属が露出した端子面を、どちらも緑色の基板の方を向くようにします。基板上のカバーを引き出し、ケーブルを差し込んだ後でカバーを押し込むことでケーブルが固定されます。

p.248 OpenCVのインストール

なお、ここではOpenCVのインストール方法について下記の3通りの方法を解説します。
  • Python3でOpenCVを利用する場合:2019年6月以降の OS (Raspbian Buster 以降)
  • Python3でOpenCVを利用する場合:2019年4月までの OS (Raspbian Stretch まで)

p.248 Python3でOpenCVを利用する場合:2019年6月以降の OS (Raspbian Buster 以降)

2つの命令がありますので、1つずつ順番に実行してください。
sudo apt update
sudo apt install python3-opencv

p.248 Python3でOpenCVを利用する場合:2019年4月までの OS (Raspbian Stretch まで)

古いRaspbian Stretchをお使いの場合は 3 つの命令がありますので、1 つずつ順番に実行してください。
sudo apt update
sudo apt install libatlas-base-dev libjasper-dev libqtgui4 python3-pyqt5 libqt4-test
sudo pip3 install opencv-python==4.5.1.48

p.250 OpenCVを用いたプログラムの実行時のエラー

NOOBS 3.1.1 (Raspbian 2019-06-20) または NOOBS 3.2.0 (Raspbian 2019-07-10) でインストールした Raspbian Busterをお使いの場合、OpenCV を用いたプログラムを実行すると下記のエラーが出ます。
ImportError: /usr/lib/arm-linux-gnueabihf/neon/vfp/libavcodec.so.58: undefined symbol: bcm_host_is_fkms_active
これは、Raspbian の kernel のバージョンが最新の OpenCV が期待するものより古くなっていることが原因です。

解決方法は以下の2通りの方法どちらかです。
  1. 「sudo apt update」、「sudo apt dist-upgrade」で kernel を最新にする
  2. microSDカードをフォーマットして最新のRaspbianをインストールしなおす
1. の方が簡単ですのでまずこちらを試し、それで問題が出た場合は 2. を試すのが良いでしょう。

p.250 ml-08-01-cameracheck.pyの実行コマンド

Python3で演習を実行するためのコマンドはこちらです。2020年5月より Python3 用のコマンドのみを記しています。
python3 ml-08-01-cameracheck.py

p.257 ml-08-02-binary.pyの実行コマンド

Python3で演習を実行するためのコマンドはこちらです。
python3 ml-08-02-binary.py

p.257 ml-08-02-binary.pyが手の形を反映していない場合

ml-08-02-binary.pyが手の形を反映していない場合、p.258「手の形が綺麗に切り出せないときの対処法」に基づいてプログラム中のパラメータhmin、hmax、sminの値を調整しなければなりません。 著者の感覚として、様々なツールが更新されるにと伴い、執筆時に比べて適切なパラメータの値が変化しているような印象があります。

典型的には、下記のパターンでの値の変更で改善されるケースが多いでしょう。書籍p.262の図8-7に基づいて述べます。
  1. 図8-7のs_binaryが手の形を含んでいる場合
    この場合、hmaxの調整のみで良いでしょう。例えば手の形が欠けている場合、hmaxをデフォルトの30から35などのように大きくすれば、手の欠けが小さくなります。
  2. 図8-7のs_binaryが手の形を全く反映していない場合
    この場合、S成分による二値化は smin =0 とすることで無効にした方が良いでしょう。その上で hmax の調整を行い、手の形が再現されるようにします。
  3. 図8-7のs_binaryがほぼ手の形を再現している場合
    この場合、hmin=-1としてH成分による認識を無効にし、S成分のみの認識してみると綺麗に手の形が現れることがあります。
なお、このようなhmin、hmax、sminの調整は、手の形の認識を含むプログラム(じゃんけんプログラムも含む)の全てで行う必要がありますのでご注意ください。

p.259 ml-08-02-binary.pyを編集するためのコマンド

leafpad ml-08-02-binary.py
なお、NOOBS 3.2.1 (Raspbian 2019-09-26) 以降ではテキストエディタとしてleafpadではなくmousepadを用います。
mousepad ml-08-02-binary.py

p.275 ml-08-03-learn.pyの実行コマンド

Python3で演習を実行するためのコマンドはこちらです。
python3 ml-08-03-learn.py result.pkl

p.286 ml-08-04-recognition.pyの実行コマンド

Python3で演習を実行するためのコマンドはこちらです。
python3 ml-08-04-recognition.py result.pkl

9章

p.293 mpg321をインストールするためのコマンド

2つの命令がありますので、1つずつ順番に実行してください。
sudo apt update
sudo apt install mpg321

p.295 音声の出力先をピンジャックにする方法 (2023-10-10 以降の Raspberry Pi OS の場合)

2023-10-00 以降の Raspberry Pi OS では、音声の出力先をピンジャックにする方法が変わっております。 もし、デフォルトでピンジャックから音が出ていない場合、以下の指示に従ってください。なお、raspi-config コマンドを実行中は、キーボードの Esc キーが「戻る」に対応しますので、困ったら Esc キーを何度か押してみると良いでしょう。
  1. ターミナルで「 sudo raspi-config 」コマンドを実行し、設定画面を開く
  2. キーボードの「↓」キーを五回押し、「6 Advanced Options」にフォーカスを合わせる
  3. キーボードの「Enter」キーを押し、「6 Advanced Options」に入る
  4. キーボードの「↓」キーを六回押し、「A7 Audio Config」にフォーカスを合わせる
  5. キーボードの「Enter」キーを押し、「A7 Audio Config」に入る
  6. キーボードの「上」キーを一回押し、「1 PulseAudio」にフォーカスを合わせる
  7. キーボードの「Enter」キーを押し、「1 PulseAudio」を選択する
  8. キーボードの「Enter」キーを押し、「了解」を選択する
  9. キーボードの「TAB」キー二回を押し、「Finish」にフォーカスを合わせる
  10. キーボードの「Enter」キーを押すと、再起動され設定が有効になる

p.295 音声の出力先をピンジャックにする方法 (2020-12-02 以降の Raspberry Pi OS の場合)

2020-12-02 以降の Raspberry Pi OS では、音声の出力先をピンジャックにする方法が変わっております。 もし、デフォルトでピンジャックから音が出ていない場合、以下の指示に従ってください。なお、raspi-config コマンドを実行中は、キーボードの Esc キーが「戻る」に対応しますので、困ったら Esc キーを何度か押してみると良いでしょう。
  1. ターミナルで「 sudo raspi-config 」コマンドを実行し、設定画面を開く
  2. キーボードの「Enter」キーを押し、「1 System Options」に入る
  3. キーボードの「↓」キーを一回押し、「S2 Audio」にフォーカスを合わせる
  4. キーボードの「Enter」キーを押し、「S2 Audio」の設定画面に入る
  5. キーボードの「↓」キーを一回押し、「1 Headphones」にフォーカスを合わせる
  6. キーボードの「Enter」キーを押し、「1 Headphones」を選択する
  7. キーボードの「TAB」キー二回を押し、「Finish」にフォーカスを合わせる
  8. キーボードの「Enter」キーを押し、raspi-config の設定画面を終了する

p.295 音声の出力先をピンジャックにするためのコマンド (2020-02-14 までの Raspbian の場合)

amixer cset numid=3 1

p.295 2020-05-27 および 2020-08-20 の Raspberry Pi OS でイヤフォンジャックを使う

2020-05-27 および 2020-08-20 の Raspberry Pi OS では、上で2通り記した音声出力の選択ができません。 HDMIケーブル経由で音声を出力する方には問題がありませんが、Raspberry Pi 上のピンジャックから音を出力したいが音が出ないという場合は、以下の指示に従ってください。 ただし、面倒な作業ですし、今後のためにこの機会にOSを最新のものにすることをお勧めします。

ml-09-01-janken.py の場合、ファイルを mousepad や Thonny などで開き、プログラム内の311行目の「args = ['mpg321', '-q', 'ml-sound/jankenpon.mp3']」という命令を以下に変更し、ファイルを上書き保存した上で実行してください。イヤフォンジャックから音声が出るようになります。
args = ['mpg321', '-q', '-a', 'hw:1,0', 'ml-sound/jankenpon.mp3']

同様に、ml-09-02-janken-shorten.py の場合もプログラムを一部変更する必要があります。こちらのファイルの場合は変更点は二カ所あります。まず、プログラム内の313行目の「args = ['mpg321', '-q', 'ml-sound/jankenpon.mp3']」という命令を以下に変更し
args = ['mpg321', '-q', '-a', 'hw:1,0', 'ml-sound/jankenpon.mp3']
さらに、317行目の「args = ['mpg321', '-q', 'ml-sound/pon.mp3']」という命令を以下に変更してください。以上の変更が終わったらファイルを上書き保存した上で実行してください。イヤフォンジャックから音声が出るようになります。
args = ['mpg321', '-q', '-a', 'hw:1,0', 'ml-sound/pon.mp3']

p.296 ml-09-01-janken.pyの実行コマンド

GUIを用いたじゃんけんシステムです。Python3で演習を実行するためのコマンドはこちらです。
python3 ml-09-01-janken.py result.pkl
このじゃんけんシステムにロボットハンドを追加し、ディスプレイないではなく現実世界でじゃんけん勝負する方法を 「人間の手を予測するじゃんけんシステムにロボットハンドを追加する」に示しましたので、電子工作に興味のある方はご覧ください。

p.300 ml-09-02-janken-shorten.pyの実行コマンド

GUIを用いたじゃんけんシステムの音声短縮版です。Python3で演習を実行するためのコマンドはこちらです。
python3 ml-09-02-janken-shorten.py result.pkl

10章

10章全般 kerasとTensorFlowの利用について

本書では、10章の内容を keras と Theano を組み合わせて利用してきました。
2023年5月までの OS Bullseye ではこれらの方法で10章の演習を実行することができました。
しかし、2023年10月にリリースされた OS Bookworm では、これらの方法は使えなくなりました。
そのため、本ページに書いてある「keras + Theanoで10章を実行する場合の補足」は OS Bullseye までにのみ当てはまると考えてください。

2023年10月にリリースされた OS Bookworm で 10 章の演習を実行する場合、keras + Theano ではなく、keras + TensorFlow2 で実行することになります。
しかし、この方法を簡単に実行できるのは 64-bit OS のみです。ですので、Bookworm で 10 章の演習を行うには、64-bit OS が必須であるとお考え下さい。 Bookworm で 10 章の演習を行う場合、 を参考にしてください。Bullseye の64-bit 版でも上記のページは実行できます。

p.308 kerasとtheanoの利用の前に (Bullseye までの OS 限定)

10章の演習は、本書の3~9章の演習を行った後に行う前提となっています。念のため、3章~9章でインストールしたツールのインストールを一気に行うコマンドをここに記します。

なお、2019年8月よりPython2用のkerasではファイルの読み込みを伴うコマンドを行う際に「Assertion Error」が出て実行に失敗するようになりました。 そのため、2020年5月より本ページでは Python3 用のインスト―ルコマンドのみを掲載することにしています。書籍に記されているのは Python2 用のインスト―ルコマンドですが、本ページの Python3 用のインスト―ルコマンドをご利用ください。上で紹介したように、本ページのコマンドをコピーしてターミナルに貼り付けて実行するのが簡単です。

さて、3から9章までのPython3用のツールをインストールするためのコマンドは下記です。
sudo apt update
sudo apt install python3-sklearn python3-pil.imagetk mpg321
ただし、Python3用OpenCVは、OSのバージョンによりインストールコマンドが異なります。
最新の OS をお使いならば、下記コマンドでPython3用OpenCVをインストールできます。
sudo apt install python3-opencv
Rasbian Stretch までの古い OS をお使いの場合のPython3用OpenCVのインストール法は以下の2つのコマンドです。
sudo apt install libatlas-base-dev libjasper-dev libqtgui4 python3-pyqt5 libqt4-test
sudo pip3 install opencv-python==4.5.1.48
以上のコマンドを実行することで、9章までの演習を終えた状態になります (ただし、カメラを有効にするなどの設定が別途必要になります)。この状態で、以下のkerasとtheanoのインストールに進みます。

p.308 kerasとtheanoの利用に必要なツールをインストールするためのコマンド

Python3 で keras や theano を用いる際に必要なツールのインストールコマンドはこちらです。
sudo apt install liblapack-dev libhdf5-dev python3-h5py

p.309 kerasとtheanoをインストールするためのコマンド

Python3 で keras や theano を用いるためのインストールコマンドはこちらです。
sudo pip3 install keras==2.3.1 theano
なお、このコマンドを実行したとき、例えば下記のような40行程度のエラーが出ることがあります。
Exception:
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
(中略)
  File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/util/retry.py", line 315, in increment
    total -= 1
TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'
これは、インストール時のネットワークに問題があるときに出るエラーです。 Raspberry Piがネットワークに接続していないとき、および、ファイルのダウンロード元であるサーバーに問題があるときの両方で上記エラーが出ます。
あるいは、同様のエラーで
THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE.
と出る場合もあります。

まず、Raspberry Piのネットワーク接続に問題がある場合はその改善を試みてください。
一方、先方のサーバーに問題がある場合、時間をあけてからコマンドを再実行すると問題が解消される場合があります。Raspberry Pi上でpipを用いてツールをインストールする場合、サーバー側の問題なのか、何度もインストールを試みて初めてインストールに成功する、ということが多い印象があります。

p.311 kerasの設定ファイルが .keras/keras.json が生成されない

keras をインストール後、ml-03-01-version.py を実行したにもかかわらず、.keras/keras.json が生成されない、という方は、 keras のバージョン 2.4 以降がインストールされているかもしれません。
keras バージョン 2.4 以降は、TensorFlow バージョン 2 専用となるため、本書で用いる Theano とともに使うことができません。 そのため、下記コマンドを実行し、keras のバージョン 2.3.1 をインストールしてください。
sudo pip3 install keras==2.3.1 

p.311 kerasの設定ファイルを編集するためのコマンド

leafpad .keras/keras.json
なお、NOOBS 3.2.1 (Raspbian 2019-09-26) 以降ではテキストエディタとしてleafpadではなくmousepadを用います。
mousepad .keras/keras.json
なお、keras.jsonの4行の内容は順番が前後することがありますが、「tensorflow」部を「keras」に書き換えさえすれば順番はそのままで構いません。

10.4 アヤメの分類

p.321 ml-10-01-iris-deep-learn.pyの実行コマンド(アヤメの学習)

Python3で演習を実行するためのコマンドはこちらです。学習には時間がかかるので実行することを必ずしもお勧めしません。
python3 ml-10-01-iris-deep-learn.py result-iris.h5
なお、Python3で10章のコマンドを実行すると、DeprecationWariningという警告が沢山あらわれることがありますが、実行には支障がないものばかりですので、無視してかまいません。

p.327 ml-10-02-iris-deep-load.pyの実行コマンド(自分で作った学習済ファイルを用いる場合)

Python3で演習を実行するためのコマンドはこちらです。
python3 ml-10-02-iris-deep-load.py result-iris.h5
なお、Python3で10章のコマンドを実行すると、DeprecationWariningという警告が沢山あらわれることがありますが、実行には支障がないものばかりですので、無視してかまいません。

p.327 ml-10-02-iris-deep-load.pyの実行コマンド(配布された学習済ファイルを用いる場合)

Python3で演習を実行するためのコマンドはこちらです。
python3 ml-10-02-iris-deep-load.py ml-iris-deep.h5
なお、Python3で10章のコマンドを実行すると、DeprecationWariningという警告が沢山あらわれることがありますが、実行には支障がないものばかりですので、無視してかまいません。

10.6 手書き数字の分類

p.351 ml-10-03-digits-cnn-learn.pyの実行コマンド(手書き数字の学習)

Python3で演習を実行するためのコマンドはこちらです。学習には時間がかかるので実行することを必ずしもお勧めしません。
python3 ml-10-03-digits-cnn-learn.py result-digits.h5
なお、Python3で10章のコマンドを実行すると、DeprecationWariningという警告が沢山あらわれることがありますが、実行には支障がないものばかりですので、無視してかまいません。

p.354 ml-10-04-digits-cnn-load.pyの実行コマンド(自分で作った学習済ファイルを用いる場合)

Python3で演習を実行するためのコマンドはこちらです。正解率を表示するプログラムです。
python3 ml-10-04-digits-cnn-load.py result-digits.h5
なお、Python3で10章のコマンドを実行すると、DeprecationWariningという警告が沢山あらわれることがありますが、実行には支障がないものばかりですので、無視してかまいません。

p.354 ml-10-04-digits-cnn-load.pyの実行コマンド(配布された学習済ファイルを用いる場合)

Python3で演習を実行するためのコマンドはこちらです。正解率を表示するプログラムです。
python3 ml-10-04-digits-cnn-load.py ml-digits-cnn.h5
なお、Python3で10章のコマンドを実行すると、DeprecationWariningという警告が沢山あらわれることがありますが、実行には支障がないものばかりですので、無視してかまいません。

p.356 ml-10-05-digits-cnn-gui.pyの実行コマンド(自分で作った学習済ファイルを用いる場合)

Python3で演習を実行するためのコマンドはこちらです。マウスで描いた数字を分類するプログラムです。
python3 ml-10-05-digits-cnn-gui.py result-digits.h5
なお、Python3で10章のコマンドを実行すると、DeprecationWariningという警告が沢山あらわれることがありますが、実行には支障がないものばかりですので、無視してかまいません。

p.356 ml-10-05-digits-cnn-gui.pyの実行コマンド(配布された学習済ファイルを用いる場合)

Python3で演習を実行するためのコマンドはこちらです。マウスで描いた数字を分類するプログラムです。
python3 ml-10-05-digits-cnn-gui.py ml-digits-cnn.h5
なお、Python3で10章のコマンドを実行すると、DeprecationWariningという警告が沢山あらわれることがありますが、実行には支障がないものばかりですので、無視してかまいません。

p.357 ml-10-06-digits-cnn-gui-mod.pyの実行コマンド(自分で作った学習済ファイルを用いる場合)

Python3で演習を実行するためのコマンドはこちらです。マウスで描いた数字を分類するプログラムです。数字の位置と大きさを補正するバージョンです。
python3 ml-10-06-digits-cnn-gui-mod.py result-digits.h5
なお、Python3で10章のコマンドを実行すると、DeprecationWariningという警告が沢山あらわれることがありますが、実行には支障がないものばかりですので、無視してかまいません。

p.358 ml-10-06-digits-cnn-gui-mod.pyの実行コマンド(配布された学習済ファイルを用いる場合)

Python3で演習を実行するためのコマンドはこちらです。マウスで描いた数字を分類するプログラムです。数字の位置と大きさを補正するバージョンです。
python3 ml-10-06-digits-cnn-gui-mod.py ml-digits-cnn.h5
なお、Python3で10章のコマンドを実行すると、DeprecationWariningという警告が沢山あらわれることがありますが、実行には支障がないものばかりですので、無視してかまいません。

なお、このプログラムをTensorFlow.jsというライブラリによりブラウザで体験するデモンストレーションを作成してみました。 「手描き数字認識をTensorFlow.jsによりブラウザで実行してみよう」で解説しておりますので、興味のある方はお試しください。

10.6 じゃんけんの手の分類

p.368 ml-10-07-hand-cnn-learn.pyの実行コマンド(じゃんけんの手の学習)

Python3で演習を実行するためのコマンドはこちらです。学習には時間がかかるので実行することを必ずしもお勧めしません。
python3 ml-10-07-hand-cnn-learn.py result-hand.h5
なお、Python3で10章のコマンドを実行すると、DeprecationWariningという警告が沢山あらわれることがありますが、実行には支障がないものばかりですので、無視してかまいません。

一方、このコマンドの実行時に下記のようなAttributeErrorが出る場合、学習用の手の画像が格納されているml-learnディレクトリがプログラムml-10-07-hand-cnn-learn.pyと同じ位置に存在しないためであると考えられます。 これは圧縮されたサンプルファイルを展開すると現れるディレクトリです。ご確認ください。
Using Theano backend.
Epoch 1/500
Traceback (most recent call last):
  File "ml-10-07-hand-cnn-learn.py", line 116, in <module>
    history = model.fit(X, y_keras, batch_size=batch_size, epochs=epochs, validation_split=0., verbose=2)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1039, in fit
    validation_steps=validation_steps)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/training_arrays.py", line 217, in fit_loop
    callbacks.on_epoch_end(epoch, epoch_logs)
  File "/usr/local/lib/python2.7/dist-packages/keras/callbacks.py", line 79, in on_epoch_end
    callback.on_epoch_end(epoch, logs)
  File "/usr/local/lib/python2.7/dist-packages/keras/callbacks.py", line 338, in on_epoch_end
    self.progbar.update(self.seen, self.log_values)
AttributeError: 'ProgbarLogger' object has no attribute 'log_values'

p.371 ml-10-08-hand-cnn-load.pyの実行コマンド(自分で作った学習済ファイルを用いる場合)

Python3で演習を実行するためのコマンドはこちらです。二値化されたカメラ映像と手の分類結果を表示するプログラムです。
python3 ml-10-08-hand-cnn-load.py result-hand.h5
なお、Python3で10章のコマンドを実行すると、DeprecationWariningという警告が沢山あらわれることがありますが、実行には支障がないものばかりですので、無視してかまいません。

二値化された映像が手の形を全く反映していない場合、本ページの「p.257 ml-08-02-binary.pyが手の形を反映していない場合」に基づき、プログラム中(この場合 ml-10-08-hand-cnn-load.py)のパラメータhmin、hmax、sminの値を調整してください。
プログラム中のhmin、hmax、sminの調整はこの後のじゃんけんプログラムでも必要になりますのでご注意ください。

ml-08-02-binary.pyが手の形を反映していない場合、p.258「手の形が綺麗に切り出せないときの対処法」に基づいてプログラム中のパラメータhmin、hmax、sminの値を調整しなければなりません。 著者の感覚として、様々なツールが更新されるにと伴い、執筆時に比べて適切なパラメータの値が変化しているような印象があります。

典型的には、下記のパターンでの値の変更で改善されるケースが多いでしょう。書籍p.262の図8-7に基づいて述べます。
  1. 図8-7のs_binaryが手の形を含んでいる場合
    この場合、hmaxの調整のみで良いでしょう。例えば手の形が欠けている場合、hmaxをデフォルトの30から35などのように大きくすれば、手の欠けが小さくなります。
  2. 図8-7のs_binaryが手の形を全く反映していない場合
    この場合、S成分による二値化は smin =0 とすることで無効にした方が良いでしょう。その上で hmax の調整を行い、手の形が再現されるようにします。
  3. 図8-7のs_binaryがほぼ手の形を再現している場合
    この場合、hmin=-1としてH成分による認識を無効にし、S成分のみの認識してみると綺麗に手の形が現れることがあります。
なお、このようなhmin、hmax、sminの調整は、手の形の認識を含むプログラム(じゃんけんプログラムも含む)の全てで行う必要がありますのでご注意ください。

p.371 ml-10-08-hand-cnn-load.pyの実行コマンド(配布された学習済ファイルを用いる場合)

Python3で演習を実行するためのコマンドはこちらです。二値化されたカメラ映像と手の分類結果を表示するプログラムです。
python3 ml-10-08-hand-cnn-load.py ml-hand-cnn.h5
なお、Python3で10章のコマンドを実行すると、DeprecationWariningという警告が沢山あらわれることがありますが、実行には支障がないものばかりですので、無視してかまいません。

二値化された映像が手の形を全く反映していない場合、本ページの「p.257 ml-08-02-binary.pyが手の形を反映していない場合」に基づき、プログラム中(この場合 ml-10-08-hand-cnn-load.py)のパラメータhmin、hmax、sminの値を調整してください。
プログラム中のhmin、hmax、sminの調整はこの後のじゃんけんプログラムでも必要になりますのでご注意ください。

p.373:2020-05-27 および 2020-08-20 の Raspberry Pi OS でイヤフォンジャックを使う

2020-05-27 および 2020-08-20 の Raspberry Pi OS では、本ページの「p.295」の項目で記した2通りの音声出力の選択ができません。 HDMIケーブル経由で音声を出力する方には問題がありませんが、Raspberry Pi 上のピンジャックから音を出力したいが音が出ないという場合は、以下の指示に従ってください。 ただし、面倒な作業ですし、今後のためにこの機会にOSを最新のものにすることをお勧めします。

ml-10-09-janken-deep.py の場合、ファイルを mousepad や Thonny などで開き、プログラム内の322行目の「args = ['mpg321', '-q', 'ml-sound/jankenpon.mp3']」という命令を以下に変更し、ファイルを上書き保存した上で実行してください。イヤフォンジャックから音声が出るようになります。
args = ['mpg321', '-q', '-a', 'hw:1,0', 'ml-sound/jankenpon.mp3']

同様に、ml-10-10-janken-deep-shorten.py の場合もプログラムを一部変更する必要があります。こちらのファイルの場合は変更点は二カ所あります。まず、プログラム内の325行目の「args = ['mpg321', '-q', 'ml-sound/jankenpon.mp3']」という命令を以下に変更し
args = ['mpg321', '-q', '-a', 'hw:1,0', 'ml-sound/jankenpon.mp3']
さらに、329行目の「args = ['mpg321', '-q', 'ml-sound/pon.mp3']」という命令を以下に変更してください。以上の変更が終わったらファイルを上書き保存した上で実行してください。イヤフォンジャックから音声が出るようになります。
args = ['mpg321', '-q', '-a', 'hw:1,0', 'ml-sound/pon.mp3']

p.373 ml-10-09-janken-deep.pyの実行コマンド(自分で作った学習済ファイルを用いる場合)

Python3で演習を実行するためのコマンドはこちらです。GUIによるじゃんけんシステムです。
python3 ml-10-09-janken-deep.py result-hand.h5
なお、Python3で10章のコマンドを実行すると、DeprecationWariningという警告が沢山あらわれることがありますが、実行には支障がないものばかりですので、無視してかまいません。

二値化された映像が手の形を全く反映していない場合、本ページの「p.257 ml-08-02-binary.pyが手の形を反映していない場合」に基づき、プログラム中(この場合 ml-10-09-janken-deep.py)のパラメータhmin、hmax、sminの値を調整してください。

さらに、2019年10月時点でデフォルトでインストールされるkeras 2.3.0を用いると、じゃんけんシステムのプログラムを実行すると、python3版であっても
AttributeError: '_thread._local' object has no attribute 'value'
というエラーが出て実行に失敗します。2019年12月時点でのkeras 2.3.1では直っていましたので下記のコマンドでkerasのバージョンを指定するするのが良いでしょう。
sudo pip3 install keras==2.3.1 theano

p.373 ml-10-09-janken-deep.pyの実行コマンド(配布された学習済ファイルを用いる場合)

Python3で演習を実行するためのコマンドはこちらです。GUIによるじゃんけんシステムです。
python3 ml-10-09-janken-deep.py ml-hand-cnn.h5
Python3で10章のコマンドを実行すると、DeprecationWariningという警告が沢山あらわれることがありますが、実行には支障がないものばかりですので、無視してかまいません。

二値化された映像が手の形を全く反映していない場合、本ページの「p.257 ml-08-02-binary.pyが手の形を反映していない場合」に基づき、プログラム中(この場合 ml-10-09-janken-deep.py)のパラメータhmin、hmax、sminの値を調整してください。

じゃんけんシステムは、手の画像が格納されているディレクトリml-imagesと音声が格納されているディレクトリml-soundがプログラムファイルml-10-09-janken-deep.pyと同じ位置にあることが前提となっています。 どちらも圧縮されたサンプルファイルを展開すると現れるディレクトリです。エラーが出る方はご確認ください。

さらに、2019年10月時点でデフォルトでインストールされるkeras 2.3.0を用いると、じゃんけんシステムのプログラムを実行すると、python3版であっても
AttributeError: '_thread._local' object has no attribute 'value'
というエラーが出て実行に失敗します。2019年12月時点でのkeras 2.3.1では直っていましたので下記のコマンドでkerasのバージョンを指定するするのが良いでしょう。
sudo pip3 install keras==2.3.1 theano
なお、このじゃんけんシステムにロボットハンドを追加し、ディスプレイないではなく現実世界でじゃんけん勝負する方法を 「人間の手を予測するじゃんけんシステムにロボットハンドを追加する」に示しましたので、電子工作に興味のある方はご覧ください。

p.374 ml-10-10-janken-deep-shorten.pyの実行コマンド(自分で作った学習済ファイルを用いる場合)

Python3で演習を実行するためのコマンドはこちらです。GUIによるじゃんけんシステムの音声短縮版です。
python3 ml-10-10-janken-deep-shorten.py result-hand.h5
Python3で10章のコマンドを実行すると、DeprecationWariningという警告が沢山あらわれることがありますが、実行には支障がないものばかりですので、無視してかまいません。

二値化された映像が手の形を全く反映していない場合、本ページの「p.257 ml-08-02-binary.pyが手の形を反映していない場合」に基づき、プログラム中(この場合 ml-10-10-janken-deep-shorten.py)のパラメータhmin、hmax、sminの値を調整してください。

p.374 ml-10-10-janken-deep-shorten.pyの実行コマンド(配布された学習済ファイルを用いる場合)

Python3で演習を実行するためのコマンドはこちらです。GUIによるじゃんけんシステムの音声短縮版です。
python3 ml-10-10-janken-deep-shorten.py ml-hand-cnn.h5
Python3で10章のコマンドを実行すると、DeprecationWariningという警告が沢山あらわれることがありますが、実行には支障がないものばかりですので、無視してかまいません。

二値化された映像が手の形を全く反映していない場合、本ページの「p.257 ml-08-02-binary.pyが手の形を反映していない場合」に基づき、プログラム中(この場合 ml-10-10-janken-deep-shorten.py)のパラメータhmin、hmax、sminの値を調整してください。

本書の演習を picamera2 (libcamera) で実行する方法

1. はじめに

Raspberry Pi OS 2021-10-30 からはじまったバージョン Bullseye ではカメラモジュールの利用方法に大きな変更が加えられ、libcamera というライブラリを用いるようになりました。 これは、本書でカメラを用いるプログラムがそのままでは動かなくなる、ということを意味します。

ただし、Bullseye では「Legacy Camera」という、これまでと互換性のあるカメラの利用方法が可能になっています。この Lecgacy Camera を用いれば本書でカメラを用いるプログラムはそのまま動作します。 しかし、2023年10月にリリースされた OS Bookworm では Legacy Camera のサポートは停止されました。

そこで、本ページでは、Legacy Camera に頼らずに最新の OS で本書の演習を実行する方法を解説します。具体的には、libcamera ライブラリを利用する Python モジュールである picamera2 を使ってプログラムを実行します。

本書のサンプルプログラムは picamera の旧バージョンを使って書かれていました。しかし、picamera2 は picamera とは互換性がありませんので、picamera2 用に書き換えられたプログラムをダウンロードして利用することになります。

2. 準備

サポート環境は Bullseye または Bookworm の 32-bit または 64-bit 版の Raspberry Pi OS です。 Bookworm の場合、64-bit 版でないと 10 章の演習を実行できないので注意しましょう。また、Bullseye の場合は、なるべく新しいバージョンを用いましょう。そうしないと、本ページで利用する picamera2 (python3-picamera2) がインストールされていないことがあるからです。

Bullseye の場合、Legacy Camera モードは無効にしておく必要があります。OS インストール直後の状態ではあらかじめ無効になっています。一度有効にしてしまった方は、 ターミナルを開いて以下の手順に従うことで、raspi-config により Legacy Camera モードを無効にしましょう。
  1. 「 sudo raspi-config 」を実行することで raspi-config を起動
  2. キーボードの「↓」キーを2回押し、「Interface Options」を選択してから「Enter」キーを押す
  3. 「I1 Legacy Camera Enable/Disable」があらかじめ選択されているので、「Enter」キーを押す
  4. 「Would you like to enable legacy camera support?」と聞かれるので「→」キーで「いいえ」が選択された状態にし、「Enter」キーを押す
  5. 「Legacy camera support is disabled」と表示されるので、「了解」が選択された状態で「Enter」キーを押す
  6. raspi-configを起動した状態の画面に戻るので、「TAB」キーを二回クリックし、「Finish」を選択した状態で「Enter」キーを押す
  7. 再起動を促されるので、「はい」が選択された状態で「Enter」キーを押す
以上で、Legacy Camera モードが無効になります。

次に、お使いのカメラモジュールのバージョンを把握してください。2023年3月現在、Raspberry Pi のカメラモジュールにはバージョン1から3があり、下図のような外観をしています。
左から、バージョン1(基板が四角)、バージョン2(基板の角が丸く、レンズ周辺が黒)、バージョン3(基板の角が丸く、レンズ周辺が銀)です。基板上にもバージョンの記載がありますね。

後でダウンロードして頂くプログラムでは、このカメラモジュールのバージョンを手動で指定する箇所があります。このバージョンの指定を自動とすると、映像の画質が低くなったり、映像範囲が狭くなったりしてしまうためです。

3. ダウンロードと実行

それでは、picamera2 を利用するプログラムをダウンロードしましょう。

ターミナルを開き、本書のサンプルファイル(「ml-」で始まるファイル)が存在するディレクトリに移動してください。 サンプルファイルをホームディレクトリに展開した方は移動の必要はありません。bluebacksディレクトリに展開した方は下記のコマンドを実行するのでした。
cd bluebacks
なお、本ページで紹介するプログラムは、「ml-」で始まる本書のサンプルファイルと同じ位置にないと動作しませんので注意してください。

次に、下記の3つのコマンドを順に実行して、必要なファイルのダウンロードと展開を行ってください。コマンドはコピー&貼り付けで実行することを推奨します。展開後はダウンロードした圧縮ファイルは不要となるので削除しています。
wget https://github.com/neuralassembly/raspi/raw/master/mlbb-picamera2.zip
unzip mlbb-picamera2.zip
rm mlbb-picamera2.zip
なお、展開されるファイルの名前は既存のサンプルファイルとは異なりますので、サンプルファイルが上書きされることはありません。展開により現れるファイルは下記の通りです。Pythonプログラムのファイル名の末尾が全て「-picamera2.py」で終わっていることに注意してください。さらに、TensorFlow 2 用のファイルには「-tf2-」がついていることにも着目してください。 なお、TensorFlow 2 用の学習済ファイルである ml-digits-cnn-tf2.h5 と ml-hand-cnn-tf2.h5 は既存のファイルが展開時に上書きされることがあるかもしれませんが、上書きして構いません。
ml-08-01-cameracheck-picamera2.py
ml-08-02-binary-picamera2.py
ml-08-04-recognition-picamera2.py
ml-09-01-janken-picamera2.py
ml-09-02-janken-shorten-picamera2.py
ml-10-08-hand-cnn-load-picamera2.py
ml-10-09-janken-deep-picamera2.py
ml-10-09-janken-deep-tf2-picamera2.py
ml-10-10-janken-deep-shorten-picamera2.py
ml-10-10-janken-deep-shorten-tf2-picamera2.py
ml-digits-cnn-tf2.h5
ml-hand-cnn-tf2.h5
さて、これらのPythonプログラムを開くと、全てのファイルの冒頭に、
camver = 1
という行があります。これは、用いるカメラモジュールのバージョンが 1 であることを示しています。お使いのカメラモジュールに応じて、全てのファイルでここの数字を 2 または 3 に変更し、保存して利用してください。

これらのプログラムを実行する際は、この「-picamera2」がついたファイルを実行するようにしてください。 例えば、書籍でサンプルファイル「ml-08-01-cameracheck.py」を実行する箇所があります。その場合、「ml-08-01-cameracheck.py」ではなく「ml-08-01-cameracheck-picamera2.py」を実行するようにする、ということです。

なお、ml-10-09 と ml-10-10 のプログラムには、ファイル名に「-tf2-」がつかないものとついたものの2種類があります。つかないものは本書で用いた keras + theano 用、「-tf2-」がついたものは TensorFlow2 用です。

以上を踏まえ、各プログラムの実行コマンドを以下に列挙しますので、必要に応じてコピーなどしてご活用ください。
python3 ml-08-01-cameracheck-picamera2.py

python3 ml-08-02-binary-picamera2.py

# 以下、ml-08-03 で result.pkl に学習データを保存した場合
python3 ml-08-04-recognition-picamera2.py result.pkl

python3 ml-09-01-janken-picamera2.py result.pkl

python3 ml-09-02-janken-shorten-picamera2.py result.pkl

# 以下、keras + theano の場合
python3 ml-10-08-hand-cnn-load-picamera2.py ml-hand-cnn.h5

python3 ml-10-09-janken-deep-picamera2.py ml-hand-cnn.h5

python3 ml-10-10-janken-deep-shorten-picamera2.py ml-hand-cnn.h5

# 以下、TensorFlow2 の場合
python3 ml-10-08-hand-cnn-load-picamera2.py ml-hand-cnn-tf2.h5

python3 ml-10-09-janken-deep-tf2-picamera2.py ml-hand-cnn-tf2.h5

python3 ml-10-10-janken-deep-shorten-tf2-picamera2.py ml-hand-cnn-tf2.h5
以上、お疲れさまでした。