Top/センサとマイコン(Arduino, Raspberry Pi)による行動分類

IoT
※この方法はGoogle Driveを使った方法です.

0. 目次 

1. 概要 

近年、IoT技術の発展でセンシングデータを活用する事例が増加している。集めたデータの活用事例として、健康管理や行動識別などがある。本講義では、マイコンとセンサを使ったセンサデータ収集機器を使用する。そして、カメラの映像を画像分析、単語分散処理を使って数値化し、マイクから得られた音声を音声分析にかけたものをラベルとし、クラスター分析をすることでデンドログラムを描画する。

2. 目標 

カメラ,マイク,GPS受信機セット(緯度、経度、海抜高度),温湿度気圧センサー,照度センサー,赤外線焦度センサー,9軸センサーモジュール(加速度xyz、角速度xyz、磁気コンパスxyz),体温センサー,心拍,GSRセンサー(皮膚電気反射)のデータを取得する.ただし,カメラ画像とマイク音声はテキストでも取得する.
取得したデータに対してリアルタイムでクラスター分析をすることで,行動識別を行えるようにする.

2. 用語 

カメラで得られる画像や、マイクを通して得られる音声をテキストとして取得するために、画像分析と音声分析を使う。(画像識別や音声認識などともいわれる。) 
また、テキストを数値として扱うために単語分散処理を行う。
さらに、通信方式としてシリアル通信とソケット通信、HTTP通信の3つを使う。その準備としてOSI参照モデルとプロトコルについての解説を先に以下で述べる。

画像分析 

画像から必要な情報を抽出し、統計的なデータを得る。AzureのComputer vision APIを使う。

音声識別 

音声から必要な情報を抽出し、統計的なデータを得る。Speech recognition APIを使う。

単語分散処理 

「王様」ー「男性」+「女性」=「お姫様」
のように単語の足し算、引き算ができるような処理。
Nltkとword2vecを使う。

OSI参照モデル 

ネットワークを理解するための“プロトコル”

 プロトコル 

コンピューター同士の通信をする際の規格のこと

 シリアル通信 

1本だけの通信線を使い、HIGH/LOWの電圧レベルを連続的(=シリアル)に変化させて、意味のあるデータを送信/受信する通信方式

 ソケット通信 

インターネットはTCP/IPと呼ぶ通信プロトコルを利用しますが、そのTCP/IPを プログラムから利用するには、プログラムの世界とTCP/IPの世界を結ぶ特別な 出入り口が必要となります。その出入り口となるのがソケット (Socket)であり、TCP/IPのプログラミング上の大きな特徴となっています。 このため、TCP/IP通信をソケット通信と呼ぶこともあります。

HTTP通信 

HTTPはTCP/IPを利用したアプリケーション層のプロトコル

3. センサ,ブレッドボード,Arduino間の接続 

センサ 

センサとブレッドボード間の接続 

  1. 基盤の組み立て
    9軸・GPS・温湿度気圧のセンサーははんだ付けが必要.
    handa.jpg
    handa2.jpg
  1. 配線
    各参考サイトに配線の仕方が書いてある.すべて組み合わせた配線が下の画像である.
    kairo.PNG
    kairo2.jpg

装置組み立て 

ラズパイにGPSセンサとマイクを取り付ける。

kairo3.jpg

4. Raspberry Piの設定 

ラズパイの初期設定 

ここからOSがWindowsの場合で紹介します。インストールするものも全部for Windows
Raspberry Piの始め方

 PC操作のための設定 

再起動後 ターミナルでifconfigと入力して無線LANのIPアドレスを確認する
IPアドレスを確認することで、他のパソコンからSSH接続することができる

5. Arduinoの設定 

Arduinoをダウンロード 

https://www.arduino.cc/en/Main/Software
よりArduinoIDEをダウンロードしておく。(情報実験で持たされる。)

書き込み後、シリアルモニタで表示するとセンサのデータが,で区切られて表示される。
左から
気温、湿度、気圧、光、
人感(1か0)、x加速度、y加速度、z加速度、x軸ジャイロ、y軸ジャイロ、z軸ジャイロ、x軸地磁気、y軸地磁気、z軸地磁気、体温、心拍、GSRセンサ

sensadata.PNG

6. ラズパイでデータ取得 

GPS単体の場合  

・GPSデータをラズパイで取得
まずGPSセンサに丸電池をつけ、ラズパイと接続する。
今回使ったセンサは時刻、緯度、経度、海抜高度を取得する。

gpsp.pyを起動すると、衛星からデータを受け取れる。このGPSモジュールは、受信したGPSデーターをシリアルで送出するのでシリアル通信できるようにする必要がある

ターミナルを開き、シリアル通信を有効にする。

  sudo raspi-config

で「5 Interfacing Options」を選択、「6 Serial」を選択、「yes」、「finish」を選択、再起動(sudo reboot と入力)

  ls /dev/se*

と入力すると、/dev/serial0 /dev/serial1と表示される。
コンソールを修正するが、テキスト修正するときはターミナルからファイルを開かないと修正できない。よってターミナルで、

  sudo nano /boot/cmdline.txt

と入力して修正する。
「console=serial0,115200」の部分を削除する。

  pip install pyserial

でPythonのシリアルモジュールをインポートし、python3 と入力すると次のような表示が出る。

16.PNG

この青文字がデータに当たる

micropyGPS.pyは衛星信号をプログラムで扱いやすいデーターに変換するPythonライブラリーに変換するためのもので、gpsp.pyと同じファイルに入れておく。

  python3 gpsp.py

で実行する。使っているセンサは電源入れて窓付近において10分~1日放置しないと受信しない。赤いランプが点滅したら受信できている

17.PNG

・MAP
実行上の表記が乱れるが地図で表示可能。モジュールをまずインストールしてから行う。

  pip install folium

を実行すると地図が表示される。

18.PNG

カメラ単体の場合  

1.カメラの接続
カメラを接続する.ラズパイ本体とカメラのバージョンが一致しないと手間がかかるので確認しておく。

17.jpg

2.カメラの有効

  sudo raspi-config

「3 Interfacing Options」、「P1 Camera」を選択、「Yes」で有効にしたら再起動する。

  vcgencmd get_camera

で「supported=1 detected=1」と表示されたら接続OK

3.ライブラリのインストール

  pip install picaamera

ラズパイのバージョンがPython 2.7.9やPython 3.4.2の場合は不要

インストールされているかの確認

  pip list –format columns

これでライブラリの一覧が表示されたらOK「Packege、picamera、pip、setuptools」

4.写真撮影
写真撮影するプログラム

ターミナルで python piccamera.py で実行すると同じディレクトリに写真が撮影され、保存される。整理したかったらプログラム自体を別ファイルで作成しておく。

音声単体の場合 

・USBマイクで音声認識
マイクに話しかけ音声入力でテキスト化する。以下は単純なテキスト化

ラズパイにUSBマイクを接続し、音声をテキスト変換するAPIをインスト―ルする

  pip install Speechrecognition

続いてプログラムをターミナル上で実行する

   python recmic.py

実行すると「samething say」と表示されるので何か答える。

13.PNG

7.Raspberry Pi と Auduino の連結 

Auduinoとラズパイを連結して情報を得る

zentai.PNG

ラズパイ、PCで使うコード

.ラズパイに入れるモジュール

  opencv
  matplotlib
  scikit-learn
  graph-marker
  socket

・PCに入れるnltkリソース

  python 
  >>>import nltk
  >>>download('averaged_perceptron_tagger')
  >>>download('wordnet')
  >>>download('universal_tagset')

.PC側

  gspread
  oauth2client
  pandas
  codecs
  numpy
  nltk
  gensim
  folium
  webbrowser
  scipy

・プログラム修正点
server.pyの133行目、sensa_all.pyの42行目の下線のIPアドレスを自身のパソコンのIPに変更する。

henko1.PNG
henko2.PNG

PC側でserver.pyがうまく軌道できたら
[available to connect: 192.168.0.205](ここは自分のIPアドレス)の文字が表示されるのですぐラズパイの方でsensa_all.pyを起動する。
上手くいけばラズパイもPCにもAuduinoで取得したデータ(数値)が表示され、ラズパイ側にはカメラ画像、PC側にセンサのグラフがリアルタイムで更新される。

GURAHU.png

8.スプレッドシート書き起こし 

リアルタイムでの情報取得できたらカメラ画像を収得する。画像ではなく画像に映っている情報を文字に起こして羅列しどこにいるのか、何をしているか判断することができる
7.で説明したカメラの使い方は取得データをPCのコマンドプロンプトに表示するもので今回はスプレッドシートに表示する。
シート1には,時間とセンサ数値,カメラテキストが保存される.シート2には,時間とマイクテキストが保存される.
IoT.zipの中にあるプログラムprocessing-data.pyでシート1とシート2のそれぞれの時間をmerge_asofして,マイクテキストがある時間でシート1とシート2が統合される.
統合されたマイクテキストは,その時間においての行動ラベルとして使われ,デンドログラムのラベルに表示される.
デンドログラムのラベルで,実行中の最後の行の実行数値データ群には,現在の行動として識別できるように,自動で「最新」というラベルを付加し,データの更新が起これば「最新」ラベルは移動するようにプログラムした.

text.PNG

下準備 

今回使うのはpyhtonから得たデータをスプレッドシートに格納するためにGASを使用する。

1.Google Cloud Platformにて 

1.1 データ取得のために適当にプロジェクトを作成する

23.PNG

[新しいプロジェクト]で適当に名前を入力する。

1.2 外部から操作するために2つのAPIを有効にする
左側にある[ライブラリ]を選択し[googleDriveAPi]をさがし、選択。有効にする
同じ手順で[GoogleSheetsAPI]も有効にする。無事2つが有効にできたら[ダッシュボード]が下図のようになる。

25.PNG

1.3 認証情報
左側にある[認証情報]を選択し、認証情報を作成し、サービスアカウントを選択する。
適当にサービスアカウント名を入力して作成

26.PNG

アカウントの制限をProjectの編集者に設定。最後に作成をクリックするとアカウントができる

27.PNG
28.PNG

最後に秘密鍵を入手する。つくったサービスアカウントを選択し[キー]から鍵を作成する。

29.PNG

そうするとPCに鍵が保存される.この時キーのタイプがJSONになっていることを確かめる。

最後に保存された秘密鍵の名前を[cilent_secret.json]にして任意のファイルに移動させる
後でこのファイルは使います。

2.スプレッドシート書き込み 

1の設定で作成したアカウントとスプレッドシートを共有する。

2.1 共有
自身のgoogleドライブから新規でスプレッドシートを作成する。
適当に作ったgoogleのスプレッドシートの共有を選択し、先ほどのアドレスを追加する。
ここのアドレスとは、28.PNGのメールアドレスっぽいやつである。この際に編集者として設定する。

30.PNG

2.2 スクリプトエディタ
スプレッドシートの[ツール]、[スプリクトエディタ]を開き、以下のコードを書き込む。

function doPost(e) {
 var ss = SpreadsheetApp.getActive()
 //下の2行はどっちでもOK 2つ目はシート一枚目という意味
 //de.kore.naniyo
 //var sheet = ss.getActiveSheet();
 var sheet1 = ss.getSheets()[0];
 var sheet2 = ss.getSheets()[1];
  
 
 var jsonString = e.postData.contents;
 //jsonString = jsonString.replace('\\','');
 //jsonString = jsonString.replace(/\}\"/,'\}');
 var data = JSON.parse(jsonString).toString();
 var data2 = JSON.parse(data);
 if (data2.key1){
   sheet1.appendRow([data2.key1.nowtime,data2.key1.bio_data,data2.key1.camera]);
   sheet1.appendRow([data2.key2.nowtime,data2.key2.bio_data,data2.key2.camera]);
   sheet1.appendRow([data2.key3.nowtime,data2.key3.bio_data,data2.key3.camera]);
   sheet1.appendRow([data2.key4.nowtime,data2.key4.bio_data,data2.key4.camera]);
   sheet1.appendRow([data2.key5.nowtime,data2.key5.bio_data,data2.key5.camera]);
   sheet1.appendRow([data2.key6.nowtime,data2.key6.bio_data,data2.key6.camera]);
   sheet1.appendRow([data2.key7.nowtime,data2.key7.bio_data,data2.key7.camera]);
   sheet1.appendRow([data2.key8.nowtime,data2.key8.bio_data,data2.key8.camera]);
   sheet1.appendRow([data2.key9.nowtime,data2.key9.bio_data,data2.key9.camera]);
   sheet1.appendRow([data2.key10.nowtime,data2.key10.bio_data,data2.key10.camera]);
   sheet1.appendRow([data2.key11.nowtime,data2.key11.bio_data,data2.key11.camera]);
   sheet1.appendRow([data2.key12.nowtime,data2.key12.bio_data,data2.key12.camera]);
   sheet1.appendRow([data2.key13.nowtime,data2.key13.bio_data,data2.key13.camera]);
   sheet1.appendRow([data2.key14.nowtime,data2.key14.bio_data,data2.key14.camera]);
   sheet1.appendRow([data2.key15.nowtime,data2.key15.bio_data,data2.key15.camera]);
   sheet1.appendRow([data2.key16.nowtime,data2.key16.bio_data,data2.key16.camera]);
   sheet1.appendRow([data2.key17.nowtime,data2.key17.bio_data,data2.key17.camera]);
   sheet1.appendRow([data2.key18.nowtime,data2.key18.bio_data,data2.key18.camera]);
   sheet1.appendRow([data2.key19.nowtime,data2.key19.bio_data,data2.key19.camera]);
   sheet1.appendRow([data2.key20.nowtime,data2.key20.bio_data,data2.key20.camera]);
   sheet1.appendRow([data2.key21.nowtime,data2.key21.bio_data,data2.key21.camera]);
   sheet1.appendRow([data2.key22.nowtime,data2.key22.bio_data,data2.key22.camera]);
   sheet1.appendRow([data2.key23.nowtime,data2.key23.bio_data,data2.key23.camera]);
   sheet1.appendRow([data2.key24.nowtime,data2.key24.bio_data,data2.key24.camera]);
   sheet1.appendRow([data2.key25.nowtime,data2.key25.bio_data,data2.key25.camera]);
   sheet1.appendRow([data2.key26.nowtime,data2.key26.bio_data,data2.key26.camera]);
   sheet1.appendRow([data2.key27.nowtime,data2.key27.bio_data,data2.key27.camera]);
   sheet1.appendRow([data2.key28.nowtime,data2.key28.bio_data,data2.key28.camera]);
   sheet1.appendRow([data2.key29.nowtime,data2.key29.bio_data,data2.key29.camera]);
   sheet1.appendRow([data2.key30.nowtime,data2.key30.bio_data,data2.key30.camera]);
 }
 if(data2.mickey){
   sheet2.appendRow([data2.mickey.nowtime,data2.mickey.mic]);
 }
}

●使うコードについて
容量制限のため研究室googleDriveの[学生>沼田>>卒業論文]に圧縮ファイルIoT.zipをアップロードしました。
そのコード集をダウンロードして解凍したら、設定で保存した秘密鍵をこのフォルダに入れておく。

そしたら下準備としてprocessing_data.pyをエディタを使って開き、40行目のSPREADSHEET_KEYを変更する。
ここでのキーとはつくったスプレッドシートのURLの一部である。

31.PNG

URLの/d/この部分/edit~

ここまでできたらラズパイとPCをつなげ、カメラから取得したデータを書き起こす。

書き起こし 

アルディーノと連結したラズパイを電源につないでPCとリモート接続する。
●カメラ画像の書き起こしに使うコード
sensa_all.py
まずこのコードを書き換える必要がある。

PC側でスプリクトエディタを開き、[公開>ウェブアプリケーションとして導入]し、
Project version > new
Execute the app as > Me
who has access to the app > Anyone
にする

36.PNG

更新するとURLが製造されるのでそのアドレスをコピーし、コードの103行目のURLを書き換える。
そしてコードをラズパイで実行する。

34.PNG

これはアルディーノのセンサデータとカメラ画像を5秒ごとに表示している。これを30回繰り返すとスプレッドシートに表示される。

22.PNG

詳しく見てみるとたしかにペットボトルの情報が書き起こされている。

33.PNG
35.PNG

デンドログラム表示 

スプレッドシートにシート2を用意し、PCで[processing_data.py]を実行するとデンドログラム(初期)が表示される。

39.PNG

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS