2019年12月29日日曜日

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

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

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

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

一つ目の目的は、ソフトウェアのインストールコマンドが本書刊行後に変更された場合に、最新情報を提供することです。ですから、本書のコマンドと本ページのコマンドが異なる場合は、本ページの情報が最新であるとお考え下さい。

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

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

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

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

3章

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

2019年6月にリリースされたNOOBS 3.1.1に含まれるRaspbianでは、圧縮ファイルを展開するためのソフトウェアのデフォルトの設定が変化しましたので利用の際は注意が必要です。
下図(左)のように、展開先のデフォルトが「/tmp」とされ、また、展開時に自動的にフォルダが作られるようになっています。
これを、下図(右)のように
  • 展開先に「 /home/pi 」または「 /home/pi/bluebacks 」と記入
  • 「Ensure a containing directory」のチェックを外す
の2点を行ってから「展開」ボタンを押すようにしましょう。展開先に記す文字は、このページからコピー (Ctrl-c) して貼り付ける (Ctrl-v) と安心です。



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

sudo apt update

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

sudo apt install python-sklearn
Python3で演習を実行したい方は下記も合わせて実行してください。
sudo apt install python3-sklearn

p.70:NOOBS 2.8.2~NOOBS 3.0.1におけるIDLEの通常起動について

NOOBS 2.8.2~NOOBS 3.0.1では、デスクトップのメニューから「Python 2 (IDLE)」の項目が削除されました(下図)。そのため、IDLEを起動するためにはいくつかの準備が必要となりました。その準備について解説します。

なお、NOOBS 3.1.1以降ではまた別の方法が必要なので、このまま画面をスクロールして「p.70:NOOBS 3.1.1以降におけるIDLEの起動方法について」をご覧ください。

さらに、IDLEではなくThonny Python IDEという新しい開発環境を用いてプログラムを実行する方法もあります。そちらに興味のある方はこのまま画面をスクロールして「p.70:Thonny Python IDEでの本書の演習の実行について」をご覧ください。


まず、LXTerminal (ターミナル)上のコマンドによりPython 2用のIDLEを起動する方法を解説します。ターミナルを起動し、下記のコマンドを実行してみてください。
idle &
Python 2用のIDLEが起動するでしょう。

次に、メニュー上に「Python 2 (IDLE)」の項目を復活させる方法を解説します。まず、ターミナルで下記のコマンドを実行し、管理者権限のテキストエディタleafpadでメニュー用設定ファイルを開きます。
sudo leafpad /usr/share/raspi-ui-overrides/applications/idle.desktop
このファイルの末尾に
NoDisplay=true
と書かれた行が存在しますので、これを
NoDisplay=false
と編集してください。そして、テキストエディタleafpadでファイルを上書き保存した後、Raspberry Piを再起動してください。メニューに「Python 2 (IDLE)」の項目が復活しているでしょう。

なお、メニューにある「Python 3 (IDLE)」はPython 3用ですが、Python 3系を用いるのであれば、メニューにあるThonny Python IDEを用いた方が良いかもしれません。その場合、ページをスクロールして「p.85:Thonny Python IDEでの本書の演習の実行について」をお読みください。

p.70:NOOBS 3.1.1以降でのIDLEの起動方法について

ここでは、NOOBS 3.1.1以降でIDLEを用いる方法について解説します。ネットワークに接続してIDLEをインストールする必要があります。この時点でまだRaspberry Piをネットワークに接続していない方は、Thonny Python IDEを用いる方法もあります。そちらを希望される場合はこのままページをスクロールして「p.70:Thonny Python IDEでの本書の演習の実行について」をご覧ください。

さて、IDLEをインストールするには、LXTerminal (ターミナル)上を起動し、下記の2つのコマンドを一つずつ順番に実行してください。コマンドをこのページから一つずつコピーしてターミナル上に貼り付けて実行するのが安全です。
sudo apt update
sudo apt install idle-python2.7
このインストールにより、LXTerminalで
idle &
とコマンドを実行することでIDLEを実行できます。

現時点では、メニューにIDLEを表示する方法はなさそうです。

なお、Python 3系のIDLEを用いたければパッケージ idle-python3.7 をインストールすれば良いのですが、Python 3系を用いるのであれば、メニューにあるThonny Python IDEを用いた方が良いかもしれません。次項をそのままお読みください。

p.70:Thonny Python IDEでの本書の演習の実行について

上の項目で記したように、RaspbianでIDLEを用いてPythonプログラムを実行するのは面倒な手続きが必要になってきました。
ここでは、より簡単にPythonプログラムを実行する方法として、デフォルトでインストール済の「Thonny Python IDE」を用いる方法を紹介します。

Thonny Python IDEはpython3用のプログラムを実行するための環境なのですが、2019/6/25に更新された本書のプログラムはPython3での実行をサポートしていますので問題なく実行できます。
それ以前にダウロードした方は再び mlbb-sample.zip をダウンロードし、展開しなおした上でご活用ください。

Thonnyを用いるということは必然的にPython3を用いることを意味します。本ページでは各章の演習のPython3での実行方法が記されておりますので、注意してお読みください。

なお、Python2 と Python3の違いを知りたい場合は次項の「p.70:Python2とPython3について」も合わせてお読みください。

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


次図のように、「LOAD」がファイルの読み込み、「RUN」がプログラム実行、「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について

ここからは、Python 2とPython 3の違いについて解説を加えますので、興味のある方はお読みください。

まず、本書で用いるプログラミング言語は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および対応コマンドが共存しています。

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

2019/6/25に更新された本書のプログラムは、Python2 と Python3 のどちらで実行しても問題が起こらないよう記述していますので、上記の違いを意識せず演習を進められます(それ以前にダウロードした方は再び mlbb-sample.zip をダウンロードし、展開しなおした上でご活用ください)。
とはいえ、プログラム実行時に自分がPython2 と Python3 のどちらで実行しているかを意識するとPythonプログラムにより早く慣れることができるでしょう。

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

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

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つずつ順番に実行してください。
sudo apt update
sudo apt install python-pil.imagetk
Python3で演習を実行したい方は下記も合わせて実行してください。
sudo apt install python3-pil.imagetk

8章

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

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

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


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

p.248 OpenCVのインストール

なお、ここではOpenCVのインストール方法について下記の3通りの方法を解説します。こだわりのない方は一番初めに解説するPython2を用いてください。
  • Python2でOpenCVを利用する場合
  • Python3でOpenCVを利用する場合(NOOBS 3.0.1 までの Stretch)
  • Python3でOpenCVを利用する場合(NOOBS 3.1.1 以降の Buster)

p.248 Python2でOpenCVを利用する場合

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

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

p.248 Python3でOpenCVを利用する場合(NOOBS 3.1.1 以降の Buster)

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

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

python ml-08-01-cameracheck.py
Python3で演習を実行したい方向けのコマンドはこちらです。
python3 ml-08-01-cameracheck.py

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

python ml-08-02-binary.py
Python3で演習を実行したい方向けのコマンドはこちらです。
python3 ml-08-02-binary.py
なお、エラーが出る場合、2019/6/25に更新されたサンプルファイル(mlbb-sample.zip)をダウンロードし直し、展開した上でご活用ください。

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

leafpad ml-08-02-binary.py

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

python ml-08-03-learn.py result.pkl
Python3で演習を実行したい方向けのコマンドはこちらです。
python3 ml-08-03-learn.py result.pkl
なお、エラーが出る場合、2019/6/25に更新されたサンプルファイル(mlbb-sample.zip)をダウンロードし直し、展開した上でご活用ください。

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

python ml-08-04-recognition.py result.pkl
Python3で演習を実行したい方向けのコマンドはこちらです。
python3 ml-08-04-recognition.py result.pkl
なお、エラーが出る場合、2019/6/25に更新されたサンプルファイル(mlbb-sample.zip)をダウンロードし直し、展開した上でご活用ください。

9章

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

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

p.295 音声の出力先をピンジャックにするためのコマンド

amixer cset numid=3 1

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

GUIを用いたじゃんけんシステムです。
python ml-09-01-janken.py result.pkl
Python3で演習を実行したい方向けのコマンドはこちらです。
python3 ml-09-01-janken.py result.pkl
なお、エラーが出る場合、2019/6/25に更新されたサンプルファイル(mlbb-sample.zip)をダウンロードし直し、展開した上でご活用ください。

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

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

GUIを用いたじゃんけんシステムの音声短縮版です。
python ml-09-02-janken-shorten.py result.pkl
Python3で演習を実行したい方向けのコマンドはこちらです。
python3 ml-09-02-janken-shorten.py result.pkl
なお、エラーが出る場合、2019/6/25に更新されたサンプルファイル(mlbb-sample.zip)をダウンロードし直し、展開した上でご活用ください。

10章

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

本書では、kerasと一緒に用いるバックエンドとしてTheanoを用いました。 このバックエンドをGoogleのTensorFlowに変更する方法を下記のページに紹介しましたので、 興味のある方はご覧ください 。結果が変わるわけではありませんし、上級者向けの内容ですので、自信がない方は書籍の通りTheanoの利用で問題ありません。

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

2つの命令がありますので、1つずつ順番に実行してください。
sudo apt update
sudo apt install liblapack-dev libhdf5-dev python-h5py
Python3で演習を実行したい方は下記のコマンドも実行してください。
sudo apt install liblapack-dev libhdf5-dev python3-h5py

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

sudo pip install keras theano
Python3で演習を実行したい方は、下記のコマンドも実行してください。
sudo pip3 install keras 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のネットワーク接続に問題がある場合はその改善を試みてください。
一方、先方のサーバーに問題がある場合、時間をあけてからコマンドを再実行すると問題が解消される場合があります。

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

leafpad .keras/keras.json
なお、keras.jsonの4行の内容は順番が前後することがありますが、「tensorflow」部を「keras」に書き換えさえすれば順番はそのままで構いません。

10.4 アヤメの分類

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

学習には時間がかかるので実行することを必ずしもお勧めしません。
python ml-10-01-iris-deep-learn.py result-iris.h5
Python3で演習を実行したい方向けのコマンドはこちらです。
python3 ml-10-01-iris-deep-learn.py result-iris.h5

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

python ml-10-02-iris-deep-load.py result-iris.h5
Python3で演習を実行したい方向けのコマンドはこちらです。
python3 ml-10-02-iris-deep-load.py result-iris.h5

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

python ml-10-02-iris-deep-load.py ml-iris-deep.h5
Python3で演習を実行したい方向けのコマンドはこちらです。
python3 ml-10-02-iris-deep-load.py ml-iris-deep.h5

10.6 手書き数字の分類

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

学習には時間がかかるので実行することを必ずしもお勧めしません。
python ml-10-03-digits-cnn-learn.py result-digits.h5
Python3で演習を実行したい方向けのコマンドはこちらです。
python3 ml-10-03-digits-cnn-learn.py result-digits.h5

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

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

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

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

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

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

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

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

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

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

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

マウスで描いた数字を分類するプログラムです。数字の位置と大きさを補正するバージョンです。
python ml-10-06-digits-cnn-gui-mod.py ml-digits-cnn.h5
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の実行コマンド(じゃんけんの手の学習)

学習には時間がかかるので実行することを必ずしもお勧めしません。
python ml-10-07-hand-cnn-learn.py result-hand.h5
Python3で演習を実行したい方向けのコマンドはこちらです。
python3 ml-10-07-hand-cnn-learn.py result-hand.h5
なお、エラーが出る場合、2019/6/25に更新されたサンプルファイル(mlbb-sample.zip)をダウンロードし直し、展開した上でご活用ください。

さらに、このコマンドの実行時に下記のようなAttributeErrorが出る場合、学習用の手の画像が格納されているml-learnディレクトリがプログラムml-10-07-hand-cnn-learn.pyと同じ位置に存在しないためであると考えられます。 これは圧縮されたサンプルファイルを展開すると現れるディレクトリです。ご確認ください。
pi@raspberrypi:~ $ python ml-10-07-hand-cnn-learn.py hand-result.h5
Using Theano backend.
Epoch 1/500
Traceback (most recent call last):
  File "ml-10-07-hand-cnn-learn.py", line 116, in 
    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の実行コマンド(自分で作った学習済ファイルを用いる場合)

二値化されたカメラ映像と手の分類結果を表示するプログラムです。
python ml-10-08-hand-cnn-load.py result-hand.h5
Python3で演習を実行したい方向けのコマンドはこちらです。
python3 ml-10-08-hand-cnn-load.py result-hand.h5
なお、エラーが出る場合、2019/6/25に更新されたサンプルファイル(mlbb-sample.zip)をダウンロードし直し、展開した上でご活用ください。

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

二値化されたカメラ映像と手の分類結果を表示するプログラムです。
python ml-10-08-hand-cnn-load.py ml-hand-cnn.h5
Python3で演習を実行したい方向けのコマンドはこちらです。
python3 ml-10-08-hand-cnn-load.py ml-hand-cnn.h5
なお、エラーが出る場合、2019/6/25に更新されたサンプルファイル(mlbb-sample.zip)をダウンロードし直し、展開した上でご活用ください。

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

GUIによるじゃんけんシステムです。
python ml-10-09-janken-deep.py result-hand.h5
Python3で演習を実行したい方向けのコマンドはこちらです。
python3 ml-10-09-janken-deep.py result-hand.h5
なお、エラーが出る場合、2019/6/25に更新されたサンプルファイル(mlbb-sample.zip)をダウンロードし直し、展開した上でご活用ください。

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

GUIによるじゃんけんシステムです。
python ml-10-09-janken-deep.py ml-hand-cnn.h5
Python3で演習を実行したい方向けのコマンドはこちらです。
python3 ml-10-09-janken-deep.py ml-hand-cnn.h5
なお、エラーが出る場合、2019/6/25に更新されたサンプルファイル(mlbb-sample.zip)をダウンロードし直し、展開した上でご活用ください。

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

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

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

GUIによるじゃんけんシステムの音声短縮版です。
python ml-10-10-janken-deep-shorten.py result-hand.h5
Python3で演習を実行したい方向けのコマンドはこちらです。
python3 ml-10-10-janken-deep-shorten.py result-hand.h5
なお、エラーが出る場合、2019/6/25に更新されたサンプルファイル(mlbb-sample.zip)をダウンロードし直し、展開した上でご活用ください。

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

GUIによるじゃんけんシステムの音声短縮版です。
python ml-10-10-janken-deep-shorten.py ml-hand-cnn.h5
Python3で演習を実行したい方向けのコマンドはこちらです。
python3 ml-10-10-janken-deep-shorten.py ml-hand-cnn.h5
なお、エラーが出る場合、2019/6/25に更新されたサンプルファイル(mlbb-sample.zip)をダウンロードし直し、展開した上でご活用ください。

26 件のコメント:

  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. このコメントは投稿者によって削除されました。

    返信削除
  8. 金丸様

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

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

    本書第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でしたね。
      こちらの勘違いです。

      削除