眠気を計測するアプリをClaude Codeでつくってみた.

はじめに

昔、JINS MEMEという集中力を計測するデバイスをつかってポモドーロテクニックにおける各セッションのパフォーマンス評価をすることに熱中していた. あれをまたやりたいと思ったのだが、残念ながら JINS MEMEは販売終了した1.

集中力計測で、目電位(EOG)をつかうのはとてもいいセンスだった. カフェで脳波計は恥ずかしいし、実用的ではない. 後継も販売されてない、EOGを使える他のデバイスもない. もうだめだと思ってクロードくんに相談してみたところ、Webカメラによる画像判定技術が EOGの代替としてつかえるとのこと.

Webカメラによる覚醒度判定は、PERCLOSという指標が使えそうだ. 2 車運転の眠気チェックでよくつかわれているようだったが、用途がリアルタイム監視ではなく、ポモドーロの間にサクッとスポット計測できるアプリが欲しかった. 既存アプリではみつかなかんたので、サクッとつくってGitHubにデプロイしてみた.

PERCLOS指標とは

眠気検出の標準指標

PERCLOS (Percentage of Eye Closure) は、一定期間内で目が閉じている時間の割合を計測する指標。米国運輸省などで採用されている標準的な疲労検出手法.

アルゴリズムは以下の通り。

  • PERCLOS = (閉眼時間 / 測定時間) × 100

判定基準は次のようになっている。

  • PERCLOS < 15%: 正常
  • 15% ≤ PERCLOS < 20%: やや疲労
  • PERCLOS ≥ 20%: 疲労

EAR (Eye Aspect Ratio) による目の開閉判定

目が閉じているかどうかの判定には、EAR(Eye Aspect Ratio)という指標を使用する。これは顔のランドマーク検出で得られる目の周囲の座標から計算される値で、目が開いているときは大きく、閉じているときは小さくなる。

本アプリでは、EARが0.2未満の場合を「目が閉じている」と判定している。

デモ

実際に動いているデモはこちら。

https://tsu-nera.github.io/sleepy_checkr/

カメラへのアクセス許可を求められるが、すべての処理はブラウザ内で完結しており、映像データは外部に送信されない。なお、カメラは恥ずかしいのでデフォルトではUI表示はOFF.

技術スタック

  • TypeScript: 型安全な開発のため
  • Vite: 高速な開発環境とビルドツール
  • MediaPipe Face Mesh: Googleが提供する顔のランドマーク検出ライブラリ
  • Web Camera API: ブラウザのカメラアクセス

おわりに

人間工学的アプローチでポモドーロ2.0へ

30秒でサクッと眠気計測という目的は達成できたようだ. 以前やってたことは、Notionをつかって1ポモごとに主観的評価や心拍数やらJINSスコアやらを記録していた.

呼吸を計測するガジェッド spire stoneでポモドーロは加速する! | Futurismo

次のステップとしては、ポモドーロアプリ開発をやりたい. JINS MEMEを再現させるならば、リアルタイム計測が必要で、この場合は視線の安定性や向きなど、瞬き以外の指標の研究も必要. ただ、30秒のスポット計測でも簡易版としてはやりたいことを満たしている。

よく、果たしてポモドーロテクニックにおける25分の根拠はあるのか?(ないだろ)とおもう. しかし、一方で、ポモドーロテクニックとは、なんとも工学的な方法だと思う. 時間を1ポモドーロという標準化によって整えることで、単位時間あたりの計測が可能となる. さらにもっといえば、人間工学的なアプローチでポモドーロを進化させたい. ポモドーロ2.0へ.

今回も自分はなにもコードをかかないでできてしまった

こういうアプリで、以前も tensowflow-jsを組み込んだアプリ、イケメン判定というなんともブサイクが不細工な顔で怒りそうなものを開発したことを思い出した.

TensorFlow.jsでイケメン判定サービスを開発しました | Futurismo

情けないことにもうReactとかかけないが、それでも爆速でアプリが完成してしまった. なお今回もわたしはコードは書いてないが、ユーザテスト参加者として貢献した、はあ.

参考リンク


  1. https://x.com/jins_meme ↩︎

  2. PERCLOS: A Valid Psychophysiological Measure of Alertness ↩︎