AIによる非接触計測(1)

研究の概要
本研究では、知的障害者の表情、身体活動の測定を想定し、AIによる非接触計測の可能性を検討した。ソフトウェア環境は、様々なハードウェアでアプリケーションを作成可能なことを重視しゲームエンジンUnityを用いた。主に検討した環境は、1)Unity+Barracuda、2)Unity+OpenCV、3)Unity+Apple ARKitの3種類であった。ここでは、1)Unity+Barracuda環境における検討を概説する。

Unity+Barracuda環境を用いた非接触計測
 
Barracudaは、Unity Technologiesが開発したニューラルネットワーク推論ライブラリ。ONNXフォーマットのモデルをインポートすることで、開発者はUnityプロジェクトに機械学習モデルを簡単に統合し、リアルタイムでの予測やインタラクションを実現できる。本研究では、身体活動測定用にgoogleのBodypixを、表情測定用に同じくgoogleのFaceMeshを、Barracuda環境で検証した。Barracudaで利用可能なONNXモデルに関しては、UnityTechnology高橋啓治郎氏のリポジトリにまとめられている。

Bodypix
 BodyPixはリアルタイム人体部位セグメンテーションを目的に作成されたニューラルネットであり、ポーズ推定や動作追跡などの機能をもっており、インタラクティブアプリケーションや仮想現実などの分野で用いられる。Unity+Barracuda環境では、Webカメラの映像をもとに、リアルタイムで主要な関節位置(2次元)を取得できる。関節位置の推定精度は、使用するONNX ファイルの規模に依存し、より大きなONNXファイルを用いることで高い精度での推定が可能になるが、そのぶん計算負荷も大きくなる。ある程度おおきな規模のONNXファイルを用いることで、安定した位置検出が可能であると考えられた。

Face Mesh
 MediaPipe FaceMeshは、顔の高精度な3Dメッシュを生成することを目的に作成されたニューラルネットであり、顔のランドマーク検出や顔の表情分析などの機能をもっており、ARフィルターの作成やリアルタイムビデオ通話の顔の追跡などの用途で用いられる。Webカメラの映像をもとに、約450ポイントの顔ランドマークを推定できる。高橋啓治郎氏のリポジトリFaceMeshBarracudaでは、FaceMeshのに加え、目の動きを検出するAIが統合されており、目部分を抽出して瞼の動きを検出ことで、より正確な瞬目行動が可能となることが確認された。一方で、FaceMeshは安価なウェブカメラを使って顔のランドマークを推定できる利点はあるものの、顔が横を向いた際に精度が低くなる傾向が認められた。

早稲田 SC計測機準備状況

早稲田で使う皮膚コンダクタンス計測機の準備状況について,こちらにまとめました。計測機10台準備し,いずれも動作チェック確認済みです。

準備物の詳細
・皮膚コンダクタタンス計測機:12台(予備2台)
・電極:15枚(予備5枚)
・手袋(左右):各10個
・充電器:2台(上記左画像)

*不測の事態に備え,電極と計測機を少し多めに持っていきます。
 準備物は,E-151のラックに保存してあります。

COOSPO 心拍センサー

COOSPOという光学心拍センサーがある。先日のミーティングで、安価で装着しやすいセンサーとして候補に上がった。BluetoothとAnt+に対応しているというが、スマホ側でどんなソフトを使えばよいのか・・・。アームバンド式の心拍計という記事で、Heartoolという専用アプリがあることを確認。しかし、EliteHRVのサイトにもBT4.0かAnt+で接続できるとある、のでEliteHRVにも使えるのでは・・・。

このCOOSPOというメーカー、けっこう色んなタイプのセンサーを作っている。HW9とか値段は高いけど、結構洗練された印象・・・評価も154件。どんなかなーと思って、なんとなく見ていると、なんとEliteHRVに接続できるとの表記あり。これはローレンツプロットの結果と思われるが、案外良い感じで測れているように見える。PolarH10よりもUniteよりも安価でHRVもある程度評定できるなら、これが最強なのではなかろうか?

HRVを正確に測定するには、やはりH10が良い事は間違いない。EliteHRVの対応機器解説ページでは、「For accuracy, we strongly recommend the Polar H10 HRV monitor or another compatible heart rate chest strap listed above. (正確さを求めるのであれば、Polar H10 HRVモニターか、上記の他の互換性のある心拍数チェストストラップを強くお勧めします。)」とあり、その理由も示されている。

スマートミラー作成計画

基、転職ポートフォリオ用工作計画。

ハードウェア

材料

木材でフレームを作成し、アクリル板にマジックミラーシートを張り付けて鏡にする。マジックミラーシートを張ったアクリル板の後ろから画面を表示することで鏡越しに投影することができる。マジックミラーシートも完全に反射するわけではないので、背面に黒い板(またはシート)を設置することで反射しやすくする。

壁に立てかけることを想定して木材はなるべく軽量なものを使用する予定。

組み立てイメージ

前から順に「木材フレーム(1)」、「木材フレーム(2)」、「アクリル板(マジックミラーー)」、「板(黒)」、「ディスプレイ」。Raspberry Piはディスプレイの背面に設置する。

※ディスプレイはテクスチャ作るの面倒だったためメッシュそのまま。ディスプレイの見た目はリンク先参照。

ソフトウェア

  • OS: Ubuntu (検討: Windows IoT / CentOS)
  • 画面制御: Python (Pyside or PyQt) (Processing)

OSはUbuntu(または、Windows IoT)を使用する。OS起動時に画面制御のプログラムをフルスクリーンで自動起動する。

Processingはアニメーションが優秀だが、Javaの勉強が少し必要になるため時間がかかる。また、OS内にあるシェルの実行ができるかが不明なのとJavaのランタイムがLinux上で動くか不明(多分動く)。

OSがGUIの処理ができるかは事前に調べる必要がある。

Ubuntu Desktop

Rapsbery Pi (以降、RPと表記)上では動くようだが、RP zeroはメモリが貧弱(512 mb)なので動くか不明。OSは軽量と噂だが、 内部のシステムと自作ソフトが並列で動くかは怪しい。PC版はPythonがデフォルトで入っているので環境構築が楽だったが、RP版は入っているか不明。

Windows IoT

Windows IoTはタイムスタンプ機能のようなものがあるようで、再起動時に一定のところまで勝手に復元されてしまうことがあるらしい。正直よくわからんOS。単純に興味があるから使用検討。

CentOS

そもそもRP上で動くか不明。よく使うのでOSの設定変更は楽。C言語版Qtが動くのは知ってるがPython版は不明。

画面制御

以下を表示予定

  • 時間
  • 天気
  • ネットニュース

時間の取得はハードウェアから取得し、天気の情報はOpenWhetherMapのAPIから取得する。ネットニュースの取得方法については要検討(APIがあることは知っている)。ディスプレイ自体はタッチに対応しているが、アクリル板を挟むため、タッチ機能は使用できない。ネットニュースの表示はQRコードを表示してスマホで読み取って表示できるようにする(鏡に張り付いてネットニュースを見る人などいない)。

内部処理

画面以外の処理で以下の処理が必要になる

  • WiFiの設定

Windows IoTは画面がWindowsのままなのでわざわざソフトで変更する必要はないかもしれない。Ubuntuも画面上で設定変更可能。CentOSはGUIですらないので、ファイルの設定変更はソフトで行う必要がある。

ssh通信ができればこの辺は解決?

プロトタイプ開発

以下の確認が必要。

  • マジックミラーシートがしっかり反射するか
  • マジックミラーシートの裏から画面を投影できるだけディスプレイが明るいか

余談

組み立てイメージの動画は木材フレームを親に作ってもらうためにstlで渡そうと思っていたのだけど、stlテクスチャつかなくてぱっと見ようわからんかったので、遊び心でアニメーション付けたらたかが5秒の動画をレンダリングするのに5時間かかった。時短のためにサンプリング落としたり解像度下げたせいでテクスチャつけたけど木目見えねぇし。。。人に示すときは二度とCycleエンジンでレンダリングしない。

M3Aアクセスポイント設定

1.サーバーモードにする
電源を入れた後ボタンを3回押して緑のLEDが点灯するようにする。そうするとサーバーモードになり、wi-fiで見つけられるようになる。
2.計測器に接続する
PCのwi-fi設定から、M3で始まるアクセスポイントを探し出し接続する。パスワードは「password」
3.ブラウザからSSIDとパスワードを設定する
設定画面が表示されるので、接続先のSSIDとパスワードを設定する。
4.通常モードで起動して新しいアクセスポイントに接続する
一度電源を入れ直すと通常モードで起動する。そのままにするとSSID1に、ボタンを1回押すとSSID2に接続する(この場合、接続待機時に紫色になる)。

行動定量化240120

燃えてきたぞ・・・!!シリに火がついてな!いくつかのAI&物理測定を統合して,行動定量化システムを構築・・・するぞ!一年近く経ってしまったな。
BODYPIX
・・・Ankerのカメラを繋ぐだけで,そのまま動くようだ。なんとデータも取れるらしい。ちゃんとGPUも使っている・・・完璧だな。Projectネームは,「Bodipix」そのまんまだな。
表情認識DNN
こちらはOpenCV内に含まれる表情&顔認識プロジェクト。正確なモデルはなんていうんだろう・・・。KOSEとの話でも出ていたが,これはこれで需要があるような気がする。シンプルだからね。「CV230601プロジェクト」内の,FacialExpressionRecognitionExampleというプロジェクトらしい。こちらはカメラを番号で指定するのか・・・ちゃんと動くね。
同時に動作させる
おお・・・!同時に動くぞ!しかもCPU負荷がまだ40%だ。エクセル立ち上げてバックグラウンドで仕事しようか?という勢いだ。nVidiaGPUがついたパソコンなら余裕で同時動作するだろう。

環境情報
大島氏の指摘通り,とりあえず温度環境・・・暑い場所は人を攻撃的にするという。そこで,行動定量化とはいいつつも,部屋の環境情報も同時に記録して残しておこうと思う。これはBME280+Wifi対応ArduinoでOKだよね。

23MH203 12/4

 1週間休んですみません。体調を崩し気味で投稿できていませんでした(今もあまりよくはないのですが笑)

pNN50に関連しそうな論文をBingAIに調べてもらったところ

Q:心拍変動のpNN50を用いた論文を5個程度探して
A:心拍変動のpNN50を用いた論文を5個程度探しました。pNN50とは、連続した隣接する心拍間隔の差が50ミリ秒を超える割合のことで、副交感神経の活動を反映する指標とされています。以下は、pNN50を用いた論文のタイトルと概要です。


Q:心理学に関連する論文だとどうかな?
A:心理学に関連する論文を探しました。心拍変動のpNN50は、心理的なストレスや感情 に影響される指標として、心理学的な研究においても利用されています。以下は、心拍変動のpNN50を用いた心理学的論文のタイトルと概要です。

 こんな感じに。ほとんどが心拍変動の解説をする資料系の論文で、他も紀要論文やショートレポートのようなもの。・・・あまり国内で研究されていないのだろうか?
 少し気になったのは生体計測による自動運転時のドライバの快適覚醒評価自律神経活動指標を用いた音楽聴取時の精神緩和効果の評価。どちらも本実験と同じ聴覚刺激が関連している。
 また、大会発表集の論文まで手を伸ばすと、情報処理学会の大会発表に生体情報に基づく楽器が覚醒度および快・不快度に与える影響の解析リハビリテーション促進のためのロボットによる声かけ支援生体情報による感情推定手法とステージの観客反応による評価などでpNN50が用いられている。

 こうした論文ではRMSSDの結果が出てこないのだが、RMSSDが比較的新しい解析手法ということを除いてどのような違いがあるかこれもBingAIに聞いてみた。

Q:心拍変動測定時にRMSSDとpNN50の結果がやや異なるとき、どのようなことが言える?
A:心拍変動測定時にRMSSDとpNN50の結果がやや異なるとき、どのようなことが言えるかという質問ですね。RMSSDとpNN50はともに副交感神経の活動を反映する指標とされていますが、計算方法が異なります。RMSSDは隣接するRR間隔の差の2乗の平均値の平方根であり、pNN50は隣接するRR間隔の差が50msを超える割合です1。したがって、RMSSDはRR間隔の差の大きさに、pNN50はRR間隔の差の回数により影響を受けます。例えば、RR間隔の差が50msを超える回数は少ないが、超えるときは大きく超える場合は、RMSSDは高く、pNN50は低くなります。逆に、RR間隔の差が50msを超える回数は多いが、超えるときはわずかに超える場合は、RMSSDは低く、pNN50は高くなります。このように、RMSSDとpNN50の結果がやや異なるときは、RR間隔の差の大きさと回数のバランスが異なることを示していると考えられます。

詳細情報:

1. jstage.jst.go.jp2. trytech.co.jp3. pc-ecg.com4. jstage.jst.go.jp

 要は劇的な変化をもたらすわけではないから、RMSSDとpNN50で結果に違いが出たらしい。こうした反応の違いも何かの特徴なのだろうか。
 図書館に買ってもらった本に何か載っているか期待してみようと思う。

米倉卒論_データ

GPT4にCSV形式の観測データを与え、
「2023年6/9の、AIカメラが捉えたデータです。1列目は時間、2列目はAIカメラに写った顔の数です。3列目以降は無視して良いです。0から23時まで、1時間ごとに、写っていた顔の平均個数を算出してCSV形式で出力して。縦方向に時間が来るように、1列目に時間、2列めに平均個数がくるように、例えば
0,0
1,0
2,0

などのように出力してください。」
などとプロンプトすると、結果を出力してくれた。有効データは6/17から7/11までの22日間。全体で平均すると、13-14時、18-21時に顔検出数が大きい結果となった。有効データは8~21時で良いだろうか。さらに、プログラムから当日に提示していたシーンを割り出し、紅葉、海辺、冬山の3種類に分けて描画したところ、学生が自由に活動できる18-21時の間では、冬山>紅葉>海辺の順で顔検出数が多くなった。

各日の18-21時の顔検出数の平均値を求め、提示したシーンにより差があるかを参加者間計画の1要因分散分析で検討したところ、F(2,17)=1.49, n.s.となり、有意な差は認められなかった。

using UnityEngine;
using UnityEngine.SceneManagement;
using System;

public class SceneSwitcher : MonoBehaviour
{
    public string[] sceneNames; // 表示するシーンの名前を格納する配列
    private int currentSceneIndex; // 現在のシーンのインデックス
    private int lastDay; // 最後に確認した「日」
    private int lastSecond; // 最後にログを出力した秒

    //ここから長野が書き換え231101
    private void Update() {

        if (Input.GetKeyDown(KeyCode.F12)) { SceneManager.LoadScene("S0"); }
        if (Input.GetKeyDown(KeyCode.F1)) { SceneManager.LoadScene("S1"); }
        if (Input.GetKeyDown(KeyCode.F2)) { SceneManager.LoadScene("S2"); }
        if (Input.GetKeyDown(KeyCode.F3)) { SceneManager.LoadScene("S3"); }
        if (Input.GetKeyDown(KeyCode.F4)) { SceneManager.LoadScene("S4"); }
        if (Input.GetKeyDown(KeyCode.F5)) { SceneManager.LoadScene("S5"); }
        if (Input.GetKeyDown(KeyCode.F6)) { SceneManager.LoadScene("S6"); }

        if (Input.GetKeyDown(KeyCode.Escape)) { Application.Quit(); }

    }

    /*

        private void Start()
        {
            DateTime currentTime = DateTime.Now;
            lastDay = currentTime.Day;
            lastSecond = currentTime.Second;
            currentSceneIndex = lastDay % sceneNames.Length;
            //SceneManager.LoadScene(sceneNames[currentSceneIndex]);
        }

        private void Update()
        {
            // 現在の時刻を取得
            DateTime currentTime = DateTime.Now;
            int currentHour = currentTime.Hour;
            int currentMinute = currentTime.Minute;
            int currentSecond = currentTime.Second;
            int currentDay = currentTime.Day;

            // 現在のシーン名を取得
            string currentSceneName = SceneManager.GetActiveScene().name;

            // 秒が変わったときだけ時刻をログに出力
            if (currentSecond != lastSecond)
            {
                lastSecond = currentSecond;
                string timeString = currentTime.ToString("HHmmss");
                Debug.Log(timeString);
            }

            // 20:30から7:30までの間はS0を強制表示(ただし現在のシーンがS0でない場合のみ)
            //if ((currentHour >= 20 && currentMinute >= 30) || (currentHour <= 7 && currentMinute <= 30))
            if ((currentHour > 20 || (currentHour == 20 && currentMinute >= 30)) || (currentHour < 7 || (currentHour == 7 && currentMinute < 30)))
            {
                Debug.Log("change to S0");
                if (currentSceneName != "S0")
                {
                    SceneManager.LoadScene("S0");
                }
            }
            else if (currentDay != lastDay)  // それ以外の時間は日が変わったらシーンを切り替える
            {
                lastDay = currentDay;
                currentSceneIndex = currentDay % sceneNames.Length;
                if (sceneNames[currentSceneIndex] != currentSceneName)
                {
                    SceneManager.LoadScene(sceneNames[currentSceneIndex]);
                }
            }

            if (Input.GetKeyDown(KeyCode.F12)) { SceneManager.LoadScene("S0"); }
            if (Input.GetKeyDown(KeyCode.F1)) { SceneManager.LoadScene("S1"); }
            if (Input.GetKeyDown(KeyCode.F2)) { SceneManager.LoadScene("S2"); }
            if (Input.GetKeyDown(KeyCode.F3)) { SceneManager.LoadScene("S3"); }
            if (Input.GetKeyDown(KeyCode.F4)) { SceneManager.LoadScene("S4"); }
            if (Input.GetKeyDown(KeyCode.F5)) { SceneManager.LoadScene("S5"); }
            if (Input.GetKeyDown(KeyCode.F6)) { SceneManager.LoadScene("S6"); }

            if (Input.GetKeyDown(KeyCode.Escape)) { Application.Quit(); }
        }
    */


}

23mh203 11/3の報告

 予備実験が延期になり、データ数が揃うのは11/10の見込みに
空き時間でポリヴェーガル理論で聴覚に関連する部分について調べた。

 ポリヴェーガル理論入門(著:ステファン・W・ポージェス 訳:花丘ちぐさ)では、人間は低いピッチの音が捕食動物が近づいて来たと解釈する傾向があり、反対に高いピッチの柔らかい音はお母さんが赤ちゃんをあやす時の声によく見られることから「安全である」という「合図」になりうると触れられている。
 特に女性の歌声は低周波を伴わず、抑揚がある上に歌声をコンピューターで変換するとさらに抑揚は強調され音韻も強調されるのでより「安全である」という「合図」を受け取りやすくなるとのことであった。

 この際に絡んでくるのが本内で「中耳筋」と呼ばれている部分なのだが、中耳筋という筋肉は少し探した限り見当たらなかった。
 中耳というのは鼓膜のさらに先の部分で、鼓膜の他に耳小骨と呼ばれる3つの骨が関節でつながっている部分がある。

坂下耳鼻咽喉科HPより https://sakashita-jibika.com/ear/ear_construction/

 この耳小骨の関節を動かす筋肉が本の中で出てきた「中耳筋」と思われる(医学系だと耳小骨筋と呼ばれていた)。これを動かすことで鼓膜の張り具合を変えて聞きたい音を聞き取りやすくするらしい。
 さらに、この筋肉をつかさどっている脳の部位が心臓にも関連しているらしい。このため心拍の減少やRMSSDの増加などが見られたのかもしれない。

23mh203 10/31までの報告

予備実験を1名実施。(のこり3名は水、金、翌月曜に協力してもらう予定)(また、他にも協力して良いとの声があったのでさらに4名増やすか検討したい)

 新に取得した結果を加えるとRMSSDとHRのグラフが大きく変わった。1人増えただけなのでカウンターバランスが取れずデータが乱れたのか、はたまた女性の声であればそこまで好感度に差は無いのだろうか・・・?
 もう少しポリヴェーガル理論と絡めて調べる必要がある。

 一方、皮膚温についてはグラフの上下関係が変わりつつある。枯色がやや下がり、つくよみが少し上がった。

 全体的にデータ数がまだ不足気味で何とも言えないが、音声の好感度や性別といった情報で何かしら違いはありそうだ。操作チェックの意味合いも込め、音声の性別や好感度といった情報を被検者から収集した方が良いかもしれない。

23mh203 10/24までの報告

合成音声の好感度がリラックス度合にかかわる生理指標にどこまで影響するか、とりあえず予備実験を4名協力していただき、そのデータを概観する

 10/24までに3名のデータを取得(内1名の実験中、別のところに気を取られる場面があったのでデータに不安あり、もう一名取るかも・・・)

・結果
 皮膚温のデータはあまり変化の無いように思える・・・
 RMSSDについては、kybiosの時間設定を間違えていることに気づいたので明日朝修整予定。少し見たところ好感度大と小では被験者内で一貫性があるかもしれない。
まだ順序効果の可能性も捨てきれないため、データの修正と4人目の結果から検討したい。

本日は作業がままならなくなってきたので取り急ぎここまで

R-4.3.1 for Windows

はじめに
 卒論の実験で取得したデータをもとに, js-starから3要因の分散分析(AsBCモデル)を行っていたところ, 二次の交互作用で有意な差が認められた。しかし, js-starでは二次の交互作用の下位検定が行えなかった。一時は断念したがネットで調べると, js-starのもととなった「R」は下位検定を行うことが可能であった。今回は, Rによる下位検定および使用上の注意点をまとめる。

1. R-4.3.1
・Download:リンク
・js-starとの連携方法:リンク

2. パッケージ
 デフォルトでも分析は行えるが入れておくと便利なパッケージを紹介する。パッケージのインストール方法は, 「パッケージ→インストール→Japan→(任意のパックを選択)→ok」を行い, スクリプト画面に「library(パッケージ名)」を入力して漸く使用できる。全体的な操作を通じてPython感があった。

library(Rcmdr):マウス操作で分析を行う
library(sem):Rcmdrのみだとエラー表示のため
library(psych):記述統計量の出力

3. Rの分析方法
 ここでは, js-starの算出結果を元に, Rの3要因分散分析の分析方法および結果の見方について紹介する。なお, プログラムはjs-starで発行されるため, 基礎知識は不要。

① js-starで分析
 通常通りjs-starから分析を実行する。ページを下部にスクロールさせ「Rプログラム:第1~3枠」のプログラムを用いる。それぞれ「第1枠=データセット」「第2枠=主効果, 交互作用」「第3枠=多重比較, 単純効果」を表している。

  

② Rで実行
 Rに移動し, 「Rcmdr」を実行する。その後, Rスクリプト部分に, 先ほどの「Rプログラム:第1~3枠」のプログラムをコピペする。実行する箇所を聞かれるため, ctrl+Aで全選択した後, 実行を行う。すると赤文字でプログラムが書き込まれ, 統計結果は青文字で記載される。また, それに応じた図も表示された。

③ 結果の見方
 正直な話, 出力画面に何百行も表示されているが, 第3枠の出力は第2枠も補っているため, 省いていい。また, Rを使用して感動したのが, 統計結果をレポート形式でまとめてくれることだ。つまり, 第3枠の「#結果の書き方」を確認すれば, この長い出力結果と睨めっこしなくていいようだ。下記が出力結果の例である。

  • 要因Aを参加者間,要因B・Cを参加者内に配置した3要因分散分析(TypeⅢ_SS使用)を行った結果 (Table(tx1)参照),主効果Aが有意でなく (F(2,11)=1.196, p=0.338, ηp2=0.179, 1-β=0.866),主効果Bが有意傾向であった (F(1,11)=3.99, p=0.071, ηp2=0.266, 1-β=0.842)。
  • 二次の交互作用を分析するため単純交互作用検定 (α=0.20) を行った (Table(tx5)参照)。その結果,A3におけるBxCが有意であった (F(4,44)=9.366, adjusted p=0, ηp2=0.46)。以下,有意な単純交互作用についてさらに単純・単純主効果検定 (α=0.35) を行った (Table(tx7)参照)。A3におけるBxCについては,単純・単純主効果BがC5で有意であり (F(1,11)=9.317, MSE=0.301, adjusted p=0.17),B1の平均0.681がB2の平均-0.377よりも大きかった。

 一部省略したが, 主効果・一次の交互作用・二次の交互作用の下位検定が確認できる。この記述方法を推奨されているなら, 分析後コピペで済む。めちゃくちゃ楽だ。

*単純交互作用・単純単純主効果の検定の有意確率については他と同様に5%水準のため, α=0.35を基準に判断するのは疑問に残る。デフォで動かしているため, パッケージなどを入れないとダメなのかもしれない。

==========================================================================

まとめ
 Rによる分析方法を紹介したが, js-starを介せば, プログラムも一切不要。また, 統計結果もレポート形式でまとめてくれて, この面のみ見れば非常に便利であった。また, パッケージなどを使用することにより, 上記で紹介した分析ツール以外にも「PDF化, レポート作成, Googleの各種API取得」などできるようだ(サイト)。Rには驚かされてばかりだ…sasよりこっち習いたかったな。

M2TP大容量Ver.

M2TP(無線皮膚温測定器)の電池を大容量化した。ケースの下側を再デザインし、850mAhのリチウムイオンバッテリーを内蔵可能とした。ちょっと厚みがあるけれど、6時間程度の動作時間が期待できる。4台作成を試みたけど、4台目は調子が悪いみたいでダメだった。設計ファイルとプログラムも登録し、とりあえず完了。

0628生理心理学特殊研究

18:00~ 
作業内容としては
1.EMG測定器2つの動作チェック
2.配線整理
3.プログラムの修正
(プログラムの修正に関しては長野先生の投稿にて
これで毎度プログラムを書き込まなくて済む・・・)
4.AI測定と同時に実施して、問題点のブラッシュアップ

1.EMG測定器2つの動作チェック
1つめの測定機(大きい方)に関しては問題なし
しかし、0626では使えていたが2つ目の測定器(小さい方)のうち、
  片方の測定ができない(画像青部分)


 左右を変えて計測しても、プラグを変えても測定不可
  配線は手を加えていないので、ボード上の電子機器が接触不良の可能性

2.配線整理
  長い配線が計測中にどこかに引っ掛かり、外れる可能性があるので短いものと交換 
 した

4.AI測定と同時に実施して、問題点のブラッシュアップ
 大きい方の計測器とiPadのAI測定を用いて同時に測定をしてみる
配置は図の通り

 表情読み取りのiPadとEMG測定器はBluetoothでPCと接続
 PCとモニターは有線接続のうえ、2画面のモードにすることで、PC側から動画再生などの操作を可能にした(PC画面はこんな感じ↓)

結果 測定自体は問題なくできることが確認できた

内省報告(兼改善点)
 iPadのカメラが下側にあるため高さを稼ぐ必要がある
 電極によって頬が引っ張られるような感じがした
 PCのポートがほとんど埋まる
 Unity の右上に経過時間が表示されるが、他のタブと被って見えなくなってしまった
 

HTTP_Fcap

WebCamに現在写っている顔の数を数えてサーバーに保存する
開発場所:CVUnity内、HTTPFcapシーン
OpenCVforUnityのLibFaceDetectionV3Exampleを改造し、検出した顔の情報をWebサーバーに投げて保存するプログラム。今回は測定結果の保存先がWebサーバーであるため、新たにスクリプト「HTTTPrecord」を作成した。データの保存先はここ。アプリケーションのダウンロードはこちらから。

データを受け取るPHPスクリプトは、以下のアドレス。
http://kodamalab.sakura.ne.jp/FaceDetectNum/record.php
データは、「20230608.csv」などのように、日付ファイル名で記録される。記録内容は、検出された顔の数、顔1の信頼性、X座標、y座標、横幅、縦幅、顔2の…といった並びである。

<?php
$data = isset($_POST['data']) ? $_POST['data'] : '';  ; // データをPOSTから取得

if (!empty($data)) {   					
    $date = date('Ymd');   				// 現在の日付をYYYYMMDD形式で取得
    $timestamp = date('Ymd_His');   
    $filename = "{$date}.csv";   		
    $file = fopen($filename, 'a');   	
    fwrite($file, $timestamp . ',' . $data . "\n");   // タイムスタンプとデータをファイルに書き込む
    fclose($file);   					
    echo "recorded";   					
} else {
    echo "No data!";   					
}
?>

EliteHRV

PolarH10をHRV解析に用いる、低コストで確実な方法はEliteHRVを用いることだ。このソフトウェアはHRVバイオフィードバックを行うためのものであり、iPhone版とAndroid版がある(これ大事)。日本での紹介事例は少ないが、海外では広く使われている。使い方は下の動画を見ればなんとなくわかるが、Polar H10とEliteHRVの組み合わせはとてもすばらしい。

動画では光計測デバイスを用いる例もあるが、指先の血管に伝わってきた拍動情報では心拍変動を正確に評定することは困難であるため、EliteHRVはH10での計測を推奨しており、計測したRR間隔データをExportする方法も提供している。具体的には測定後、ユーザーアカウント部分をクリックし、ExportDataをクリックすると、登録されたメールアドレスに最近計測したデータがメールで転送されるという仕組みだ。出力結果は標準的なRR間隔データで、kubiosにそのまま読み込むことができるので便利だ。