Translate

2019年12月10日火曜日

AWS Greengrass チュートリアル「機械学習の推論を実行する」を試したが何の反応もなかった件

AWS Greengrassのチュートリアルを試している。

チュートリアルの一つ

機械学習の推論を実行する
https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/ml-inference.html

は、
S3上にあるmxnetモデルファイルをロードしてAWS Greengrass Core(デバイス側)上のLambdaで実行してデバイスに装備したカメラで撮影した対象物を予測しその結果を"hello/world"というトピックに返却するというもの。

下の図のSage Maker部分は、チュートリアルでは体験できないが、S3に学習済みモデルファイルをおいてそれをCore上のLambdaが使用するとことは体験できる。



AWS Greengrass Coreは最近買ってきたRaspberry Pi 4B(3B+でも可)にインストールして、上記リンクのとおりに実行してみた...が、動かない..

AWS Greengrass Core 上のログ(エラー)は /greengrass/ggc/var/log/user/<リージョン名>/NNNNNNNNNN/.log というテキストファイルに書き出される。

のぞいてみると

[2019-12-09T07:45:30.002Z][FATAL]-lambda_runtime.py:140,Failed to import handler function "greengrassObjectClassification.function_handler" due to exception: libgfortran.so.3: cannot open shared object file: No such file or directory
[2019-12-09T07:45:30.004Z][FATAL]-lambda_runtime.py:380,Failed to initialize Lambda runtime due to exception: libgfortran.so.3: cannot open shared object file: No such file or directory


というエラーが出ていた。

どうも libgfortran.so.3 というファイルがない、findで探してみると libgfortran.so.5 はあるけど 3 はなかった。

..で、apt install でインストールしようとすると..

pi@gateway:~ $ sudo apt install libgfortran3
Reading package lists... Done
Building dependency tree
Reading state information... Done
You might want to run 'apt --fix-broken install' to correct these.
The following packages have unmet dependencies:
 python-opencv : Depends: python-numpy (>= 1:1.16.0~rc1) but it is not going to be installed
                 Depends: python-numpy-abi9
 python-picamera : Depends: python-numpy but it is not going to be installed
 python-scipy : Depends: python-numpy (>= 1:1.16.0~rc1) but it is not going to be installed
                Depends: python-numpy-abi9
E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).
pi@gateway:~ $

..どうもnumpyが悪さしている様子..

ここはpipでなくaptnumpyをいれてみようということで sudo apt install python-numpy を実行して動かしてみたら、今度はログに


:
[2019-12-10T01:51:58.67Z][ERROR]-[01:51:58] /work/mxnet/src/engine/engine.cc:55: MXNet start using engine: NaiveEngine
[2019-12-10T01:51:59.829Z][ERROR]-csr.py:15,ImportError
[2019-12-10T01:51:59.836Z][ERROR]-csr.py:15,:
[2019-12-10T01:51:59.843Z][ERROR]-csr.py:15,No module named _multiarray_umath
[2019-12-10T01:52:01.69Z][FATAL]-lambda_runtime.py:140,Failed to import handler function "greengrassObjectClassification.function_handler" due to exception: numpy.ufunc size changed, may indicate binary incompatibility. Expected 124 from C header, got 112 from PyObject
[2019-12-10T01:52:01.691Z][FATAL]-lambda_runtime.py:380,Failed to initialize Lambda runtime due to exception: numpy.ufunc size changed, may indicate binary incompatibility. Expected 124 from C header, got 112 from PyObject

  • _multiarray_umath がないよというERROR
  • numpy.ufunc サイズが違うよというFATAL

という2つの問題が発生..


そうか、mxnetがtensorflowを使ってるけど、まだインストールされてなかった。

あわてて sudo pip install tensorflow を実行。


:
  copying h5py/tests/test_vds/test_highlevel_vds.py -> build/lib.linux-armv7l-2.7/h5py/tests/test_vds
  running build_ext
  ('Loading library to get version:', 'libhdf5.so')
  error: libhdf5.so: cannot open shared object file: No such file or directory
  ----------------------------------------
  ERROR: Failed building wheel for h5py
  Running setup.py clean for h5py
Successfully built absl-py wrapt keras-applications termcolor gast
Failed to build h5py
Installing collected packages: funcsigs, mock, absl-py, keras-preprocessing, futures, setuptools, protobuf, grpcio, markdown, werkzeug, tensorboard, wrapt, backports.weakref, h5py, keras-applications, astor, termcolor, gast, google-pasta, tensorflow-estimator, tensorflow

今度は libhdf5.so がないよ..だと..

イライラしつつ sudo apt install libhdf5-dev を実行して、再度hello/worldをサブスクライブしても反応なし..

ログには、

:
[2019-12-10T04:58:46.477Z][FATAL]-lambda_runtime.py:140,Failed to import handler function "greengrassObjectClassification.function_handler" due to exception: numpy.ufunc size changed, may indicate binary incompatibility. Expected 124 from C header, got 112 from PyObject
[2019-12-10T04:58:46.478Z][FATAL]-lambda_runtime.py:380,Failed to initialize Lambda runtime due to exception: numpy.ufunc size changed, may indicate binary incompatibility. Expected 124 from C header, got 112 from PyObject
[2019-12-10T04:58:46.479Z][ERROR]-[04:58:46] /work/mxnet/src/engine/engine.cc:55: MXNet start using engine: NaiveEngine
[2019-12-10T04:58:48.045Z][ERROR]-csr.py:15,ImportError
[2019-12-10T04:58:48.052Z][ERROR]-csr.py:15,:
[2019-12-10T04:58:48.059Z][ERROR]-csr.py:15,No module named _multiarray_umath

..そうか _multiarray_umath の問題を解決できてなかった..

しらべると numpy を最新版にしないといけないらしい。

が、numpy は mxnet の制約上限バージョンでインストールされている..

ままよ、と sudo pip install numpy -U して最新版に更新、Coreデバイスをリブートして、hello/worldをサブスクライブしてみたら..やっと動いた...


うーむ、
AWS Greengrass Core上で動かす Lambda は
AWS上で動かすLambdaと違って
自前で環境を整えないといけない。

現時点のGreengrass CoreはPython2.7なのが厄介だ。

来年には切れる2のサポート問題から、最近のコードは基本 Python3.xで書かれている。

実行ユーザが ggc_user/ggc_group なので、
このユーザにvirtualenvを切ればおそらくPython3.xでも動かせるだろうが、デフォルトの状態ではvirtualenvなしのOSインストール状態のPythonバージョンが適用される。

Raspberry PiのTensorflowも現時点pipできるバージョンは1.14.0

おまけにエラーは、 /greengrass/ggc/var/log/user/<リージョン名>/NNNNNNNNNN/.log を覗かないとわからない..




そしてもっとも厄介なのが、この情報がいま時点では、ということ。
明日には変わっているかもしれない..

AWS Greengras Core 環境整備がとても大変だ..

本番だとCoreを複数立てるわけだろうし..

かなり厄介だな、IoT ゲートウェイって..


2019年11月28日木曜日

node環境でaws-iot-device-sdk-jsを使っていたら、Emitted 'error' event on DeviceClient instanceと出て落ちる件

node環境でaws-iot-device-sdk-jsをつかったexpressアプリを作って起動したら、

(env) foo@bar:~/tar $ node server.js
Node.js is listening to PORT:3000
connect
events.js:187
      throw er; // Unhandled 'error' event
      ^

Error: premature close
    at onclosenexttick (/home/pi/projects/donkey_agent_telemetry/node_modules/end-of-stream/index.js:54:86)
    at processTicksAndRejections (internal/process/task_queues.js:75:11)
Emitted 'error' event on DeviceClient instance at:
    at MqttClient. (/home/pi/projects/donkey_agent_telemetry/node_modules/aws-iot-device-sdk/device/index.js:772:15)
    at MqttClient.emit (events.js:215:7)
    at TLSSocket.f (/home/pi/projects/donkey_agent_telemetry/node_modules/once/once.js:25:25)
    at onclosenexttick (/home/pi/projects/donkey_agent_telemetry/node_modules/end-of-stream/index.js:54:73)
    at processTicksAndRejections (internal/process/task_queues.js:75:11)
(env) foo@bar:~/tar $


..というエラーがでた..

'error' イベントがemitされたらしいので

device.on('error', function() {
  console.log('error');
})

を使って例外を無視させようとしたけど、
同じエラーが発生..

どうもほかのイベントすべてを
うけとってやらないとエラーでnodeが落ちるらしい。

device.on('reconnect', function() {
  console.log('reconnect');
})

device.on('close', function() {
  console.log('close');
})

device.on('offline', function() {
  console.log('offline');
})

全部のイベントをうけとるようにしたら、
落ちなくなった...

それだけ。

2019年11月26日火曜日

一般ユーザで実行したら "/dev/uinput" cannot be opened for writing と出る件



    from evdev import uinput, UInput
    from evdev import ecodes as e

Raspberry Pi上で上記のようにevdevパッケージを使ったPythonプログラムを実行しようとしたら、

env) foo@bar:~/tar $ python hogehoge.py
"/dev/uinput" cannot be opened for writing
Have you tried running as root? sudo hogehoge.py
env) foo@bar:~/tar $

というエラーが出た。

virutalenv 上でevdevをインストールしたからかも..
とおもって
virtualenv環境ではなくじかにevdevをインストールして、
sudoをつけて実行すると..うごいた..

でも、このプログラムを一般ユーザでうごかしたい..

ということで調べたら、
以下の方法で動いた。

sudo vi /etc/udev/rules.d/40-uinput.rules

してファイルを新規作成し、

SUBSYSTEM=="misc", KERNEL=="uinput", MODE="0660", GROUP="uinput"

と入力し保存。

つぎに、

sudo vi /etc/modules-load.d/uinput.conf

してファイルを新規作成し、

uinput

と入力し保存。

そして

sudo groupadd uinput
sudo usermod -aG uinput <実行ユーザ名>


して実行ユーザを新規作成したuinputグループに参加させる。

そして

sudo reboot

すればよい。


最近のLinux(raspbeianだけど..)は
ルール関係が複雑で、
入社当時のBSDなんかだと安直に

chmod a+rw /dev/uinput

とかしてたけど、
最近のLinux(raspbeianだけど..)は
ルール関係が複雑なので
こんなことしてもリブートしたらすぐに戻っちゃうだろうから..
(やったことないので、ほんとにそうなるかは、わからないけどね)

2019年11月14日木曜日

I2C 通信の smbus ベースのコードをpigpioに移植中にi2c_read_i2c_block_dataではまる

Python で MPU9250 を使おうとして、
以下のリポジトリを発見。

https://github.com/FaBoPlatform/FaBo9AXIS-MPU9250-Python

ただ、既存コードを pigpio ベースで行っているので、
Apache-2.0ライセンスでもあることから、
コードを書き換えてみようとためしてみた。

pigpioのi2c関連の関数は、
pigpio.pi()で取得したオブジェクトに
smbus とほとんど同じ名前で同じ機能があるので
ほいほいと書き換えていった..

引数のアドレスをpigpioハンドラにすれば
ほとんど変更いらずだわ..

..と、思っていたのだけど..

smbusの

read_i2c_block_data(addr, cmd)

の戻り値が

long[]

になっているのに対し、

pigpio の

i2c_read_i2c_block_data(handle, reg, count)

の戻り値は

Tupple

1要素目が0以上が正常読み込みしたことをあらわし、
負値の場合はエラーコードになる。

そして2要素目が取得した値なのだけど..
これがbytearrayになってる..


..めんどくさー



おきをつけあれ。


ちなみに..私は以下のラップ関数で逃げました。

ご参考まで。

def read_i2c_block_data(pi, handler, reg, count):
    """
    SMBusのread_i2c_block_dataと戻り値を合わせるための関数。
    引数:
        handler     pigpio I2C ハンドラ
        reg         デバイスレジスタ
        count       読み込むバイト数
    戻り値:
        int[]       read_i2c_block_dataの戻り値はlong[]だがpython3
                    なのでint[]
    例外:
        ConnectionError エラーの場合
    """
    if pi is None:
        try:
            import pigpio
        except:
            raise
        pi = pigpio.pi()
    (b, d) = pi.i2c_read_i2c_block_data(handler, reg, count)
    if b >= 0:
        data = []
        for i in range(count):
            value = int(d[i])
            data.append(value)
        return data
    else:
        raise ConnectionError('Error:{} in i2c_read_i2c_block_data'.format(
            str(b)))


誤りがあれば、コメント欄にご指摘ください。

2019年9月18日水曜日

Coral Dev Board セットアップでrootfsのflash中にFAILED (Error reading sparse file)が出る

Coral Dev Board JP Version がでたので、早速セットアップしてみた。

このデバイス、セットアップが厄介だ。
OS領域はEdge TPU側にもっているので別途SDカードを購入しなくても
つかうことができる。

しかし、micro-Bケーブル1本とUSB-Cケーブル2本が必要になる。

セットアップにはMacもしくはLinuxとあるけど、
ここをよむと
ようは最新のWindows版 fastboot をPATHのとおるところにいれておけば
flash.shの中身をWindows用に解釈してうごかせばいいらしい。

で、やってみたのだけど
fastboot flash rootfs rootfs_arm64.img の最中で
以下のようなエラ-が出て先に進めない..

C:\Users\XXXX4\Downloads\mendel-enterprise-chef-13\mendel-enterprise-chef-13> fastboot flash rootfs rootfs_arm64.img
Sending sparse 'rootfs' 1/3 (397265 KB)            OKAY [ 13.822s]
Writing 'rootfs'                                   OKAY [ 29.406s]
Sending sparse 'rootfs' 2/3 (408325 KB)            FAILED (Error reading sparse file)
fastboot: error: Command failed


いろいろためしたなかで sparse サイズを変えてみたら
うまくいった。

わたしの場合は、 -S 256M をつけて動かしたら、

(base) C:\Users\XXXXX\Downloads\mendel-enterprise-chef-13>fastboot -S 256M flash rootfs rootfs_arm64.img
Sending sparse 'rootfs' 1/5 (249985 KB)            OKAY [  8.672s]
Writing 'rootfs'                                   OKAY [ 15.024s]
Sending sparse 'rootfs' 2/5 (242396 KB)            OKAY [  8.469s]
Writing 'rootfs'                                   OKAY [ 18.266s]
Sending sparse 'rootfs' 3/5 (257332 KB)            OKAY [  8.935s]
Writing 'rootfs'                                   OKAY [ 10.362s]
Sending sparse 'rootfs' 4/5 (257993 KB)            OKAY [  8.997s]
Writing 'rootfs'                                   OKAY [ 61.520s]
Sending sparse 'rootfs' 5/5 (150843 KB)            OKAY [  5.710s]
Writing 'rootfs'                                   OKAY [ 80.547s]
Finished. Total time: 232.835s

(base) C:\Users\XXXXX\Downloads\mendel-enterprise-chef-13>

..うまくいった...




p.s.

にしても、シリアル接続を使ってセットアップとは..

シリアル経由でサーバ設定するデータセンタ民や
kermitなどを使ったことのある人はわかるだろうけど..

..イマドキの若者には難しそうな気がする..

2019年9月10日火曜日

Donkeycar3.1.0上の機械学習モデルを調べてみた


Donkeycar がVersion3になり、実装されているモデルのタイプ(DEFAULT_MODEL_TYPE)が増えた。

しかし、どのモデルが何者なのか、ドキュメントには一切書かれていない。

デフォルトで動作するlinear以外はどうなっているのか、
そもそも既存のTubデータで動作するのかといった情報がないのだ。

結局 donkeycar パッケージリポジトリを自分で読むしか無いのだ。

<2019/09/11追記>
Facebook側にコメントが有り、公式ドキュメントにも
記載があるそうです。よく読めって話ですよね..
http://docs.donkeycar.com/parts/keras/
まずこちら(Google Chromeの翻訳かけても十分読めます)を
参照していただいたほうがいいでしょう。

と、いうことでざっと読んで概要をまとめてみた。

ちなみにdonkeycarのモデルの呼び出しはFactoryパターンで実装されていて、
myconfig.py上にDEFAULT_MODEL_TYPEを指定すると、
(デフォルトはconfig.py上のDEFAULT_MODEL_TYPE="linear"が有効になる)
Abstract Factory関数はutil.pyのget_model_by_typeの引数にわたり
該当するモデルパーツクラスがインスタンス化される仕組みだ。

Donkeycar3.1.0には以下のモデルタイプ(引数model_type)が存在する。


model_typeクラス概要
lineardonkeycar.parts.keras.KerasLineardonkeycarデフォルトのモデル。中間層は、Conv2D×5層。出力層でステアリング値、スロットル値を直接出力。
tflite_lineardonkeycar.parts.tflite.TFLitePilotTensorFlow Lite モデルファイルをロードして実行するためのパーツクラス。トレーニングを実行するための`compile`メソッドが実装されていないのでモデル作成およびトレーニングはdonkeycarアプリケーション外で各自で作成・実行しなくてはならない。linearで作成したモデルファイルをコンバートするなどして使用する(h5ファイルのコンバート処理はkeras_model_to_tfliteメソッドが提供されている)。使用可能なモデルは、入力はイメージ(120x160x3)、出力はアングル値・ステアリング値(ともにfloat値)が前提となる。
localizerdonkeycar.parts.KerasLocalizerほぼcategoricalのモデルと同じだが、出力層がスロットル、アングルにロケーション分類値が加わっている。ロケーション分類値は、LED表示に使用されるのみなので、自動運転動作には全く影響しない。LEDを搭載していない標準DonkeyCarの場合はcategoricalを指定した場合と何ら変わらない。 しかしTubデータにロケーション分類値を格納する処理が実装されていないので、学習処理が動かないかもしれない。
behaviordonkeycar.parts.keras.KerasBehavioral入力層がイメージと車線状態を取り込むモデル。車線状態(左車線・右車線のどちらか)をL1キーでトグル入力させそれをone hotな動作ベクトルに変換し、イメージと一緒に入力層に与えている。入力層以外はイメージ側は`categorical`と同様、状態ベクトル側は全結合層×3、最後に両方の結果を連結している。ソースコードコメントを読むと昔はlinearベースだったようだ。ジョイスティックがない場合、あってもL1というラベルが使用しているJoystickクラスに定義されていない場合はこのモデルを選択しても意味がない。しかも手動運転時の運転者が走行操作と並行してただしく状態を入力しなければならない。
imudonkeycar.parts.keras.KerasIMUMPU6050(I2C)から角速度3軸、加速度3軸がTubデータに書かれていることが前提。入力層はイメージとIMU値、中間層はイメージがConv×5層・IMUが全結×3層を結合したもの、出力層でステアリング値、スロットル値を直接出力。
tensorrt_lineardonkeycar.parts.tensorrt.TensorRTLinearTensorRTを使ったクラス、このためTelsa/Jetson/Nvidia Driveがない場合は使用できない(GeForceも実行できない)。`compile`メソッドは存在するが処理が実装されていないため、学習済みモデルをロードし推論するのみの機能提供となるコンバート方法は公式ドキュメントを参照のこと。なお、コードのコメントにtesnorflow-gpuでのトレーニングは非推奨との記述がある(なぜかは不明)。
coral_tflite_lineardonkeycar.parts.coral.CoralLinearPilotEdgeTPU搭載した環境を前提としたクラス。Tensorflow Liteモデルファイルを読み込み、推論を実行するのみ。モデルファイルは別途作成する必要がある。コンバート方法は..知っている人はコメント欄にお願いします..
3ddonkeycar.parts.keras.Keras3D_CNN畳み込み層を時系列データを扱うためConv2DではなくConv3Dを使ったモデル。直近一定数(デフォルトは20)のイメージを入力し、Conv3D×4層の中間層にかけ、アングル値・スロットル値を出力する(分類ではなくfloat値で返却)。
rnndonkeycar.parts.keras.KerasRNN_LSTM時系列データが扱えるRNN/LSTMをベースとしたモデル。直近一定件数(デフォルトは3)のイメージを入力し、各イメージにConvolution2D×5層にかけ各々をベクトル化したものを作成しLSTM(RNN実装の一つ)にかけ、出力層はアングル値、スロットル値を出力する(分類ではなくfloat値で返却)。
categoricaldonkeycar.parts.keras.KerasCategorical画像分類を使ったモデル。入力層はイメージ、中間層はイメージサイズによりConv2D×4or5層、出力層はスロットル15分割、アングル20分割の各1値を選定する。CNNの画像分類精度の高さを使っているためlinearより精度が高いという人もいる。細やかな動作を行いたい場合は出力層の分割数を増やせば良い。
latentdonkeycar.parts.keras.KerasLatentConv2D×8層を中間層に持つモデル。入力はイメージ、出力はアングル値・スロットル値(ともにfloat値を直接出力)以外にCNNを掛けた直後Deconvolution(Transposed Convolution/up-convolutionともいうDC-GANによく使用される)層を6層かけてイメージも生成している。しかし出力ではアングル値・スロットル値のみを使っているだけで生成したイメージは`KerasLatent`クラス内で捨てているため、そのまま使用する場合は、単にCNN8層のモデルでしかない。
fastaidonkeycar.parts.fastai.FastAiPilotfastaiパッケージのモデルファイルを読み込み実行するための推論のみのパーツクラス。クラス上にcompileメソッドがなくpython manage.py trainを実行できない(donkeycarアプリケーションを使ったトレーニングができない)。よってモデルはdonkeycarアプリケーション外部で定義されていることが前提となる。fastaiパッケージがtoachパッケージベースで記述されているためtensorflowベースではない。なおfastaiパッケージはディープラーニングのeラーニングコースである course.fast.ai 内で使用されている。

標準Donkeycarで有効に動作しそうなモデルタイプは
  • linear
  • categorical
  • rnn
  • 3d
の4種類。
ただ..rnnと3dは複数のイメージデータ(rnnはデフォルト3件、3dはデフォルト10件)
を入力にしないといけないが、
manage.py上のVehicle上のメモリ領域に最近N件のイメージデータを
確保するような処理がない..
なのでまともに動作するのは
  • linear
  • categorical
の2つだけだ。

<2019/09/11修正>
rnn、3dのrun関数内で最近N件をインスタンス変数にためて
いる実装がありました。推論も実行できそうです。
コメントご指摘、ありがとうございました。

linearでうまく行かない人はcategoricalでうまくいくことが多い。
これはCNNが画像分類で世に出たわけでもともと得意なケース
ということなのだとおもう。


  • behavior
は、ゲームパッドでの手動運転(学習データ収集)が必須となっており、
かつゲームパッド上に(joystick具現クラス上に)ラベル"L1"が定義されていること
が前提となり、
手動運転中Donkeycarが車線を変更するたびにL1ボタンを押さなくてはならない。
behaviorモードで手動運転したTubデータは項目が増えるが、
そのまま先の4つのモードでもトレーニングさせることができる(拡張項目は無視されるが、ファイルロードに時間がかかる)。
ゲームパッドとしてPS3/PS4をつかっているならこのまま動作すると思うが
F710とかだとmanage.pyの1行を書き換える(L1をLTなどに書き換える)必要がある
(厄介なことにmyconfig.pyではなくmanage.py上に直書きされているのだ)。


また
  • imu
は、MPU6050をI2C経由で接続しておかなくてはならず、
Tubデータも増える。
MPU6050は日本のAmazonでも購入可能だ。
IMUデータはCNNではなく全結合層の結果をCNNの結果と
コンカチしているだけなので
素人目にも精度が悪そうだ。
角速度と加速度なので、
機械学習の入力として使用するのではなく、
ルールベースの剰余項補正などに使用したほうが良いとおもう。


  • localizer 
はよくわからない実装だ。
3色LEDを搭載しているDonkeycarでないと意味がないし、
そもそもどう点灯してほしいかの学習データ入力方法がないので
学習は無法地帯になっている。
コードを読む上でなにか見落としがあるのかもしれない。
3色LEDの想定はKY-009という基板実装モジュールで
日本のAmazonにもあるにはあるが品切れ状態で
国内で入手するのは難しそうである。
3色LED自体は販売されているので、
ブレッドボード上でカソード側の抵抗を見繕えば
自前基板実装の難易度は高くない。
(..Donkeycarを菅原文太が乗っていたデコトラみたいにしたかったのかもしれない..)

よくわからない実装といえば
  • latent
もそうだ。
DC-GANで使用されているDeconvolution層を使って画像データを生成
させているが、3.1.0ではつくりっぱなしで、
Tubやメモリ上に格納していない、使用していないのだ。
想像するに、学習データを増やそうとしているのだろうが、
もしかしたら後続バージョンでなにかかわるのかもしれない。
入力・出力ともデフォルトのTubデータで操作しそうだから
このモデルも動くとは思うが、deconv結果を使用しない以上
単なるCNN8層モデルでしかないため、
トレーニングや自動運転処理が重いだけでおわるかもしれない。


以下の4つのモデル
  • tflite_linear
  • coral_tflite_linear
  • tensorrt_linear
  • fastai
は、クラス上にモデルファイルのロードと自動運転実行機能しか
実装されていない。
fastai以外はlinearとついているのでlinearモデルのTF Lite/TF Lite TPU版/TensorRT
実装(モデル定義、トレーニング処理)があってもいいとおもうのだけど
みあたらない..

ただ
  • tflite_linear
  • coral_tflite_linear
は、デフォルトのlinearで学習したモデルファイルをコンバートするだけ
で使用できそうだ。coralはUSB接続するGoogle Coralアクセラレータ
(旧Mobidius)かEdge TPU実装ボード(Google Coral Dev Board JP Version)が
ないと動作しない。
  • tensorrt_linear
は、Tesla(Google ColabでもOK)、Jetson、NVIDIA Driveシリーズでのみ
動作する。
TeslaをDonkeycarに乗せるのはコストが見合わないし、
NVIDIA Driveはトヨタとかホンダとか本気で自律走行を載せようとしている
メーカ向けらしいので無理。
ほぼJetson Nano向けということになる。
持っていないので詳しくないが、Jetson Nano上のTensorflow は
バックエンドでTensorRTを使うようになっているのだと思う
(モデルファイルはどう作るのかは不明)

<2019/09/11追記>
tensorrt_linearのモデルファイルの作り方は公式ドキュメント
http://docs.donkeycar.com/guide/robot_sbc/tensorrt_jetson_nano/
に記載されています。
コメントご指摘、ありがとうございました。



p.s.

ちなみにdonkey makemovie --tub <tubデータディレクトリパス> --type < model_type値 > --out < 出力mp4ファイルパス >--salient --start 1 --end <画像にしたいtubデータ通し番号(最後)>を実行することで、
モデルがexciteした箇所を可視化してくれる。
さらにモデルが推論した値も可視化してくれるので
ぜひためしてほしい。

..のだけど、処理はとても重い。
linear で start=1 end=2400を指定して
仮想マシン2コア8GBRAM(FloydHub cpu)で動かしたら
8時間たったころにメモリが足りなくて落ちた..
しかも生成したmp4は途中で切れている状態で
再生できなかった..

以下、FloydHub実行例。
#Tubデータはデータセットとして先に格納済みで
#モデルファイルmodels/20190910/mypilot_linear.h5も作成済みが前提。
#Tawn氏のkeras-visだと動かなかったので1行だけ修正した版を独自リポジトリ
#に格納している

floyd run --cpu --env tensorflow-1.13 --data user_id/datasets/dataset_name/1:data 'git clone https://github.com/autorope/donkeycar.git&&cd donkeycar&&git checkout master&&cd ..&&pip install -e donkeycar[pc]&&pip install keras-vis&&git clone https://github.com/coolerking/keras-vis&&pip install -e keras-vis&&donkey createcar --path mycar&&cd mycar&&donkey makemovie --tub /floyd/input/data --out linear.mp4 --type linear --model ../models/20190910/mypilot_linear.h5 --start 1 --end 2400 --salient'



Google Colaboratory (Python3/GPU)で
linear で start=1 end=2400を指定して実行すると
5時間23分かかって1分の動画を生成した..
ただ..実はGoogle Colabratoryの90分問題・120分問題というのがあり、
(モデルファイル作成のトレーニング処理は長くても20分なので問題ない)
手動で対処していたためほとんど他の作業ができなかった..
この記事に書いてあるChromeプラグインを入れたのだが、
#ダイアログが出て自動更新されなかった

タダだから、文句言えないけど..

p.s.2

ちなみにrnnや3dモデルでdonkey makemovieすると大量のエラーがでた。
generatorやrunの入力が複数件対応していないためだ。

<2019/09/11追記>
エラーの原因はrnnと3dで異なっているので、もう少し掘り起こしてみます..

p.s.3

tensorflow liteはRaspberry Pi Zero上では
トレーニングだけでなく推論実行できない。
armv6ベースのwheelファイルがPyPIにないので
自分でwheelファイルがつくれないと、
すなわちソースコードからwheelファイルを
Raspberry Pi Zero上もしくはDockerコンテナなどのクロスコンパイル環境上で
ビルドできないと、
使用できない。

あるいはTawn氏が作ったtflite_serverというOSSで
クラサバ形態をとるかだが、
これだと"自律"走行とは言えないかもしれない..

2019年8月14日水曜日

Windows10上でRaspberry Pi Zero用Tensorflow Lite 静的ライブラリのコンパイル方法

Donkeycarのバージョンが3.1.0にあがってしまいました..
3.1.0の目玉はTensorRT対応とTensorflow Lite対応です。
TensorRTはGPUがそもそもないのでどうでもいいですがLiteのほうは..Zeroで自動走行にすると内部エラーで落ちる問題が解決できるかもしれない..ということでRaspberry Pi ZeroにTensorflow Liteをインストールしなくてはなりません。

でもそんなwheelファイル誰も公開していない..TawnさんにSlackできいても知らないとの答え..

しょうがないので公式ドキュメントに従ってコンパイルをすることになったわけです。

----

Tensorflow LiteドキュメントにはDockerコンテナ上でクロスコンパイルする手順がかかれていますが、あくまでarmv7l(3B/3B+)用であり、get started に whlファイルのダウンロード元URLがかかれているので、正直コンパイルするひつようがありません。

でもなぜかZero用のarmv6用は置かれていないので、自分でコンパイルするしかありません。

以下、手順を紹介しますが、すべての機能のテストをしていませんので、動かなくてもごめんなさい。
Tensorflow本体のビルドは40時間以上かかるというブログ記事情報もあったりしますが、ここに書かれている手順はLiteの静的ライブラリ作成だけなので、Lenovo T470で20分くらいだったとおもいます。

----

Docker Desktopのインストール

  • Windows10上にDocker Desktopをインストール
  • Docker Desktop>Settings>Shared Drives
  • Cドライブをシェア

クロスコンパイル環境コンテナの起動

  • コマンドプロンプトを管理者として起動
  • cd c:/Users/ユーザ名
  • mkdir tmp
  • docker run -it -v c:/Users/ユーザ名/tmp:/projects tensorflow/tensorflow:nightly-devel /bin/bash
(Proxy指定が必要な場合)
  • cat >> /etc/apt/apt.conf <
  • Acquire::http::Proxy "http://proxy.server:XXXX";
  • Acquire::https::Proxy "http://proxy.server:XXXX";
  • Ctrl+D


  • apt-get update
  • apt-get install crossbuild-essential-armhf vim

リポジトリのチェックアウト

(Proxy指定が必要な場合)
  • git config --global http.proxy http://peoxy.server:XXXX
  • git config --global https.proxy http://peoxy.server:XXXX

  • cd /projects
  • git clone https://github.com/tensorflow/tensorflow
  • cd tensorflow
  • git checkout master


Raspberry Pi Zero用設定に書き換え

  • vi vi tensorflow/lite/tools/make/targets/rpi_makefile.inc
  • 5行目:TARGET_ARCH := armv6 に変更
  • 38行目:-fPIC の末尾に \ 追加
  • 39行目:-marc 挿入
  • 46行目:-fPIC の末尾に \ 追加
  • 47行目:-marc 挿入
  • 53行目:-Wl,--as-needed の末尾に \ 追加
  • 54行目:-latomic 挿入

コンパイル実行

  • ./tensorflow/lite/tools/make/download_dependencies.sh
  • ./tensorflow/lite/tools/make/build_rpi_lib.sh
  • exit


静的ライブラリファイルのデプロイ

  • WinSCPなどを使って以下のファイルをRaspberry Pi Zero上の/usr/local/libなどにコピー
C:\Users\89004\tmp\tensorflow\tensorflow\lite\tools\make\gen\rpi_armv6\lib\libtensorflow-lite.a

------

..公式サイトにwheelファイルリンクがないのはもしかしたらZeroでは動作しないということなのかもしれないなあ..

そのあたりは自己責任でお願いします...



ps

WinSCP後の後始末

クロスコンパイル環境コンテナの削除

  • docker container ls -a でコンテナID先頭3文字を確認
  • docker container rm コンテナID先頭3文字


イメージの削除

  • docker image rm tensorflow/tensorflow:nightly-devel


作業ディレクトリの削除

  • cd c:/Users/ユーザ名
  • del /f tmpY選択

2019年7月31日水曜日

pip install時にERROR: THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE.というエラーが発生する

pip install時にERROR: THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE.というエラーが発生する

Raspberry Pi上で以下のようにtensorflowをpip install しようとしたら、

(env) pi@nakano:/dev/input $ pip install tensorflow
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting tensorflow
  Downloading https://www.piwheels.org/simple/tensorflow/tensorflow-1.13.1-cp37-none-linux_armv6l.whl (87.1MB)
     |??????                          | 13.9MB 36kB/s eta 0:33:37

ERROR: 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.
    tensorflow from https://www.piwheels.org/simple/tensorflow/tensorflow-1.13.1-cp37-none-linux_armv6l.whl#sha256=25f4ff027beec1e568baf8e90a07bad59d354560533d6b37318b9efeb70beeb1:
        Expected sha256 25f4ff027beec1e568baf8e90a07bad59d354560533d6b37318b9efeb70beeb1
             Got        3ace76e2b0ded895a4e6239a4620a1f0aaa92ad8747d5660f6b34f17d5f4c688

というエラーが出てしまい先に進めない..

--no-chache-dirをつけて実行しても同様のエラーでとまる。

ダウンロードしようとしてフィンガープリントのハッシュが合わないようなので、以下のようにwgetしてwhlファイルをpip innstallしたら..何度かエラーを出すがそのままダウンロードすることができ、うまくいった。

env) pi@nakano:~/tmp $ wget https://www.piwheels.org/simple/tensorflow/tensorflow-1.13.1-cp37-none-linux_armv6l.whl
--2019-07-31 00:03:14--  https://www.piwheels.org/simple/tensorflow/tensorflow-1.13.1-cp37-none-linux_armv6l.whl
Resolving www.piwheels.org (www.piwheels.org)... 93.93.129.174, 46.235.225.189, 2a00:1098:0:82:1000:3b:1:1, ...
Connecting to www.piwheels.org (www.piwheels.org)|93.93.129.174|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 87138952 (83M)
Saving to: ‘tensorflow-1.13.1-cp37-none-linux_armv6l.whl’

tensorflow-1.13.1-c  16%[== >                  ]  13.39M  29.1KB/s    in 8m 16s

2019-07-31 00:11:35 (27.6 KB/s) - Read error at byte 14041088/87138952 (Error decoding the received TLS packet.). Retrying.

--2019-07-31 00:11:36--  (try: 2)  https://www.piwheels.org/simple/tensorflow/tensorflow-1.13.1-cp37-none-linux_armv6l.whl
Connecting to www.piwheels.org (www.piwheels.org)|93.93.129.174|:443... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 87138952 (83M), 73097864 (70M) remaining
Saving to: ‘tensorflow-1.13.1-cp37-none-linux_armv6l.whl’

tensorflow-1.13.1-c  34%[+++== >               ]  28.31M  27.8KB/s    in 9m 11s

2019-07-31 00:20:51 (27.7 KB/s) - Read error at byte 29687808/87138952 (Error decoding the received TLS packet.). Retrying.

--2019-07-31 00:20:53--  (try: 3)  https://www.piwheels.org/simple/tensorflow/tensorflow-1.13.1-cp37-none-linux_armv6l.whl
Connecting to www.piwheels.org (www.piwheels.org)|93.93.129.174|:443... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 87138952 (83M), 57451144 (55M) remaining
Saving to: ‘tensorflow-1.13.1-cp37-none-linux_armv6l.whl’

tensorflow-1.13.1-c  51%[++++++=== >           ]  43.02M  30.3KB/s    in 8m 56s

2019-07-31 00:29:52 (28.1 KB/s) - Read error at byte 45105152/87138952 (Error decoding the received TLS packet.). Retrying.

--2019-07-31 00:29:55--  (try: 4)  https://www.piwheels.org/simple/tensorflow/tensorflow-1.13.1-cp37-none-linux_armv6l.whl
Connecting to www.piwheels.org (www.piwheels.org)|93.93.129.174|:443... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 87138952 (83M), 42033800 (40M) remaining
Saving to: ‘tensorflow-1.13.1-cp37-none-linux_armv6l.whl’

tensorflow-1.13.1-c  68%[++++++++++== >        ]  56.80M  27.9KB/s    in 8m 22s

2019-07-31 00:38:21 (28.1 KB/s) - Read error at byte 59555840/87138952 (Error decoding the received TLS packet.). Retrying.

--2019-07-31 00:38:25--  (try: 5)  https://www.piwheels.org/simple/tensorflow/tensorflow-1.13.1-cp37-none-linux_armv6l.whl
Connecting to www.piwheels.org (www.piwheels.org)|93.93.129.174|:443... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 87138952 (83M), 27583112 (26M) remaining
Saving to: ‘tensorflow-1.13.1-cp37-none-linux_armv6l.whl’

tensorflow-1.13.1-c  84%[+++++++++++++== >     ]  70.11M  27.2KB/s    in 8m 7s

2019-07-31 00:46:36 (28.0 KB/s) - Read error at byte 73515008/87138952 (Error decoding the received TLS packet.). Retrying.

--2019-07-31 00:46:41--  (try: 6)  https://www.piwheels.org/simple/tensorflow/tensorflow-1.13.1-cp37-none-linux_armv6l.whl
Connecting to www.piwheels.org (www.piwheels.org)|93.93.129.174|:443... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 87138952 (83M), 13623944 (13M) remaining
Saving to: ‘tensorflow-1.13.1-cp37-none-linux_armv6l.whl’

tensorflow-1.13.1-c 100%[++++++++++++++++=== > ]  83.10M  28.1KB/s    in 7m 56s

2019-07-31 00:54:39 (28.0 KB/s) - ‘tensorflow-1.13.1-cp37-none-linux_armv6l.whl’ saved [87138952/87138952]

(env) pi@nakano:~/tmp $ ls
tensorflow-1.13.1-cp37-none-linux_armv6l.whl
(env) pi@nakano:~/tmp $ pip install tensorflow-1.13.1-cp37-none-linux_armv6l.whl
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Processing ./tensorflow-1.13.1-cp37-none-linux_armv6l.whl
Collecting termcolor > =1.1.0 (from tensorflow==1.13.1)
  Downloading https://www.piwheels.org/simple/termcolor/termcolor-1.1.0-py3-none-any.whl
Collecting absl-py > =0.7.0 (from tensorflow==1.13.1)
  Downloading https://www.piwheels.org/simple/absl-py/absl_py-0.7.1-py3-none-any.whl (117kB)
     |????????????????????????????????| 122kB 52kB/s
Collecting tensorflow-estimator < 1.15.0rc0, > =1.14.0rc0 (from tensorflow==1.13.1)
  Downloading https://files.pythonhosted.org/packages/3c/d5/21860a5b11caf0678fbc8319341b0ae21a07156911132e0e71bffed0510d/tensorflow_estimator-1.14.0-py2.py3-none-any.whl (488kB)
     |????????????????????????????????| 491kB 21kB/s
Collecting astor > =0.6.0 (from tensorflow==1.13.1)
  Downloading https://files.pythonhosted.org/packages/d1/4f/950dfae467b384fc96bc6469de25d832534f6b4441033c39f914efd13418/astor-0.8.0-py2.py3-none-any.whl
Collecting google-pasta > =0.1.6 (from tensorflow==1.13.1)
  Downloading https://files.pythonhosted.org/packages/d0/33/376510eb8d6246f3c30545f416b2263eee461e40940c2a4413c711bdf62d/google_pasta-0.1.7-py3-none-any.whl (52kB)
     |????????????????????????????????| 61kB 56kB/s
Collecting wrapt > =1.11.1 (from tensorflow==1.13.1)
  Downloading https://www.piwheels.org/simple/wrapt/wrapt-1.11.2-cp37-cp37m-linux_armv6l.whl (68kB)
     |????????????????????????????????| 71kB 51kB/s
Requirement already satisfied: six > =1.10.0 in /usr/lib/python3/dist-packages (from tensorflow==1.13.1) (1.12.0)
Requirement already satisfied: wheel > =0.26 in /home/pi/env/lib/python3.7/site-packages (from tensorflow==1.13.1) (0.33.4)
Requirement already satisfied: numpy < 2.0, > =1.14.5 in /usr/lib/python3/dist-packages (from tensorflow==1.13.1) (1.16.2)
Collecting keras-applications > =1.0.8 (from tensorflow==1.13.1)
  Downloading https://files.pythonhosted.org/packages/71/e3/19762fdfc62877ae9102edf6342d71b28fbfd9dea3d2f96a882ce099b03f/Keras_Applications-1.0.8-py3-none-any.whl (50kB)
     |????????????????????????????????| 51kB 30kB/s
Collecting tensorboard < 1.14.0, > =1.13.0 (from tensorflow==1.13.1)
  Downloading https://files.pythonhosted.org/packages/0f/39/bdd75b08a6fba41f098b6cb091b9e8c7a80e1b4d679a581a0ccd17b10373/tensorboard-1.13.1-py3-none-any.whl (3.2MB)
     |????????????????????????????????| 3.2MB 24kB/s
Collecting grpcio > =1.8.6 (from tensorflow==1.13.1)
  Downloading https://www.piwheels.org/simple/grpcio/grpcio-1.22.0-cp37-cp37m-linux_armv6l.whl (13.0MB)
     |???????????????????????????     | 10.7MB 27kB/s eta 0:01:25
Collecting keras-preprocessing > =1.0.5 (from tensorflow==1.13.1)
  Downloading https://files.pythonhosted.org/packages/28/6a/8c1f62c37212d9fc441a7e26736df51ce6f0e38455816445471f10da4f0a/Keras_Preprocessing-1.1.0-py2.py3-none-any.whl (41kB)
     |????????????????????????????????| 51kB 36kB/s
Collecting gast > =0.2.0 (from tensorflow==1.13.1)
  Downloading https://www.piwheels.org/simple/gast/gast-0.2.2-py3-none-any.whl
Collecting protobuf > =3.6.1 (from tensorflow==1.13.1)
  Downloading https://files.pythonhosted.org/packages/34/58/a8230dcd36e5db75c1084f4fc32b18cc217bb2806143597df625dc628a5d/protobuf-3.9.0-py2.py3-none-any.whl (432kB)
     |????????????????????????????????| 440kB 29kB/s
Requirement already satisfied: h5py in /home/pi/env/lib/python3.7/site-packages (from keras-applications > =1.0.8- > tensorflow==1.13.1) (2.9.0)
Collecting markdown > =2.6.8 (from tensorboard < 1.14.0, > =1.13.0- > tensorflow==1.13.1)
  Downloading https://files.pythonhosted.org/packages/c0/4e/fd492e91abdc2d2fcb70ef453064d980688762079397f779758e055f6575/Markdown-3.1.1-py2.py3-none-any.whl (87kB)
     |????????????????????????????????| 92kB 30kB/s
Collecting werkzeug > =0.11.15 (from tensorboard < 1.14.0, > =1.13.0- > tensorflow==1.13.1)
  Downloading https://files.pythonhosted.org/packages/d1/ab/d3bed6b92042622d24decc7aadc8877badf18aeca1571045840ad4956d3f/Werkzeug-0.15.5-py2.py3-none-any.whl (328kB)
     |????????????????????????????????| 337kB 26kB/s
Requirement already satisfied: setuptools in /home/pi/env/lib/python3.7/site-packages (from protobuf > =3.6.1- > tensorflow==1.13.1) (41.0.1)
ERROR: 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.
    grpcio > =1.8.6 from https://www.piwheels.org/simple/grpcio/grpcio-1.22.0-cp37-cp37m-linux_armv6l.whl#sha256=6f92b984a746341529b8f82f7c6e101d36d70764f232505949828af7dca27e06 (from tensorflow==1.13.1):
        Expected sha256 6f92b984a746341529b8f82f7c6e101d36d70764f232505949828af7dca27e06
             Got        e3c32a594668a3aa59f190f0a768e11b81710d91b1fa9ae2918d414ba204f2b5


(env) pi@nakano:~/tmp $ wget https://www.piwheels.org/simple/grpcio/grpcio-1.22.0-cp37-cp37m-linux_armv6l.whl
--2019-07-31 01:09:05--  https://www.piwheels.org/simple/grpcio/grpcio-1.22.0-cp37-cp37m-linux_armv6l.whl
Resolving www.piwheels.org (www.piwheels.org)... 46.235.225.189, 93.93.129.174, 2a00:1098:0:80:1000:3b:1:1, ...
Connecting to www.piwheels.org (www.piwheels.org)|46.235.225.189|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 12990873 (12M)
Saving to: ‘grpcio-1.22.0-cp37-cp37m-linux_armv6l.whl’

grpcio-1.22.0-cp37-  69%[============ >        ]   8.56M  26.5KB/s    in 5m 9s

2019-07-31 01:14:19 (28.4 KB/s) - Read error at byte 8978432/12990873 (Error decoding the received TLS packet.). Retrying.

--2019-07-31 01:14:20--  (try: 2)  https://www.piwheels.org/simple/grpcio/grpcio-1.22.0-cp37-cp37m-linux_armv6l.whl
Connecting to www.piwheels.org (www.piwheels.org)|46.235.225.189|:443... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 12990873 (12M), 4012441 (3.8M) remaining
Saving to: ‘grpcio-1.22.0-cp37-cp37m-linux_armv6l.whl’

grpcio-1.22.0-cp37- 100%[+++++++++++++====== > ]  12.39M  30.1KB/s    in 2m 20s

2019-07-31 01:16:42 (28.1 KB/s) - ‘grpcio-1.22.0-cp37-cp37m-linux_armv6l.whl’ saved [12990873/12990873]

(env) pi@nakano:~/tmp $ ls
grpcio-1.22.0-cp37-cp37m-linux_armv6l.whl
tensorflow-1.13.1-cp37-none-linux_armv6l.whl
(env) pi@nakano:~/tmp $ pip install grpcio-1.22.0-cp37-cp37m-linux_armv6l.whl
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Processing ./grpcio-1.22.0-cp37-cp37m-linux_armv6l.whl
Requirement already satisfied: six > =1.5.2 in /usr/lib/python3/dist-packages (from grpcio==1.22.0) (1.12.0)
Installing collected packages: grpcio
Successfully installed grpcio-1.22.0
(env) pi@nakano:~/tmp $ pip install tensorflow-1.13.1-cp37-none-linux_armv6l.whl
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Processing ./tensorflow-1.13.1-cp37-none-linux_armv6l.whl
Collecting keras-applications > =1.0.8 (from tensorflow==1.13.1)
  Using cached https://files.pythonhosted.org/packages/71/e3/19762fdfc62877ae9102edf6342d71b28fbfd9dea3d2f96a882ce099b03f/Keras_Applications-1.0.8-py3-none-any.whl
Requirement already satisfied: six > =1.10.0 in /usr/lib/python3/dist-packages (from tensorflow==1.13.1) (1.12.0)
Requirement already satisfied: numpy < 2.0, > =1.14.5 in /usr/lib/python3/dist-packages (from tensorflow==1.13.1) (1.16.2)
Collecting astor > =0.6.0 (from tensorflow==1.13.1)
  Using cached https://files.pythonhosted.org/packages/d1/4f/950dfae467b384fc96bc6469de25d832534f6b4441033c39f914efd13418/astor-0.8.0-py2.py3-none-any.whl
Collecting wrapt > =1.11.1 (from tensorflow==1.13.1)
  Using cached https://www.piwheels.org/simple/wrapt/wrapt-1.11.2-cp37-cp37m-linux_armv6l.whl
Collecting protobuf > =3.6.1 (from tensorflow==1.13.1)
  Using cached https://files.pythonhosted.org/packages/34/58/a8230dcd36e5db75c1084f4fc32b18cc217bb2806143597df625dc628a5d/protobuf-3.9.0-py2.py3-none-any.whl
Collecting gast > =0.2.0 (from tensorflow==1.13.1)
  Using cached https://www.piwheels.org/simple/gast/gast-0.2.2-py3-none-any.whl
Requirement already satisfied: grpcio > =1.8.6 in /home/pi/env/lib/python3.7/site-packages (from tensorflow==1.13.1) (1.22.0)
Collecting tensorflow-estimator < 1.15.0rc0, > =1.14.0rc0 (from tensorflow==1.13.1)
  Using cached https://files.pythonhosted.org/packages/3c/d5/21860a5b11caf0678fbc8319341b0ae21a07156911132e0e71bffed0510d/tensorflow_estimator-1.14.0-py2.py3-none-any.whl
Collecting tensorboard < 1.14.0, > =1.13.0 (from tensorflow==1.13.1)
  Using cached https://files.pythonhosted.org/packages/0f/39/bdd75b08a6fba41f098b6cb091b9e8c7a80e1b4d679a581a0ccd17b10373/tensorboard-1.13.1-py3-none-any.whl
Collecting termcolor > =1.1.0 (from tensorflow==1.13.1)
  Using cached https://www.piwheels.org/simple/termcolor/termcolor-1.1.0-py3-none-any.whl
Collecting absl-py > =0.7.0 (from tensorflow==1.13.1)
  WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))': /simple/absl-py/
  Using cached https://www.piwheels.org/simple/absl-py/absl_py-0.7.1-py3-none-any.whl
Collecting google-pasta > =0.1.6 (from tensorflow==1.13.1)
  Using cached https://files.pythonhosted.org/packages/d0/33/376510eb8d6246f3c30545f416b2263eee461e40940c2a4413c711bdf62d/google_pasta-0.1.7-py3-none-any.whl
Collecting keras-preprocessing > =1.0.5 (from tensorflow==1.13.1)
  Using cached https://files.pythonhosted.org/packages/28/6a/8c1f62c37212d9fc441a7e26736df51ce6f0e38455816445471f10da4f0a/Keras_Preprocessing-1.1.0-py2.py3-none-any.whl
Requirement already satisfied: wheel > =0.26 in /home/pi/env/lib/python3.7/site-packages (from tensorflow==1.13.1) (0.33.4)
Requirement already satisfied: h5py in /home/pi/env/lib/python3.7/site-packages (from keras-applications > =1.0.8- > tensorflow==1.13.1) (2.9.0)
Requirement already satisfied: setuptools in /home/pi/env/lib/python3.7/site-packages (from protobuf > =3.6.1- > tensorflow==1.13.1) (41.0.1)
Collecting markdown > =2.6.8 (from tensorboard < 1.14.0, > =1.13.0- > tensorflow==1.13.1)
  Using cached https://files.pythonhosted.org/packages/c0/4e/fd492e91abdc2d2fcb70ef453064d980688762079397f779758e055f6575/Markdown-3.1.1-py2.py3-none-any.whl
Collecting werkzeug > =0.11.15 (from tensorboard < 1.14.0, > =1.13.0- > tensorflow==1.13.1)
  Using cached https://files.pythonhosted.org/packages/d1/ab/d3bed6b92042622d24decc7aadc8877badf18aeca1571045840ad4956d3f/Werkzeug-0.15.5-py2.py3-none-any.whl
Installing collected packages: keras-applications, astor, wrapt, protobuf, gast, tensorflow-estimator, markdown, absl-py, werkzeug, tensorboard, termcolor, google-pasta, keras-preprocessing, tensorflow
Successfully installed absl-py-0.7.1 astor-0.8.0 gast-0.2.2 google-pasta-0.1.7 keras-applications-1.0.8 keras-preprocessing-1.1.0 markdown-3.1.1 protobuf-3.9.0 tensorboard-1.13.1 tensorflow-1.13.1 tensorflow-estimator-1.14.0 termcolor-1.1.0 werkzeug-0.15.5 wrapt-1.11.2
(env) pi@nakano:~/tmp $ pip list


tensorboard          1.13.1
tensorflow           1.13.1
tensorflow-estimator 1.14.0


(env) pi@nakano:~/tmp $

関連パッケージも同様のエラーがでたのでwgetしてpip installして再実行してやっとこさtensorflowをインストールできた。

Raspberry Pi上だったのでLinuxコマンドのwgetを使ったが、WindowsならWSLのwgetcurlを使うか、ためしてないがブラウザでダウンロードしても多分動くはずだ。



..おかげで今月のギガ3GB全部使ってしまったよ..とほほ..

2019年7月30日火曜日

Raspbian OS 初回起動時からSSH接続したい




Raspbean OS をSDカードに書き込み、
Raspberry Piにさして最初に起動する際、
SSHが無効になっているので
どうしてもモニタやキーボードが必要になります。

Xを使う人はそれでもいいですが、
DonkeyCarやロボット、IoTゲートウェイとして
Xの入っていないRaspbean Liteをつかう人は
初回以外モニタなどは使用しない。

なので初回起動時からSSH接続したいはず。

とくにRaspberry Pi Zeroを使う場合
HDMIがミニHDMIコネクタでないと接続できない。

わざわざコネクタ買っても初回しか使わないし..

と、いうことで調べてみたら、
SDカードへイメージを書き込んだ直後、
SDカードカードのbootパーティション(wpa_supplicant.confと同じ場所)
に"ssh"という空のファイルを作成しておけば初回起動時にSSH接続できるようになるようだ。

情報元: http://downloads.raspberrypi.org/raspbian/release_notes.txt

sshというファイルを書き込んだSDカードをRaspberry Piに挿して
起動すると..うまくいった。デフォルトユーザでSSH経由でログインできた。

これは便利だ。

2019年5月7日火曜日

映画「アベンジャーズ エンドゲーム」前提パッケージ

※今回は、ITの話ではありません。

GWの最終週の日曜、たまたま岡田斗司夫氏のニコ生をみていたら、いまやってる映画「アベンジャーズ エンドゲーム」を見るための必要最低限の前提マーベル映画リストを上げていた。

ので、列挙してみた。

  • アイアンマンの1
  • マイティ・ソーのどれかひとつ (1だと浅野忠信がでてる)
  • キャプテン・アメリカの1
  • アベンジャーズの1
  • ガーディアンズ・オブ・ギャラクシーの1
  • アベンジャーズの2(エイジ・オブ・ウルトロン)
  • キャプテン・アメリカの3(シビル・ウォー)
  • アベンジャーズの3(インフィニティ・ウォー) 

GW 開始早々エンドゲームを見てしまった自分から見ても、いいリストだと思う。

端から端まで全部楽しむなら、ハルクとかアントマンとか、ひげマントの魔術師とかも全部見ているといいのだけど、そんなにマーベルに年貢を納めなくてもエンドゲームの本筋だけ追うのなら上記の8本で十分だ。


Pythonで例えるなら、エンドゲームリポジトリのsetup.pyinstall_requiresには上記の8本は最低でもいれておけば、全機能は実行できないけどコア機能は動作するはずだ。


..といっても、必要最小限のこれらのタイトル全部見ると17時間を超えるらしいけど..


2019年4月11日木曜日

AWS IoT Core にQoS=2でLast Willメッセージを設定したら例外が出た件

AWS IoT CoreへアクセスするPythonプログラムを書いた。
ライブラリはpahoではなくAWSIoTPythonSDKを使った。



ちなみにMQTTブローカへ接続するプログラムを書く場合、
ベンダ提供ライブラリを素直に使うのが生産性を上げるコツだ。
ベンダ固有の機能の有無を関数やメソッドのコード上ドキュメントで
確認できるし、
一番困るのがベンダ固有のpayloadやtopicフォーマットを持っている
場合だ。
ドキュメントをイチから読むより、関数やメソッドのドキュメントを
見るほうが圧倒的に速い..と私はおもっている。
..Eclipse Mosquitto、IBM Watson IoT PlatformとAWS IoT Coreしか
まだ触ったことがないのだけど..

話をもどすが、どうも AWS IoT に Will

つまりデバイスが死んだ際に
特定のメッセージを指定トピックへ送信してくれる
MQTTベースのメッセージブローカに標準搭載される機能

がないと思っている人が意外と多い。

AWS IoT に Will がないと書かれたブログ記事もすくなくなく
これを鵜呑みにした人がおおいのだろう。

ベータ版の頃はそうらしかったのだけど、
今のバージョンでは存在している。
#この先、消えるかはわからないけど ;-p

AWSIoTPythonSDK の AWSIoTMQTTClient クラスには

configureLastWill(topic, payload, QoS, retain=False)
というインスタンスメソッドが存在する。

なのでQoS=2にしてWillメッセージをセットすると..

Traceback (most recent call last):
  File "test_dev.py", line 45, in
    test_dev()
  File "test_dev.py", line 31, in test_dev
    client = Client('conf/aws/xxxx/xxxx.yml', 'xxxx_test')
  File "C:\Users\xxxxx\projects\xxxx\aws\broker.py", line 354, in __init__
    client.connect()
  File "C:\Users\xxxxx\AppData\Local\Continuum\anaconda3\envs\xxxx\lib\site-packages\AWSIoTPythonSDK\MQTTLib.py", line 486, in connect
    return self._mqtt_core.connect(keepAliveIntervalSecond)
  File "C:\Users\xxxxx\AppData\Local\Continuum\anaconda3\envs\xxxx\lib\site-packages\AWSIoTPythonSDK\core\protocol\mqtt_core.py", line 195, in connect
    raise connectTimeoutException()
AWSIoTPythonSDK.exception.AWSIoTExceptions.connectTimeoutException


というエラーになってconnectできない状態になってしまった。

どうも Will はサポートされたけど、
AWS IoT はあくまで QoS は 0 か 1 までで
QoS=2は未だにサポートしていないらしい..
というより、今サポートしてないなら、やる気なしでしょ..


ということでQoS=1にしたら正常に動作した


ちなみに引数にretainがあり、
AWSIoTPythonSDKのコードをおっていくとpahoのクライアントクラスに
そのまま値を渡しているので、
もしかしたら..とおもって retain=True で実行してみた。

..結果は、QoS=2のときと全く同じ例外が発生してしまった..

retain とは、
最後にpublishされたメッセージをブローカで保持し、
新規Subscriberにそのメッセージを渡す
MQTTベースのメッセージブローカに標準提供される機能のひとつ。

AWS IoTベータのころからサポートされておらず、
こちらもQoS=2同様
現時点でもサポートされていない
ということらしい..


そのかわりにシャドウを使えってことなのだろうけど..
この機能AWS IoT Coreにしか存在しない独自機能なんだよなあ..

..日本のSIerは、こういったベンダ依存をきらうからねえ..

AWS Greengrass チュートリアル「機械学習の推論を実行する」を試したが何の反応もなかった件

AWS Greengrassのチュートリアルを試している。 チュートリアルの一つ 機械学習の推論を実行する https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/ml-inference....