ラベル 機械学習 の投稿を表示しています。 すべての投稿を表示
ラベル 機械学習 の投稿を表示しています。 すべての投稿を表示

2024年2月19日月曜日

本書の内容を Pi Zero ~ Pi 5 で実行する方法

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

(2025.6動作確認)
Pi 5 対応のサンプルプログラム、付録PDFは下記のリンクからダウンロードしてください。サンプルプログラムを圧縮したファイル「 mlbb-sample-pi5.zip 」の「-pi5」の部分が「Pi 5 対応」を意味しています。

はじめに

本ページでは、金丸隆志著「カラー図解 Raspberry Piではじめる機械学習」(講談社ブルーバックス)の内容を Raspberry Pi Zero ~ Raspberry Pi 5 で動作させるための補足情報を紹介します。

本書はこれまで、「本書出版時(2018年3月)から最新の OS まで、可能な限り同じサンプルプログラムが動作する」という状態を目指し、サンプルファイルの更新を続けてきました。
しかし、2023年9月に海外で発表された Raspberry Pi 5 (以下 Pi 5) では、2023年10月にリリースされた Bookworm という OS 以降でしか動作しません。Bookworm では以前の OS とカメラを利用する仕組みが違う、Theano というライブラリを利用できなくなっている、など、過去の OS とは大きく異なります。
そのため、過去の OS と同じプログラムを動作させることが困難になってきています。

そこで、この機会にすべてのプログラムを「Pi 5 で問題なくプログラムが動作すること」を基準に一新し、このページでその動作方法を解説することにしました。
書籍とこのページだけを見れば、全ての演習を Pi Zero ~ Pi 5 で実行できるようになります。

対象とする OS は、以下のように 2023年5月にリリースされた Rsapberry Pi OS (Bullseye) の最終版と、2023年10月にリリースされた Bookworm 以降の 64-bit OS です。64-bit OS を用いないと、第10章の演習を実行することができません。

日付バージョンOSバージョン
2023/5/3Raspberry Pi OS 2023-05-03Bullseye (最終版)
2023/10/10Raspberry Pi OS 2023-10-10Bookworm (Pi 5 は Bookworm 以降のみが動作)
-中略
2025/5/13Raspberry Pi OS 2025-05-13
2025/10/1Raspberry Pi OS 2025-10-1Trixie
-中略
2025/12/4Raspberry Pi OS 2025-12-04

64-bit OS を利用可能な Raspberry Pi の機種は、主に、Pi 3~5 および Pi Zero 2W です(ただし、Pi Zero 系は上級者向けなのでお勧めしません)。64-bit OS が動作しない機種では、以下の古いOSに対する情報に基づき、32-bit の Legacy な Bullseye OS で第10章の演習を実行する必要がありますので、ご了承ください。

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

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

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

一つ目の目的は、ソフトウェアのインストールコマンドが本書刊行後に変更された場合に、最新情報を提供することです。ですから、本書のコマンドと本ページのコマンドが異なる場合は、本ページの情報が最新であるとお考え下さい。実際、書籍では 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 圧縮されたサンプルファイルの展開に関する注意

圧縮ファイルを展開するためのソフトウェアのデフォルトの設定が書籍から変化していますので利用の際は注意が必要です。
下図(左)のように、展開先のデフォルトが「/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 インストールできるソフトウェアの一覧を更新するコマンド

パスワードの入力を求められたら、入力してEnterキーを押してください。
sudo apt update

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

パスワードの入力を求められたら、入力してEnterキーを押してください。
sudo apt -y install python3-sklearn

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

本書で解説した開発環境IDLEは既に Raspberry Pi OS に含まれていません。より簡単にPythonプログラムを実行する方法として、デフォルトでインストール済の「Thonny」を用いる方法をここで紹介します。

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

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


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

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


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

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

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

  • 右上の「Switch to regular mode」というリンクをクリックすることで、ユーザーインターフェースをシンプルモードからレギュラーモードに変更する(Thonny の再起動が必要)
    (後で元に戻したいときは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 で得られます。なお、「Program arguments」の部分はコマンドライン引数が不要なプログラムでは空欄に戻して実行してください。
このように、Thonny でのコマンドライン引数の利用は少し面倒なので、ターミナルでのコマンドでの実行に慣れた方が良いかもしれません。



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

本ページではPythonプログラムの実行コマンドも掲載しますが、本書で記したように、「TAB」キーによる補完機能をマスターすることをお勧めします。 Python3での実行コマンドはこちらです。
python3 ml-03-01-version.py

5章

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

ml-05-01-2feat3class-nn.pyは毎回同じ乱数系列を利用するため、常に同じ結果を返すとp.153で述べました。 そのこと自体は正しいのですが、scikit-learnのバージョンがアップデートされた影響で、書籍の図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%に達しません

また、比較的新しい scikit-learn では (例えば Bookworm や Trixie)、tol に負の値を設定するとエラーが出るようになりました。そのため、長時間の実験は下記の手順で行ってください。
max_iter=10000, tol=0.00001

→(上記の部分を下記に変更)

max_iter=100000, n_iter_no_change=100000, tol=0.00001
すなわち、max_iterを一桁増やし、それを同じ値をn_iter_no_changeに設定、ということです。tolの値を変更する必要はありません。変更後の行も記しておきましょう。
clf = MLPClassifier(hidden_layer_sizes=(100, ), max_iter=100000, n_iter_no_change=100000, tol=0.00001, random_state=1)
ちなみに、長時間実験にかかる時間は、 Pi 5 で 1分程度、Pi 4 で 4分程度、Pi Zero 2 W で 20分程度です。

なお、Trixie では長時間実験でも正解率100%に達しなくなっているようです。これは、Trixie では libopenblas-dev というパッケージが scikit-learn と一緒にインストールされないことの影響のようです。 「sudo apt install libopenblas-dev 」というコマンドでインストールすれば正解率100%に達するようになります。 libopenblas-dev は、本ページでは TensorFlow をインストールするときにインストールするパッケージです。インストールすることで学習が少し高速になるというメリットもあります。
なお、 libopenblas-dev をインストールせずに正解率100%に達したい場合、random_state の値を 2 か 3 に設定してください。乱数の系列が変わり、正解率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つずつ順番に実行してください。なお、現在の OS ではこのプログラムはインストール済だと言われることが多いでしょう。パスワードの入力を求められたら、入力してEnterキーを押してください。
sudo apt update
sudo apt -y install python3-pil.imagetk

8章

p.243 カメラについて

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

以下、Raspberry Pi のカメラモジュールの利用について解説します。 Raspberry Pi 用のカメラモジュールは、現在では下図のように バージョン 1 から バージョン 3 までの 3 バージョンがあります。
左から、バージョン1(基板が四角)、バージョン2(基板の角が丸く、レンズ周辺が黒)、バージョン3(基板の角が丸く、レンズ周辺が銀)です。基板上にもバージョンの記載がありますね。どのバージョンでも動作させることができます。

Raspberry Pi 1 から Pi 4 でしたら、カメラモジュールの Raspberry Pi 本体への取り付けは、本書記載の通り「(ケーブルの)端子面がRaspberry PiのmicroSDカードの方を向くように」取り付けます。

一方、Raspberry Pi Zero および Pi 5 の場合、カメラモジュールの取り付けにはいくつかの注意があります。

まず、カメラモジュールに取り付けられているケーブルを、Pi Zero および Pi 5 に対応したものに交換する必要があります。例えば下記のものは Pi Zero でも Pi 5 でも利用可能です。 Pi Zero 用ケーブルでRaspberry Pi Zero WH にカメラモジュールを取りつけた様子が下図です。Raspberry Pi 本体に向かってケーブルが細くなっているのがわかるでしょうか。


専用ケーブルをカメラに取り付ける際、金属が露出した端子面を緑色の基板の方を向くようにします。基板上のカバーを引き出し、ケーブルを差し込んだ後でカバーを押し込むことでケーブルが固定されます。
専用ケーブルを Raspberry Pi 本体に取り付ける際、Pi Zero の場合はやはり金属が露出した端子面を緑色の基板の方を向くようにします。
Pi 5 の場合は、下図のように「金属が露出した端子面が USB 端子側を向くように」取り付けます。これは Pi 1~Pi 5とは逆向きですので注意してください。
また、Pi 5 にはカメラを取り付けられる場所が 2 箇所ありますが、「CAM/DISP 0」と書かれた方に接続しましょう。

なお、どの Raspberry Pi を用いるにせよ、カメラのコネクタは壊れやすいので、両手で慎重に開け閉めしましょう。私は片手で雑に扱っていて壊したことがあります。

p.248 OpenCVのインストール

2つの命令がありますので、1つずつ順番に実行してください。パスワードの入力を求められたら、入力してEnterキーを押してください。
sudo apt update
sudo apt -y install python3-opencv

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

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を編集するためのコマンド

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つずつ順番に実行してください。パスワードの入力を求められたら、入力してEnterキーを押してください。
sudo apt update
sudo apt -y install mpg321

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

2023-10-00 以降の Raspberry Pi OS では、音声の出力先をピンジャックにする方法が変わっております。 もし、デフォルトでピンジャックから音が出ていない場合、以下の指示に従ってください。なお、raspi-config コマンドを実行中は、キーボードの Esc キーが「戻る」に対応しますので、困ったら Esc キーを何度か押してみると良いでしょう。
  1. ターミナルで「 sudo raspi-config 」コマンドを実行し、設定画面を開く。パスワードの入力を求められたら、入力してEnterキーを押す
  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.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というバックエンドを組み合わせて用いました。
しかし、Theano は現在開発が終了しており、OS Bookworm ではインストールもできなくなってしまいました。

そこで、10章の演習は、kerasと組み合わせることができるバックエンドとして Thenao ではなく TensorFlow を用いることにします。 この方法は、2025年10月時点で、64-Bit 版 の Bookworm と Bullseye で実行するのが最も簡単です。
2025年10月の時点での最新OS Trixie では、Python のバージョンが 3.13 であるため Tensorflow の実行がやや特殊となっております。Tensorflow が Python 3.13 をサポートしていないため、仮想環境に Python 3.11 をインストールして利用するのです。この方法はやや特殊なので、個人的には Bookworm や Bullseye の利用をお薦めします。

なお、64-Bit OS を利用可能なのは、Pi 3/4/5/Zero 2W です。

Tensorflow のインストール法は書籍に記されておりませんので、以下の解説を見てください。

TensorFlow 2 のインストール方法 (Trixie 64-bit 版の場合)

Trixie にインストールされているのは Python 3.13 という TensorFlow がサポートしていないバージョンなので、仮想環境に Python 3.11 をインストールして TensorFlow をセットアップするという方針です。2025年10月時点で、Raspberry Pi のカメラモジュールの利用はできず、ウェブカメラを用いることになります。

以下のコマンドを一つずつ順に実行してください。パスワードの入力を求められたら、入力してEnterキーを押してください。PINTO0309 (Katsuya Hyodo) さんのビルドした TensorFlow 2.15 の 64-bit 版がインストールされます。
# まず、必要なライブラリをインストール

sudo apt -y install libhdf5-dev libc-ares-dev libeigen3-dev gcc gfortran libgfortran5 libatlas3-base libopenblas-dev libblas-dev liblapack-dev cython3 openmpi-bin libopenmpi-dev  

# Python 3.11 の仮想環境を作るために pyenv と pipenv のインストールと設定

sudo apt -y install pyenv pipenv

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc

echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc

echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc

source ~/.bashrc

pyenv install 3.11.11 

pipenv --python 3.11.11

# 以上で、Python 3.11.11 が $HOME/.pyenv/versions/3.11.11 にインストールされた
# 仮想環境は $HOME/.local/share/virtualenvs 以下に構築されている
# ここからが TensorFlow のインストール

pipenv install keras_applications==1.0.8

pipenv install keras_preprocessing==1.1.2

pipenv install numpy==1.26.2

pipenv install h5py==3.14.0

pipenv install pybind11==2.9.2

pipenv install protobuf==3.20.3

pipenv install ml_dtypes==0.2.0

pipenv install six wheel mock gdown

wget https://github.com/PINTO0309/Tensorflow-bin/releases/download/v2.15.0.post1/tensorflow-2.15.0.post1-cp311-none-linux_aarch64.whl

pipenv install tensorflow-2.15.0.post1-cp311-none-linux_aarch64.whl

# 最後に、本書10章のプログラムを実行するために必要なライブラリも仮想環境にインストール

pipenv install scikit-learn matplotlib opencv-contrib-python==4.11.0.86
以上で、Python 3.11.11 の仮想環境で本書10章のプログラムを実行する準備が整いました。なお、この時点でホームディレクトリにある設定ファイル .bashrc の末尾をコマンド「 mousepad ~/.bashrc 」により見たとき、下記のようになっているのが正しいです。こうなっていない場合、修正するか、末尾に手動で追記して保存してください。
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi
さて、10章のプログラムを実行する前に、
pipenv shell
を実行してください。すると、プロンプトが
(kanamaru) kanamaru@raspberrypi:~ $
のように変化します。2か所ある「kanamaru」の部分は皆さんのユーザー名で置き換えられているはずです。先頭の「(kanamaru)」が、仮想環境で作業していることを示します。 10章のプログラム(ml-10で始まるもの)はこの仮想環境で、「python3 ファイル名」などのコマンドで実行できます。コピーできる形式のコマンドは全て以下に記されています。
なお、2025年10月時点で、Raspberry Pi のカメラモジュールを用いるプログラム(ml-10-08-hand-cnn-load.py、ml-10-09-janken-deep.py、ml-10-10-janken-deep-shorten.py)は動作しません。 「本書の演習をウェブカメラで実行する方法」で配布している ml-10-08-hand-cnn-load-webcam.py、ml-10-09-janken-deep-webcam.py、ml-10-10-janken-deep-shorten-webcam.py をウェブカメラとともに用いるのが良いでしょう。
すなわち、mlbb-webcam.zip をダウンロードして展開し、現れたファイル群が全てサンプルプログラム群があるフォルダ(典型的には bluebacks フォルダ)に存在する状態にします。そして、実行するのはファイル名に「-webcam」を含むファイルとします。 下記のように、ですね。
python3 ml-10-08-hand-cnn-load-webcam.py ml-hand-cnn.h5
python3 ml-10-09-janken-deep-webcam.py ml-hand-cnn.h5
python3 ml-10-10-janken-deep-shorten-webcam.py ml-hand-cnn.h5
なお、仮想環境を抜けるには
(kanamaru) kanamaru@raspberrypi:~ $ exit
を実行してください。なお、仮想環境に入らずに「pipenv run python3 ファイル名」でプログラムを実行することもできますのでお好みでどうぞ。

TensorFlow 2 のインストール方法 (Bookworm 64-bit 版の場合)

Raspberry Pi OS Bullseye 64-bit 版で、TensorFlow 2 系のパッケージをインストールするには、以下のコマンドを一行ずつ順に実行します。パスワードの入力を求められたら、入力してEnterキーを押してください。 PINTO0309 (Katsuya Hyodo) さんのビルドした TensorFlow 2.15 の 64-bit 版がインストールされます。
sudo apt -y install libhdf5-dev libc-ares-dev libeigen3-dev gcc gfortran libgfortran5 libatlas3-base libatlas-base-dev libopenblas-dev libblas-dev liblapack-dev cython3 openmpi-bin libopenmpi-dev python3-dev python3-h5py

sudo pip3 install keras_applications==1.0.8 --no-deps --break-system-packages

sudo pip3 install keras_preprocessing==1.1.2 --no-deps --break-system-packages

sudo pip3 install numpy==1.26.2 --break-system-packages

sudo pip3 install h5py==3.14.0 --break-system-packages

sudo pip3 install pybind11==2.9.2 --break-system-packages

sudo pip3 install protobuf==3.20.3 --break-system-packages

sudo pip3 install ml_dtypes==0.2.0 --break-system-packages

pip3 install -U --user six wheel mock gdown --break-system-packages

wget https://github.com/PINTO0309/Tensorflow-bin/releases/download/v2.15.0.post1/tensorflow-2.15.0.post1-cp311-none-linux_aarch64.whl

sudo -H pip3 install tensorflow-2.15.0.post1-cp311-none-linux_aarch64.whl --break-system-packages
全てのコマンドが無事終了すれば インストールは終わりです。なお、TensorFlow 2.3 以降では keras は TensorFlow 専用となっていますので、.keras/keras.json による設定は必要ありません。

TensorFlow 2 のインストール方法 (Bullseye 64-bit 版の場合)

Raspberry Pi OS Bullseye 64-bit 版で、TensorFlow 2 系のパッケージをインストールするには、以下のコマンドを1行ずつ順に実行します。パスワードの入力を求められたら、入力してEnterキーを押してください。 こちらも、PINTO0309 (Katsuya Hyodo) さんのビルドした TensorFlow 2.15 の 64-bit 版がインストールされます。

なお、下記のコマンドを実行すると、numpy のバージョンが新しくなる関係で theano が動作しなくなりますのでご了承ください。さらに、numpy が新しくなる影響で apt でインストールした scikit-learn 0.23.2 が動作しなくなりますので、pip3 で最新版をインストールし直す必要もあります。
sudo apt -y install libhdf5-dev libc-ares-dev libeigen3-dev gcc gfortran libgfortran5 libatlas3-base libatlas-base-dev libopenblas-dev libblas-dev liblapack-dev cython3 openmpi-bin libopenmpi-dev python3-dev python3-h5py

sudo pip3 install keras_applications==1.0.8 --no-deps

sudo pip3 install keras_preprocessing==1.1.2 --no-deps

sudo pip3 install numpy==1.26.2

sudo pip3 install h5py==3.14.0

sudo pip3 install pybind11==2.9.2

sudo pip3 install protobuf==3.20.3

sudo pip3 install ml_dtypes==0.2.0

pip3 install -U --user six wheel mock gdown

wget https://github.com/PINTO0309/Tensorflow-bin/releases/download/v2.15.0.post1/tensorflow-2.15.0.post1-cp39-none-linux_aarch64.whl

sudo -H pip3 install tensorflow-2.15.0.post1-cp39-none-linux_aarch64.whl
なお、2026年7月の時点で、Bullseye の場合ここで pip3 コマンドが動作しなくなります。具体的には、ターミナルで pip3 コマンドを単独で実行すると、下記のエラーが出て以後 pip3 コマンドが何も実行できなくなります。
pip AttributeError: module 'lib' has no attribute 'GEN_EMAIL'
そのようなエラーに遭遇した場合、ターミナルで下記の2コマンドを実行し、cryptographyを削除してください。これで pip3 コマンドが動作するようになるはずです。
sudo rm -rf /usr/local/lib/python3.9/dist-packages/cryptography

sudo rm -rf /usr/local/lib/python3.9/dist-packages/cryptography-49.0.0.dist-info
その後、Bullseye のみで必要になる、scikit-learn のインストールを下記コマンドで実行してください。2026年7月の時点では、scikit-learn は 0.23.2 から 1.6.1 へアップグレードされました。
sudo pip3 install -U scikit-learn
さて、全てのコマンドが無事終了すれば インストールは終わりです。なお、TensorFlow 2.3 以降では keras は TensorFlow 専用となっていますので、.keras/keras.json による設定は必要ありません。

10.4 アヤメの分類

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

Python3で演習を実行するためのコマンドはこちらです。学習には時間がかかるので実行することを必ずしもお勧めしません。
python3 ml-10-01-iris-deep-learn.py result-iris.h5
なお、TensorFlow 2.15 では、ファイルの保存の際に下記のような警告が現れますが、気にする必要はありません。
UserWarning: You are saving your model as an HDF5 file via `model.save()`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')`.

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

Python3で演習を実行するためのコマンドはこちらです。
python3 ml-10-02-iris-deep-load.py result-iris.h5

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

Python3で演習を実行するためのコマンドはこちらです。
python3 ml-10-02-iris-deep-load.py ml-iris-deep.h5

10.6 手書き数字の分類

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

Python3で演習を実行するためのコマンドはこちらです。学習には時間がかかるので実行することを必ずしもお勧めしません。
python3 ml-10-03-digits-cnn-learn.py result-digits.h5
なお、TensorFlow 2.15 では、ファイルの保存の際に下記のような警告が現れますが、気にする必要はありません。
UserWarning: You are saving your model as an HDF5 file via `model.save()`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')`.

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

Python3で演習を実行するためのコマンドはこちらです。正解率を表示するプログラムです。
python3 ml-10-04-digits-cnn-load.py result-digits.h5

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

Python3で演習を実行するためのコマンドはこちらです。正解率を表示するプログラムです。
python3 ml-10-04-digits-cnn-load.py ml-digits-cnn.h5

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

Python3で演習を実行するためのコマンドはこちらです。マウスで描いた数字を分類するプログラムです。
python3 ml-10-05-digits-cnn-gui.py result-digits.h5

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

Python3で演習を実行するためのコマンドはこちらです。マウスで描いた数字を分類するプログラムです。
python3 ml-10-05-digits-cnn-gui.py ml-digits-cnn.h5

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

Python3で演習を実行するためのコマンドはこちらです。マウスで描いた数字を分類するプログラムです。数字の位置と大きさを補正するバージョンです。
python3 ml-10-06-digits-cnn-gui-mod.py result-digits.h5

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

Python3で演習を実行するためのコマンドはこちらです。マウスで描いた数字を分類するプログラムです。数字の位置と大きさを補正するバージョンです。
python3 ml-10-06-digits-cnn-gui-mod.py ml-digits-cnn.h5
なお、このプログラムを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
なお、このコマンドの実行時にAttributeErrorが出る場合、学習用の手の画像が格納されているml-learnディレクトリがプログラムml-10-07-hand-cnn-learn.pyと同じ位置に存在しないためであると考えられます。 これは圧縮されたサンプルファイルを展開すると現れるディレクトリです。ご確認ください。

また、TensorFlow 2.15 では、ファイルの保存の際に下記のような警告が現れますが、気にする必要はありません。
UserWarning: You are saving your model as an HDF5 file via `model.save()`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')`.


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

Python3で演習を実行するためのコマンドはこちらです。二値化されたカメラ映像と手の分類結果を表示するプログラムです。
python3 ml-10-08-hand-cnn-load.py result-hand.h5
二値化された映像が手の形を全く反映していない場合、本ページの「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
二値化された映像が手の形を全く反映していない場合、本ページの「p.257 ml-08-02-binary.pyが手の形を反映していない場合」に基づき、プログラム中(この場合 ml-10-08-hand-cnn-load.py)のパラメータhmin、hmax、sminの値を調整してください。
プログラム中のhmin、hmax、sminの調整はこの後のじゃんけんプログラムでも必要になりますのでご注意ください。

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

Python3で演習を実行するためのコマンドはこちらです。GUIによるじゃんけんシステムです。
python3 ml-10-09-janken-deep.py result-hand.h5
二値化された映像が手の形を全く反映していない場合、本ページの「p.257 ml-08-02-binary.pyが手の形を反映していない場合」に基づき、プログラム中(この場合 ml-10-09-janken-deep.py)のパラメータhmin、hmax、sminの値を調整してください。

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

Python3で演習を実行するためのコマンドはこちらです。GUIによるじゃんけんシステムです。
python3 ml-10-09-janken-deep.py ml-hand-cnn.h5
二値化された映像が手の形を全く反映していない場合、本ページの「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と同じ位置にあることが前提となっています。 どちらも圧縮されたサンプルファイルを展開すると現れるディレクトリです。エラーが出る方はご確認ください。

なお、このじゃんけんシステムにロボットハンドを追加し、ディスプレイないではなく現実世界でじゃんけん勝負する方法を 「人間の手を予測するじゃんけんシステムにロボットハンドを追加する」に示しましたので、電子工作に興味のある方はご覧ください。

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

Python3で演習を実行するためのコマンドはこちらです。GUIによるじゃんけんシステムの音声短縮版です。
python3 ml-10-10-janken-deep-shorten.py result-hand.h5
二値化された映像が手の形を全く反映していない場合、本ページの「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
二値化された映像が手の形を全く反映していない場合、本ページの「p.257 ml-08-02-binary.pyが手の形を反映していない場合」に基づき、プログラム中(この場合 ml-10-10-janken-deep-shorten.py)のパラメータhmin、hmax、sminの値を調整してください。

おわりに

以上、お疲れさまでした。
本ページの内容をすべて学ぶと、TensorFlow2 を用いたディープラーニングの演習までを終えたことになります。
さらなる発展的な内容として、下記のコンテンツを公開しています。Google の開発したmediapipe というライブラリを用いて、コンピュータとのより安定したじゃんけん勝負を実現しております。
是非体験してみてください!

2019年12月3日火曜日

Raspberry Pi で YOLO v3-Tiny / YOLO v3 による物体検出を試してみよう

以下は、古くなったのでサポートを停止した情報です。代替ページとして「Raspberry Pi 5 でリアルタイムな姿勢推定と物体検出」をお勧めします。

1. 物体検出とは何か

本ページでは、Rapsberry Pi で「物体検出」を行う方法を紹介します。「物体検出」とは何かを知るには、下図の画像を見るのがわかりやすくて良いでしょう。


机の上にキーボード、カッター、カップ、マウスが置かれており、その写真に物体検出を適用した結果、物体の位置、大きさ、種類が表示されています。 図ではわかりにくいですが、検出された物体にそれぞれキーボード、ナイフ、カップ、マウスという名称が英語で記されています。

なお、「カッター」が「ナイフ」と検出されている理由は後に解説しますが、一言で言えば「学習データにカッターが含まれていないから」です。

物体検出には様々な方法がありますが、本ページで用いる物体検出は、本書で紹介した CNN (畳み込みニューラルネットワーク) の技術が使われたものです。
しかし、下図に示したように通常のCNNと物体検出では大きく異なる点があります。


通常のCNNでは、上図(A)のように画像中に一つの対象が記されており、その画像が属するクラス(「2」や「カップ」と言った分類先)が出力されます。

一方、物体検出では上図(B)のように、一枚の画像中に複数の物体が存在することがあり得ます。そして、それぞれの物体のクラスだけではなく位置や大きさも出力されねばなりません。

2. YOLOとは何か

この物体検出に CNN (畳み込みニューラルネットワーク) の考え方を応用した手法がいくつか提案されており、本ページで紹介するのはそのうちの一つである YOLO です。
YOLO(You Only Look Once、一度だけ見る)は 2016 年に J. Redmon らにより提案された手法です。 オリジナルの論文はこちらから入手できます。

You only look once とは、英語表現 You only live once(一度だけの人生)をもじったものと考えられます。「一度だけ見る」とは、YOLO では一枚の画像に対する認識に CNN の計算を一度だけ実行すれば良いことを示しています。
物体検出に CNN を用いる他の手法では、一枚の画像に対する認識時に何度も CNN の計算を行わねばならなかったことと対比しているのだと思われます。

通常の CNN の出力層ではソフトマックス関数により入力が属するクラスを出力します。詳細は省略しますが、YOLO では出力層に機械学習の回帰の考え方を適用し、物体の位置や大きさに関わる量も出力できるようにします。それにより、物体検出を可能にしているのです。

なお、執筆時点で YOLO にはバージョン 1 からバージョン 3 が存在します。本ページでは YOLO バージョン 3 を実行する方法を紹介します。

バージョンごとに性能が向上されている他に、学習時に用いられたデータが異なるという特徴があります。それにより、認識される物体の種類が異なるのです。
YOLO バージョン 1 ではクラス数 20 の Pascal VOC 2007 といううデータセットが用いられています。20 種類の物体を検出できるということです。その性能を向上させた YOLO バージョン 2 ではImageNet と COCO という 2 つのデータセットを組み合わせてクラス数 9000 の認識が可能な YOLO9000 というネットワークを実装しています。

そして、本ページで用いる用いた YOLO バージョン 3 では COCO というデータセットを用いてクラス数 80 の認識が可能です。80 種類のクラスをこちらでみることができます。

上で見た図で、カッターを「ナイフ」と認識しているのは「カッター」のデータがデータセットに含まれていなかったであると既に述べましたが、それは上のリンクにあるクラス一覧で確認することができます。

なお、これらの「学習済ネットワーク」から出発して新たなデータを学習させる「転移学習」という方法もありますが、本ページでは取り扱いません。

また、通常 YOLO で用いる CNN は、何十個もの畳み込み層と 2 個の全結合層を持ちます。これをそのまま Raspberry Pi の計算能力で実行するのはやや荷が重いといえます。そのため、本ページでは畳み込み層の数を十個程度に減らした YOLO の簡易版である Tiny YOLO の実行方法も紹介します。

Raspberry Pi 3までをお使いの方はこの Tiny YOLO を利用すると良いでしょう。 高速な Raspberry Pi 4 をお使いの方は通常の YOLO もあわせてチャレンジしてみましょう。

また、本ページの続編的なページとして、物体検出の高速化に関連する「Raspberry Pi + Coral USB Accelerator + TensorFlow Lite で物体検出と姿勢推定を試してみよう」もありますので合わせてご覧ください。Coral USB Acceleratorをお持ちでない場合も演習を実行できます。

3. Python3 用の TensorFlow と OpenCV のインストール

さて、YOLO および Tiny YOLO を実行するためには、Python3 用の TensorFlow および OpenCV のインストールが必要です。本書の補足ページの下記ページに従い、Python3 用の TensorFlow および OpenCV をインストールして下さい。 なお、本ページの内容を Anaconda で実行したい方は「本書の演習を Anaconda の Spyder で実行する方法」を参考にしてください。

さて、ここからは以下の流れで解説が進みます。 TensorFlow 1 系に比べて TensorFlow 2 系の解説は簡易的となっておりますのでご了承ください。

1. [TensorFlow 2 系] プログラムのダウンロードから実行まで

TensorFlow 2 系で行うための方法を記します。簡易的な解説となっていますのでご了承ください。

まず、プログラムをダウンロードするには下記のコマンドを実行して下さい。cedrickchee氏のプログラムに筆者が手を加えたファイルがダウンロードされます。TensorFlow 1 系とは別のプログラムを用いていることにもご注意ください。
git clone https://github.com/neuralassembly/tensorflow2-yolo-v3
プログラムのダウンロードが終わったら、下記コマンドを実行し、tensorflow2-yolo-v3 ディレクトリ(フォルダ)内に移動します。
cd tensorflow2-yolo-v3
そして、下記の4つのコマンドを実行し、YOLOv3用の重みをダウンロ―ドし、さらにそれを TensorFlow 用に変換します。前半 2 つが通常の YOLO 用のコマンド、後半 2 つが tiny YOLO 用のコマンドです。
wget https://pjreddie.com/media/files/yolov3.weights -O data/yolov3.weights
python3 convert.py

wget https://pjreddie.com/media/files/yolov3-tiny.weights -O data/yolov3-tiny.weights
python3 convert.py --weights ./data/yolov3-tiny.weights --output ./checkpoints/yolov3-tiny.tf --tiny
Raspberry Pi 4 登場以前の Raspberry Pi 3 などで、コマンド「python3 convert.py」実行時にエラーが出る場合、 「2. [TensorFlow 1 系] プログラムのダウンロードと準備」で解説されているスワップ領域の増加を試してみると良いかもしれません。

次に、静止画に対して物体検出を行うコマンドが下記の 2 つです。1 つ目のコマンドは、通常の YOLO を画像「./data/meme.jpg」に対して適用します。 「./data/meme.jpg」は、「現在のディレクトリ(./)にある data ディレクトリ(data/)にある画像 meme.jpg」という意味です。 同様に、2 つ目のコマンドは、tiny YOLO を画像「./data/street.jpg」に対して適用します。
どちらの場合も、検出結果が描かれた output.jpg というファイルが保存されます。
python3 detect.py --image ./data/meme.jpg

python3 detect.py --weights ./checkpoints/yolov3-tiny.tf --tiny --image ./data/street.jpg
最後に、ウェブカメラから取得した映像への物体検出は以下で行います。1 つ目が通常のYOLO、2 つ目が tiny YOLO 用のコマンドです。どちらも、終了するにはウインドウ上でキーボードの「q」をタイプしてください。
なお、Bullseye 64-bit で、Legacy Camera 有効 + カメラモジュールで使っている場合、カメラモジュールでの認識が可能です。 Bookworm 64-bit の場合カメラモジュールでの認識はできません。USBで接続するウェブカメラが必要です。その場合、detect.py の 57行目の「cap = cv2.VideoCapture(0)」のカッコ内の数字を 0 から 1 に変更する必要があるかもしれません。
python3 detect.py --webcam

python3 detect.py --weights ./checkpoints/yolov3-tiny.tf --tiny --webcam


2. [TensorFlow 1 系] プログラムのダウンロードと準備

ここからは、TensorFlow 1 系用の YOLO バージョン 3 (YOLOv3) のダウンロードと準備を行いましょう。
公式の YOLO は、darknet というライブラリでネットワークを実現しています。 それを別のディープラーニング用ライブラリで実行するためのプログラムを様々な方が公開しています。

ここでは、kcosta42 氏が公開しているプロクラムを用います。 kcosta42 氏のプログラムに、カメラ映像に対する物体検出機能を筆者が追加したプログラムをダウンロードします。 ターミナルを開き、下記のコマンドでプログラムをダウンロードしましょう。
git clone https://github.com/neuralassembly/Tensorflow-YOLOv3
次に、学習済のパラメーター(結合係数)ファイルをダウンロードして TensorFlow 用のファイルに変換します。下記の3つのコマンドを順に一つずつ実行します。
cd Tensorflow-YOLOv3

curl https://pjreddie.com/media/files/yolov3-tiny.weights > ./weights/yolov3-tiny.weights

python3 convert_weights.py --tiny
一つ目のコマンドはディレクトリの移動を、二つ目のコマンドははTiny YOLO用のパラメーターファイル (35MB程度) のダウンロードを表します。
三つ目のコマンドはファイル変換を行います。Pi 3 B+で 1 分 30 秒程度、Pi 4 B で40秒程度の時間がかかります。このときコンソールに大量の WARNING が出ますが、変換は適切に行われますので気にする必要はありません。

Raspberry Pi 4 をお使いの方で Tiny ではない通常の YOLO の実行もしたい方は、引き続き下記の2コマンドを実行してください。
curl https://pjreddie.com/media/files/yolov3.weights > ./weights/yolov3.weights

python3 convert_weights.py
それぞれ YOLO 用のパラメーターファイルのダウンロードと変換を行っています。Pi 4 B で 2 分程度の時間がかかります。
なお、パラメータファイルは250MB程度ありますので、SDカードの容量に注意してください。
なお、ファイルの変換には多くのメモリが必要とされるため、 Pi 3 B+までのRaspberry Piでは途中で強制終了してしまいます。

なお、2019.12末に試したところ、2つめのコマンドで Raspberry Pi 4 でもメモリに関するエラーが出て終了してしまいました(std::bad_alloc)。
これは、この時期にインストールされた tensorflow-1.14.0 に問題があるからのようです。
sudo pip3 install tensorflow==1.13.1
上記のコマンドにより tensorflow 1.13.1 にバージョンを落とすと上の変換コマンド「python3 convert_weights.py」はRaspberry Pi 4 メモリ 8GB 版と 4GB 版とでは問題なく実行でき、「Model Saved at "./weights/model.ckpt" 」と表示されて正常終了します。その場合、「3. プログラムの実行 (静止画の場合)」に進んでください。

なお、Raspberry Pi 4 メモリ 2GB 版ではメモリが足りず tensorflow-1.13.1 にバージョンを落としても「python3 convert_weights.py」コマンドに失敗することがあります。 その場合、SDカードの領域をメモリの一部として使う「スワップ」という領域のサイズを増やす必要があります。スワップ領域のデフォルトのサイズは 100MB であるので、これを 600MB に増やしてみましょう。 下記コマンドにより、スワップ領域のサイズを決めるファイル /etc/dphys-swapfile を管理者権限のテキストエディタで開きます。
sudo mousepad /etc/dphys-swapfile
下記の行がありますので、
CONF_SWAPSIZE=100
この数値 100 を下記のように 600 に変更します。
CONF_SWAPSIZE=600
変更したらテキストエディタでファイルを上書き保存してから、Raspberry Pi を再起動します。すると、スワップ領域の量が 600MB に増えており、変換コマンド「python3 convert_weights.py」が「Model Saved at "./weights/model.ckpt" 」と表示されて正常終了するようになります。
正常終了を確認したら、再び /etc/dphys-swapfile を管理者権限で開き、CONF_SWAPSIZE の値を 100 に戻して構いません。

以上が終わったら物体検出を実行してみましょう。

3. [TensorFlow 1 系] プログラムの実行 (静止画の場合)

まず、静止画に対する物体検出を試してみましょう。プログラムをダウンロードすることでユーザー pi のホームディレクトリに Tensorflow-YOLOv3 というディレクトリ(フォルダ)が出来ていますが、
その中の data ディレクトリ→ imagesディレクトリとたどった中にある person.jpg というファイルに対して物体検出をおこないます。あらかじめ、Raspberry Pi上のファイルマネージャで画像をダブルクリックしてどのような画像か確認しておきましょう。

そして、 Tensorflow-YOLOv3 というディレクトリに移動してからプログラムを実行します。 結合係数の変換からターミナルを閉じていなければそのまま実行してよいのですが、新たにターミナルを起動した場合はあらかじめ
cd Tensorflow-YOLOv3
というコマンドを実行し、ディレクトリを移動してからプログラムを実行します。

Tiny YOLO (YOLOv3-tiny) によりperson.jpgに対して物体検出を行うには下記のコマンドを実行します。
python3 detect.py --tiny image 0.5 0.5 ./data/images/person.jpg
Pi 3 B+で 45秒程度(パラメータファイルからのモデルの構築に36秒、入力から検出結果を得るのに9秒)、Pi 4 B で 24 秒程度(パラメータファイルからのモデルの構築に20秒、入力から検出結果を得るのに4秒)の時間待つと、結果が保存されます。
結果は、Tensorflow-YOLOv3 ディレクトリ内の detections ディレクトリにある image_output.png というファイルに保存されています(ファイル名は毎回固定です)。 下記のようなファイルが保存されているはずです。


犬に対する枠が2重に表示されていたり、馬が sheep と判定されているなど若干問題はありますが、Tinyではない通常の YOLO を用いるとこの問題はどちらも解決されます(その方法は後述します)。
なお、犬に対する枠が2重に表示されている問題は Tiny の範囲で解決できます。実行コマンド中の「0.5 0.5」のうち、一つ目の数字は「同じクラスの物体を示す枠が複数あって重なっているとき、重なりが大きい枠を除去する」という処理に使われます。 この数字を 0 から 1 の範囲で小さくすると(例えば 0.3)、犬の枠は一つになります。すなわち「python3 detect.py --tiny image 0.3 0.5 ./data/images/person.jpg」ですので興味のある方は試してみてください。

ここで、実行コマンドの中の「./data/images/person.jpg」について解説しておきましょう。これは物体検出を行う対象となる画像の位置を指定しています。このとき、下記の記号を覚えておくと便利です。

   .   ユーザーが現在いるディレクトリ
   /   ディレクトリの区切り

この表によると、「./data/images/person.jpg」は「ユーザーが現在いるディレクトリ内にあるdataディレクトリ→imagesディレクトリにあるperson.jpgという画像」という意味になります。 それ以外には下記の記号を覚えておくと良いでしょう。

   ..   ユーザーが現在いるディレクトリの一つ上のディレクトリ

この記号を用いると、例えば「../image.jpg」と書くことで「ユーザーが現在いるディレクトリの一つ上のディレクトリにあるimage.jpgという画像」という意味になります。

ここで学んだ知識を確認するため、別の画像に対しても Tiny YOLO で物体検出を行ってみましょう。本ページの冒頭に示した机の上にキーボード、カッター、カップ、マウスを置いた画像を試してみましょう。下記のコマンドで画像をダウンロードします。
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/desk-image.jpg
ファイルマネージャで Tensorflow-YOLOv3 ディレクトリにダウンロードされた desk-image.jpg の存在を確認し、どんな画像か確認しておきましょう。 そして、下記のコマンドにより物体検出を実行します。
python3 detect.py --tiny image 0.5 0.5 ./desk-image.jpg
先ほど学んだように「./desk-image.jpg」は「現在のディレクトリにある desk-image.jpg という画像ファイル」という意味になるのでしたね。

実行結果は先程と同じく detections ディレクトリの image_output.png として保存されます。以下のような図になっているはずです。


本ページ冒頭の図と異なり、カッターが検出されていません。これは、物体かどうかを判定する基準が厳しいからです。実行コマンド中の「0.5 0.5」のうち二つ目の数字を0.2にすると、基準が緩くなり、カッターがナイフと判定されるようになります (基準は0から1の範囲の数値で定めます)。すなわち「python3 detect.py --tiny image 0.5 0.2 ./desk-image.jpg」です。このコマンドで本ページ冒頭の図と同じものが detections ディレクトリの image_output.png として保存されます。

さて、ここまで Tiny YOLO での物体検出を解説してきました。通常の YOLO で物体検出を行いたい場合は、コマンドから「--tiny」を除いて下記を実行します。Pi 3 B+までではパラメータファイルの変換に失敗するので、実行可能なのは Raspberry Pi 4 以降のみでしたね(メモリ 4GB 版と 2GB版とで動作を確認)。
python3 detect.py image 0.5 0.5 ./data/images/person.jpg
Pi 4 B で 1 分弱(パラメータファイルからのモデルの構築に45秒、入力から検出結果を得るのに8秒)待つと、これまで通り detections ディレクトリの image_output.png として保存されます。
認識率はこちらの通常の YOLO を用いることで格段に上がりますが、そのぶん認識結果を得るまでの時間がかかるようになっています。

4. [TensorFlow 1 系] プログラムの実行 (カメラの映像の場合)

最後に、Raspberry Pi に接続したカメラから得られた映像に対して物体検出を行う方法を紹介します。

カメラは、Raspberry Pi 公式のカメラモジュールおよび USB 接続のウェブカメラのどちらでも構いません。USB 接続のウェブカメラとしてこちらで動作確認したのは ロジクール社の C270 および C920 です。

本ページでは「××社の○○と言うカメラで動くか」という質問や「××社の○○と言うカメラで動くようにして欲しい」という要望には応えることができませんのでご了承ください。

実行方法は、静止画の場合と同様に Tensorflow-YOLOv3 ディレクトリに「cd Tensorflow-YOLOv3」コマンドで移動してから下記を実行します。

Tiny YOLOの場合はこちらです。
python3 detect.py --tiny webcam 0.5 0.5 
利用状況は下図のようになります。Pi 3 B+ では、約1秒に一回くらい映像が更新されましたが、5秒くらいの映像遅れがあるので実用は厳しいところです。
Pi 4 B では、1秒に複数回映像が更新され、2秒くらいの映像遅れがあります。



通常の YOLO の場合はコマンドから「--tiny」を除いた下記のコマンドを実行します。こちらは Raspberry Pi 4 でのみ実行できます(メモリ 4GB 版と 2GB 版とで動作を確認)。 こちらは Tiny YOLO よりも認識率は良いのですが、映像の遅れが25秒程度あるので使いどころは難しいところです。
python3 detect.py webcam 0.5 0.5 


8. まとめ

Raspberry Pi で YOLO v3-Tiny / YOLO v3 による物体検出を試してみました。カメラ映像に対する例を試してみたところ、実用するためには Raspberry Pi 4 + YOLO v3-Tiny くらいの動作速度は最低限欲しいところです。

また、YOLO v3-Tiny は認識精度が低いので、実用するにはなんらかの工夫が必要と思われます。

この物体検出の高速化に関して、「Raspberry Pi + Coral USB Accelerator + TensorFlow Lite で物体検出と姿勢推定を試してみよう」ページを作成しましたので、引き続きご覧ください。Coral USB Acceleratorをお持ちでない場合も演習を実行できます。

2019年12月2日月曜日

本書の演習を Windows / macOS を用いて Anaconda 上の Spyder で実行する方法

1. はじめに

(2026.5 動作確認済)
本書の演習を Windows / macOS で動作している Anaconda 上の Spyder で実行する方法に関する質問が時々あります。
Anaconda での実行を正式にサポートすることはできませんが、本ページでそのヒントをいくつか記します。

なお、本ページの内容はWindowsのユーザー名に日本語文字や半角スペースなどが含まれていると実行できません。
ただし、最近は「Microsoftアカウント」でユーザーを作成することが多いので、この問題は起こりにくくなっています。 なぜなら、Microsoftアカウントでは登録したメールアドレスの先頭数文字がユーザー名となり、 メールアドレスには日本語文字や半角スペースは含まれないためです。

2. ツールのインストール

それでは、本書の演習をWindowsなどで実施するために必要な Anaconda のインストールと設定の方法を解説します。

まず、Anaconda のダウンロードは、こちらのページで「Skip registration」をクリックすることから始まります。
現れたページの末尾で下図のように「Windows 64-Bit Graphical Installer」をクリックし、インストール用のファイルをダウンロードします。

macOS に対するヒント
macOS 用は、M1/M2 チップなどの系列用の「64-Bit (Apple silicon) Graphical Installer」をダウンロードすることになります。
Intel 版 macOS を用いている方は、こちらより「Anaconda3-2025.06-1-MacOSX-x86_64.pkg」をダウンロードするのが良いと思います。
なお、macOS版では下記の制限があります。ご了承ください。
  • Intel版: じゃんけんシステム(9章、10章、mediapipeじゃんけん) で映像が出ない
  • Apple silicon版: じゃんけんシステム(9章、10章) で映像と音声が出ない。mediapipeが動作しない


ダウンロードされたファイル(執筆時なら Anaconda3-2025.12-2-Windows-x86_64.exe)をダブルクリックし、Anaconda のインストールを行ってください。
基本的には、現れた画面で促されるままに「Next」、「I Agree」、「Next」、「Next」、「Install」、「Next」、「Next」とボタンをクリックして行くだけです。
最後の画面は下記の通りですが、2つの選択肢のチェックを外し「Finish」ボタンを押しましょう。それでインストールが終了します。
なお、チェックを外し忘れると、Anaconda Navigator というアプリケーションが起動してしまいます。ここでは Anaconda Navigator の起動は不要なので 「×」ボタンなどで全て閉じてください。 「Quit Anaconda Navigator?」と聞かれたら「Don't show again」にチェックを入れて「Yes」をクリックします。 さらに、「Do you with to update to Anaconda Navigator x.x.x now?」 のように Anaconda Navigator をアップデートするか?と英語で聞くウインドウも現われることがありますが、 「No, don't show again」をクリックして無視してください。

「アップデートは自分の意志で行う」ものとし、Anaconda 等からアップデートを促されたときは基本的に無視する、という方針です。 これは、アップデートにより、動くべきものが動かなくなるリスクを避けるためです。

また、インストール中に下記のエラーが出る場合、冒頭で触れた「ユーザー名に問題のある文字が含まれている」場合になります。このまま先に進めてもうまくいきませんので、Windowsでに日本語文字を含まないユーザーを作り直すしかありません。
Error: Due to incompatibility with several Python libraries, 'Destination Folder' cannot contain non-ascii characters (special characters or diacritics). Please choose another location.
ただし、最近は「Microsoftアカウント」でユーザーを作成することが多いので、この問題は起こりにくくなっています。
なぜなら、Microsoftアカウントでは登録したメールアドレスの先頭数文字がユーザー名となり、メールアドレスには日本語文字や半角スペースは含まれないためです。

さて、Anaconda のインストールが終わったら、スタートメニューから Anaconda を起動しましょう。 Windows 11 の場合、スタートメニューの右上にある「すべて」を一度クリックすると、 アルファベット順のアプリケーション一覧が表示されるので、 その「A」の項目から下図の「Anaconda (anaconda3)」という項目 (フォルダ) を見つけましょう。

そして、「Anaconda (anaconda3)」フォルダにある、「Anaconda Prompt」をクリックして実行しましょう。
なお、最新の Windows 11 に更新している場合は、スタートメニューは上図と異なる可能性があります。 その場合、まず下図のように「すべて」の「ビュー」を「一覧」に変更してください。
そうすると、アプリ一覧がアルファベット順で現われるので、下図のように「Anaconda (anaconda3)」フォルダにある、「Anaconda Prompt」実行しましょう。
ただし、Windows 11 のバージョンによっては、Windows 11 のバグより、スタートメニューの項目がすぐには更新されない問題があります。 その場合、Windows 11 を再起動してからスタートメニューを探すことで、以下のような部分を見つけることができるでしょう。
最終的に、以下のようなプロンプトが現れます。


macOS に対するヒント
macOS では、Anaconda Prompt のかわりに macOS のターミナルを使います。


現れたプロンプトで各種ツールのインストール作業を始めます。ただし、最新のAnaconda環境でそのまま本書に必要なツールをインストールしようとすると、ツール同士のバージョンの衝突が起こりうまくインストールできないことがあります。そこで、「Pythonの仮想環境を作ってそこに必要なツールのインストールを行う」という方針にします。

なお、プロンプトの冒頭には「(base) C:Users\(ユーザー名)」という内容が書かれています。「(ユーザー名)」の部分は人によって異なります。
本ページ冒頭で「Windowsのユーザー名に日本語文字や半角スペースなどが含まれていると実行できません」と述べましたが、このユーザー名の部分に日本語文字などを含んではいけない、という意味なのでした。

さて、プロンプト上で下記のコマンドを実行して仮想環境を作成します。仮想環境に「tf2」という名称を付けていますが、これは「TensorFlowのバージョン2をインストールする仮想環境」という意味で付けました。さらに、仮想環境 tf2 で用いる Python のバージョンは 3.9 とします。3.9 にしたのは、安定性を重視したためです。
conda create -n tf2 python=3.9
なお、以後長いコマンドが続きます。Windows 11 をお使いの方でしたら、ブラウザ上で上のコマンドをコピーし、Ctrl-V によりコマンドをプロンプトに貼り付ければ楽に実行できます。
Windows 10 のプロンプトでは Ctrl-V は効かないはずですので、下図のようにメニューから貼り付けます。


貼り付けが完了した状態が下図で、この状態で「Enter」キーを押すことで、コマンドを楽に実行できるわけです。
なお、処理が進むと「Continue creating environment (y/[n])?」や「Proceed (y/[n])?」などと聞かれますので、どちらの場合もキーボードで「y」をタイプして「Enter」キーを押して作業を進めてください。

macOS に対するヒント
macOS では、先頭に (base) と書かれたターミナルで、
conda create -n tf2 python=3.9
を実行すればよい。


仮想環境の作成が完了したら、下記のコマンドを実行して作成した仮想環境「tf2」に入ります。
conda activate tf2
その結果、下図の状態になります。プロンプトの行頭が「(base)」から「(tf2)」に変化しており、環境が「base」から「tf2」に変わったことがわかります。
そのままの状態で、下記のコマンドを実行して、本書に必要なツールをインストールしましょう。このコマンドは特に長いので、注意してコピーして実行しましょう。先ほどと同様、 「Proceed (y/[n])?」と聞かれたときはキーボードで「y」をタイプして「Enter」キーを押して作業を進めてください。
conda install scikit-learn matplotlib pillow py-opencv tensorflow keras numpy spyder=5.5.1 console_shortcut toml
「done」と表示されていれば、ここまでの作業に成功しています。

macOS に対するヒント
macOS (Apple silicon版) では、以下のコマンドを用いてください。Intel 版は上記のコマンドのまま実行できます。
conda install scikit-learn matplotlib pillow py-opencv tensorflow keras numpy spyder=5.5.1 toml


最後に、画像処理に用いる opencv とじゃんけんシステムで音を鳴らすための playsound というライブラリをインストールしておきましょう。先頭が (tf2) のプロンプトのまま、下記のコマンドを実行します。
pip install opencv-contrib-python==4.10.0.84 playsound==1.2.2
以上で本書の演習を実行するために必要なツールのインストールは終わりです。インストールが完了すると、スタートメニューの「Anaconda (anaconda3)」の項目には下図のように「Spyder (tf2)」や「Anaconda Prompt (tf2)」が追加されています。ここで「Spyder (tf2)」をクリックし、Spyder を起動しましょう。
ただし、Windows 11 のバージョンによっては、Windows 11 のバグより、スタートメニューの項目がすぐには更新されない問題があります。 その場合、Windows 11 を再起動してからスタートメニューを探すことで、以下のような部分を見つけることができるでしょう。 ここで「Spyder (tf2)」をクリックし、Spyder を起動しましょう。
Spyderの起動時に、「Kite をインストール (Insall Kite)」とか「Start Tour」などという画面が現れたら、「無視 (Dismiss)」 を選択してください。
さらに、「Spyder x.x.x が利用可能です!」などというメッセージが出たら(英語の場合もあり得ます)、下図のように「起動時に更新をチェック」のチェックを外し、「いいえ」をクリックしてください。
Anaconda と同様、Spyder も更新しない方針だからです。


macOS に対するヒント
macOS では、ターミナルで
conda activate tf2
を実行してから
spyder
とコマンドで実行してください。


なお、仮想環境 tf2 用のSpyder が起動して、インターフェースが日本語ではなかった場合、メニューから「Tools」→「Preferences」を選択し、現れたウインドウで「Application」→「Advanced settings」を選択してLanguageを日本語に設定してください。その際、再起動を促されますのでそれに従えばインターフェースが日本語になります。


3. サンプルファイルの準備

次に、演習ファイルの用意です。まず、「書の内容を Pi Zero ~ Pi 5 で実行する方法」より、演習ファイル mlbb-sample-pi5.zip をダウンロードし、それが終わったら展開してください(ファイルを右クリックして「すべて展開」)。

さらに、カメラを用いる演習用に、「本書の演習をウェブカメラで実行する方法」にて紹介したウェブカメラ用の演習ファイル mlbb-webcam.zip をダウンロードし、こちらも展開してください。 そして、mlbb-webcam.zip を展開して現れるファイルを、全て本書の演習ファイルと同じフォルダに移動してください。これを行わないと正しく実行できない演習ファイルがあります。2個のファイルを上書きするか聞かれますが、上書きして構いません。

さて、サンプルの演習ファイルのあるフォルダにウェブカメラ用のファイルを加えると、「同じ番号のファイルが複数ある」状態になります。例えば、「ml-08-01」という番号がついたファイルは
  • ml-08-01-cameracheck.py
  • ml-08-01-cameracheck-webcam.py
の2つありますし、「ml-10-09」という番号のついたファイルも同様です。
  • ml-10-09-janken-deep.py
  • ml-10-09-janken-deep-webcam.py
このような場合、「webcam のついたファイルを使う」ようにしてください。上の例だと「ml-08-01-cameracheck-webcam.py」と「ml-10-09-janken-deep-webcam.py」ですね。
webcam のついていない方を実行するとエラーが出ますので注意してください。

以上でサンプルファイルの準備は完了です。

4. ファイルの実行に関する注意

あとは「Spyder (tf2)」からファイルを読みこんで実行するだけなのですが、いくつか注意がありますので順番に列挙します。
  • グラフ表示のあるプログラムでは、図のように「プロット」領域にグラフが現れます。



  • 7章最初に CUI で実行するじゃんけん (ml-07-01-janken-cui.py および ml-07-02-perceptron-cui.py) の実行には注意があります。まず、それらのファイルを開いた状態で「実行」→「ファイルごとの設定」を選択します。


    そした現れた画面で「カスタム設定でファイルを実行」にチェックを入れ、さらに「コンソール」の「外部システムターミナルで実行」を選択して「OK」してください。その設定をしてから実行しないと、プログラムを正しく終了できなくなります。
    なお、「ファイルごとの実行設定」の画面は小さく表示されることが多いので、ウインドウの端をつかんで大きくしてからご利用ください。

  • カメラを用いた演習、例えば ml-08-01-cameracheck.py と ml-08-01-cameracheck-webcam.py という同じ番号のファイルが複数見つかりますが、すべて末尾が「-webcam.py」という名前のファイルを選ぶようにしましょう。 これは上で mlbb-webcam.zip を展開した時に現れたファイルです。

    さらに、カメラを用いた演習でも「実行」→「ファイルごとの設定」で「カスタム設定でファイルを実行」にチェックを入れてから「コンソール」→「外部システムターミナルで実行」を選択してください。そうしないと、プログラム終了時にカメラが正常終了しません。

    また、カメラを用いた演習で手の形にが白く二値化されない場合、「書籍で用いたコマンドおよび追加情報」の「p.257 ml-08-02-binary.pyが手の形を反映していない場合」の項目を参考に、hmin、hmax、smin などのパラメータを調整する必要があります。

  • コマンドライン引数(ひきすう)の必要なプログラムの実行についてです。
    例えば、ml-08-03-learn.py の実行には下記のように「result.pkl」というコマンドライン引数をつける必要があるのでした。
    python3 ml-08-03-learn.py result.pkl
    
    これをSpyder で実現するためには、「実行」→「ファイルごとの設定」を開き、図のように「カスタム設定でファイルを実行」にチェックを入れ、さらに「一般設定」→「コマンドラインオプション」にチェックを入れてから、右側の入力欄に「result.pkl」と記入してOKボタンを押します。なお、古い Spyder では「カスタム設定でファイルを実行」のチェックが存在しない場合がありますがその場合は「一般設定」→「コマンドラインオプション」への記述だけで構いません。

    以上で演習ファイルにコマンドライン引数をつけて実行できます。文字通りこれは「ファイルごとの設定」ですので、演習ファイルを変更するごとに設定しなおす必要があります。

  • 9章で実行するじゃんけんシステム、ml-09-01-janken-webcam.py と ml-09-02-janken-shorten-webcam.pyは、「実行」→「ファイルごとの設定」で「カスタム設定でファイルを実行」にチェックを入れてから「コンソール」の「外部システムターミナルで実行」を選択して「OK」してください。そうしないと正常に終了できなくなります。「一般設定」の「コマンドラインオプション」への「result.pkl」の設定も必要です。

  • 10章最後に登場するじゃんけんシステムは、「実行」→「ファイルごとの設定」を開き、「カスタム設定でファイルを実行」にチェックを入れてから「外部システムターミナルで実行」を選択して「OK」してください。そうしないと正常に終了できなくなります。「一般設定」の「コマンドラインオプション」への「ml-hand-cnn.h5」の設定も必要です。


macOS に対するヒント
macOS (Intel/Apple silicon共通) では以下の点にご注意ください。ご了承ください。
  • 数字認識やじゃんけんなど、GUIを持ったプログラム(6章、7章、9章、10章およびmediapipeじゃんけん)も「外部システムターミナルで実行」しないと、プログラムが正常終了しません
  • じゃんけんシステム(9章、10章およびmediapipeじゃんけん)がマルチスレッドの問題でそのままでは動作しません。具体的には、映像を写す画面が開きません。
    プログラム中の「cv2.imshow('...', img)」の行の先頭に「#」を付けて無効にすると(すなわち、「#cv2.imshow('...', img)」のように)エラーは出なくなり、じゃんけんは動作します。
    ただし、映像を写す画面は開きませんのでご了承ください。
さらに、macOS (Apple silicon) では、じゃんけんシステムで音声を出力するための playsound が動作しません。そのため、先頭が (tf2) のターミナルで
pip uninstall playsound
を実行し、playsound を削除してください。cv2.imshow の無効化と合わせ、じゃんけんシステム (9章、10章) は映像なし、音声なしで動作するようになります。 また、macOS (Apple silison) では以下で紹介する mediapipe は動作しませんのでご了承ください。




5. MediaPipe のサンプルプログラムの実行に関する注意

また、Anaconda の Spyder で「Raspberry Pi 5 でリアルタイムな姿勢推定と物体検出」の内容を実行したい場合の解説を行います。

まず、mediapipe のインストールが必要です。「Anaconda Prompt (tf2)」を起動し、先頭が (tf2) のコマンドプロンプトで下記のコマンドを実行してインストールします。
pip install mediapipe==0.10.11
その後、姿勢推定と物体検出を以下の手順で実行します。
<姿勢推定の場合>
  • 「mediapipe-python-sample」のサンプルファイルをダウンロードするときは、「こちらのリンク」の先で「Code」ボタン→「Download ZIP」とたどります。ZIPファイルをダウンロ―ド後は展開します。
  • 展開したプログラムのうち、ファイル名に「_picamera2.py」が含まれていないものは、ウェブカメラで実行できます。
  • どのプログラムを実行する場合も、「実行」→「ファイルごとの設定」において「カスタム設定でファイルを実行」にチェックを入れ、「コンソール」を「外部システムターミナルで実行」に設定します。カメラの種類を変えたい場合は、「一般設定」の「コマンドラインオプション」で「--device 1」などとカメラ番号を指定してください。

<物体検出の場合>
  • 「mediapipe」のサンプルファイルをダウンロードするときは、「こちらのリンク」の先で「Code」ボタン→「Download ZIP」とたどります。ZIPファイルをダウンロ―ド後は展開します。
  • 展開したプログラムのうち、「object_detection/raspberry_pi」フォルダにある「detect.py」を実行します。その前に、「efficientdet_lite0.tflite」をダウンロードし、「detect.py」と同じフォルダに保存しておきましょう。
  • ファイル実行時の設定として、「実行」→「ファイルごとの設定」において「カスタム設定でファイルを実行」にチェックを入れ、「コンソール」を「外部システムターミナルで実行」に設定します。さらに、 「一般設定」の「コマンドラインオプション」で「--model efficientdet_lite0.tflite」を指定します。 カメラの種類を変えたい場合は、「一般設定」の「コマンドラインオプション」を「--model efficientdet_lite0.tflite --cameraId 1」などとしてカメラ番号を指定してください。

さらに、Anaconda の Spyder で「Raspberry Pi 5 と mediapipe で AI とじゃんけん勝負してみた」の内容を実行したい場合、以下の手順で行ってください。
  • 「mediapipe-janken」のファイルをダウンロードするときは、「こちらのリンク」の先で「Code」ボタン→「Download ZIP」とたどります。ZIPファイルをダウンロ―ド後は展開します。
  • 手の形の学習済ファイルは ml-mediapipe-hand.h5 なのですが、配布されているファイルはバージョンの問題により Anaconda 上で動作しません(Raspberry Piでは動作する)。そのため、 ml-mediapipe-hand.h5 を Anaconda で作り直す必要があります。
  • 展開したプログラムのうち、ml-mediapipe-02-learn.py を開きます。「実行」→「ファイルごとの設定」において「カスタム設定でファイルを実行」にチェックを入れ、「一般設定」の「コマンドラインオプション」に保存先のファイル名を「ml-mediapipe-hand.h5」と指定します。これは、配布済のファイルの上書きとなります。その後、プログラムを実行すると学習済ファイル ml-mediapipe-hand.h5 が保存されます。
  • その後、ml-mediapipe-03-janken.py を実行します。「実行」→「ファイルごとの設定」において「カスタム設定でファイルを実行」にチェックを入れ、「コンソール」を「外部システムターミナルで実行」に設定し、「一般設定」の「コマンドラインオプション」に「ml-mediapipe-hand.h5」を指定します。以上の設定でファイルを実行してください。

2018年8月26日日曜日

人間の手を予測するじゃんけんシステムにロボットハンドを追加する

0. はじめに

本書では、9章および10章において、コンピュータと勝負できるじゃんけんシステムを作成しました。

過去の履歴をもとに人間の手を予測する部分をパーセプトロンで、画像処理と組み合わせて人間の現在の手を読み取る部分に三層ニューラルネットワークやディープラーニングの畳み込みニューラルネットワーク (CNN) を用いました。

このシステムでは、コンピュータの出す手はディスプレイ上の画像として表現されていました。本ページでは、コンピュータの出す手をロボットハンドに表現させる手法を紹介します。

実際にそのシステムが稼働している様子を示したのが下図です。左側に見えている黒い物体がロボットハンドです。後述しますが、ここでは市販のものを用いています。


本システムが動作している様子は以下の動画に示されています。


本書のあとがきで「本書をきっかけに機械学習の機能を組み込んだ電子工作の作品作りにチャレンジするのも面白いでしょう」と記しました。このシステムはまさにそのような例になっています。完成までの時間を短縮するために市販のロボットハンドを用いましたが、これを自作のものにすれば、より独自性の高い作品となるでしょう。

以下では、このロボットハンドを追加したじゃんけんシステムの概要と仕組みを解説します。

1. 本システムの構成(ロボットハンド編)

今回、なるべく簡単にシステムを実現するため、ロボットハンドは下図の市販のものとしました。


これは、アマゾンで購入した下記の商品です。
選ぶときに考慮したのは、全ての指を独立にプログラムにより制御できることです。このロボットは5本の指を5つのサーボモーターで曲げ伸ばしするだけなので、サーボモーターの制御により自由に動かせることから選択しました。

なお、このロボットハンドはものを掴めるわけではない上に高価なので、このじゃんけんシステムのためだけに購入するのは現実的ではないでしょう。5つのサーボモーターを用いて簡易的な手を自作するのが良いかもしれません。

参考までに、このロボットハンドを構造を記します。5つのサーボモーターは全て手首よりの下の部分にあり、シャフトで動力を伝えて上部の指を曲げ伸ばししています。


このロボットには第一関節、第二関節があり、サーボモーターの動きと連動する仕組みになっています。この仕組みをそのまま自作で再現するのはそれなりに大変ですが、第一関節と第二関節のない5本の棒を曲げるだけなら比較的簡単に実現できるかもしれません。

サーボモーターを用いた工作は「実例で学ぶRaspberry Pi電子工作」の6脚ロボットの作成で取り扱いましたので、興味のある方はご参考ください。

ただし、電子工作に触れるのは初めてという方は、入門編である「カラー図解 最新 Raspberry Piで学ぶ電子工作」から学び始めるのが無難でしょう。

本ページの以下の内容は、ある程度電子工作に慣れている方向けの解説となっておりますのでご了承ください。

2. 本システムの構成(回路編)

このロボットハンドを制御するための回路部分が下図に示されています。このうち、Raspberry Piとカメラモジュールは本書で解説済のものです。


5本の指を制御するために追加しているのが、上図の「PCA9685搭載サーボドライバー」です。これは「実例で学ぶRaspberry Pi電子工作」の8章で6脚ロボットを制御する際に用いたもので、複数のサーボモーターを制御するためのものです。

スイッチサイエンスさんで購入できる「PCA9685搭載16チャネル PWM/サーボ ドライバー (I2C接続)」を用いています。

Raspberry Piとの接続は下図のようになっています。これもまた「実例で学ぶRaspberry Pi電子工作」の8章で用いた接続とほぼ同じです。

なお、ロボットハンドに供給する電源としては秋月電子通商さんで購入できる「スイッチングACアダプター6V2A」を用いました。ロボットハンドに7.5Vのアダプタが付属するのですが、PCA9685搭載サーボドライバーに接続できる最大の電圧が6Vであるため変更しました。なお、アダプターを接続するソケットはロボットハンドに付属するものが利用できます。



3. 本システムの構成(プログラム編)

このシステムを動作させるためには、I2Cと呼ばれる通信方法を有効にする必要があります。メニューの「設定」→「Raspberry Piの設定」で設定アプリケーションを起動し、「インターフェイス」タブを選択し、「I2C」の項目を「有効」にしてください。

次に、このシステムを動作させるためのプログラム janken-robothand.py をダウンロードします。これは、ディープラーニング用である ml-10-09-janken-deep.py をベースに作成しました。

まずターミナルを起動してください。ml-10-09-janken-deep.py がユーザーpiのホームに直接存在する場合は、そのまま下記のコマンドを実行して janken-robothand.py をダウンロードしてください。
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/janken-robothand.py
もし、ml-10-09-janken-deep.py が bluebacks ディレクトリ内にある場合は、上記コマンドを実行する前に「cd bluebacks」コマンドを実行してください。

ダウンロードが終わったら、下記のコマンドで実行します。これは ml-10-09-janken-deep.py の実行方法と同じですね。
python janken-robothand.py ml-hand-cnn.h5
うまくいけば、ロボットハンドつきのじゃんけんシステムが動作します。

なお、「本書のディープラーニングの演習をkeras + TensorFlowで実行する方法」をもとにkerasのバックエンドをTensorFlowにしている方は、上記プログラムは動作しません。TensorFlow用のファイルを下記でダウンロードし、
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/janken-robothand-tf.py
下記コマンドで実行するようにしてください。
python janken-robothand-tf.py ml-hand-cnn.h5

さて、本ページと同じ市販のロボットハンドを用いる場合は上記のプログラムの実行で良いのですが、ロボットハンドを自作した場合は調整が必要です。以下ではそのためのコメントをいくつか記します。

まず、ロボットハンドを動かすための命令は janken-robothand.py 内の下記の部分(guchokipa_servo関数)です。
def guchokipa_servo(i):
    if i==0: #グーのとき
        # 順に、親指~小指に対応するサーボの値。
        # 2番目の引数は常に0。範囲は143~410程度で276がゼロ点。
        # 以下同様。
        setPCA9685Duty(0, 0, 350)
        sleep(0.01)
        setPCA9685Duty(1, 0, 220)
        sleep(0.01)
        setPCA9685Duty(2, 0, 240)
        sleep(0.01)
        setPCA9685Duty(3, 0, 220)
        sleep(0.01)
        setPCA9685Duty(4, 0, 350)
    elif i==1: #チョキのとき
        setPCA9685Duty(0, 0, 350)
        sleep(0.01)
        setPCA9685Duty(1, 0, 380)
        sleep(0.01)
        setPCA9685Duty(2, 0, 360)
        sleep(0.01)
        setPCA9685Duty(3, 0, 220)
        sleep(0.01)
        setPCA9685Duty(4, 0, 350)
    elif  i==2: #パーのとき
        setPCA9685Duty(0, 0, 190)
        sleep(0.01)
        setPCA9685Duty(1, 0, 380)
        sleep(0.01)
        setPCA9685Duty(2, 0, 360)
        sleep(0.01)
        setPCA9685Duty(3, 0, 360)
        sleep(0.01)
        setPCA9685Duty(4, 0, 210)
引数として与えるiが0(グー)、1(チョキ)、2(パー)のときの、5つのサーボモーターに与える数値が定められています。 例えば、グー(i=0)のとき、親指から小指のサーボモーターに与えられる数値は、順に(350, 220, 240, 220, 350)となっています。

コメントにありますように、ここに与える数値は143~410程度で276がサーボモーターのゼロ点となっています。この数値は、ロボットハンドのつくり方によってまったく異なります。ですから、ロボットハンドごとに値を変更する必要があります。

しかし、じゃんけんシステムが動作しているときにこの数値を変更するのは困難です。そこで、数値調整のためのテストプログラム  janken-robothand-test.py を作成しました。下記のコマンドを実行してダウンロードしましょう。
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/janken-robothand-test.py
このプログラムの実行方法は下記の通りです。
python janken-robothand-test.py 0
python janken-robothand-test.py 1
python janken-robothand-test.py 2
1つめの命令を実行すると、ロボットハンドは「グー」の形で静止します。2つ目なら「チョキ」、3つ目なら「パー」です。

このプログラム janken-robothand-test.py 内にも上と同じguchokipa_servo関数は存在します。そこで、 janken-robothand-test.py の guchokipa_servo関数を編集して「グー」、「チョキ」、「パー」の形に対応するサーボモーター用の数値を確定し、その数値の変更を janken-robothand.py 内のguchokipa_servo関数にも適用すれば良いのです。

あともう一点注意すべき箇所があります。 janken-robothand.py に下記の部分があります。
(中略)
    # "ぽん!"のタイミングでサーボが動くようタイミング調整
    sleep(2)
    # サーボを動かす
    guchokipa_servo(comp_choice)

    # サーボの動きはじめと手の描画のタイミング調整
    sleep(0.2)
(中略)
ここにある「sleep(2)」と「sleep(0.2)」は待ち時間を設定している部分ですが、これもロボットハンドにより調整が必要だろうと思います。

一つ目の「sleep(2)」は「じゃんけんぽん」という掛け声が始まってから何秒後にサーボモーターが動き始めるか、を設定しています。これを適切に調整して「ぽん!」の掛け声と同時にロボットハンドが動き始めるようにします。

二つ目の「sleep(0.2)」は、サーボモーターが動き始めてから何秒後に人間の手を確定させるか、を調整しています。この値が小さいと、まだ人間が手を出し切る前に手を読み取ってしまうので、誤認識が多くなるでしょう。

4. おわりに

以上、ロボットハンドを用いたじゃんけんシステムについて紹介しました。実際にこのシステムを作ろうとすると、高価なロボットハンドを購入するか、あるいは自作するかの選択となりますが、いずれにせよハードルは低くはありません。

しかし、動画を見ることで「機械学習と電子工作を組み合わせることで何ができるか」のイメージはつかめたのではないかと思います。

皆さんも、機械学習と電子工作を組み合わてどのようなシステムが可能か考えてみると楽しいでしょう。

2018年8月21日火曜日

手描き数字認識をTensorFlow.jsによりブラウザで実行してみよう

0. はじめに

本書の機械学習用プログラムは、Pythonというプログラミング言語に機械学習用のライブラリを組み合わせて実現しています。ディープラーニングにはkerasとtheano、それ以外はscikit-learnを用いたのでした。

また、ディープラーニングの計算を担う部分であるtheanoは、ライブラリkerasのバックエンドと呼ばれるのでした。

書籍に記したように、このバックエンドは変更可能です。2018年8月に投稿した下記のページでは、theanoをGoogleの開発したTensorFlowに置き換えて本書の演習プログラムを実行する方法を解説しました。
上記のページに従うと、TensorFlowをプログラミング言語Pythonで利用することになります。

一方、TensorFlowをJavaScriptというプログラミング言語から利用可能になるTensorFlow.jsが2018年4月に公開されました。このTensorFlow.jsを用いると、皆さんが普段お使いのブラウザでディープラーニングを実行できるようになります。

本ページではその簡単な例を試してみましょう。

1. 実行してみよう

それでは、下記のリンクをクリックし、TensorFlow.jsによるプログラムを体験してみましょう。
現れたウインドウには、下図のように3つの枠と2つのボタンがあり、マウスやタッチにより描いた0~9の数字を認識できるようになっています。「認識」ボタンをクリックまたはタッチすることで結果が表示されます。


本書をお読み頂いた方なら気づくかもしれませんが、これは演習プログラム ml-10-06-digits-cnn-gui-mod.py を JavaScript + TensorFlow.js に移植したものになっています。このプラグラムがどのような仕組みで動いているかの解説は、本書の6章と10章をお読みください。

ブラウザで動作するプログラムですので、下図のようにタブレット上のタッチでも数字を描くことができます。

ただし、プログラムページにも表示されているように、動作するブラウザはChrome、Firefox、Microsoft Edge、Safariの最新版です。これらのブラウザの古いバージョンでは動作しない可能性がありますし、Internet Explorerでは動作しませんのでご注意ください。


2. 何に使えるの?

さて、Raspberry Pi上のPythonプログラムとほぼ同じプログラムをブラウザで動作させることができることが体験頂けたと思います。

この仕組みは、学習結果をデモンストレーションする用途で利用するのが効果的です。

本書で体験できるように、機械学習の学習のプロセスは、Raspberry Piに代表されるようなLinux系OS上で実行するのが一般的です。試行錯誤を繰り返し、良い学習結果が得られることを目指します。

良い学習結果が得られたら、やはりLinux系OS上で結果を確認することができます。 それが本書の演習プログラム ml-10-06-digits-cnn-gui-mod.py なのでした。

一方、その学習結果をブラウザ上で実行できたら、より多くの人にその成果を体験してもらえるでしょう。最新のブラウザがあれば、ツールを追加インストールする必要もなく、結果を追体験できるのですから。

以上のように、学習結果のデモンストレーションとして用いるのが TenforFlow.js の典型的な使用例と言えるのではないでしょうか。

あるいは、学習結果を利用したインターネット上のサービスを作ることもできるでしょう。

さて、この例を体験すると、学習結果の確認はPythonではなくJavaScriptによりブラウザで出来た方が良い、と思う方もいるかもしれません。

しかし、PythonとJavaScriptというのは全く異なる言語ですから、PythonプログラムをJavaScriptプログラムに移植することは、実際にはかなりの労力が必要となります。

ですので、本ページの内容は「皆さんに体験して頂く」ことを主眼とし、皆さんがJavaScriptプログラムを書けるようになることを目指すわけではありません。ご了承ください。

3. 少しだけ技術的なコメント

少しだけ技術的なコメントを記しますが、本ページのプログラムを体験するために以下の内容を理解する必要はありませんので、飛ばして頂いても全く問題ありません。

JavaScriptプログラム自体は、プログラムのページでソースを閲覧すると確認することができます。基本的な流れは、
  1. 学習済のデータを読みこみ、ネットワークモデルを構築する
  2. モデルに手書き数字に基づいた入力を与え、結果を確認する
となっています。

学習済のデータは、本書では ml-digits-cnn.h5 という拡張子h5のファイルでした。これを、「Importing a Keras model into TensorFlow.js」に従い、jsonという形式のファイルに変換しました。

具体的には、tensorflowjsを下記のコマンドでインストールし、
sudo pip install tensorflowjs
その後、下記のコマンドでh5ファイルをjsonファイルに変換しました。
tensorflowjs_converter --input_format keras ml-digits-cnn.h5 .
すると、実行したディレクトリにmodel.json、group1-shard1of1、group2-shard1of1、group3-shard1of1、group4-shard1of1 というファイルが出来ていますので、これをサーバー上に置きます。

なお、用いるh5ファイルは、keras + TensorFlowで出力したものでなければならないようです。本書に付属するh5ファイルはkeras + theanoで出力したものですから、そのままでは正しい認識結果を返しませんでした。

さて、作成した学習済jsonファイルを読み込むのは、下記のようなJavaScriptです。model.jsonを読み込むことで、group1-shard1of1、group2-shard1of1、group3-shard1of1、group4-shard1of1も自動的に読み込まれます。
async function load_tf(){
  model = await tf.loadModel('http://アドレス/model.json');
}
ファイルの読み込みによりモデルを構築したら、下記の命令により数字の認識結果を取得しています。例えば数字の2が認識された場合、argMax(1)により、[2]という配列(テンソル)が得られますので、その中身の数字をget(0)で取得してます。
var result = model.predict(X).argMax(1).get(0);

なお、おまけですがアヤメの分類をおこなうプログラム ml-10-02-iris-deep-load.py のTensorFlow.js 版も下記のリンクで見ることができます。
こちらは見て面白い例ではありませんが、シンプルなJavaScriptのソースを見たい方には参考になるかもしれません。

2018年8月9日木曜日

本書のディープラーニングの演習をkeras + TensorFlowで実行する方法

はじめに

本書では、10章のディープラーニングの演習のためにkerasというライブラリとTheanoというバックエンドを組み合わせて用いました。

kerasと組み合わせることができるバックエンドは他にもGoogleのTensorFlowなどがあることを書籍で紹介しましたが、執筆当時TensorFlowはインストールがやや難しいため、本書では用いませんでした。

しかし 2018年8月、TensorFlowのバージョン1.9.0がRaspberry Piを正式にサポートしたことにより、Raspberry PiでTensorFlowを用いることができるようになりました。それにより、本書の10章のプログラムを TensorFlow で実行することが一時的に容易になったのです。

とは言え、この分野は進歩のスピードが速く、状況は常に変わっています。2023年現在、TensorFlow バージョン 2 の Raspberry Pi の公式なサポートはなく、有志の方がビルドしてくださった TensorFlow を利用させて頂いております。
また、ディープラーニングのライブラリのトレンドは TensorFlow から Facebook により開発された PyTorch (パイトーチ) に移り、一方 Google は TensorFlow とは別に jax/flax という数値計算およびディープラーニングのライブラリの開発を始めています。

このように、進歩の激しい分野で最新のツールを追いかけることはなかなか難しいことです。

本ページは、本書 10 章の演習を keras + TensorFlow で実行する方法を解説します。
上で述べたようにライブラリ(すなわちツール)のトレンドは移り変わるものですから、TensorFlow で実行すること自体が重要だというわけではありません。 しかし、2023年10月、Raspberry Pi OS の最新版 Bookworm では、これまで 5 年間用いてきた keras + Theano が動作しなくなってしまいました。 Bookworm で 10 章の演習を実行するには本ページの方法が唯一の方法となってしまったのです。ただし、64-bit 版 OS 限定の方法であることはご了承ください。

状況を整理すると下記の通りです。2025年10月時点での最新 OS Trixie を用いた場合、デフォルトの Python 3.13 とは別に Python 3.11 をインストールして用いることになり、かなり特殊な方法ですので、個人的には Bookworm をお勧めします。

OSTensorFlowkeras + Theano
Raspberry Pi OS Trixie 64-bit△ (ver2)×
Raspberry Pi OS Trixie 32-bit××
Raspberry Pi OS Bookworm 64-bit〇 (ver2)×
Raspberry Pi OS Bookworm 32-bit××
Raspberry Pi OS Bullseye 64-bit〇 (ver2)
Raspberry Pi OS Bullseye 32-bit×
Raspberry Pi OS Buster 32-bit〇 (ver1, 2)


何が変わるのか?

まず、TensorFlowの実行方法を解説する前に、TheanoからTensorFlowに変えることで何が変わるのかをあらかじめ紹介しておきましょう。

[性能]
  • TheanoからTensorFlowに変えても、計算を担うライブラリが変わるだけですから、機械学習の性能は変化しません
[プログラム全般に関して]
  • Theanoでは、プログラムの初回実行時にコンパイルという作業が行われるため、Raspberry Piで5分程度の時間がかかりました。TensorFlowではこれがなくなり、速やかに計算が始まります
[学習用プログラムに関して]
  • 学習用プログラム(ml-10-01-iris-deep-learn.py、ml-10-03-digits-cnn-learn.py、ml-10-07-hand-cnn-learn.pyの3つ)をRaspberry Pi 2~4で実行すると、マルチコアのプロセッサが有効に使われるため、プログラムの実行時間が短くなります。特に、Raspberry Pi 4 ではかなり高速に学習が終了します(あくまで本書執筆時に用いた Theano による結果と比べれば、ですが)。ただし、結果確認用プログラムではその効果はありません。また、シングルコアのRaspberry Pi 1 やRaspberry Pi Zeroでもその効果はありません。
[その他の注意]
  • TensorFlowをインストールすると、ベクトル計算用のライブラリNumPyがアップグレードされることで、プログラム実行時にライブラリ間のバージョンの組合せに起因する警告(FutureWarningやRuntimeWarningなどのWarning)がでることがあります。Warningはエラーではありませんから、当面は気にしなくても良いのですが、気になる方は気になるでしょう。

以下の流れ

さて、本ページでは以下の流れにそって解説していきます。自分の該当する部分をご覧ください。

TensorFlow 2 のインストール方法 (Trixie 64-bit 版の場合)

Trixie にインストールされているのは Python 3.13 という TensorFlow がサポートしていないバージョンなので、仮想環境に Python 3.11 をインストールして TensorFlow をセットアップするという方針です。2025年10月時点で、Raspberry Pi のカメラモジュールの利用はできず、ウェブカメラを用いることになります。

以下のコマンドを一つずつ順に実行してください。
# まず、必要なライブラリをインストール

sudo apt -y install libhdf5-dev libc-ares-dev libeigen3-dev gcc gfortran libgfortran5 libatlas3-base libopenblas-dev libblas-dev liblapack-dev cython3 openmpi-bin libopenmpi-dev  

# Python 3.11 の仮想環境を作るために pyenv と pipenv のインストールと設定

sudo apt -y install pyenv pipenv

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc

echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc

echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc

source ~/.bashrc

pyenv install 3.11.11 

pipenv --python 3.11.11

# 以上で、Python 3.11.11 が $HOME/.pyenv/versions/3.11.11 にインストールされた
# 仮想環境は $HOME/.local/share/virtualenvs 以下に構築されている
# ここからが TensorFlow のインストール

pipenv install keras_applications==1.0.8

pipenv install keras_preprocessing==1.1.2

pipenv install numpy==1.26.2

pipenv install h5py==3.14.0

pipenv install pybind11==2.9.2

pipenv install protobuf==3.20.3

pipenv install ml_dtypes==0.2.0

pipenv install six wheel mock gdown

wget https://github.com/PINTO0309/Tensorflow-bin/releases/download/v2.15.0.post1/tensorflow-2.15.0.post1-cp311-none-linux_aarch64.whl

pipenv install tensorflow-2.15.0.post1-cp311-none-linux_aarch64.whl

# 最後に、本書10章のプログラムを実行するために必要なライブラリも仮想環境にインストール

pipenv install scikit-learn matplotlib opencv-contrib-python==4.11.0.86
以上で、Python 3.11.11 の仮想環境で本書10章のプログラムを実行する準備が整いました。なお、この時点でホームディレクトリにある設定ファイル .bashrc の末尾をコマンド「 mousepad ~/.bashrc 」により見たとき、下記のようになっているのが正しいです。こうなっていない場合、修正するか、末尾に手動で追記して保存してください。
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi
さて、10章のプログラムを実行する前に、
pipenv shell
を実行してください。すると、プロンプトが
(kanamaru) kanamaru@raspberrypi:~ $
のように変化します。2か所ある「kanamaru」の部分は皆さんのユーザー名で置き換えられているはずです。先頭の「(kanamaru)」が、仮想環境で作業していることを示します。 10章のプログラム(ml-10で始まるもの)はこの仮想環境で、「python3 ファイル名」などのコマンドで実行できます。コピーできる形式のコマンドは全て以下に記されています。 なお、2025年10月時点で、Raspberry Pi のカメラモジュールを用いるプログラム(ml-10-08-hand-cnn-load.py、ml-10-09-janken-deep.py、ml-10-10-janken-deep-shorten.py)は動作しません。 「本書の演習をウェブカメラで実行する方法」で配布している ml-10-08-hand-cnn-load-webcam.py、ml-10-09-janken-deep-webcam.py、ml-10-10-janken-deep-shorten-webcam.py をウェブカメラとともに用いるのが良いでしょう。
なお、仮想環境を抜けるには
(kanamaru) kanamaru@raspberrypi:~ $ exit
を実行してください。なお、仮想環境に入らずに「pipenv run python3 ファイル名」でプログラムを実行することもできますのでお好みでどうぞ。

TensorFlow 2 系のインストール方法 (Bookworm 64-bit 版のみ)

Raspberry Pi OS Bullseye 64-bit 版で、TensorFlow 2 系のパッケージをインストールするには、以下のコマンドを1行ずつ順に実行します。 PINTO0309 (Katsuya Hyodo) さんのビルドした TensorFlow 2.15 の 64-bit 版がインストールされます。
sudo apt -y install libhdf5-dev libc-ares-dev libeigen3-dev gcc gfortran libgfortran5 libatlas3-base libatlas-base-dev libopenblas-dev libblas-dev liblapack-dev cython3 openmpi-bin libopenmpi-dev python3-dev python3-h5py

sudo pip3 install keras_applications==1.0.8 --no-deps --break-system-packages

sudo pip3 install keras_preprocessing==1.1.2 --no-deps --break-system-packages

sudo pip3 install numpy==1.26.2 --break-system-packages

sudo pip3 install h5py==3.14.0 --break-system-packages

sudo pip3 install pybind11==2.9.2 --break-system-packages

sudo pip3 install protobuf==3.20.3 --break-system-packages

sudo pip3 install ml_dtypes==0.2.0 --break-system-packages

pip3 install -U --user six wheel mock gdown --break-system-packages

wget https://github.com/PINTO0309/Tensorflow-bin/releases/download/v2.15.0.post1/tensorflow-2.15.0.post1-cp311-none-linux_aarch64.whl

sudo -H pip3 install tensorflow-2.15.0.post1-cp311-none-linux_aarch64.whl --break-system-packages
全てのコマンドが無事終了すれば インストールは終わりです。なお、TensorFlow 2.3 以降では keras は TensorFlow 専用となっていますので、.keras/keras.json による設定は必要ありません。

TensorFlow 2 系のインストール方法 (Bullseye 64-bit 版のみ)

Raspberry Pi OS Bullseye 64-bit 版で、TensorFlow 2 系のパッケージをインストールするには、以下のコマンドを1行ずつ順に実行します。 PINTO0309 (Katsuya Hyodo) さんのビルドした TensorFlow 2.15 の 64-bit 版がインストールされます。

なお、下記のコマンドを実行すると、numpy のバージョンが新しくなる関係で theano が動作しなくなりますのでご了承ください。さらに、numpy が新しくなる影響で apt でインストールした scikit-learn 0.23.2 が動作しなくなりますので、pip3 で最新版をインストールし直す必要もあります。
sudo apt -y install libhdf5-dev libc-ares-dev libeigen3-dev gcc gfortran libgfortran5 libatlas3-base libatlas-base-dev libopenblas-dev libblas-dev liblapack-dev cython3 openmpi-bin libopenmpi-dev python3-dev python3-h5py

sudo pip3 install keras_applications==1.0.8 --no-deps

sudo pip3 install keras_preprocessing==1.1.2 --no-deps

sudo pip3 install numpy==1.26.2

sudo pip3 install h5py==3.14.0

sudo pip3 install pybind11==2.9.2

sudo pip3 install protobuf==3.20.3

sudo pip3 install ml_dtypes==0.2.0

pip3 install -U --user six wheel mock gdown

wget https://github.com/PINTO0309/Tensorflow-bin/releases/download/v2.15.0.post1/tensorflow-2.15.0.post1-cp39-none-linux_aarch64.whl

sudo -H pip3 install tensorflow-2.15.0.post1-cp39-none-linux_aarch64.whl
なお、2026年7月の時点で、Bullseye の場合ここで pip3 コマンドが動作しなくなります。具体的には、ターミナルで pip3 コマンドを単独で実行すると、下記のエラーが出て以後 pip3 コマンドが何も実行できなくなります。
pip AttributeError: module 'lib' has no attribute 'GEN_EMAIL'
そのようなエラーに遭遇した場合、ターミナルで下記の2コマンドを実行し、cryptographyを削除してください。これで pip3 コマンドが動作するようになるはずです。
sudo rm -rf /usr/local/lib/python3.9/dist-packages/cryptography

sudo rm -rf /usr/local/lib/python3.9/dist-packages/cryptography-49.0.0.dist-info
その後、Bullseye のみで必要になる、scikit-learn のインストールを下記コマンドで実行してください。2026年7月の時点では、scikit-learn は 0.23.2 から 1.6.1 へアップグレードされました。
sudo pip3 install -U scikit-learn
さて、全てのコマンドが無事終了すれば インストールは終わりです。なお、TensorFlow 2.3 以降では keras は TensorFlow 専用となっていますので、.keras/keras.json による設定は必要ありません。

TensorFlow 2 系のインストール方法 (Busterまで)

Raspberry Pi OS Bullseye よりも古い Buster までの OS で、Python3 用の TensorFlow 2 系のパッケージをインストールするには、以下の3つのコマンドを順に実行します。
sudo pip3 install keras==2.4.3
wget https://github.com/lhelontra/tensorflow-on-arm/releases/download/v2.4.0/tensorflow-2.4.0-cp37-none-linux_armv7l.whl
sudo pip3 install tensorflow-2.4.0-cp37-none-linux_armv7l.whl
一つ目のコマンドは、kerasを最新の TensorFlow 用にアップグレードしています。この新しい keras は TensorFlow 専用となっており、本書で解説した Theano と合わせて使うことはできませんのでご注意下さい。そのため、Theano を用いるときは keras のバージョンを 2.3.1 に指定していたのでした。

二つ目のコマンドは、lhelontra 氏のサイトから、氏がビルドしたパッケージをダウンロードしています。三つ目のコマンドでそれをインストールしています。

なお、Raspberry Pi 1 や Raspberry Pi Zero を用いる場合、二つ目および三つ目のコマンドの「armv7l」の部分を「armv6l」に変更する必要がありますのでご注意ください。ただし、私は Raspberry Pi 1 や Raspberry Pi Zero での動作は確認していません。

以上でインストールは終わりです。なお、TensorFlow 2.3 以降では keras は TensorFlow 専用となっていますので、.keras/keras.json による設定は必要ありません。

上記のように TensorFlow2 をインストールした場合、学習済ファイルを TensorFlow2 用に更新しないと、認識率が悪くなることがあります。また、プログラムに手を加えなければならない場合もありました。

それらのファイルは下記のコマンドを実行することでダウンロードできます。プログラムをbluebacksディレクトリに展開した方は、下記のダウンロードコマンド実行前に「cd bluebacks」を実行してください。

なお、TensorFlow 2 系では、配布した学習済のファイル(拡張子 h5)も変更が必要な場合があるようでしたので、そちらもダウンロードしています。
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/ml-10-09-janken-deep-tf2.py
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/ml-10-10-janken-deep-shorten-tf2.py
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/ml-digits-cnn-tf2.h5
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/ml-hand-cnn-tf2.h5
これらの利用方法は例えば以下となります。ml-digits-cnn-tf2.h5 や ml-hand-cnn-tf2.h5 のように、「-tf2」がついた学習済ファイルが存在する場合はそちらを優先しを用いるようにしてください。ml-iris-dnn.h5 は「-tf2」がついていないファイルを用いて構いません。
python3 ml-10-04-digits-cnn-load.py ml-digits-cnn-tf2.h5
python3 ml-10-05-digits-cnn-gui.py ml-digits-cnn-tf2.h5
python3 ml-10-06-digits-cnn-gui-mod.py ml-digits-cnn-tf2.h5

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


TensorFlow 1 系のインストール方法 (Busterまで)

Raspberry Pi OS Bullseye よりも古い Buster までの OS で、Python3 用の TensorFlow 1 系のパッケージをインストールするには、以下のコマンドを実行します。
sudo pip3 install keras==2.3.1 tensorflow
環境によってはpip3コマンドは下記のようにMemoryErrorで終了してしまうかもしれません。
(中略)
  File "/usr/share/python-wheels/CacheControl-0.11.7-py2.py3-none-any.whl/cachecontrol/filewrapper.py", line 50, in _close
    self.__callback(self.__buf.getvalue())
  File "/usr/share/python-wheels/CacheControl-0.11.7-py2.py3-none-any.whl/cachecontrol/controller.py", line 275, in cache_response
    self.serializer.dumps(request, response, body=body),
  File "/usr/share/python-wheels/CacheControl-0.11.7-py2.py3-none-any.whl/cachecontrol/serialize.py", line 87, in dumps
    ).encode("utf8"),
MemoryError
その場合、下記のように「--no-cache-dir」オプションをつけてインストールコマンドを実行してください。
sudo pip3 --no-cache-dir install keras==2.3.1 tensorflow
インストールは、途中でNumPyのアップグレードが実行されるため、数十分かかります。2018年8月時点で、NumPyのバージョンは1.12.1から1.15.0とアップグレードされました。

なお、下記のようなエラーが出てインストールに失敗することがあります。
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を用いてツールをインストールする場合、サーバー側の問題なのか、何度もインストールを試みて初めてインストールに成功する、ということが多い印象があります。


NumPyがアップグレードされたことは、本書で何度か行ったように、ml-03-01-version.pyを実行すると確認できます。試してみてください。 すると、見慣れない警告(FutureWarningなど)がたくさん現れると思います。

本ページの内容を実行すると、このような警告(Warning)がたくさん出るようになります。以下ではこれらの警告を「気にしない」という方針で記述していきます。これらの警告が気になるという方は、本ページの最後で紹介するツールのアンインストールを実行することで、この警告は出なくなります。

さて、TensorFlowのインストールが終わったら、それをkerasから利用する設定を行いましょう。 本書311ページで行った手順を逆にするだけです。

まず、ターミナルを新規に立ち上げ、下記のコマンドを実行しましょう。
leafpad .keras/keras.json
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。
mousepad .keras/keras.json
すると、下記の内容がテキストエディタleafpadで開きます。本書の演習を実行した方は、backendが下記のようにtheanoに編集されているでしょう。なお、この4行の順番が変わっていることがありますが、それは気にしなくても構いません。
{
    "epsilon": 1e-07,
    "floatx": "float32",
    "image_data_format": "channels_last",
    "backend": "theano"
}
バックエンドをTheanoからTensorFlowにするには、これを下記のように変更します。
{
    "epsilon": 1e-07,
    "floatx": "float32",
    "image_data_format": "channels_last",
    "backend": "tensorflow"
}
編集が終わったら上書き保存し、テキストエディタleafpadを閉じます。以上でTensorFlow 1 系のインストールと設定は終了です。

上記の方法でインストールと設定が終わったら、本書に従いプログラムを実行してみましょう。例えば、手書き数字の認識を行うml-10-06-digits-cnn-gui-mod.pyを実行してみます。
python3 ml-10-06-digits-cnn-gui-mod.py ml-digits-cnn.h5
警告(Warning)はいくつか出ますが、下図のように問題なくプログラムが実行されることがわかります。


おおむね、keras + Theano用のプログラムがそのまま動作しますが、「ml-10-09」および「ml-10-10」から始まるじゃんけんシステムのプログラムだけは、TensorFlow用の変更が必要です(スレッドと呼ばれるものを用いているためです)。

keras + TensorFlow 1 系用のじゃんけんシステムのプログラムは下記の2つのコマンドを実行することでダウンロードできます。プログラムをbluebacksディレクトリに展開した方は、下記のダウンロードコマンド実行前に「cd bluebacks」を実行してください。
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/ml-10-09-janken-deep-tf.py
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/ml-10-10-janken-deep-shorten-tf.py
これらのプログラムの実行方法は下記の通りとなります。
python3 ml-10-09-janken-deep-tf.py ml-hand-cnn.h5
python3 ml-10-10-janken-deep-shorten-tf.py ml-hand-cnn.h5


TensorFlowのアンインストール

以上、本書のディープラーニング用プログラムをkeras + TensorFlowの組合せで実行する方法を紹介しました。

これを実行すると、主にNumPyがアップグレードされることにより、ディープラーニングの演習以外でも警告(Warning)が多く出るようになります。

これはインストールしたライブラリの内部記述に起因するものであり、多くはライブラリのアップグレードで解消されることが多いものです。本ページではそれらの警告を「気にしない」という方針で記述しました。

これらの警告が気になるという方は、本ページでインストールしたTensorFlowおよびアップグレードされたNumPyをアンインストールすることをお勧めします。下記のコマンドでアンインストールされます。
sudo pip3 uninstall tensorflow numpy
途中で「Proceed ? (続行しますか?)」という質問が2回出ますので、キーボードの「y」をタイプしてEnterキーを押してください。

また、TensorFlow 2 系をインストールしていた方は、以下のように keras のバージョンを 2.3.1 に戻す必要もあります。
sudo pip3 install keras==2.3.1 
以上でNumPyは1.15.0から1.12.1に戻り、警告(Warning)は出なくなります。もちろん、TensorFlowもアンインストールされましたので使えなくなります。 ですから、.keras/keras.jsonのbackendの項目を下記のようにtheanoに変更して保存しましょう。
{
    "epsilon": 1e-07,
    "floatx": "float32",
    "image_data_format": "channels_last",
    "backend": "theano"
}