2020年12月29日火曜日

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

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

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

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

一つ目の目的は、ソフトウェアのインストールコマンドが本書刊行後に変更された場合に、最新情報を提供することです。ですから、本書のコマンドと本ページのコマンドが異なる場合は、本ページの情報が最新であるとお考え下さい。実際、書籍では 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 用のコマンドのみを記しています。
sudo apt update
sudo apt install python3-pil.imagetk

8章

p.243, Bullseye (Raspberry Pi OS 2021-10-30 以降) でのカメラの利用について

Raspberry Pi OS 2021-10-30 からはじまったバージョン Bullseye ではカメラモジュールの利用方法に大きな変更が加えられました。 そのため、Bullseye にてカメラを利用するには、以下の方法で「Legacy Camera」のサポートを有効にする必要があります。

カメラモジュールを利用する場合、Raspberry Pi OS 2021-10-30 をお使いのかたは、まず以下の2つのコマンドを順に実行することで OS を最新にする必要があります。
sudo apt update
sudo apt dist-upgrade
必要に応じてキーボードで「y」をタイプして「Enter」キーを押すことで、アップデートが進行します。終わったら、Raspberry Pi を再起動してください。

その後、ターミナルを開いて以下の手順に従うことで、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」キーを押す
以上で、カメラモジュールを利用した演習を実行できるようになります。

なお、2022年2月からは、Bullseye の 64-bit 版も正式にインストール可能になっていますが、64-bit 版 OS では本書のカメラモジュールを用いる演習の準備が面倒です。32-bit 版 OS を利用することを推奨します。 詳細は、以下のようになります。
32-bit 版 BullseyeLegacy Cameraモードをオンにした上で、本書付属のサンプルファイルを用いる
64-bit 版 BullseyeLegacy 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がほぼ手の形を再現している場合
    この場合、hmax=180として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 音声の出力先をピンジャックにする方法 (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の利用について

本書では、kerasと一緒に用いるバックエンドとしてTheanoを用いました。 このバックエンドをGoogleのTensorFlowに変更する方法を下記のページに紹介しましたので、 興味のある方はご覧ください 。結果が変わるわけではありませんし、上級者向けの内容ですので、自信がない方は書籍の通りTheanoの利用で問題ありません。 なお、TensorFlowを導入すると、下記の発展的な内容にもトライできます。本書の演習を終えた後に挑戦してみるのも良いでしょう。

p.308 kerasとtheanoの利用の前に

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がほぼ手の形を再現している場合
    この場合、hmax=180として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の値を調整してください。

62 件のコメント:

  1. p.39まで順調にテストしながら読み進めてきましたが、
    kerasとtheanoをインストールするためのコマンド
    sudo pip install keras theano
    でエラーが発生してしまいkerasがインストールできない事態です。
    <エラー内容>
    pi@raspberrypi:~ $ sudo pip install keras theano
    Collecting keras
    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/lib/python2.7/dist-packages/pip/commands/install.py", line 353, in run
    wb.build(autobuilding=True)
    File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 749, in build
    self.requirement_set.prepare_files(self.finder)
    File "/usr/lib/python2.7/dist-packages/pip/req/req_set.py", line 380, in prepare_files

    ・(略)

    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'


    ・使用環境
    <ボード>
    RaspberryPi2B
    <Raspbian> 
    Version:March 2018
    Release date:2018-03-13
    Kernel version:4.9

    pipがおかしいのでしょうか?
    解る方、アドバイスお願いします。

    返信削除
    返信
    1. お知らせ頂きありがとうございます。

      上記のエラーは、ネットワークに問題がある場合に出るエラーのようです。

      例えば、わざとRapsberry Piのネットワーク接続を切って(Wifiをオフにして)
      pipコマンドを実行しても上記のエラーがでます。

      しかし、今回の場合はファイルをダウンロードする先方のサーバーに問題があるようで、
      私も同じエラーが出る状況です。

      少し時間を空ければサーバーが復旧するかもしれませんので、
      しばらくお待ちください。

      削除
    2. ご返答ありがとうございます。
      ネットワークエラーなんですね、何度試行してもエラーのため、こちらのブログを参考に一度PIPをremoveして
      http://6bibouroku9.blog.fc2.com/blog-entry-13.html
      apt-get remove python-pip python3-pip
      wget https://bootstrap.pypa.io/get-pip.py
      sudo python get-pip.py
      sudo python3 get-pip.py
      とコマンドを通し、kerasとtheanoを別々にインストールを試みているところです。
      自動で何度かリトライしてくれてインストールは進んでいるようです。

      削除
    3. ありがとうございます。もう少し状況がわかりました。

      Raspberry Piのpipでは、/etc/pip.confに記されている情報をもとに、
      https://www.piwheels.org/simple
      というサーバーにビルド済ファイルを探しに行きます。

      このサーバーへのアクセスができないとエラーが出るのだと思います。

      /etc/pip.confの
      extra-index-url=https://www.piwheels.org/simple
      という行の先頭に「#」をつけてコメントアウトすると、
      サーバーへのアクセスをスキップすると思われます。

      ただし、今これを書いている段階で先方のサーバーが
      復活したようなので、上記の変更は必要なくなったように見えます。

      削除
    4. ありがとうございます!なんと私のインストールのタイミングが悪かっただけというオチでしたか。あららら
      scipyのセットアップにがなかなか時間がかかっているようで、とりあえず様子見です。

      あと1つだけ質問なのですが、Raspbianをupgradeするとscikit-learnがインストール出来ないという状況になりましたが今後もupgradeはしてはいけないのでしょうか?
      初心者の不躾な質問で申し訳ありません。

      削除
    5. sudo apt-get upgradeでアップグレードされたOSについては、
      読者の皆さんと筆者の環境を揃えるのが難しいため、
      原則としてはサポート外と考えています。

      ただし、何が起こるかを事前に知っておくために
      アップグレードされた環境でも個人的に動作チェックはしています。

      その経験で言うと、
      sudo apt-get install python-sklearn
      はアップグレードされたOSでも常に可能だったと思います。

      「scikit-learnがインストール出来ない」というのは
      どのような状況でしょうか。

      削除
    6. そうなんですね。一昨日インストールした時点では無理でした。
      sudo apt-get install python-sklearn
      のコマンドが通らず、こちらのコピペでも駄目で、Raspbianを入れ直してupgradeせずにインストール出来たという経緯がありました。
      エラーの内容は忘れてしまいましたが、パッケージが見つかりませんというメッセージだったかと思います。そのときapt-getは諦めてpipで入れようと試みましたがpipも今回同様のエラーメッセージで弾かれてしまったので、もしかしてそれもサーバーの問題だったのか?もしれません。

      削除
    7. apt-getによるインストールが失敗する場合、二つの原因が思いつきます。

      1. サーバー上のアプリケーションの情報とRaspberry Pi上のそれとが一致していない

      その場合、「sudo apt-get update」を実行することで
      Raspberry Pi上の情報が更新され、インストールが可能になることが多いと思います。

      2. Raspberry Pi上で、apt-getによるインストール情報が壊れている。

      こちらは、apt-get によるインストールを途中でやめた場合に起こりやすいと思います。
      この場合エラーメッセージ中に
      「『...』というコマンドを手動で実行しろ」
      というメッセージが表示されていることがあり、
      それを実行することでまたapt-getによるインストールが可能になることがあります。
      実行すべきコマンドが指示されていない場合は厄介ですが、
      Googleなどで「apt-get 修復」などで検索すると関連情報が見つかる場合があります。

      以上、思いつく二つの原因を記しましたが、他にもあるかもしれません。
      おっしゃるように、サーバー側に問題があることも考えられますね。

      いずれにせよ、OSアップグレードとの関連性は低いような気がしております。

      削除
  2. 報告です。
    今朝、別のSDカードを準備して再現性があるのかテストしてみました。
    sudo apt-get upgrade
    ・(略)
    Setting up libreoffice-report-builder-bin (1:5.2.7-1+rpi1+deb9u3) ...
    Setting up libreoffice (1:5.2.7-1+rpi1+deb9u3) ...
    Processing triggers for libc-bin (2.24-11+deb9u3) ...
    pi@raspberrypi:~ $ sudo apt-get install python-sklearn
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    E: Unable to locate package python-sklearn
    pi@raspberrypi:~ $

    とエラーが出てやはり出来ませんでした。
    updateをすると出来るのかと思い、updateしてみましたら
    pi@raspberrypi:~ $ sudo apt-get update
    Get:1 http://raspbian.raspberrypi.org/raspbian stretch InRelease [15.0 kB]
    Hit:2 http://archive.raspberrypi.org/debian stretch InRelease
    Get:3 http://raspbian.raspberrypi.org/raspbian stretch/main armhf Packages [11.7 MB]
    Err:3 http://raspbian.raspberrypi.org/raspbian stretch/main armhf Packages
    Hash Sum mismatch
    Hashes of expected file:
    - Filesize:11655728 [weak]
    ・(略)
    - Filesize:1586041 [weak]
    Last modification reported: Fri, 13 Apr 2018 22:31:11 +0000
    Release file created at: Fri, 13 Apr 2018 22:33:09 +0000
    E: Some index files failed to download. They have been ignored, or old ones used instead.

    というエラーが出てupdateが失敗しました。

    その状態では他のパッケージもインストール出来なくなってるのでは?と試してみました
    pi@raspberrypi:~ $ sudo apt-get install ibus-mozc
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    E: Unable to locate package ibus-mozc
    pi@raspberrypi:~ $ sudo apt-get install python-sklearn
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    E: Unable to locate package python-sklearn
    やはりインストール出来ませんでした。
    scikit-learnの問題では無い事だけは判明しました。
    これはこちらの機種依存の問題なのか、それともRaspbianの問題なのか不明ですがこちらの環境では現在upgradeすると困った事態になるようで、しばらくupgradeはしないでおくことにします。

    返信削除
    返信
    1. 貼り付けて頂いたエラーメッセージを見る限り、問題は、
      sudo apt-get upgradeによるOSの更新にあるのではなく、
      sudo apt-get updateによるパッケージリストが何らかの理由で壊れていること
      が原因であると思われます。

      以下、順に記していきます。

      python-sklearnインストール時の一つ目のエラーは
      「python-sklearnが見つからない」というエラーを示しています。

      これは、インストールできるパッケージのリストを取得するための
      コマンドsudo apt-get updateが正常に実行されていないことを意味し、
      それにより、python-sklearnを見つけられなかったのだと考えられます。

      一方、sudo apt-get updateを実行した後のエラーは、
      「Raspberry Piローカルに保存されているパッケージリストと
      サーバー上のパッケージリストが一致しない」という意味だと思われます。

      理由はわかりませんが、Raspberry Piローカルに保存されている
      パッケージリストが壊れていることが考えられます。
      (sudo apt-get updateコマンドの実行を途中で止めてしまい、
      パッケージリストが不完全な状態になった、などが原因として考えられます)

      なお、「ibus-mozcがインストールできてpython-sklearnがインストールできない」
      のは、不完全なパッケージリストに、ibus-mozcは含まれているが、
      python-sklearnは含まれていない、ということが原因と思われます。
      (パッケージリストがアルファベット順に並んでいるとすれば、
      p以降の名称のパッケージがインストールできない、
      ということはあるかもしれません)

      さて、以上の状態からの復帰法は、私は経験がないのでわかりませんが、
      「Hash Sum mismatch」というキーワードでGoogleで検索すると、
      いくつかのヒントが見つかります。

      例えば、あるサイトには下記の2つの対処法が書いてあり、
      それぞれで問題が解決した、という人が見つかります。

      対処法1
      sudo apt-get clean
      を実行してから
      sudo apt-get update
      を実行する

      対処法2
      sudo rm -rf /var/lib/apt/lists/*
      を実行してから(コピーして実行してください)、
      sudo apt-get update
      を実行する

      今回の場合に該当するかはわかりませんが、
      試してみる価値はあるのではないかと思います。

      削除
  3. お世話になります。Raspberry Pi電子工作から貴殿のファンです。リモートコントロールのロボットも楽しみながら完成しました。
    Rapberry Piではじめる機械学習もこれから休日に楽しみながら学習しようと思います。
    さて、質問なのですが、Raspbian stretchのバージョン9.4で、python2.7のIDLEでは、何のエラーなく結果がでるのですが、ターミナル上で実行するとsklearnのImportエラーとなります。
    以下のような結果です。
    pi@raspberrypi:~/bb3 $ python2.7 ml-04-01-irisbasic.py
    Traceback (most recent call last):
    File "ml-04-01-irisbasic.py", line 2, in
    from sklearn import datasets
    ImportError: No module named sklearn

    何かpython2.7のライブラリの場所がおかしいのでしょうか?
    ご教示いただきたく。よろしくお願いします。

    返信削除
    返信
    1. お問合せありがとうございます。

      恐らく、python2用のscikit-learnがインストールされていないのではないでしょうか。
      sudo apt-get update
      sudo apt-get install python-sklearn
      を実行後、コマンドによる実行をもう一度試してみてください。

      それではなぜIDLEによる実行が成功したのかですが、
      恐らく、インストールされているscikit-learnがpython3用だからではないでしょうか。

      最新のRaspbianでは、GUIのメニューから起動できるIDLEはpython3用のみで、
      python2用のIDLEはコマンドで「idle」と実行しなければ起動しなくなっています。

      そのあたりの事情は本ページ
      https://mlbb1.blogspot.com/2018/03/blog-post.html
      の「p.70:NOOBS 2.8.2以降におけるIDLEの起動方法について」
      に記されています。

      以上の内容が該当するか、お試しください。

      削除
  4. ご回答ありがとうございます。
    sudo apt-get updateもsudo apt-get install python-sklearnも以前からやっておりましたが、やはりターミナルでは機能しませんでした。
    ただ、idle &コマンドはやってませんでしたが、それでもだめでした。
    以下のような状況です。
    pi@raspberrypi:~/bb3 $ idle &
    [1] 8449
    pi@raspberrypi:~/bb3 $ ** IDLE can't import Tkinter.
    Your Python may not be configured for Tk. **

    [1]+ 終了 1 idle
    pi@raspberrypi:~/bb3 $ python ml-03-01-version.py
    scikit-learnはインストールされていません
    numpyはインストールされていません
    scypyはインストールされていません
    matplotlibはインストールされていません
    PIL(Pillow)はインストールされていません
    kerasがインストールされていないか、まだ設定が済んでいません
    theanoはインストールされていません
    pi@raspberrypi:~/bb3 $

    前にも記載しましたが、Python2(IDLE)では動作しております。
    関係あるかどうかわかりませんが、リモートPCからteratermでログインすると必ず、以下のメッセージが
    出てきます。
    pyenv: cannot rehash: /usr/local/pyenv/shims isn't writable
    pyenvのインストールがうまくいってないのか、それと関係あるのかも含め、ご教示いただければ幸いです。
    以上、よろしくお願いいたします。

    返信削除
  5. 追記です。Python2(IDLE)はStretchからデフォルトでは、プログラムメニューからなくなってましたが、「設定」→「Main Menu Editor」でプログラムメニューに登録しております。それが悪さしているということはないですよね。。

    返信削除
    返信
    1. 追加情報です。そもそもTkinerがインポートできない状態です。以下参照。
      pi@raspberrypi:~/bb3 $ python
      Python 2.7.15 (default, Aug 15 2018, 18:02:53)
      [GCC 6.3.0 20170516] on linux2
      Type "help", "copyright", "credits" or "license" for more information.
      >>> import Tkinter
      Traceback (most recent call last):
      File "", line 1, in
      File "/home/pi/.pyenv/versions/2.7.15/lib/python2.7/lib-tk/Tkinter.py", line 39, in
      import _tkinter # If this fails your Python may not be configured for Tk
      ImportError: No module named _tkinter
      >>>

      この情報をサイトで調べたらTcl/tkのコンフィグレーションがうまくでいてないようです。
      tcl/tkは最新バージョン (8.6.0+9)でインストール済なのですが、configとmakeが必要とかの情報があります。ここら辺のご知見あればご教示ください。

      因みに別質問なのですが、インフラ系企業でAI/ディープラーニングなどで監視系システムの研究者の知人がいて、python3系が主流でpython2は事実上使用しないのが開発者では普通とのことでした。
      本稿のプログラムのpython3への移植は容易なのでしょうか?

      削除
    2. 今回のエラーメッセージでSutoさんがpyenvを用いていることがわかりました。
      前回も恐らく同じ状況だったと考えられます。

      pyenvは複数のバージョンのPythonの環境を切り替えて使うことができるツールです。
      例えば「Python 3.5環境」と「Python 3.6環境」を切り替えて使う、
      というようなことができます。
      Sutoさんの場合
      「Raspberry Pi標準のPython 2.7」と「pyenvで用意されたPython 2.7」を
      切り替えて使う状態になっているように見えます。
      GUIメニューからのidleでは「Raspberry Pi標準のPython 2.7」が使われ、
      コマンドプロンプトでは「pyenvで用意されたPython 2.7」が
      使われているわけです。

      pyenvはアプリケーションの開発者が、複数の環境でアプリケーションの
      動作チェックをするために用いるのが一般的です。

      ですから、一般ユーザーがpyenvを使うべき状況はほとんどないと私は考えます。

      なお、Python2環境とPython3環境を共存して切り替えて使うことは、
      pyenvを用いなくてもPython標準で
      (あるいはRaspberry Piインストール直後から)
      可能になっています。

      また、pyenvは後述するように、その特性を理解して使わないと
      トラブルの元です。

      そのため、本書ではpyenv環境でのプログラムの動作を
      サポートすることはできません。ご了承ください。

      ですから、今回の問題に対する解決方法は
      「pyenvを使わないようにする」となります。

      以下、もう少し状況を詳しく解説しますが、
      サポート対象外の内容ですので、pyenvについて解説するのは
      今回の回答を最後とさせて頂くことを、ご了承ください。

      さて、Sutoさんの場合
      「Raspberry Pi標準のPython 2.7」と「pyenvで用意されたPython 2.7」を
      別の環境として切り替えて利用するようになっているように見えます。

      注意しなければならないのは、
      apt-getで入れたライブラリ(今回の場合python-sklearn)は、
      「Raspberry Pi標準のPython 2.7」に対してのみインストールされます。
      インストールされたライブラリは「pyenvで用意されたPython 2.7」では
      使うことができません。

      また、Tkinterのようなライブラリも、
      「Raspberry Pi標準のPython 2.7」でのみ利用可能です。

      これらのライブラリを
      「pyenvで用意されたPython 2.7」で用いる方法もないわけではありません。
      「--system-site-packages」で検索すればその方法は見つかると思います。

      しかし上述のように、pyenvを使い続けると他にもトラブルが現れる可能性があります。
      ですから、「pyenvを使わない」というのが私が推奨する解決方法ですし、
      pyenv環境は本書ではサポート対象外とします。ご了承ください。

      なお、私はSutoさんがどのような経緯で(どのような情報を参考にして)
      pyenvを使うようになったのか分かりません。
      ですので、どうすればSutoさんがpyenvを使わないようにできるかもまた、
      分かりません。

      Sutoさんがpyenvを意識せずに利用しているのならば、
      何らかの理由で、pyenvを自動的に優先して利用する環境が
      構築されているのでしょう。

      もし、pyenvを使わないようにしたいがその方法が分からない、
      という場合、SDカードをフォーマットしてRaspbianをインストールし直すのも手です。
      (そして、インストール後はpyenvをインストールしない)
      それが、本書が本来サポート対象とする環境なのです。

      pyenvについての解説は以上です。

      次に、Python3について記します。
      「インフラ系企業でAI/ディープラーニングなどで監視系システムの研究者の知人」
      のご意見に関して、そのような考え方があることは承知していますが、
      私は必ずしもその考え方を取りません。

      「Python2とPython3のどちらを用いるべきか」については、その人の立場により
      様々な意見があり、一つの結論を出すことは難しいと私は考えています。
      (例えば「Python2とPython3のどちらを用いるべきか」というキーワードで
      Googleで検索してみてください)

      私自身の考えは、前回の回答で記した
      「p.70:NOOBS 2.8.2以降におけるIDLEの起動方法について」
      の項目に記してあります。

      長くなりますが引用しましょう。

      #####(引用ここから)
      まず、本書で用いるプログラミング言語はPythonですが、Pythonにはバージョン2 (Python 2) とバージョン 3 (Python 3)が存在します。

      Python 3の方が新しいのですが、両者には互換性が保たれていないところがあり、Python 2からPython 3への移行はなかなか進んでいません。そのため、多くのシステムではPython 2とPython 3を共存させています。

      実際、Raspberry Pi上で動作するRaspbianでは、2012年のリリース以来Python 2とPython 3が共存しています。

      そして、「Python 2用のIDLE」はPython 2でプログラムを実行するための開発環境、「Python 3用のIDLE」はPython 3でプログラムを実行するための開発環境、というわけです。

      以上を踏まえ、Pythonのバージョンに関する本書の方針を記しておきます。

      本書のプログラムは、可能な限りPython 2とPython 3のどちらでも動作するように記述されています。 しかし、8~10章で用いるOpenCVを用いるプログラムだけは、Python 2でないと動作しません。それは、Python用のOpenCVモジュールで簡単にインストールできるものが、Python 2用しかないためです。OpenCV を Python 3 で用いる方法もないわけではありませんが、入門書の範囲を大きく逸脱してしまうため、本書ではサポート対象としません。

      ですから、本書の内容はPython 2で学習を進めることをお勧めしています。
      #####(引用ここまで)

      上記の内容を補足すれば、本書で優先しているのは
      「沢山いらっしゃる読者の方が途中で挫折することなく最後の演習までたどり着けること」、
      「Pythonのバージョンをではなく、機械学習の本質の理解を重視すること」
      の二点です。

      もし、Python3を使うことを優先すると、
      多くの方がOpenCVのインストールで挫折し、先に進めなくなってしまうでしょう。

      削除
  6. ご回答ありがとうございました。
    また、Python2の有用性やOpenCVとの整合性もご説明いただき、ありがとうございます。
    Pyenvのインストールの経緯については恥ずかしながら自分自身も記憶をたどれません。5台ほどPi3(Pizeroは3台)ありますが、なぜかこれだけpyenvがインストールされてました。stretchに変えたpi3はAIY voice kitと本装置ですが、このラズパイはいろいろサイト情報で遊んでから貴殿の著に臨んだせいと思われます。こちらの都合の環境での不必要な質問で貴重な時間を取らせてしまい申し訳ありませんでした。
    pyenvがないと不都合が起きるアプリは幸いなさそうなので、貴殿のアドバイス通り必要なものだけバックアップしてstretchを入れ替えようと思います。
    ありがとうございました。

    返信削除
    返信
    1. 今後OpenCVをPython3で用いたいという要望が増えるかもしれませんので、以下のページで解説することになりました。興味がありましたらご覧ください。

      画像処理の演習をPython3用のOpenCV3で実行する方法
      https://mlbb1.blogspot.com/2018/08/python3opencv3.html

      ありがとうございました。

      削除
  7. 金丸様

    ご対応とご連絡頂き、大変感謝いたします!
    OpenCVのサイトを見ても、Python3バージョンが多く、本著を解読したらサイトで勉強しようと思っておりました。
    Pyenvの件は、どうやら、GCPか、AWSをトラ技の記事でインストールした時に入ってたものでした。再度、最新のstretchでサクサク動いてます。
    何分土日休みの週末勉強なので、昨日も貴著をようやく半分くらい読み終えました。また、実践というより理論解読なので、眠くならぬよう音読してます。(笑)

    返信削除
  8. お世話になります。

    本書第8章の演習を行ったところ、下記のようなエラーが生じてしまい、演習を進めることができません。

    pi@raspberrypi:~ $ cd bluebacksML
    pi@raspberrypi:~/bluebacksML $ python ml-08-01-cameracheck.py
    mmal: mmal_vc_port_enable: failed to enable port vc.null_sink:in:0(OPQV): ENOSPC
    mmal: mmal_port_enable: failed to enable connected port (vc.null_sink:in:0(OPQV))0xe1bff0 (ENOSPC)
    mmal: mmal_connection_enable: output port couldn't be enabled
    Traceback (most recent call last):
    File "ml-08-01-cameracheck.py", line 6, in
    with picamera.PiCamera() as camera:
    File "/usr/lib/python2.7/dist-packages/picamera/camera.py", line 433, in __init__
    self._init_preview()
    File "/usr/lib/python2.7/dist-packages/picamera/camera.py", line 513, in _init_preview
    self, self._camera.outputs[self.CAMERA_PREVIEW_PORT])
    File "/usr/lib/python2.7/dist-packages/picamera/renderers.py", line 558, in __init__
    self.renderer.inputs[0].connect(source).enable()
    File "/usr/lib/python2.7/dist-packages/picamera/mmalobj.py", line 2212, in enable
    prefix="Failed to enable connection")
    File "/usr/lib/python2.7/dist-packages/picamera/exc.py", line 184, in mmal_check
    raise PiCameraMMALError(status, prefix)
    picamera.exc.PiCameraMMALError: Failed to enable connection: Out of resources

    なお、本書記載のチェックポイントは全て確認済みです。
    お忙しいところ大変恐縮ですが、問題点のご指摘をいただけますと幸いです。
    何卒よろしくお願い致します。

    返信削除
    返信
    1. 一行目の「mmal: mmal_vc_port_enable: failed to enable port vc.null_sink:in:0(OPQV): ENOSPC」でGoogle検索すると、
      このエラーは「既にカメラが利用中なところに、さらにカメラを利用するプログラムを起動しようとする」
      ときに出るもののようです。

      わざとらしい例ですが、LXTerminalを2つ起動し、それぞれでml-08-01-cameracheck.pyを起動しようとすると、
      2つ目の起動でこのエラーが出ます。

      より現実的な例では、例えば、Y.Nさんが私の電子工作の書籍を学んでいたとして、
      「プログラムを自動起動するためのファイル /etc/rc.local にカメラ配信用プログラム
      10-02-stream.sh などの起動命令が書かれている」
      などのケースが考えられます。

      この場合、既にカメラ配信プログラムが起動しているところで
      さらに ml-08-01-cameracheck.py を実行しようとしてエラーがでるというわけです。

      その場合、 /etc/rc.local からカメラ起動用プログラムが書かれた行を
      削除(またはコメントアウト)する必要があります。

      そのようなわけで、他にカメラを使うプログラムが実行されていないかを
      チェックしてみてください。

      削除
    2. ご対応いただきありがとうございます。

      ご指摘いただいたとおりやってみましたが、うまくいきません。

      そこでPython3からプログラムを起動しようと思い、当HP上のプログラムを試しましたが、
      今度はそこで下記のようなエラーが生じました。

      pi@raspberrypi:~ $ sudo pip3 install opencv-python
      Collecting opencv-python
      Downloading https://www.piwheels.org/simple/opencv-python/opencv_python-3.4.4.19-cp35-cp35m-linux_armv7l.whl (7.4MB)
      76% |████████████████████████▋ | 5.7MB 284kB/s eta 0:00:06
      THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE. If you have updated the package versions, please update the hashes. Otherwise, examine the package contents carefully; someone may have tampered with them.
      opencv-python from https://www.piwheels.org/simple/opencv-python/opencv_python-3.4.4.19-cp35-cp35m-linux_armv7l.whl#sha256=329d9d9fdd62b93d44a485aeaab4602c6f5b8555ea8bcc7dbcdc62c90cfe2c3f:
      Expected sha256 329d9d9fdd62b93d44a485aeaab4602c6f5b8555ea8bcc7dbcdc62c90cfe2c3f
      Got f72b67cb8074d151a45de72b88ca64a6e74f842c88816c47acd775f92027fa90

      大変恐縮ですが、再度問題点をご指摘いただけますでしょうか。
      よろしくお願い致します。

      削除
    3. 「sudo pip3 install opencv-python」はRaspbian Jessie用のコマンドですがそれで正しいでしょうか。
      最新OSであるRaspbian Buster用のコマンドは変わっていますので注意してください。

      なお、
      「THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE」というエラーは
      「p.309 kerasとtheanoをインストールするためのコマンド」
      に記していうように「先方のサーバーに問題がある場合、時間をあけてからコマンドを再実行すると問題が解消される」
      というケースはあり得ますのでご注意ください。

      しかしいずれにせよ、それが解決したとしても元々のカメラの
      「mmal: mmal_vc_port_enable: failed to enable port vc.null_sink:in:0(OPQV): ENOSPC」
      という問題の解決になるとはあまり思えません。
      カメラのエラーは、カメラの2重アクセスが問題になっているので、
      Pythonのバージョンが原因であるとは考えにくいためです。

      Y.Nさんがお使いのカメラは、これまでかつてRaspberry Piで使用できたことはあるのでしょうか。
      もし、「かつては使えたが今は使えない」という場合、
      長くOSを使っていて、何か動いてはいけないアプリケーションがバックグラウンドで
      動いているという可能性はあります。
      その場合、SDカードをフォーマットしてOSを再インストールすることも検討してください。

      もし、OSインストール直後の状態でもカメラに関して同じエラー
      「mmal: mmal_vc_port_enable: failed to enable port vc.null_sink:in:0(OPQV): ENOSPC」
      がでる場合、
      (1) カメラのハードウェアが壊れている
      (2) カメラの接続方法が悪い
      などの原因も考えられます。

      削除
    4. 再度接続を試みたら、カメラが接続できました。
      まず試しにIDLE(Python2)で試してみたら接続できました。
      その後カメラのウィンドウを閉じ、本書の記述どおりにターミナルからプログラムを入力すると、同様に接続に成功しました。
      単にラズパイやカメラの調子が悪かっただけでしょうか。

      ちなみに「「sudo pip3 install opencv-python」はRaspbian Jessie用のコマンド』とのことですが、本HPには下記の通り、「Stretch」と明記されています。私のラズパイのバージョンはStretchなので、記載のとおりだと問題ないように思うのですが、私の認識違いでしょうか。

      p.248 Python3でOpenCVを利用する場合(NOOBS 3.0.1 までの Stretch)
      3つの命令がありますので、1つずつ順番に実行してください。
      sudo apt update
      sudo apt install libatlas-base-dev libjasper-dev libqtgui4 python3-pyqt5 libqt4-test
      sudo pip3 install opencv-python

      削除
    5. 原因は分かりませんが、解決したのなら良かったです。

      おっしゃるとおり、Busterの前はJessieではなくStretchでしたね。
      こちらの勘違いです。

      削除
  9. 質問させて下さい。
    p.327 python ml-10-02-iris-deep-load.py result-iris.h5 を実行すると、次のようにエラーとなります。python ml-10-01-iris-deep-learn.py result-iris.h5 は正常に実行できています。
    -------以下--------
    Using Theano backend.
    Traceback (most recent call last):
    File "ml-10-02-iris-deep-load.py", line 27, in
    model = keras.models.load_model(savefile)
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/saving.py", line 458, in load_wrapper
    return load_function(*args, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/saving.py", line 550, in load_model
    model = _deserialize_model(h5dict, custom_objects, compile)
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/saving.py", line 243, in _deserialize_model
    model = model_from_config(model_config, custom_objects=custom_objects)
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/saving.py", line 593, in model_from_config
    return deserialize(config, custom_objects=custom_objects)
    File "/usr/local/lib/python2.7/dist-packages/keras/layers/__init__.py", line 168, in deserialize
    printable_module_name='layer')
    File "/usr/local/lib/python2.7/dist-packages/keras/utils/generic_utils.py", line 147, in deserialize_keras_object
    list(custom_objects.items())))
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/sequential.py", line 302, in from_config
    model.add(layer)
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/sequential.py", line 166, in add
    layer(x)
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/base_layer.py", line 425, in __call__
    self.build(unpack_singleton(input_shapes))
    File "/usr/local/lib/python2.7/dist-packages/keras/layers/core.py", line 895, in build
    constraint=self.kernel_constraint)
    File "/usr/local/lib/python2.7/dist-packages/keras/legacy/interfaces.py", line 91, in wrapper
    return func(*args, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/base_layer.py", line 243, in add_weight
    weight = K.variable(initializer(shape, dtype=dtype),
    File "/usr/local/lib/python2.7/dist-packages/keras/initializers.py", line 218, in __call__
    dtype=dtype, seed=self.seed)
    File "/usr/local/lib/python2.7/dist-packages/keras/backend/theano_backend.py", line 2668, in random_uniform
    return rng.uniform(shape, low=minval, high=maxval, dtype=dtype)
    File "/usr/local/lib/python2.7/dist-packages/theano/sandbox/rng_mrg.py", line 872, in uniform
    rstates = self.get_substream_rstates(nstreams, dtype)
    File "/usr/local/lib/python2.7/dist-packages/theano/configparser.py", line 117, in res
    return f(*args, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/theano/sandbox/rng_mrg.py", line 771, in get_substream_rstates
    assert isinstance(dtype, str)
    AssertionError

    返信削除
    返信
    1. こちらでも確認しました。どうもPython2用のkerasに問題があり、
      ファイルの読み込みができない状況のようです。

      しばらく待つと問題が解消されたバージョンがリリースされる可能性がありますが、
      当面はPython3用のkerasを用いてしのぐのが無難かもしれません。
      (Python3 用のkerasでは問題ありませんでした)

      Python3用のkerasの利用は、下記のようにします。

      まず、1~9章で使うPython3用パッケージを下記の2つのコマンドでインストールします。
      2つ目のコマンドは長いですが一行です。
      sudo apt update
      sudo apt install python3-sklearn python3-pil.imagetk mpg321 liblapack-dev libhdf5-dev python3-h5py

      最新のRaspbian Busterをお使いならば、さらに下記でPython3用OpenCVをインストールします。
      sudo apt install python3-opencv

      Rasbian Stretch以前をお使いの場合のPython3用OpenCVのインストール法は以下の2つのコマンドです。1つ目のコマンドは長いですが一行です。
      sudo apt install libatlas-base-dev libjasper-dev libqtgui4 python3-pyqt5 libqt4-test
      sudo pip3 install opencv-python


      さて、以上が終わった後、下記コマンドでPython3用のkerasとtheanoをインストールします。
      sudo pip3 install keras theano

      なお、Python3で10章のコマンドを実行すると、DeprecationWariningという警告が
      沢山あらわれることがありますが、実行には支障がないものばかりですので、
      無視してかまいません。

      削除
  10. Python3のKerasを使用すると問題なく実行できました。今回は丁寧に教えて下さいましたが、今後自分で解決するとなると、どのような勉強が必要になるかなどもアドバイス下さると助かります。ありがとうございました。

    返信削除
    返信
    1. 通常はエラーメッセージをよく読み、必要に応じてエラーメッセージで検索すれば、
      解決のヒントが得られることが多いです。

      ただし、今回の場合はエラーメッセージを見ても原因が良く分かりませんでした。
      Python3で正常動作すると気づいたのはたまたまです。

      削除
  11. こんにちわ
    先ほど質問を投稿したものですが解決したので削除しました。
    しつこいようですが質問に答えていただけると嬉しいです。
    10章の 「python ml-10-07-hand-cnn-learn.py result-hand.h5」を実行したところ
    ImportError : no module named 'cv2'
    というエラーが発生し実行できませんでした。
    これはopencvがきちんとインストールされていないというとこなのでしょうか。また、違うことが原因なのか教えていただきたいです。

    返信削除
    返信
    1. 先ほどの質問と合わせますと、恐らくですが、 Python2 と Python3 を混同されているのではないかと思います。

      Python2 の場合、
      sudo pip install keras theano
      でインストールし、実行は
      python ml-03-01-version.py
      です。

      Python3 の場合、
      sudo pip3 install keras theano
      でインストールし、実行は
      python3 ml-03-01-version.py
      です。

      先ほどの質問は、このインストールコマンドと実行コマンドの組み合わせが正しくなかった可能性があります。

      まず本ページの「p.70:Python2とPython3について」を読み、
      Python2 と Python3 の違いについて理解してください。

      次に、今回の問題ですが、
      「ImportError : no module named 'cv2'」
      とは、OpenCVがインストールされていないということを意味します。

      これには、3つのパターンが考えられます。
      「Python2 用のOpenCV がインストールされているが、Python3 で実行しようとしている」
      「Python3 用のOpenCV がインストールされているが、Python2 で実行しようとしている」
      「Python2 用のOpenCV も Python3 用のOpenCVもインストールされていない。

      どのパターンに当てはまるか、確認してみてください。

      なお、本ページの「p.308 kerasとtheanoの利用の前に」に記したように、
      現在 keras と theano は Python2 では動作しなくなっております。

      ですから、10章以降の内容は Python3 用のコマンドで実行してください。

      すなわち、keras と theanoのインストール前の準備は本ページの
      「p.308 kerasとtheanoの利用の前に」で「Python3用」と記されている方を実行し、
      keras と theanoのインストールは
      「p.308 kerasとtheanoの利用に必要なツールをインストールするためのコマンド」

      「p.309 kerasとtheanoをインストールするためのコマンド」
      の「Python3用」と記されている方を実行してください。

      そして、10章のコマンドはすべて本ページに記されている
      「python3」で始まるコマンドを実行してください。

      削除
  12. ご対応ありがとうございます。
    削除した質問にまで丁寧にお答えいただき申し訳ないです。
    もう一度本誌をよく読みpython2とpython3の違い、kerasとtheanoの利用について理解します。
    もうひとつだけ質問なのですが、Python3用OpenCVをインストールしようと
    sudo apt install libatlas-base-dev libjasper-dev libqtgui4 python3-pyqt5 libqt4-test
    sudo pip3 install opencv-python
    を実行すると、
    could not find a version that satisfies the requirement opencv-python
    No matching distribution found for opencv-python
    と、インストールできません。これはpythonとopencvのバージョン違いによるものでしょうか。
    お答えいただけるとうれしいです。

    返信削除
    返信
    1. そのコマンドを用いるということは、古いRaspbian Stretchをお使いなのでしょうか?

      もし、2019年6月にリリースされたRaspbian Busterをお使いなのでしたら、

      sudo apt install python3-opencv

      だけでpython3用のOpenCVのインストールは完了します。

      削除
  13. いま使用してるのはRaspbian Stretchです。
    Raspbian Busterに切り替えてまたやってみます。
    今日はお忙しい中多くの質問に答えてくださりありがとうございました。

    返信削除
    返信
    1. 念のためRaspbian StretchでもPython3用OpenCVのインストールを試してみましたが、
      sudo apt install libatlas-base-dev libjasper-dev libqtgui4 python3-pyqt5 libqt4-test
      sudo pip3 install opencv-python
      の2コマンドで問題なくインストールできました。

      うまくいかなかった理由はわかりませんが、
      事前にその他のツールのインストール
      sudo apt install python3-sklearn python3-pil.imagetk mpg321
      を行っておかないと、問題が起こるということはあるのかもしれません。

      あるいは、本書で紹介したツール以外の何かがインストールされていて、
      それらと相性の問題を起こしているということもあり得ます。

      削除
  14. 『ラズパイで電子工作』以来の読者です。機械学習とはどんなものかをラズパイを使って体験・理解できる本のうたい文句通りでした。名著と思います。
    pythonにも機械学習にも興味があったので,本書にしたがって演習を行い,数日で終了しました。
    初学者でも理解できるよう,さまざまな配慮がされていて,つまづくことは少なかったです。
    機械学習を基礎からディープラーニングまで理解,体験できました。機械学習のライブラリの威力も実感できました。
    ラズパイは処理は速くはありませんが,カメラによる画像認識などもでき楽しかったです。
    ただ一つ,scikit-learnのインストールコマンドはpython2と3では異なり,本書の記述はpython2用ですね。サポートページには書かれていましたが最初気づかず,python3用のIDE(thonny)で動かしていた自分は,インストールしたはずなのにプログラムが動かず戸惑いました。
    これからサポートページの追加演習にチャレンジしたいと思います。
    また『高校数学からはじめるディープラーニング』も読んでみたいと思います。

    返信削除
    返信
    1. 心強いコメントありがとうございます。

      『高校数学からはじめるディープラーニング』の方は数学がメインなので
      少し毛色が異なりますが、お楽しみいただけると幸いです。

      削除
  15. python3 kerasの最新バージョンをインストールした後、
    import kerasを実施しても、$HOME/.keras が出来ませんでした。
    本に記載の バージョン: 2.1.4 なら.keras が出来ましたので連絡いたします。

    返信削除
    返信
    1. お知らせ頂きありがとうございます。

      現在 Python3 用に keras をデフォルト状態でインストールすると、
      2.4 系がインストールされるのですが、これは Tensorflow バージョン 2 専用と
      なってしまったため、そのままでは Theano と一緒のには使えないですね。

      sudo pip3 install keras==2.3.1
      のように、バージョン指定してインストールすることで、
      Theanoとともに使えるバージョンの keras がインストールされます。
      (インストール解説もそのように変更しました)

      よろしくお願いします。

      削除
  16. 皆さんみたいにエラーがでたとかではないのでが・・・
    本にml-08-03-learn.pyを実行するたびに用いる乱数系列が変わるとありますが
    なぜ毎回変わるのでしょうか?
    プログラム内に乱数系列を変えるものがあるのでしょうか?
    あれば教えてほしいです。
    基本的なものかもしれませんが勉強中でここで詰まってしまっていますので教えていただけると嬉しいです。

    返信削除
    返信
    1. 様々な回答があり得ますが、まずは、プログラムの記述方法についてから解説します。

      プログラムの記述法については、p.153 に解説があります。
      こちらは ml-05-01-2feat3class-nn.py についての解説ですが、
      MLPClassifier 呼び出し時に random_state=1 とすることで、
      整数値 1 に基づいた乱数系列を毎回用いることになり、
      random_state=None とすることで毎回異なる乱数系列を用いることになることが
      解説されています。

      ml-08-03-learn.py についても同じで、プログラム内部で
      random_state=None を指定しているので毎回異なる乱数系列が用いられます。

      以上がプログラムの記述方法についての解説です。

      次に、「毎回同じ乱数」と「毎回異なる乱数」とで何が違うのかを、
      乱数の生成方法に基づいて解説します。

      コンピューターで乱数系列を生成する場合、
      多くの場合それは真にランダムなものではなく、
      ランダムに見える系列をルールに従って生成しています。
      そのため、そのような乱数は擬似乱数とも呼ばれます。

      擬似乱数を生成するルールの表現としては、
      高校数学で学ぶ数列の漸化式がわかりやすいかもしれません。
      a_n+1 = f(a_n) のようなルールに基づいて、
      系列 a_n (n=0,1,2,…) が計算される、と言うものです。

      このとき、数列の初期値 a_0 として毎回同じ値を用いれば、
      毎回同じ乱数系列が得られます。
      一方、乱数の初期値 a_0 を毎回変えると、
      毎回異なる乱数系列が生成されます。
      典型的には、プログラムを実行した時刻にもとづいて
      初期値 a_0 を決める、などということがPythonの内部で行われます。

      すなわち、プログラム内部で random_state=None を指定したときは
      時刻に基づいて乱数の初期値 a_0 を決めるため毎回異なる乱数値が得られ、
      random_state=1 などを指定したときは、その数値(ここでは1)に基いて
      乱数の初期値 a_0 を決めるため毎回同じ乱数値が得られることになります。

      以上の解説でいかがでしょうか。

      削除
    2. 返信ありがとうございます。
      読んだのに覚えきれてなかったようで・・・
      それなのに教えていただきありがとうございます。
      本を読んで思ったのですが、毎回同じ乱数だと損失関数が同じなので、乱数系列を毎回変えることで損失関数を変える
      という解釈でいいでしょうか?

      あとグラフなのですが
      lossの値が小さく、time stepの値が小さく、曲線がきれいな時、損失が小さな値に収束しているので分類がうまくいってる。
      ということでいいでしょうか?

      削除
    3. 乱数の役割としては下記の2つあります。

      1. 損失関数をどこから下り始めるかを決める
      (p.159の図5-10の矢印を一つ選ぶ)

      2. 学習用データを複数のグループ(ミニバッチ)に分けるときの
      分け方を毎回変える(p.186 で少し触れられている)
      (ミニバッチを変えることで損失関数の形が変わる)

      ただし、上記の 2. については本書では軽く触れる程度となっています。

      > lossの値が小さく、time stepの値が小さく、曲線がきれいな時、
      > 損失が小さな値に収束しているので分類がうまくいってる。
      > ということでいいでしょうか?

      基本的には、損失が小さい値に収束することが重要で、
      「time stepの値が小さく、曲線がきれいな時」はそれほど重要ではありません。
      例えば、別のランダム性を導入すると、
      損失の減少はきれいな曲線ではなくなることがあります。
      p.324の図10-5などです。

      また、「分類がうまくいっているかどうか」は損失だけではなく、
      本当は手書き数字で行ったように正解率なども調べるべきですね(p.184)。
      (ただし、ml-08-03-learn.py では正解率は表示していませんが)

      正解率を調べるべき理由は、
      「損失の収束値が小さいほうが分類の性能は高いはずだが、
      損失の収束値を正解率の値に対応づけることができない」
      からです。

      以上でいかがでしょうか。

      削除
    4. なるほど
      機械学習させると毎回変わる理由がわかりました。
      乱数系列をランダムにしている理由は損失関数をどこから下り始めるかを決めるため。
      ということですね。
      あと損失関数のグラフでlossの値(縦軸)が0に近くなり、timestep(横軸)の値が小さいときが小さい値に収束している。
      ってことであってますでしょうか?

      削除
    5. > lossの値(縦軸)が0に近くなり、timestep(横軸)の値が小さいときが小さい値に収束している。

      すいません、「imestep(横軸)の値が小さいとき」の意味がよくわかりません。

      言葉で表現するならば、
      「lossの値(縦軸)が0に近い小さな値で変化しなくなったときに、収束していると言える」
      というくらいで十分ではないでしょうか。

      (細かなことを言えば、p.144 図5-7のように0に近くない値に収束することもあるので
      注意が必要ですが)

      削除
    6. 実際にグラフを出したときに同じように0に近い値に収束していますが、timestepが175の時に収束している時と200の時に収束しているときがあります。

      削除
    7. なるほど。

      その状況なら、わたしも175で収束している方を選ぶと思いますが、
      本来は正解率で比較すべきかなと思います。
      (サンプルファイルでは正解率を表示していないのですが)

      また、実際にはどちらを選んでも体感では違いがない、ということはあり得ると思います。

      削除
    8. このコメントは投稿者によって削除されました。

      削除
    9. 昨日は色々とありがとうございました。
      損失関数のグラフで
      横軸は学習を進行させるための時間ステップとありますが
      縦軸の損失は何の損失なのでしょうか
      理解力がなくて申し訳ないです。

      削除
    10. 損失関数とはどのような関数かについては本書 p.145 に書かれておりますのでご覧ください。

      なお、以前の質問にあった「乱数」もそうですが、本書巻末(p.381)にあるさくいんを
      ご利用いただくと、その用語の初出のページ、および重要な解説のあるページを知ることができますので
      ご活用ください。

      なお、本書ではなぜ「損失」という語が使われるかの解説はしていませんが、
      「誤差」に関連した量(関数)だと理解すると、「損失」という語よりは
      イメージしやすいのではないかと思います。

      削除
    11. ありがとうございます。

      削除
    12. 8-2で
      映像をHSV形式に変換させるとき
      hsv = cv2.cvtColor(stream.array, cv2.COLOR_BGR2HSV)
      とありますがこれはどういった処理をしているのでしょうか

      削除
    13. HSV形式についての解説は、本書ではp.261から書かれております。

      しかし、書籍ではページ数の制限などから、すべてを書きつくすことはできません。
      書籍の内容以上のことを知りたい場合、
      インターネット検索などを併用して学ばれることをお勧めします。

      例えば、検索すれば下記のページなどが見つかります。

      Python-OpenCVでのRGBからHSVに変換
      https://data-analysis-stats.jp/python/python-opencv%E3%81%A7%E3%81%AErgb%E3%81%8B%E3%82%89hsv%E3%81%AB%E5%A4%89%E6%8F%9B/

      削除
  17. 初心者ですが、質問させてください。
    この補足資料の記述の中で、9章の補足にあるml-09-01-janken.py実行時のイヤホンジャックからの
    「じゃんけんぽん」という音の出力が出ない状態です。
    資料の中のアイルの行の変更をしたのですがやはり音が聞こえません。
    ちなみに ターミナルでmpg321 ml-sound/jankenpon.mp3 というコマンドを実行するとイヤフォンから
    「じゃんけんぽん」と聞こえましたので音声の出力はピンジャックになっていると思われます。
    些末なことで時間をとらせるのは心苦しいのですがよろしくご指導ください。

    返信削除
    返信
    1. イヤフォンジャックからの音の出力ですが、この1年間で2回、
      Raspberry Pi の OS で仕様の変更があったため、
      ややこしく、つまづきやすいところです。

      まず、OSのバージョンにより、新しい方から以下の3つのケースに分かれます。
      どのケースが該当するかは、OS をインストールしたタイミングで
      想像できるのではないかと思います。

      ケース1: Raspberry Pi OS 2020-12-02 および 2021-01-11
      ケース2: Raspberry Pi OS 2020-08-20 および 2020-05-27
      ケース3: 2020年2月以前の Raspbian

      これら3つのケースに対し、それぞれ以下の2つの項目をチェックする必要があります。

      (1) 音声の出力先をイヤフォンジャックにする設定
      (2) プログラムファイルに変更が必要かどうか

      3つのケースに対する(1)、(2)の設定をまとめると以下のようになります。


      ケース1の(1):
      本ページ「p.295 音声の出力先をピンジャックにする方法 (2020-12-02 以降の Raspberry Pi OS の場合)」
      の内容を実行
      ケース1の(2):
      配布されたプログラムファイルのままで良く、変更は不要


      ケース2の(1):
      設定は不要
      ケース2の(2):
      本ページ「p.295 2020-05-27 および 2020-08-20 の Raspberry Pi OS でイヤフォンジャックを使う」
      の内容に従い、配布されたプログラムを変更して利用


      ケース3の(1):
      本ページ「p.295 音声の出力先をピンジャックにするためのコマンド (2020-02-14 までの Raspbian の場合)」
      の内容を実行
      ケース3の(2):
      配布されたプログラムファイルのままで良く、変更は不要


      yanasanさんの場合、
      「mpg321 ml-sound/jankenpon.mp3 」コマンドによりイヤフォンジャックから音が聞こえたそうですので、
      ケース1かケース3ではないかと思います。
      その場合、プログラムファイルは配布されたファイルのままで音が聞こえるはずで、
      ファイルを変更するとむしろ音が出なくなると思います。

      以上の回答でいかがでしょうか。

      削除
  18. 早速のご対応誠にありがとうございました。
    確かにご指摘の通り配布されたファイルの通りに戻すと、ジャックから音が出るようになりました。
    ついでに、厚かましいお願いですが、修正内容のargs =・・・の引数の解説をお願いしてもよろしいですか?

    返信削除
    返信
    1. argsに変更が必要となるのは、返信時に記した

      ケース2: Raspberry Pi OS 2020-08-20 および 2020-05-27

      のみです。このバージョンのOSでは、音声の出力先のデフォルトを変更できない
      (少なくとも私には見つけられなった)ため、
      音声の出力先をプログラムごとに変更する必要があります。

      具体的にみますと、下記のargsは、

      args = ['mpg321', '-q', '-a', 'hw:1,0', 'ml-sound/jankenpon.mp3']

      コマンドプロンプトで

      mpg321 -q -a hw:1,0 ml-sound/jankenpon.mp3

      を実行することと同じ意味を表します。
      デフォルトから加わったのは、「-a hw:1,0」の箇所で、
      これはオーディオ出力先を「hw:1,0」としてmpg321を実行する、
      という意味になります。

      ケース2のOSでは、以下のように音声出力先を使い分けます。

      ケース2:HDMI
      mpg321 -q -a hw:0,0 ml-sound/jankenpon.mp3

      ケース2:イヤフォンジャック
      mpg321 -q -a hw:1,0 ml-sound/jankenpon.mp3


      「hw:1,0」などによるオーディオデバイスの指定は、
      Linux における Alsa というサウンドシステムでの指定方法です。

      yanasan さんはケース1の最新OSを利用されているのだと思いますが、
      最新OSでは、Alsa ではなく、PulseAudioという仕組みを用いて音声を鳴らすようになっており、
      音のデフォルトを指定できるようになっています。

      raspi-config で音声出力のデフォルトをイヤフォンジャックに変更した場合、
      以下のコマンドで音が鳴ります。

      ケース1:HDMI
      mpg321 -q -a hw:0,0 ml-sound/jankenpon.mp3

      ケース1:イヤフォンジャック
      mpg321 -q ml-sound/jankenpon.mp3

      なお、ケース1で音声出力のデフォルトをイヤフォンジャックに変更した場合、
      mpg321 -q -a hw:1,0 ml-sound/jankenpon.mp3
      でも実は音がイヤフォンジャックから音が鳴りますが、
      ボリュームをGUIから変更できないので、
      mpg321 -q ml-sound/jankenpon.mp3
      で鳴らした方が良いと思います。

      なお、前回の回答で私が書いた
      「ファイルを変更するとむしろ音が出なくなる」は間違いで、
      今回確認したところ、
      「ケース1でファイルを変更しても音は出る」
      ようでした。

      そうすると、yanasanさんがファイルを変更して音が出なかった理由が
      わからなくなるのですが、何か別の要因があったのかもしれません。

      いずれにせよ、
      「ケース1でmpg321 -q -a hw:1,0 ml-sound/jankenpon.mp3で音を鳴らすと
      GUIでボリュームを変更できない」という問題があるため、
      ケース1ではファイル変更なしでmpg321 -q ml-sound/jankenpon.mp3で音を鳴らすのが
      良いと思います。

      以上の回答でいかがでしょうか。

      削除
  19. ご丁寧な回答誠にありがとうございました。
    いろいろな知識を得ることが必要とあらためて納得しました。

    返信削除
  20. 金丸先生に感謝します。
    70歳にしてAI を使うことを体験させて頂きありがとうございます。

    先月末、「RasperryPiではじめる機械学習」という本を購入し、私もできそうだと思い、RasperryPiを購入し、カメラを購入しました。12日の今日「じゃんけんポン」マシン(AIが詰まった)が今日完成しました。
    費用 1.RasperryPiではじめる機械学習 中古本 1307円
       2.最新Raspberry Pi 4 ケース ラスベリー セット 9,798円 (ポイント利用分 -約400円)
         1) ケース+
         2)5V 3A 電源Micro USB-C
            アダプター 冷却ファン+ヒートシンク
         3)Raspberry Pi 4 Model
         4)マイクロSDカード
       3.Micro HDMI - HDMI ケーブル 1m  900x2 1800円
       4.TRASKIT Raspberry Pi カメラモジュール
          1080P 5M OV5647センサー ケース付き   1480円
                       総計  14,385円
    その他
       写真のマウスは含まれていません、RaspberryPiの大きさを比較するための参考のため
      他に必要なものは、保有していた備品 キーボード、マウス(USB対応または無線対応)、モニター


    返信削除
  21. 9章のじゃんけんプログラム、三層ニューラルネットワークに変更する場合のMLPClassifierへのインポート文が必要ですね?

    返信削除
    返信
    1. 結論を先に書けば、おっしゃる通りです。

      丁寧に書けば、以下のようになります。

      ml-09-01/ml-09-02 は以下のように認識を行っています。
      戦略の予測: Perceptron
      手の画像処理: MLPClassifier

      ただし、「手の画像処理」の学習部は
      ml-08-03のプログラムで実行しているため、
      ml-09-01/ml-09-02では MLPClassifier を import していません。

      もし、「戦略の予測」を MLPClassifier に変更したければ、
      ml-09-01/ml-09-02でも MLPClassifier を import する必要があります。

      以上でいかがでしょうか。

      削除
    2. 丁寧なご返信ありがとうございます。書籍最後まで読み進めることができました。ラズパイでも機械学習を体験でき、とてもおもしろかったです。

      削除