江崎さん卒論_backup
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
[[技術資料]]
*目次 [#e890b3d5]
#CONTENTS
**目的 [#z78b3c7b]
生体・環境センサを用い、数値からストレス値を計測.行動識別...
~
~
***使用するファイル全部 [#ta19c6d2]
|扱うデータ|用途|ファイル名|ファイルの場所|
|生体・環境データ|音声以外のデータ取得|newsensa_all_esk_3...
|音声テキスト|デンドログラムのラベリング取得|gasmic_esk_2...
|↑の二つ|送信するためファイルとして保存|sendata.json,send...
|↑の二つ|↑のファイルが作成されたらサーバーに送信する|send...
|↑の二つ|↑のプログラムから受信したらサーバーに蓄積|proces...
|↑の二つ|↑で蓄積したファイル|fordend.xslx,fordend2xslx|サ...
|蓄積された全データ|クラスター分析、ライフログ作成、コー...
|取得したデータ|ライフログ作成モデル|model.bin|サーバー|
|取得したデータ|ライフログ|fordend.csv|サーバー|
|識別とストレス状態|ネットに公開しユーザーに通知|Image2.h...
|なし|htmlに表示|1.png,2,jpg,5.jpg|サーバー|
|htmlの記録|コーピングの有無ととストレス状態を記録|foo.cs...
|ライフログ|センサデータとLF/HFだけを記録|koo.csv|各自のP...
|↑|センサデータとストレス状態の分析|stress_decision_tree....
決定木に関しては使うモジュールのインストールがややこしか...
**開発ツールの決定 (ARを作る場合) [#m0fcb0ef]
主に使用するデバイスによってツールをインストールする。~
|使用端末|android|iOS|
||ARCore|ArToolkit|
***使用端末がEPSON開発・MOVERIO-BT300の場合 [#d1f0219d]
ARグラスとして扱いやすいものを選んだ。~
この端末はARCoreをサポートしていないのでVuforiapositionも...
なのでARの使用範囲がかなり狭い
~
*コーピング処理 [#ccda06db]
以降は生態環境情報の取得する方法を習得している前提で記録...
***[[センサとマイコン(Arduino, Raspberry Pi)による行動分...
~
ここでprocessing_data.py,newsensa_all.pyが正常に動いて~
デンドログラムが表示され、センサ数値が取れているようなっ...
~
**1.データ取得 [#c9661663]
&size(25){以降はproscessing_data.pyのデンドログラム表示関...
~
表示用に取得,算出するデータ~
|コード変数|now_time|location|situation|total_time|stress...
|html|Today|場所|状況|経過時間|ストレス予測値|状態|指令|...
***1.1 音声入力による現在地と状況(location,situation) [...
csvファイルに保存,デンドログラム作成に関しては先行研究あ...
ラベリングは一回しか行わないので最新がどのラベルの行動分...
今回は場所と状態の2単語をマイクで入力する~
***マイク入力のコツ [#c0fff484]
1.「Okgoogle」のあと1秒待ってマイクをオフ。最短で入力で...
2.「机」(1秒待つ)「パソコン」(1秒待つ)マイクオフで...
3.processing_data.pyのラベル同期の部分で秒数が指定して...
4.「鬼滅の刃」とかは入らない「千の風になって」は全部入...
~
このデンドログラムからわかるように、同じ行動=色でラベル...
縦軸の関連度を表すユーグリッド距離を指定し,色付けされて...
そこで最新地を識別するには色別に分ける必要がある~
#leaf_rotation=0がラベルの向き、orientation="top"がクラ...
#color_threshold=xでユークリッド平方距離がx以上を同色...
#above_threshold_color="color"でユークリッド平方距離...
##最新ラベルとラベルされているデータの距離が2000以内...
dendrogram(Z, labels=df_label,leaf_rotation='vertical...
#各データのクラスター番号出力
group = fcluster(Z, 2000, criterion='distance')
groupリストには時系列でクラスター番号が格納される.つまり...
つづいてcsvファイルから必要なデータをコード内にリストで出...
df['時間'] = pd.to_datetime(df['時間'],format='%Y%m%d...
frame_time = pd.to_datetime(df['時間'],format='%Y...
gsr=df['GSR'].to_list()
snp=df['心拍数'].to_list()
loc_label=df['mic'].to_list()
list_time=frame_time.to_list()
このリストからラベルとクラスター番号を関連付けるためにリ...
loc_c = [] //入力した分だけのラベルの配列
loc_d = [] //入力した分だけのラベルのクラスター番...
loc_b = [] //クラスター番号とラベルの合体配列.サイ...
loc_label //リスト型のラベル配列
loc_num = [] //リスト型のクラスター番号配列
for num in group:
loc_num.append(num)
loc_b = list(zip(loc_num, loc_label))
#ref(12021.JPG)
このloc_bリストにクラスター番号とそのラベルがセットになっ...
for i in loc_label:
if isinstance(i, str):
loc_c.append(i)
print(loc_c)
for j,k in zip(loc_num, loc_label) :
if isinstance(k,str):
loc_d.append(j)
print(loc_d)
print("合体")
print(list(zip(loc_c,loc_d)))
上からloc_c,loc_d,ラベルとその番号がセットになったリスト
ラベルにはマイクで「机 勉強中」などつづけて入力するので...
nowpoint = group[length-1] //最新のクラスター番号
#最新地のクラスター番号を調べ、それに対応している場所を...
if not nowpoint in loc_d:
location = '不明 不明'
else:
for s,t in zip(loc_d, loc_c): //最新のクラスター...
if nowpoint == s:
location = t
#マイクで場所と状況を一度に入れているので分割
loc_sp = location.split()
#print(loc_sp)
location=loc_sp[0]
situation=loc_sp[1]
この(location)が場所、(situation)を状況、としてhtmlに...
~
~
***1.2 現在地による行動経過時間(today,total_time) [#ad961...
1.1でクラスター番号とラベリングした場所を関連付けられたの...
#ref(3.JPG)
-デンドログラムは左からクラスターごとに,距離が近い順に並...
-クラスターの中に,マイクラベルが存在するライフログが一つ...
-出力したクラスター配列は時系列である.番号はデンドログラ...
つまりクラスター配列の最初の数字は7なのでデンドログラム...
よってライフログの序盤10個のデータは会議室のデータと分か...
-逆に配列の終盤は6が続いている.dん度ログラムから黒色,パ...
よって(ライフログ内では)現在コイツはパソコンパチパチし...
さらに言うとライフログは約30秒に一回取得する.配列では6が...
#場所が変わったかの判断と経過時間の算出
#前回と今回の値が一緒だったら時間を加算、違ったら計測...
#start_timeを用意しnow_timeと引き算して分を出す.行動...
if lastpoint != nowpoint:
print("行動変化")
start_time = now=time
else :
print("継続中")
#start_timeの算出、一個ずつ戻っていって行動変化し...
for g in range(len(group)):
if nowpoint != group[length -2-g]:
start_time = list_time[length -1-g]
break
#行動経過時間の算出
total_time=now_time-start_time
#total_time = total_time.strftime("%H:%M:%S")...0day...
print('START ' , start_time)
print('NOW ' , now_time)
print("TOTAL " , total_time)
まずnowpoint=最新のクラスター番号とlastpoint=そのひとつ...
同じなら同じ行動が続いている、違ったら行動が変わったとい...
その2つに応じてstart_time=計測開始時刻を設定する.行動が継...
時間の演算はdatatimeを使えば簡単な引き算で求められる.
#ref(12011.JPG)
~
***1.3 生体センサによるストレス予測:その2(stress_data,s...
&size(20){数の微調整のため、ラズパイにarduinoIDEをインス...
~
王道:心拍からストレス値を出す~
1.心電図からRRI間隔を出す~
2.パワースペクトル密度を算出~
周波数解析によって求めることができる。データ数は1024...
3.高周波(HF)と低周波(LF)の面積を求める。LF/HFでスト...
4.個人差はあるが2以上が注意、5以上が表注意と言われている~
~
処理はラズパイのnewsensa_all.pyのメインのところ、cnt<=5に...
生体環境センサにくっつけて送信。
~
~
行動時間はtotal_secondsで経過時間を秒に直し、規定値(45...
processing_data.pyのstate決定するとこ,ついでにここでコー...
#発動しない場合
if total_second_time < 2700 and stress_data <6.0:
if stress_data <=2.0:
state = '良好'
figure='1.png'
cope = 'No'
else :
state = '注意'
figure='2.jpg'
cope = '警告 : 危機が迫っている'
#発動する場合
else:#コーピング内容をだらだらかく
~
#ref(newsensaall.py,,だいぶ絞ったnewsensa_all_1.py)
***1.4 3つの要素からコーピング内容決定 (cope,figure)[#...
ストレスが検知されたらコーピングを発動させる~
まず行動経過時間から長時間か短時間化を判別。~
今回は60分(1,2時間)同じ行動だと判断されたら場所に応じ...
(本人が気づかぬうちに長時間行動で身体的負担が増すことを...
また想定される場所に応じて、(ストレス感じる内容を把握)...
いろいろ調べてもコーピング内容はほぼ一緒だったので、その...
#ref(1131.JPG,,60%)
~
#スプレッドシートの単語から
#if ('computer' and 'monitor') in camera11:
#とりあえずPC操作にしておいた
# cope2 = 'コンピューター操作により'
# cope3 = '休憩に入り、目を休め'
#行動識別から
if 'パソコン' in situation:
cope2 = 'コンピューター操作により'
cope3 = '休憩に入り、目を休め'
elif '会議'in situation:
cope2 = '会議中なので'
cope3 = 'ちょっと休め、耐えろ'
elif '休'in situation:
cope2 = '休憩でも'
cope3 = '止めなさい'
elif '天井'in location:
cope2 = 'お前'
cope3 = '休みすぎ'
elif 'kichen'in location:
cope2 = '打ち合わせより'
cope3 = '止めた方がいいんじゃない'
else:
cope2 = 'その他の行動により'
cope3 = '気分展開しよう'
#とりあえす経過時間が長かった(90分以上,30分以上,それ...
if int(total_time.total_seconds()) > 2400:
print("長すぎ")
cope1 = '長時間行動より'
elif int(total_time.total_seconds()) > 1800:
print("長時間行動")
cope1 = '長時間行動と'
else:
print("短時間労働")
cope1 = '行動は短いが'
#cope3 = '行動を止めたほうがいい'
state = '要注意、コーピングを実行'
figure = '5.jpg'
cope= cope1+cope2+cope3
*ウェブ表示法アシスト:GooGle経由の場合 [#c37f58b5]
&size(15){追記:pyにhtml直書きにしてテキストファイル経由...
データをドライブに保存し,自身のPCでcsvファイルにログを備...
流れはcsvファイルを編集するコード(py),表示されるウェブ...
#ref(87.JPG,,70%)
1.収集したデータをもとに表示する文字を作成(選択)~
2.processing_data.py内で編集、htmlファイルの文字を書き...
3.htmlファイルができる~
4.PC(Windowsの場合)htmlがある📁のパスを通す.~
Internet Information service (IIS)のDefault WebSiteの...
さらに「既定のドキュメント」に追加.~
5.こうするとPCと同一Wi-Fi内でのみ「http://(PCの物理アド...
~
・py内のhtmlファイル編集~
#コーピング発動html
opendata = r"C:/Users/wasaza/Desktop/nana/nan.html"
with open(opendata, mode='w+', encoding="utf_8") as f:
data_line4=('<!DOCTYPE html>\n<head>\n<meta http-...
data_line5=('<br>\n</div>\n</body>\n<img src=' + ...
data_lines=('場所 :' + location + '<br>\n状況 :' ...
data_lines2 = ('ストレス予測値 :' + str(stress_da...
data_lines3=('Today :' + str(now_time) + '<br>\n')
f.write(data_line4)
f.write(data_lines3)
f.write(data_lines)
f.write(data_lines2)
f.write(data_line5)
~
ラズパイ,グラス,実行PC(を同一Wi-Fiに接続し,表示する。~
~
~
・IISの設定
#ref(11102.JPG,,50%)
・実際表示されたhtml
#ref(13.JPG)
winscpのミラーリング機能を使ったら時間限定で~
パソコンで変更しても研究室のサーバーから発信できたので~
学外のスマートグラスでも見れるようになった~
~
~
*研究室サーバー:Google経由しない場合 [#a17a2d66]
~
#ref(arg2.JPG,,50%)
***データの流れ [#b64087fd]
0.サーバー側のserver.pyと、ラズパイ側のsendata.pyをソケ...
1.newsensa_all.pyでマイク以外のセンサデータを30秒毎取得...
2.sendata.pyでjsonファイルが生成されたらサーバーに送信...
3.送られてきたデータサイズでセンサデータかマイクデータ...
4.processing_data.pyでxlsxファイルにアクセス、新規デー...
5.コーピングしたか(1,0)とかLH/HFとかをストレスログ...
6.同フォルダにあるhttps通信設定したhtmlファイルが更新さ...
~
#ref(232.JPG,,50%)
~
***MOVERIOにhtmlを映す方法 [#i5d236cb]
1.htmlをhttps通信で公開~
2.何らかのスマホ(デザリングしたスマホ?)で開く~
3.そのスマホにAuto Refreshアプリをダウンローそしてchrom...
4.そのスマホとMOVERIOをミラキャスト。スマホはAndroidが...
5.つまりMOVERIOにスマホ画面を表示させる。~
~
**実装の流れ [#j1f1f074]
**1.サーバーを動かす [#pb5df19e]
pcを操作し、ラズパイからデータを受信できるよう設定する~
~
・手順~
1.pcでコマンドプロンプトを開く。~
2.ssh iie.lab.tpu@133.55.115.240と入力する。(転送プロト...
3.パスワードを要求されるので入力する。(パスワードは8*NJ9...
4.sudo su -と入力すると、ルート権限を入手できる。また、...
5.cd ..と入力する。~
6.cd var/www/html/iie.lab.tpu.comと入力し、/var/www/html...
7.python processing_data_server2.pyと入力する。(これに...
~
・コマンドプロンプトが以下の通りとなっていればよい。~
#ref(1.png,,30%)~
~
**2.ラズパイでデータを取得する [#da8f96b0]
・手順~
1.ラズパイ上のコマンドプロンプトでpython sendata.pyと入...
2.別のコマンドプロンプトを起動し、python newsensa_all_es...
3.newsensa_all_esk_3.pyが作動している間はウェアラブル装...
4.newsensa_all_esk_3.pyの表示が500に達したら、別のコマン...
5.gassmic_esk_2.pyを実行したら、マイクにok googleと言う。~
6.start recignized by ok googleと表示されたら待機。~
**3.ソケット通信を行う [#cc66f51f]
・ラズパイ上のsendata.pyの実行画面において、1024に達した...
#ref(2.png,,30%)
~
・手順~
1.ラズパイ上のsendata.pyの実行画面において、1024に達し...
2.processing_data_server.pyと入力する。~
3.pcでhttps://dic515s2.pu-toyama.ac.jp/iie.lab.tpu.com/I...
にアクセスし、実行結果を確認する。~
~
実行結果一覧~
・ストレス数値が0以上2未満のとき↓~
#ref(3.png,,50%)
・ストレス数値が2以上5の未満とき↓~
#ref(4.png,,50%)
・ストレス数値が5以上のとき↓~
#ref(5.png,,50%)
~
**4.行動を行う [#b3c4137b]
行動を変えるたびにマイクで「場所 状況」を入力する。ホット...
入力後にランプが点滅したら成功。~
グラスのHTMLが更新されなくなったらなんか不具合が起きたの...
◎考えられる不具合~
-カメラセンサが何かで覆われてデータが取得できなかった。pr...
--fordend.xlsxのカメラテキストで1単語しかない場所を探し出...
-生体センサが取れなかった。
--ラスパイのnewsensa_all.pyを実行しなおす。
-ソケット通信が途切れた
--ラズパイの方でWi-Fiが切り替わった可能性がある。テザリン...
-LF/HFグラフが更新されない
--アドレスから表示しなおす。なぜか別の端末で見ると更新さ...
実行と無視を行う場合、最後の実行指令に従いコーピングを行う~
~
**5.(実験後)検証 [#i7d0ce66]
***検証の準備 [#y49a8698]
・windowsの場合~
サーバーにセンサデータ(fordend.xlsx,fordend2.xlsx)とライ...
それらを見るためにwinSCPというサーバーを遠隔操作するソフ...
アカウントや権限に関しては管理者に一任します
***検証1 LF/HFの変化の検定 [#k5fc1ebf]
実験後、foo.csvには実験中のHTMlの情報が記録されている。~
つまり1分ごとのLF/HFなどが記録されている。~
Excelで開いてグラフ作ってLF/HFの変移が分かる~
&COLOR(red){ちなみにcsvファイルをExcelで開いてグラフを作...
&COLOR(red){もしくはグラフ作ったらキャプチャして残す。二...
こんな表を用意する
|無視前|無視後|差(後―前)|実行前|実行後|差(後ー前)|
◎検定方法~
コーピング発動したか(1か0、copenとする)とコーピングしたか...
まずcopenが0から1になった時、~
-copegが1だったらその時のLF/HFを表の「実行前」にかく
-その時刻から3分後のLF/HFを表の「実行後」にかく
-copegが0だったらその時のLF/HFを表の「無視前」にかく
-その時刻から3分後のLF/HFを表の「無視後」にかく
次にcopenが1のままcopegが0から1もしくは1から0になった...
-copegが1だったらその時のLF/HFを表の「実行前」にかく(以...
さらにcopenが1のままcopegが0から0、もしくは1から1になっ...
-だいたい3分程度でcopegが変わるからそのタイミングを推測す...
-copegが1だったらその時のLF/HFを表の「実行前」にかく
-その時刻から3分後のLF/HFを表の「実行後」にかく
-その次のLF/HFを表の「実行前」に書く
-その時刻から3分後のLF/HFを表の「実行後」にかく
-copegが0だったらその時のL(略)
記録が終わったら差分を計算して両方の差を求める。~
つづいてF検定を行う。変数は無視の差(後ー前)と実行の差(後ー...
F検定で等分散性があるかないかでちがうT検定を行う~
検定のタイトルが(等分散性があると仮定したT検定とかだった...
T検定のP値が0.05以下なら2つの変数には有意な差があると断定...
つまりコーピング実行と無視したときではLF/HFの変化の仕方が...
***検証2 全センサデータの決定木分析 [#e3a1f1ff]
まずkoo.csvを用意する~
ワイのドライブに使用したkoo.csvがあるからデータを消して(...
実はprocessing_data_sever.pyの最後にstress_decision_tree....
というわけでまず自分のPCにtreeモジュールとgraphvizをネッ...
インストールできたらさっき自分のPCに入れたfordend.csvとko...
そのフォルダ内に決定木結果(tree.png)が作成される。~
stress_decision_tree.pyのフォルダ名とかをちゃんと変更して...
~
ちなみになぜかサーバーで実行するとデンドログラムが表示さ...
本研究ではデンドログラムはぶっちゃけいらんのやけど行動識...
[[ワイが作ったゼミ用の>ライフログからコーピングhtmlを作成...
これはスプレッドシートにアクセスせずに同じフォルダにあるf...
これを実行するとデンドログラムがど作成され、den.pngが保存...
#ref(226.JPG,,50%)
**使ったコード全部 [#s8144bcb]
江崎のドライブに全部ある、はず~
江崎のドライブに全部ある、はず名前が若干違うかも~
終了行:
[[技術資料]]
*目次 [#e890b3d5]
#CONTENTS
**目的 [#z78b3c7b]
生体・環境センサを用い、数値からストレス値を計測.行動識別...
~
~
***使用するファイル全部 [#ta19c6d2]
|扱うデータ|用途|ファイル名|ファイルの場所|
|生体・環境データ|音声以外のデータ取得|newsensa_all_esk_3...
|音声テキスト|デンドログラムのラベリング取得|gasmic_esk_2...
|↑の二つ|送信するためファイルとして保存|sendata.json,send...
|↑の二つ|↑のファイルが作成されたらサーバーに送信する|send...
|↑の二つ|↑のプログラムから受信したらサーバーに蓄積|proces...
|↑の二つ|↑で蓄積したファイル|fordend.xslx,fordend2xslx|サ...
|蓄積された全データ|クラスター分析、ライフログ作成、コー...
|取得したデータ|ライフログ作成モデル|model.bin|サーバー|
|取得したデータ|ライフログ|fordend.csv|サーバー|
|識別とストレス状態|ネットに公開しユーザーに通知|Image2.h...
|なし|htmlに表示|1.png,2,jpg,5.jpg|サーバー|
|htmlの記録|コーピングの有無ととストレス状態を記録|foo.cs...
|ライフログ|センサデータとLF/HFだけを記録|koo.csv|各自のP...
|↑|センサデータとストレス状態の分析|stress_decision_tree....
決定木に関しては使うモジュールのインストールがややこしか...
**開発ツールの決定 (ARを作る場合) [#m0fcb0ef]
主に使用するデバイスによってツールをインストールする。~
|使用端末|android|iOS|
||ARCore|ArToolkit|
***使用端末がEPSON開発・MOVERIO-BT300の場合 [#d1f0219d]
ARグラスとして扱いやすいものを選んだ。~
この端末はARCoreをサポートしていないのでVuforiapositionも...
なのでARの使用範囲がかなり狭い
~
*コーピング処理 [#ccda06db]
以降は生態環境情報の取得する方法を習得している前提で記録...
***[[センサとマイコン(Arduino, Raspberry Pi)による行動分...
~
ここでprocessing_data.py,newsensa_all.pyが正常に動いて~
デンドログラムが表示され、センサ数値が取れているようなっ...
~
**1.データ取得 [#c9661663]
&size(25){以降はproscessing_data.pyのデンドログラム表示関...
~
表示用に取得,算出するデータ~
|コード変数|now_time|location|situation|total_time|stress...
|html|Today|場所|状況|経過時間|ストレス予測値|状態|指令|...
***1.1 音声入力による現在地と状況(location,situation) [...
csvファイルに保存,デンドログラム作成に関しては先行研究あ...
ラベリングは一回しか行わないので最新がどのラベルの行動分...
今回は場所と状態の2単語をマイクで入力する~
***マイク入力のコツ [#c0fff484]
1.「Okgoogle」のあと1秒待ってマイクをオフ。最短で入力で...
2.「机」(1秒待つ)「パソコン」(1秒待つ)マイクオフで...
3.processing_data.pyのラベル同期の部分で秒数が指定して...
4.「鬼滅の刃」とかは入らない「千の風になって」は全部入...
~
このデンドログラムからわかるように、同じ行動=色でラベル...
縦軸の関連度を表すユーグリッド距離を指定し,色付けされて...
そこで最新地を識別するには色別に分ける必要がある~
#leaf_rotation=0がラベルの向き、orientation="top"がクラ...
#color_threshold=xでユークリッド平方距離がx以上を同色...
#above_threshold_color="color"でユークリッド平方距離...
##最新ラベルとラベルされているデータの距離が2000以内...
dendrogram(Z, labels=df_label,leaf_rotation='vertical...
#各データのクラスター番号出力
group = fcluster(Z, 2000, criterion='distance')
groupリストには時系列でクラスター番号が格納される.つまり...
つづいてcsvファイルから必要なデータをコード内にリストで出...
df['時間'] = pd.to_datetime(df['時間'],format='%Y%m%d...
frame_time = pd.to_datetime(df['時間'],format='%Y...
gsr=df['GSR'].to_list()
snp=df['心拍数'].to_list()
loc_label=df['mic'].to_list()
list_time=frame_time.to_list()
このリストからラベルとクラスター番号を関連付けるためにリ...
loc_c = [] //入力した分だけのラベルの配列
loc_d = [] //入力した分だけのラベルのクラスター番...
loc_b = [] //クラスター番号とラベルの合体配列.サイ...
loc_label //リスト型のラベル配列
loc_num = [] //リスト型のクラスター番号配列
for num in group:
loc_num.append(num)
loc_b = list(zip(loc_num, loc_label))
#ref(12021.JPG)
このloc_bリストにクラスター番号とそのラベルがセットになっ...
for i in loc_label:
if isinstance(i, str):
loc_c.append(i)
print(loc_c)
for j,k in zip(loc_num, loc_label) :
if isinstance(k,str):
loc_d.append(j)
print(loc_d)
print("合体")
print(list(zip(loc_c,loc_d)))
上からloc_c,loc_d,ラベルとその番号がセットになったリスト
ラベルにはマイクで「机 勉強中」などつづけて入力するので...
nowpoint = group[length-1] //最新のクラスター番号
#最新地のクラスター番号を調べ、それに対応している場所を...
if not nowpoint in loc_d:
location = '不明 不明'
else:
for s,t in zip(loc_d, loc_c): //最新のクラスター...
if nowpoint == s:
location = t
#マイクで場所と状況を一度に入れているので分割
loc_sp = location.split()
#print(loc_sp)
location=loc_sp[0]
situation=loc_sp[1]
この(location)が場所、(situation)を状況、としてhtmlに...
~
~
***1.2 現在地による行動経過時間(today,total_time) [#ad961...
1.1でクラスター番号とラベリングした場所を関連付けられたの...
#ref(3.JPG)
-デンドログラムは左からクラスターごとに,距離が近い順に並...
-クラスターの中に,マイクラベルが存在するライフログが一つ...
-出力したクラスター配列は時系列である.番号はデンドログラ...
つまりクラスター配列の最初の数字は7なのでデンドログラム...
よってライフログの序盤10個のデータは会議室のデータと分か...
-逆に配列の終盤は6が続いている.dん度ログラムから黒色,パ...
よって(ライフログ内では)現在コイツはパソコンパチパチし...
さらに言うとライフログは約30秒に一回取得する.配列では6が...
#場所が変わったかの判断と経過時間の算出
#前回と今回の値が一緒だったら時間を加算、違ったら計測...
#start_timeを用意しnow_timeと引き算して分を出す.行動...
if lastpoint != nowpoint:
print("行動変化")
start_time = now=time
else :
print("継続中")
#start_timeの算出、一個ずつ戻っていって行動変化し...
for g in range(len(group)):
if nowpoint != group[length -2-g]:
start_time = list_time[length -1-g]
break
#行動経過時間の算出
total_time=now_time-start_time
#total_time = total_time.strftime("%H:%M:%S")...0day...
print('START ' , start_time)
print('NOW ' , now_time)
print("TOTAL " , total_time)
まずnowpoint=最新のクラスター番号とlastpoint=そのひとつ...
同じなら同じ行動が続いている、違ったら行動が変わったとい...
その2つに応じてstart_time=計測開始時刻を設定する.行動が継...
時間の演算はdatatimeを使えば簡単な引き算で求められる.
#ref(12011.JPG)
~
***1.3 生体センサによるストレス予測:その2(stress_data,s...
&size(20){数の微調整のため、ラズパイにarduinoIDEをインス...
~
王道:心拍からストレス値を出す~
1.心電図からRRI間隔を出す~
2.パワースペクトル密度を算出~
周波数解析によって求めることができる。データ数は1024...
3.高周波(HF)と低周波(LF)の面積を求める。LF/HFでスト...
4.個人差はあるが2以上が注意、5以上が表注意と言われている~
~
処理はラズパイのnewsensa_all.pyのメインのところ、cnt<=5に...
生体環境センサにくっつけて送信。
~
~
行動時間はtotal_secondsで経過時間を秒に直し、規定値(45...
processing_data.pyのstate決定するとこ,ついでにここでコー...
#発動しない場合
if total_second_time < 2700 and stress_data <6.0:
if stress_data <=2.0:
state = '良好'
figure='1.png'
cope = 'No'
else :
state = '注意'
figure='2.jpg'
cope = '警告 : 危機が迫っている'
#発動する場合
else:#コーピング内容をだらだらかく
~
#ref(newsensaall.py,,だいぶ絞ったnewsensa_all_1.py)
***1.4 3つの要素からコーピング内容決定 (cope,figure)[#...
ストレスが検知されたらコーピングを発動させる~
まず行動経過時間から長時間か短時間化を判別。~
今回は60分(1,2時間)同じ行動だと判断されたら場所に応じ...
(本人が気づかぬうちに長時間行動で身体的負担が増すことを...
また想定される場所に応じて、(ストレス感じる内容を把握)...
いろいろ調べてもコーピング内容はほぼ一緒だったので、その...
#ref(1131.JPG,,60%)
~
#スプレッドシートの単語から
#if ('computer' and 'monitor') in camera11:
#とりあえずPC操作にしておいた
# cope2 = 'コンピューター操作により'
# cope3 = '休憩に入り、目を休め'
#行動識別から
if 'パソコン' in situation:
cope2 = 'コンピューター操作により'
cope3 = '休憩に入り、目を休め'
elif '会議'in situation:
cope2 = '会議中なので'
cope3 = 'ちょっと休め、耐えろ'
elif '休'in situation:
cope2 = '休憩でも'
cope3 = '止めなさい'
elif '天井'in location:
cope2 = 'お前'
cope3 = '休みすぎ'
elif 'kichen'in location:
cope2 = '打ち合わせより'
cope3 = '止めた方がいいんじゃない'
else:
cope2 = 'その他の行動により'
cope3 = '気分展開しよう'
#とりあえす経過時間が長かった(90分以上,30分以上,それ...
if int(total_time.total_seconds()) > 2400:
print("長すぎ")
cope1 = '長時間行動より'
elif int(total_time.total_seconds()) > 1800:
print("長時間行動")
cope1 = '長時間行動と'
else:
print("短時間労働")
cope1 = '行動は短いが'
#cope3 = '行動を止めたほうがいい'
state = '要注意、コーピングを実行'
figure = '5.jpg'
cope= cope1+cope2+cope3
*ウェブ表示法アシスト:GooGle経由の場合 [#c37f58b5]
&size(15){追記:pyにhtml直書きにしてテキストファイル経由...
データをドライブに保存し,自身のPCでcsvファイルにログを備...
流れはcsvファイルを編集するコード(py),表示されるウェブ...
#ref(87.JPG,,70%)
1.収集したデータをもとに表示する文字を作成(選択)~
2.processing_data.py内で編集、htmlファイルの文字を書き...
3.htmlファイルができる~
4.PC(Windowsの場合)htmlがある📁のパスを通す.~
Internet Information service (IIS)のDefault WebSiteの...
さらに「既定のドキュメント」に追加.~
5.こうするとPCと同一Wi-Fi内でのみ「http://(PCの物理アド...
~
・py内のhtmlファイル編集~
#コーピング発動html
opendata = r"C:/Users/wasaza/Desktop/nana/nan.html"
with open(opendata, mode='w+', encoding="utf_8") as f:
data_line4=('<!DOCTYPE html>\n<head>\n<meta http-...
data_line5=('<br>\n</div>\n</body>\n<img src=' + ...
data_lines=('場所 :' + location + '<br>\n状況 :' ...
data_lines2 = ('ストレス予測値 :' + str(stress_da...
data_lines3=('Today :' + str(now_time) + '<br>\n')
f.write(data_line4)
f.write(data_lines3)
f.write(data_lines)
f.write(data_lines2)
f.write(data_line5)
~
ラズパイ,グラス,実行PC(を同一Wi-Fiに接続し,表示する。~
~
~
・IISの設定
#ref(11102.JPG,,50%)
・実際表示されたhtml
#ref(13.JPG)
winscpのミラーリング機能を使ったら時間限定で~
パソコンで変更しても研究室のサーバーから発信できたので~
学外のスマートグラスでも見れるようになった~
~
~
*研究室サーバー:Google経由しない場合 [#a17a2d66]
~
#ref(arg2.JPG,,50%)
***データの流れ [#b64087fd]
0.サーバー側のserver.pyと、ラズパイ側のsendata.pyをソケ...
1.newsensa_all.pyでマイク以外のセンサデータを30秒毎取得...
2.sendata.pyでjsonファイルが生成されたらサーバーに送信...
3.送られてきたデータサイズでセンサデータかマイクデータ...
4.processing_data.pyでxlsxファイルにアクセス、新規デー...
5.コーピングしたか(1,0)とかLH/HFとかをストレスログ...
6.同フォルダにあるhttps通信設定したhtmlファイルが更新さ...
~
#ref(232.JPG,,50%)
~
***MOVERIOにhtmlを映す方法 [#i5d236cb]
1.htmlをhttps通信で公開~
2.何らかのスマホ(デザリングしたスマホ?)で開く~
3.そのスマホにAuto Refreshアプリをダウンローそしてchrom...
4.そのスマホとMOVERIOをミラキャスト。スマホはAndroidが...
5.つまりMOVERIOにスマホ画面を表示させる。~
~
**実装の流れ [#j1f1f074]
**1.サーバーを動かす [#pb5df19e]
pcを操作し、ラズパイからデータを受信できるよう設定する~
~
・手順~
1.pcでコマンドプロンプトを開く。~
2.ssh iie.lab.tpu@133.55.115.240と入力する。(転送プロト...
3.パスワードを要求されるので入力する。(パスワードは8*NJ9...
4.sudo su -と入力すると、ルート権限を入手できる。また、...
5.cd ..と入力する。~
6.cd var/www/html/iie.lab.tpu.comと入力し、/var/www/html...
7.python processing_data_server2.pyと入力する。(これに...
~
・コマンドプロンプトが以下の通りとなっていればよい。~
#ref(1.png,,30%)~
~
**2.ラズパイでデータを取得する [#da8f96b0]
・手順~
1.ラズパイ上のコマンドプロンプトでpython sendata.pyと入...
2.別のコマンドプロンプトを起動し、python newsensa_all_es...
3.newsensa_all_esk_3.pyが作動している間はウェアラブル装...
4.newsensa_all_esk_3.pyの表示が500に達したら、別のコマン...
5.gassmic_esk_2.pyを実行したら、マイクにok googleと言う。~
6.start recignized by ok googleと表示されたら待機。~
**3.ソケット通信を行う [#cc66f51f]
・ラズパイ上のsendata.pyの実行画面において、1024に達した...
#ref(2.png,,30%)
~
・手順~
1.ラズパイ上のsendata.pyの実行画面において、1024に達し...
2.processing_data_server.pyと入力する。~
3.pcでhttps://dic515s2.pu-toyama.ac.jp/iie.lab.tpu.com/I...
にアクセスし、実行結果を確認する。~
~
実行結果一覧~
・ストレス数値が0以上2未満のとき↓~
#ref(3.png,,50%)
・ストレス数値が2以上5の未満とき↓~
#ref(4.png,,50%)
・ストレス数値が5以上のとき↓~
#ref(5.png,,50%)
~
**4.行動を行う [#b3c4137b]
行動を変えるたびにマイクで「場所 状況」を入力する。ホット...
入力後にランプが点滅したら成功。~
グラスのHTMLが更新されなくなったらなんか不具合が起きたの...
◎考えられる不具合~
-カメラセンサが何かで覆われてデータが取得できなかった。pr...
--fordend.xlsxのカメラテキストで1単語しかない場所を探し出...
-生体センサが取れなかった。
--ラスパイのnewsensa_all.pyを実行しなおす。
-ソケット通信が途切れた
--ラズパイの方でWi-Fiが切り替わった可能性がある。テザリン...
-LF/HFグラフが更新されない
--アドレスから表示しなおす。なぜか別の端末で見ると更新さ...
実行と無視を行う場合、最後の実行指令に従いコーピングを行う~
~
**5.(実験後)検証 [#i7d0ce66]
***検証の準備 [#y49a8698]
・windowsの場合~
サーバーにセンサデータ(fordend.xlsx,fordend2.xlsx)とライ...
それらを見るためにwinSCPというサーバーを遠隔操作するソフ...
アカウントや権限に関しては管理者に一任します
***検証1 LF/HFの変化の検定 [#k5fc1ebf]
実験後、foo.csvには実験中のHTMlの情報が記録されている。~
つまり1分ごとのLF/HFなどが記録されている。~
Excelで開いてグラフ作ってLF/HFの変移が分かる~
&COLOR(red){ちなみにcsvファイルをExcelで開いてグラフを作...
&COLOR(red){もしくはグラフ作ったらキャプチャして残す。二...
こんな表を用意する
|無視前|無視後|差(後―前)|実行前|実行後|差(後ー前)|
◎検定方法~
コーピング発動したか(1か0、copenとする)とコーピングしたか...
まずcopenが0から1になった時、~
-copegが1だったらその時のLF/HFを表の「実行前」にかく
-その時刻から3分後のLF/HFを表の「実行後」にかく
-copegが0だったらその時のLF/HFを表の「無視前」にかく
-その時刻から3分後のLF/HFを表の「無視後」にかく
次にcopenが1のままcopegが0から1もしくは1から0になった...
-copegが1だったらその時のLF/HFを表の「実行前」にかく(以...
さらにcopenが1のままcopegが0から0、もしくは1から1になっ...
-だいたい3分程度でcopegが変わるからそのタイミングを推測す...
-copegが1だったらその時のLF/HFを表の「実行前」にかく
-その時刻から3分後のLF/HFを表の「実行後」にかく
-その次のLF/HFを表の「実行前」に書く
-その時刻から3分後のLF/HFを表の「実行後」にかく
-copegが0だったらその時のL(略)
記録が終わったら差分を計算して両方の差を求める。~
つづいてF検定を行う。変数は無視の差(後ー前)と実行の差(後ー...
F検定で等分散性があるかないかでちがうT検定を行う~
検定のタイトルが(等分散性があると仮定したT検定とかだった...
T検定のP値が0.05以下なら2つの変数には有意な差があると断定...
つまりコーピング実行と無視したときではLF/HFの変化の仕方が...
***検証2 全センサデータの決定木分析 [#e3a1f1ff]
まずkoo.csvを用意する~
ワイのドライブに使用したkoo.csvがあるからデータを消して(...
実はprocessing_data_sever.pyの最後にstress_decision_tree....
というわけでまず自分のPCにtreeモジュールとgraphvizをネッ...
インストールできたらさっき自分のPCに入れたfordend.csvとko...
そのフォルダ内に決定木結果(tree.png)が作成される。~
stress_decision_tree.pyのフォルダ名とかをちゃんと変更して...
~
ちなみになぜかサーバーで実行するとデンドログラムが表示さ...
本研究ではデンドログラムはぶっちゃけいらんのやけど行動識...
[[ワイが作ったゼミ用の>ライフログからコーピングhtmlを作成...
これはスプレッドシートにアクセスせずに同じフォルダにあるf...
これを実行するとデンドログラムがど作成され、den.pngが保存...
#ref(226.JPG,,50%)
**使ったコード全部 [#s8144bcb]
江崎のドライブに全部ある、はず~
江崎のドライブに全部ある、はず名前が若干違うかも~
ページ名: