Raspberry Pi に、Tensorflowをインストールする手順

以下を導入したRaspberry Pi 2 以上で、TensorflowとOpenCVをインストールする手順です。公式の手順やインターネットで検索してもところどころエラーが発生したので、検証した上でまとめました。

RASPBIAN STRETCH LITE

  • Version:June 2018
  • Release date:2018-06-27

以下を実行。

$ sudo apt-get update -y && sudo apt-get upgrade -y
$ sudo raspi-config
$ sudo apt-get install python3-pip python3-dev python3-pandas python3-h5py libatlas-base-dev
$ wget https://github.com/lhelontra/tensorflow-on-arm/releases/download/v1.10.0/tensorflow-1.10.0-cp35-none-linux_armv7l.whl
$ sudo pip3 install tensorflow-1.10.0-cp35-none-linux_armv7l.whl
$ sudo pip3 install keras
$ sudo pip3 install --upgrade h5py

Tensorflowのバージョンチェック

$ python3
>>>import tensorflow as tf
>>>tf.__version
1.10.0
>>> exit()

Watson Visual Recognitionで画像認識した結果をRaspberry Pi Zero WHで読み上げ

画像認識からの音声読み上げと温度センサーの同時利用の確認 - 日々クラウドにふれる記録の続きで、画像認識した結果を音声読み上げするフローです。テキストを音声ファイルに変換するツールとして「pico2wave」を使用しています。 また、画像認識した結果のうち、特定のキーワードのときだけ「Replace」と名付けたChangeノードで別の言葉に置換し、音声読み上げするようにしています。たとえば駅のホームで、歩きスマホ中の歩行者を認識したときだけ「キケンキケン」と音声読み上げするといった具合です。

f:id:kolinz:20180825102103p:plain
USBカメラで取得した画像をWatsonで画像認識し音声読み上げするためのNode-REDフロー

現在は動作確認を終え、より条件を付与するために超音波センサーや赤外線センサーを追加できるかどうかに取り組んでいます。

画像認識からの音声読み上げと温度センサーの同時利用の確認

作業中にRaspberry Pi Zero WHのカメラコネクタを壊してしまい、カメラモジュールを用いた画像認識が出来なくなってしまいましたので、カメラをUSB接続のものに変更し、それに合わせて画像認識と認識結果の音声読み上げフローをNode-REDに実装しました。 カメラモジュール使えていれば、WatsonのVisual Recognitionの処理をもっと簡単に構成することができます。

<カメラコネクタ破損前> f:id:kolinz:20180823011431p:plain

<カメラコネクタ破損後> f:id:kolinz:20180823011438p:plain

<Node-REDに実装したフロー> f:id:kolinz:20180823010722p:plain

ノード名:fswebcam

Execノード設定 コマンド:fswebcam -r 352x288 --no-banner photo.jpg

ノード名:Visual Recognition

Execノード設定 コマンド:curl -X POST -u "apikey:xxxx" --form "images_file=@/home/pi/photo.jpg" "https://gateway.watsonplatform.net/visual-recognition/api/v3/classify?version=2018-03-19"

画像認識をインターネット経由でやっているので、ワンテンポ遅れて違和感。OpenCV使って内部で画像認識処理させるのが良いかなぁ。 ブレッドボードにささっているのは、温度センサーです。両方使えるようにしています。i2c接続のため、A/Dコンバータを使うことでほとんどのセンサーは接続できます。

Raspberry Pi カメラモジュールの仮ケース

Raspberry Pi カメラモジュール、USB接続のカメラに比べると安くないので、とりあえず簡易的なケースに入れておきたく、100均で売っているSDカードのケースを加工。カメラモジュールとRaspberry Pi Zero WHを接続するケーブルを挟まないように隙間を作る加工をした上で、カメラ部分をくり抜いています。あとでヤスリをかけて整える予定。

f:id:kolinz:20180822010456p:plain

Raspberry Pi Zero WHに、ReSpeaker 2-Mics Pi HATを載せて音声出力を確認

Raspberry Pi Zero (WH含む)には、3.5mmジャックがなく、USBポートがありますがMicro-Bが1つだけです。 Mini HDMIがあるので、Mini HDMIからの出力時に音声を取り出すか、GPIOを使うか悩みどころです。今回は、「拡張ボード」を使います。「ReSpeaker 2-Mics Pi HAT」と言い、スイッチサイエンスで1300円ほどで購入しました。Amazonでは3500円前後でした(2018年8月現在)。

f:id:kolinz:20180820023633p:plain
上がReSpeaker 2-Mics Pi HAT、下にRaspberry Pi Zero WH

左右にマイクが2つと、3.5mmジャックが増え、コンビニなどでも購入可能なイヤフォンが使えます。 それ以外に、Groveコネクタがあるので対応ケーブルを使うことで、Grove対応やそれ以外の各種センサーをつなげることができます。 今回は、音声出力を確認するまでの手順です。

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install git
$ cd /usr/local/src/
$ sudo git clone https://github.com/respeaker/seeed-voicecard.git
$ cd seeed-voicecard/
$ sudo ./install.sh
$ sudo reboot

再起動後、再び接続し直します。

$ sudo alsactl --file=asound.state restore
$ aplay -l

$ aplay -l により音声出力デバイスの認識状況が表示される。

card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: seeed2micvoicec [seeed-2mic-voicecard], device 0: bcm2835-i2s-wm8960-hifi wm8960-hifi-0 [] Subdevices: 1/1

カード1のデバイス0 を指定すると、ReSpeaker 2-Mics Pi HATに接続したイヤフォンから聞こえることがわかります。 alsamixerを実行し、F6キーを押して、カード1に切り替え、の音量を上げます。96や100くらい。 Escキーを押して設定を終了します。

$ alsamixer

f:id:kolinz:20180820022442p:plain
alsamixerを実行し、サウンドデバイスの音声出力を調整している画面

サンプル音声ファイルを使って、実際にイヤフォンから音が出るか聴いてみましょう。下記コマンドを実行。

$ aplay -D plughw:1,0 /usr/share/sounds/alsa/Front_Left.wav

Python使ってFitbitのアクティビティデータ(安静時心拍、歩数、消費カロリー)を取得する

Fitbitのアクティビティデータを取得し、クラウド上のデータベースなり、CSV出力して、NoSQL DBにCSVごと投げるなり処理するコードについて、とりあえず動きましたので、忘れないようにメモしました。特に安静時心拍や歩数、消費カロリーは、日本語で情報がほぼ無いので苦労しました。

Python 2.x と Fitbit API接続のため、python-fitbit を使用しています。 前日のデータを取得するために、Fitbitへの接続と下記の変数を定義します。

アクティビティ変数 安静時心拍 歩数 消費カロリー
変数名 resthr act cal

ポイント部分

DATE = datetime.date.today()
DATE = (DATE -  datetime.timedelta(days=1)) 
client = fitbit.Fitbit(CLIENT_ID, CLIENT_SECRET, ACCESS_TOKEN, REFRESH_TOKEN , refresh_cb = updateToken)

#Get resting HeartRate
fitbit_resthr = client.time_series('activities/heart', base_date=DATE,  period='1d')
resthr = fitbit_resthr['activities-heart']

#Get Activity Steps
fitbit_act = client.time_series('activities/steps', base_date=DATE,  period='1d')
act = fitbit_act['activities-steps']

#Get Activity Calories
fitbit_cal = client.time_series('activities/calories', base_date=DATE,  period='1d')
cal = fitbit_cal['activities-calories']

上記は、Fitbit APIの、「Activity Time Series」と「Heart Rate Time Series」を使用しており、base_dateがターゲットの日付(ここでは前日で、period で日付範囲を指定します。ここでは、period を1d=1日としています。データの仕様は下記の公式ドキュメントを確認してください。

dev.fitbit.com dev.fitbit.com

出力する処理です。

#Activity-resting-HeartRate
for varrest in reversed ( range( 0, len(resthr) ) ):
    print  ( str( resthr[varrest]['value']['restingHeartRate'] ) )

#Activity-Steps
for vars in reversed ( range( 0, len(act) ) ):
    print  ( str( act[vars]['value'] ) )

#Activity-Calories
for varc in reversed ( range( 0, len(cal) ) ):
    print  ( str( cal[varc]['value'] ) )

わかってみると単純でした。

Hyperledger Composer (2018年5月28日時点) をIDCFクラウドに導入する手順

ブロックチェーンを用いたアプリケーションを開発ができる「Hyperledger Composer」導入について、公式ドキュメントが英語で、たまにトラブルに遭遇するので、トラブル回避のための記録です。

IDCFクラウドの標準のイメージテンプレートでは、ストレージが標準15GBなのでストレージ不足のため、標準のイメージテンプレートは使わずに、付属のISOファイルから仮想サーバーを立てています。IDCFクラウド付属のISO「Ubuntu-16.0.4.2-server-amd64.iso」を使用しました。ストレージは、25GB以上は欲しいです。 またIDCFクラウド仮想サーバーのマシンタイプは最低限「light.S2」が望ましいです。「light.S1」で動かすのは厳しいです。マシンタイプ「light.S2」でストレージ30GB、月2,000円と表示されました。

次はnode.js についてです。Hyperledger Composer は、ブロックチェーン基盤としてHyperledger Fabricを使用します。Hyperledger Composer 0.19.4 までは、パッケージマネージャを使ってnode.jsを導入していました。(Qiitaで書いた記事)

5月28日時点で、nvm でnode.jsを導入することでトラブルが減りましたので、公式のHyperledger Composer Docs で述べられている「prereqs-ubuntu.sh」を使った方が良いです。

$ sudo apt-get update -y && sudo apt-get install git wget nano curl software-properties-common build-essential
$ sudo apt-get upgrade -y
$ curl -O https://hyperledger.github.io/composer/unstable/prereqs-ubuntu.sh
$ chmod u+x prereqs-ubuntu.sh
$ ./prereqs-ubuntu.sh
$ sudo reboot

再起動後、再びSSH接続。次のコマンドを順次実行していきます。

$ npm install -g composer-cli
$ npm install -g composer-rest-server
$ npm install -g generator-hyperledger-composer
$ npm install -g yo
$ npm install -g composer-playground
$ mkdir ~/fabric && cd ~/fabric
$ curl -O https://raw.githubusercontent.com/hyperledger/composer-tools/master/packages/fabric-dev-servers/fabric-dev-servers.tar.gz
$ tar -xvf fabric-dev-servers.tar.gz
$ ./downloadFabric.sh
$ ./startFabric.sh
$ ./createPeerAdminCard.sh

これにて、Hyperledger Composerの標準的な導入は終わりです。 5月28日時点、「composer-cli」「composer-rest-server」「generator-hyperledger-composer」「composer-playground」の各バージョンは、0.19.6 が入りました。 5月28日以降でトラブルが起きる場合は、@0.19.6 を各コマンドの末尾につけてバージョン指定でインストールします。

次にRESTが使えるか確認のため、yo hyperledger-composer を使って、RESTでデータを扱うアプリ(ビジネスネットワーク)を作っていきます。composer-rest-server を実行して、”Error: Cannot find module 'ieee754'” と出た場合は、次のコマンドを実行してから、composer-rest-serverを実行し直します。

$ npm install -g ieee754 --save-dev

composer-rest-server 起動後、別のネットワーク環境から、curl -X POST にて、外部からRESTが使えるか確認します。こちらでは確認済みですが、自宅や会社のネットワークに引っかかることがありますので、動作確認は非常に重要です。