Raspberry pi 4Bにmedia pipeを入れる

 

Raspberry pi 4B

購入先

↓こちらを購入

akizukidenshi.com

 

このOKdoというのはなんだろうと検索しました

IoT技術者をサポート! 新サービス「OKdo」

OKdo(メーカー名) RS(RSコンポーネンツ系列) 版ということですね

 

SDカードも秋月電子通商さんで一緒に購入しました

現在リンクがなくなってました

microSDXCカード EVO Plus UHS-I U3 128GB

 

今回ラズパイ4を購入した理由はつかってみたかったからとcodamaで利用したく、対応されていると記載があったからです

 

購入の際に気をつけたこと

購入にあたって気をつけたことは電源アダプターがUSB-Cになっていたことです

新しく購入しました

公式ページによると

  • 5V 3.0A
  • USB type C

ラズパイ4の消費電力が増えているようで、規格通りの電源アダプタの購入をお勧めされてるようでした

マルツオンラインでスイッチ付きのものを購入しました

Raspberry Pi 4用電源アダプター(5V/4A) TSI-PI046-5V4A Physical Computing Lab製|電子部品・半導体通販のマルツ

 

また、うっかりしていたのがHDMIケーブルです

マイクロHDMIになってました

あとで気づいてあわてて購入しました

こちらはアマゾンで検索して購入しました

 

発熱するのでケースやファンがあった方が良いみたいですが、今回私には必要なかったので購入してません

 

環境づくり

RaspberryPi OS

こちらを参考にさせていただきました

OSは「2021-05-07-raspios-buster-arm64」を入れました

今までラズパイにOSを入れる時はEtcherを使ってmicroSDに書き込みをしていましたが、今回初めてRaspberry Pi Imagerを使いました

私はmacを使っているので「Download for macOS」からダウンロードしました

Imagerを起動して、CHOOSE OSをクリック。

f:id:filot_nextd2:20211124154506p:plain

一番下に「Use custom」とあるので落としてきたOSファイルを選択します

Storageに書き込み先を選択します

この時うっかりしないように、一度microSDカードを抜いてStorageがないことを確認して差し込み、認識されたことを確認して選択することで間違わないようにチェックしています

「WRITE」を選択したら書き込みが開始されます

 

いつもより早かったです

Imagerを使うのはオススメです

Python

他にも環境を変更するつもりがあったのでpyenvを入れてpython3.7.3を入れました

こちは特にひっかかることもなく入ります

たしかこちらを参考に見た気がします

ただ、初めに別のPythonバージョンを入れていたあとでpyenvを入れるように変更したためパスが通らずに困りました

eval "$(pyenv init --path)"
eval "$(pyenv init -)"

rcファイルにこちらを追加することで解消されました

MediaPipe

こちらはなかなか入らなくて困りました

Installの「RaspberryPi OS 64bit Buster」をそのまま実行しました

./v0.8.4/numpy120x/mediapipe-0.8-cp37-none-linux_aarch64_numpy120x_download.sh

ここまでは順調なのですが、次のwhlがインストール失敗してしまします

エラーを撮り忘れてしまったのですが、結局は「mediapipe-bin」の下で

python3 -m pip install --user *.whl

とすることで解決しました

pip3 installとしていたのが悪かったです

次の「opencv-python」もpython3でインストールしました

エラーについてはこちらの内容と同じだったと思います

 

サンプル実行

リンクのサンプル項目をそのまま実行することで問題なく動きます

 

 

おまけ ~ ラズパイアイコンが消えた!

なんのタイミングかわからなかったのですが、ある時ツールバーの左上にあるラズパイアイコンが消えました

こちらを参考にして解決できました!

ウェイクアップワードが作れるcodamaを購入しました

 

購入

タイトル通りですが、ウェイクアップワードを自分で作ることができる「codama」という商品を購入しました!

f:id:filot_nextd2:20211117122457j:plainf:id:filot_nextd2:20211117122454j:plain

 

こちらから購入できます

akizukidenshi.com

こんな感じ

f:id:filot_nextd2:20211117134337j:plain

箱には3つのパーツに分かれて入ってます

f:id:filot_nextd2:20211117135123j:plain


使ったもの

  • Raspberry pi 4B
  • codama
  • Raspberry pi スペーサー
  • イヤホン
  • mac(マイク代わり)

 

ラズパイのOSはbuster-arm64をいれています

問題ありませんでしたが32の方が良いかもしれません

 

早速組み立て

GitHubに初期設定のwikiがあり、公式ページリンクがあります

詳しく書いてくれているので戸惑うこともなくセットできます

 

取り付け方法はこちら

向きに気をつけて3つのパーツを差し込んでいきます

写真が掲載されてるので見ればわかる感じです

 

今回私はRaspberry pi 4Bを利用しましたが、熱くなるので
Raspberrypi用のスペーサー」があった方が良かったです

 

マニュアル通りにツールをダウンロードしてI2Cの設定をおこないます

codamaの認識を確認するために下のコマンドを実行しますがなかなか認識されなくて、一度シャットダウンしてラズパイ充電器のスイッチもOFFにして5秒くらい待ってからスイッチをON

起動してコマンドを打ったら認識されました

arecord -l

 

動作確認の録音では

arecord -c1 -fS16_LE -r16000 /tmp/test.wav

これだとエラーになってしまったのでこちらを使いました

arecord -D plughw:1,0 -f cd test.wav

がさがさした音が録音されたのでcdをつけました

問題なく動くことが確認できたので次へ進みます

 

ウェイクアップワードを作ってみる

セットアップページはこちら


方法は3通り

  1. PCとUSB接続するマイクとして使用する場合(オススメ)
  2. Raspberry PiとUSB接続するマイクとして使用する場合
  3. Raspberry PiとI2S接続するマイクとして使用する場合

1番を選びました

こちらも詳しく書いてくれているので、読んだ通りに進めていきます

白いジャンパーピンは小さいので無くさないように注意です!

 

説明にある通りここにChromeでアクセスしてウェイクアップワードの登録をおこないます

「こだま!」と声をかけたかったのですが、短すぎて登録できませんでした

「やぁ、こだま!」とすることで登録できました

 

イベントを取得してみる

pythonを使ってウェイクアップワードのイベントを取得してみます
ソースを消してしまったか上書きしてしまったようなので要点のみです、、

pythonは3.7.3を使っています

 

「ウェイクアップワード動作確認」の説明にある通り

codamaはウェイク・アップ・ワードの検出が行われると、GPIO27がHIGHになります

ということで

import RPi.GPIO as GPIO

をします

 

CODAMA_TRIGGERD_GPIO=27
GPIO.setmode(GPIO.BCM)
GPIO.setup(CODAMA_TRIGGERD_GPIO, GPIO.IN)
GPIO.add_event_detect(CODAMA_TRIGGERD_GPIO, GPIO.RISING, callback=detected)

これで立ち上がりを検出できます

 

コールバッグメソッドを用意してプリントされたらOK

def detected(value):
    print ("detected!")

 

(確かflaskを使ってサンプル画面表示をさせて確認をしたはず。。

 

声をかけると赤くライトが光るので反応してるのがわかりやすいです

f:id:filot_nextd2:20211118180727j:plain f:id:filot_nextd2:20211118180722j:plain

 

最後に

  • wikiページにも記載があり、公式ページがとても役に立ちます

 

  • 作業を中断して時間が経った後にウェイクアップワードで声をかけても全然反応しないことがありました
    動作確認をしてもエラーがでており、認識できていない様子でした
    Rebootではなく、再起動することで解消されました
    この時ラズパイの電源まで落としました
    こちらの方と同じ現象です

 

  • 私以外に部長がウェイクアップワードで声をかけましたが無反応でした
    登録した人の声じゃないと反応してくれないのかどうかは調べてないのですが、ダメなのかも?です
    私の声はちょっとワードを言えばすぐ拾ってくれて使いやすかったです

 

  • ドコモAIエージェントAPIは現在利用できなくなってるようです
    AgentCraft少しあいさつをするパターンを触ってみましたが簡単にできたので何かに使ってみたいですね

 

とりあえず、登録した私の声であればすぐ拾ってくれるのでSpeechToTextと組み合わせて何か作りたいです

脳波解析個人レベルプリプロセス(電極再基準化、条件分け)

↓前回

残りの個人レベルプリプロセスでは、
必要により、電極再基準化や、条件分けを実施する

電極再基準化

探査電極が基準電極から遠くなるほど電位差が大きくなるため、頭皮上電位分布の偏りを最小にするため、ある電極のデータをすべての電極のデータから差分すること。
頭皮全体を満遍なく覆えるほどの電極数や、均一に配置されている場合に使用可能。ただし再基準化により検討すべき信号が消失してしまう可能性もあるので、導入には要検討

条件分け

個人レベルでの比較において、条件差を検討、エクスポートする必要がある場合に実施

f:id:filot_nextd2:20210924174538p:plain

例として↑を条件分けする、S2、S3、S4のイベントがエポックに内在されている

 

S3(標準刺激)が出たエポックに絞る

f:id:filot_nextd2:20210929141121p:plain

 

S2(標的刺激)が出たエポックに絞る

f:id:filot_nextd2:20210929141219p:plain

抽出したデータをファイルで保存しておけば、条件比較が可能になる(eeglabの場合は.set形式のファイル)

 

 

脳波解析個人レベルプリプロセス(信号源推定)

↓前回

filot-nextd2.hatenablog.com

 

今回は抽出した成分を使用し、信号源推定を実施

推定方法としてダイポール推定を用いる

信号源が脳内のどこかにあると仮定し、脳内に仮定したダイポールで得られる頭皮上脳波データがどのように得られるかを推定し(順問題)、抽出した独立成分の頭皮上電位分布図と一致するか調べていく方法

推定時に使用する頭部モデル(今回はMotreal Neurological Instituteで作成された頭部のMRIデータ)を選択し、頭部モデルの空間座標と、サンプルデータの電極位置の空間座標を互換化する

f:id:filot_nextd2:20210928161559p:plain

↑今回はAuto selectを選択し、データとモデルで同じ名前のチャンネルが自動でペアリングされる。EEGLABのチャンネルで設定されているチャンネル名と揃えてる必要がある。揃っていない場合は、手動で設定

 

f:id:filot_nextd2:20210928175206p:plain

↑設定後

なお、推定には前記事で抽出した独立成分を使用する

 

f:id:filot_nextd2:20210928182700p:plain

f:id:filot_nextd2:20210928182708p:plain

f:id:filot_nextd2:20210928182716p:plain

f:id:filot_nextd2:20210928183031p:plain

↑標準のMRI画像に、推定された信号源の位置および方向をプロットした図

 

次回残りの個人測定プリプロセスについて記載

脳波解析個人レベルプリプロセス(独立成分分析)

解析手法を複数回に分けて記載する

↓前回

filot-nextd2.hatenablog.com

今回は、独立成分分析に関して記載

独立成分分析の適用

脳波は以下のように取得できる

f:id:filot_nextd2:20210924174538p:plain

各電極ごとの、基準電極との電位差が取得できるのだが、
この電位は多方向からの信号が混ざったものである

例えば以下の10/20法を例にしてみる

f:id:filot_nextd2:20210927141240p:plain

後頭部の電極O1付近の波形(電位差)が大きく動いていたとしても、

その信号源は、O1直下とはいいきれない

f:id:filot_nextd2:20210927141926j:plain

信号源がT5かもしれないし、Pz、O2、もしくは全てかもしれない

あくまで電極から収集できるのは基準電極との電位差だからだ

 

そこで、信号を分析するために、独立成分分析を使用する

ものすごくざっくり言ってしまうと、混ざった信号から、信号を独立して抽出すること

↓イメージ

f:id:filot_nextd2:20210927143527p:plain

これを脳波解析時に使用する

EEGLAB上で↑の脳波のデータに対して独立成分分析(ICA)を適用してみると

f:id:filot_nextd2:20210927143831p:plain

↑このように、信号の抽出が可能

 

f:id:filot_nextd2:20210927144500p:plain

↑各成分が時系列上でどう影響しているかも確認可能

 

次回、ダイポール推定について記載する

指の側面の触覚を調べてみる

 

はじめに

普段触れているもので硬いもの、柔らかいものを想像して人差し指で抑えるように想像してみてください

硬いものであれば指の側面には何も触れず、柔らかいものであれば物体が触れるような感覚があると予想できます

f:id:filot_nextd2:20210922153237j:plain

 

また、下図のように凹凸があるものに対して指を横に動かすと指の側面に凹凸を感じると思います

f:id:filot_nextd2:20210922153002j:plain

このように触覚には指の腹だけではなく側面の感覚も重要なのではないかと考え調べてみました


二点弁別閾

二点弁別閾とは皮膚の表面に触れる2点のものが2点であると感じられる感覚の最小の値のことです

触れた2つの間隔が狭ければ1点と感じるそうです

指先の2点弁別閾は年齢で異なるようですが、おおよそ2~3mmとなります

高齢者であれば5mmほどとなるそうです

指の側面に言及したものはあまり見つかりませんでしたが、指の腹よりは側面の方が間隔が広くなるようでした

背中となると4~5cmほどになるそうなので指の感覚は鋭いようです

 

 

触覚受容器

以前触覚について調べて見たことがあるのですが、指の側面も指の腹と同じ受容器で検知するようです

filot-nextd2.hatenablog.com

 

指側面の触覚は荒さに通じるのではないか

web上で調べたところ指側面の触覚に関しての記事はあまり見つかりませんでした

今回指側面の触感が重要なのではないかと考えて調べてみることにしましたが、結局「荒さ」を検知することに通じたことなのではないかと考えるようになりました

「ざらざら」した触感というのが指を上部から圧迫する感覚とそこに凹凸があるという感覚が必要なはずです

f:id:filot_nextd2:20210927143622p:plain

横に動かさず、上からの圧迫のみであればどこに圧がかかっているのかを指が感知していればそれだけで凹凸があるという触覚になるはずです

これはSAIについて調べている論文を読みました

指側面に触れることで物質の柔らかさの表現になると思いましたが、これは「ざらざら」の表現の延長線上の話だと思い、結局側面に注目して調べる必要はないのでは?という結論に達しました、、、

 

 

 

脳波解析個人レベルプリプロセス(エポックリジェクション)

解析手法を複数回に分けて記載する

解析の流れ

従来のオーソドックスな方法を記載すると以下になる

  1. 脳波計を使用し、データを取得(電極間の電位差や周波数変化等)
  2. 解析するためのプリプロセスを実施
  3. 抽出した成分に事象関連電位(ERP)、時間周波数分析、ICA(独立成分分析)クラスタリング等を行い解析

今回はサンプルデータを使用し、プリプロセスのエポックリジェクションを実施するまでを記載する

参考資料

使用するツール

サンプルデータの内容

  • 実験参加者数:4人
  • 実験実施内容:オドボール課題
    (頻度高の標準刺激と頻度低の標的刺激をランダムに呈示し、標的刺激に向けられる反応を見るための課題)
  • 刺激呈示頻度:標準刺激(以降Sとする)120回につき、標的刺激(以降Tとする)30回、モニターに表示
  • 刺激呈示後アクション:ボタンを、Sであれば中指、Tであれば人差し指で押す
  • イベントマーカー:SはS3、TはS2、ボタン押し反応はS4として、イベント情報が潜時(呈示された時刻)に記録
  • 刺激呈示時間:刺激呈示時間が200ms、その後1800ms(2秒間の呈示サイクルが繰り返される)
  • 電極数:32 (32極目は眼電モニタリング用に左目尻付近に設置)
  • 基準電極:Cz (電位差を取得するための基準とする電極)
  • 収録時サンプリング周波数:200Hz
  • 収録時フィルタ:0.016Hzハイパスフィルタ

プリプロセス概要

個人レベル解析の場合

  1. データインポート
  2. ダウンサンプリング
  3. データのフィルタリング
  4. 電源ノイズの低減
  5. 電源情報の登録
  6. ノイズの多い電極の除外
  7. エポッキング
  8. エポックリジェクション
  9. 独立成分分析
  10. ダイポール推定
  11. 電極の再基準化
  12. 条件付け

集団レベル解析の場合は後日記載

実施内容

  1. データインポート
    サンプルデータをEEGLABにインポート
  2. ダウンサンプリング
    ※PCにより計算量を抑える必要があれば実施
  3. データのフィルタリング
    ・データの周波数帯域を設定
     今回はナイキスト周波数にする
    ・ハイパスフィルタを適用(1Hz)
     発汗などによる1Hz以下の周波数での頭皮上電位分布の推移を除き、独立成分分析をうまく機能させるため
  4. 電源ノイズの低減
    ・ローパスフィルタを設定(50Hz or 60Hz)
     ※シールドルーム外で実施する場合に設定することがあるが、最近だと独立成分分析を利用して除去するケースもある
    CleanLineなどのツールで低減する
     商用電源のノイズ波形に対して当てはまりの良いサイン波を推定して差分
     ※実際にはローパスフィルタを設定しない場合に使用
  5. 電源情報の登録
    ・頭部モデルの設定
     頭部モデルとは、信号源を与えた際に頭皮上で電位がどう伝播するのか、その仕方を決定するモデルであり、主にEEGLABでは3種類選択可能
     ・BESA
      4層(頭皮、頭蓋骨、脳脊髄液、脳実質)の球体で構成されてる
     ・MNI
      メッシュで構成されてるMotreal Neurological Instituteモデル、解剖学的妥当性が高い
     ・spherical
      眼電をモニタリングする電極を含めた球体
     今回はMNIを選択
    ・電極情報の読み込み
     今回はサンプルデータに事前に電極情報が登録されている。
    電極装着時、電極の実際の空間位置を計測してた場合は、そのデータを使うが、そうでない場合は電極名に従って10-5法にて定義されている電極の位置情報を設定する。なお電極の命名方法が10-5法に準拠していれば、EEGLABが自動的に実施する(実際によく使われるのは10/20法)

    f:id:filot_nextd2:20210922144002p:plain

    f:id:filot_nextd2:20210922144033p:plain

  6. ノイズの多い電極の除外
    今回のサンプルデータで実施する必要はないが、後続の信号源推定、独立成分分析等で結果に影響を及ぼすため、判明した段階で除去することが望ましい
  7. エポッキング
    刺激呈示前何秒から刺激呈示後何秒までといった時間窓をエポックという。
    条件ごとにエポックを揃え治すことで、事象関連電位(ERP)の条件間比較が容易になる。今回はS2、S3を対象としてエポックを生成するようにする

    ここまで準備することで
    ↓のように参照できるようになる

    f:id:filot_nextd2:20210922163723p:plain

  8. エポックリジェクション
     ノイズを含むエポックを削除する。総エポック数のなるべく10%におさめるのが理想。最悪30%以内。
    リジェクトの指針としては「急峻かつ過大」「空間分布が異常(単一電極に限られる、逆に過度に全体的)」の、両方にあてはまるもの。これらは生体電気活動以外に由来する電位変化と考えられるため。筋電や眼球運動などは「急峻かつ過大」に該当するが、空間分布としては異常性は無いので、独立成分分析で分離可能なので、ここでリジェクトすべきではない。

    :例

    f:id:filot_nextd2:20210922164436p:plain

    ↑この各電極のデータをまず縦軸に1つにまとめる

    f:id:filot_nextd2:20210922164622p:plain


    ↑まとめる前と見比べてみると、Fp1、Fp2の眼球付近の電極が反応してることがわかる。
    ただしこれを、全試行データをもとに標準化すると、↓こうなる

     

    f:id:filot_nextd2:20210922165236p:plain

    Fp1, Fp2付近に現れていた電位差が少なくなった、これは、全試行に満遍なく表れていることを示していて、全体的に見ると特に異質ではないといえる。よってこの段階でリジェクトするべきではない。

    統計を用いた方法は別の機会に記載。


    次回、独立成分分析以降を記載。