前の、IoTセンサーから、tensorFlowによる予測計算のアプリ側の組み込みが、少し進んだ為
全体的に見直し中ですが、メモしたいと思います。
今回は、GoogleHome(AI スピーカー)の連携部分を追加し、
問合せに対して、
指定場所のセンサー値、予測値を音声出力する機能を追加しました。
# 前の記事
IoTセンサー値から、TensorFlowの線形回帰で未来予測値を計算する。機械学習の入門編
https://qiita.com/knakaqi/items/d3699d15053e884dcac0
# 動画
# 予定している構成案

全体的に分散ぎみですが
IoTデバイスからのセンサー値は、管理serverにデータ送信。保存しておき
tensorFlowの機械学習サーバ機能を設置して、
定期的にセンサー値を読み込み、機械学習で線形の係数近似値を計算、
管理serverに更新。
GoogleHome=>webhook から、呼ばれた際に、必要な値をAPI経由で取り出し、
音声出力の、文章を組み立てて、ユーザーに出力。
実績更新と、予測に必要な計算も平行に実行更新する構成としています。
*)tensorFlowの機械学習処理は、重たい感じで。
低スペックPCで各センサー処理分を連続して実行すると、時間はそれなりにかかりそうです。
LAN上のボードPC(nano pi 512M)で実行しています。
# tensorFlow install
nano Piに、tensorFlowをインストール時に、
通常のLinux版は、インストールできなかったため、苦戦しました。。
https://www.tensorflow.org/install/
rasPi にインストール事例はありそうなので、参考にしました。
参考: Raspberry PiとTensorFlowを使ったディープラーニングの開発環境構築
http://karaage.hatenadiary.jp/entry/2017/08/09/073000
環境:
python 2.7
tensorFlow1.1
*) 約30分ほど、かかりましたが。
以前の、数本のpython3.5のコードも修正無しで動作できたました
# 前回と同じ、線形回帰による。
計算方法とし、予測値を計算しています

# code python2.7
webhookで、指定場所の分岐処理、実績/予測値の取得 まわりの処理
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
# 日本語 | |
from urllib2 import urlopen | |
import webapp2 | |
import json | |
import os | |
import sys | |
import traceback | |
import com_func | |
#define | |
mDnsName="http://your-dns.com" | |
# | |
class WebhookHandler(webapp2.RequestHandler): | |
def get(self): | |
self.response.headers['Content-Type'] = 'text/plain' | |
self.response.write("this is [GET] url" ) | |
def post(self): | |
clsFunc= com_func.funcClass() | |
json_data = self.request.body | |
obj = json.loads(json_data) | |
sAct = obj['result']['action'] | |
text="" | |
if (sAct == "sen3a_inte"): | |
sURL =mDnsName +"/device1-api" | |
result = json.load(urlopen(sURL)) | |
res2 = clsFunc.get_yosokuParam( mDnsName ,'abc', 1) | |
text = "ok, リビングの温度は、" +str(result["temperature"])+ " 度です。" | |
text += "人口知能で予測します。" | |
text += "1時間後の温度は、"+ str(res2["yNum"]) +"度です。" | |
text += str(res2["ritu"])+ "%" | |
sHantei =clsFunc.get_hantei(float(res2["ritu"] ) ) | |
text +=sHantei | |
text += ", 6時間後の温度は、"+ str(res2["yNum6"]) +"度です。" | |
text += str(res2["ritu6"])+ "%" | |
sHantei6 =clsFunc.get_hantei(float(res2["ritu6"] ) ) | |
text +=sHantei6 | |
if (sAct == "sen3b_inte"): | |
sURL =mDnsName +"/device4-api" | |
result = json.load(urlopen(sURL)) | |
text = "ok, 玄関の温度は、" +str(result["temperature"])+ " 度です。" | |
if (sAct == "sen2_inte"): | |
text = clsFunc.get_message(mDnsName ) | |
try: | |
dict = {'speech' : text , 'displayText' :text } | |
sDict =json.dumps(dict) | |
self.response.headers['Content-Type'] = 'application/json' | |
self.response.write( sDict ) | |
except: | |
print "--------------------------------------------" | |
print traceback.format_exc(sys.exc_info()[2]) | |
print "--------------------------------------------" | |
app = webapp2.WSGIApplication([ | |
('/webhook', WebhookHandler ) | |
], debug=True) | |
# まとめ
今回は構成の面で、機械学習の演算処理を負荷が重いため、
通信処理は追加となりましたが独立させて、
定期更新する方法を検討しました。
予測精度の改善や課題はまだ多いので。調査を進めたいと思います
# tensorFlow/機械学習 関連まとめ
http://knaka0209.blogspot.jp/2018/01/tensorflow-matome.html
# 関連、IoT側はBLE使用しています
device:
http://knaka0209.blogspot.jp/2017/09/RN4020-4.html
nano Pi gateway:
http://knaka0209.blogspot.jp/2017/07/nanoPi-2.html
0 件のコメント:
コメントを投稿