1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

疲労度の時系列データを可視化してみた②(PERCLOS / EAR)

Last updated at Posted at 2025-12-02

この記事は Qiita Advent Calendar 2025 - 時系列データ の3日目の記事です。

はじめに

前回の記事では、欠損だらけのデータではありますが、グラフ化しました。

今回は「そもそもこのデータの指標はなんなのか?」という話をします。

AIに激しく心配された

PCのカメラで自分の健康状態がわかればいいなと思い、最初は手っ取り早く 「自撮り画像をAI(LLM)に投げて判定してもらう」 というアプローチを試しました。

結果は、

「とても眠そうです。今日はもう仕事をやめて今すぐ休息をとってください。あなたのことが心配です」

と、過剰な心配をしてもらって、それはそれで気分が良かったのですが、全然客観的ではありませんでした。たぶんまばたきの瞬間などを見て「疲れている」「眠そう」とか判定しているようです。クセ毛のことを「見るからに疲れ果てた様子で」などと言われました。落ち武者のように見えたのでしょう。

客観的な疲労の指標を調べ、 PERCLOSEAR をみつけました。

動画が必要

人間は眠くなると当然目を閉じる時間が長くなります。疲労度の測定ではこれが指標として使われているようです。しかし静止画でたまたま目を閉じていると「疲れている」と判定されてしまいます。そこで動画での計測が必要になります。

  • 正常なまばたき: 0.1〜0.4秒程度で開く
  • 眠気による閉眼: ゆっくり閉じて、長く閉じたままになる

つまり、「一定時間の中で、どれくらいの割合で目が閉じていたか」 というデータを使います。

眠気の指標:PERCLOS(パークロス)

そこで登場するのが PERCLOS (Percentage of Eye Closure) です。

PERCLOSは1994年、Wierwilleらの研究で提案されました。当時から現在まで、眠気検出のスタンダードとして広く引用されています。原理は単純で

「直近3分間で、目が80%以上閉じていた時間は何%?」

「まばたきの回数」より、この「閉じていた時間の割合」の方が、眠気やパフォーマンス低下と強く相関することが報告されています。

Wierwille (1994) の研究およびDasgupta et al. (2015) を参考に、「PERCLOSが 15% を超えたら眠い」と判定することにしました。

目の開き具合を測る:Eye Aspect Ratio(EAR)

「目が80%閉じている」を画像から正確に計測するのは難しい問題です。瞳孔の隠れ具合を厳密に測定するには、高解像度のカメラや特殊な照明が必要になります。

2016年、SoukupováとČechが実用的な解決策を提案しました。顔のランドマーク検出を使った EAR(Eye Aspect Ratio) です。

ear_landmarks.png

$$
EAR = \frac{||p_2 - p_6|| + ||p_3 - p_5||}{2 \times ||p_1 - p_4||}
$$

仕組みはシンプルで、目の周りのランドマーク(特徴点)の「縦の距離」と「横の距離」の比率を見ます。

カメラとの距離が変わっても、顔との比率なので影響を受けにくいというメリットがあります。

多くの実装を参考に、EAR 0.2 をPERCLOSの「80%閉眼」とみなして使用しました。

PERCLOSとEARのまとめ

  1. 動画の全フレームを見る
  2. EAR < 0.2 のフレーム数をカウント
  3. (閉眼フレーム数 / 全フレーム数) * 100 が PERCLOS値
  4. これが 15 を超えたら 「Drowsy(眠い)」

実装の工夫:PCを重くしないために

理論はわかったのですが、実装しようとするとつまづきがありました。Python (OpenCV) で動画を撮影していましたが、動画がうまく撮影できていないときや、処理に異常に時間がかかることがありました。バックグラウンドで処理するものなので、他のプロセスが干渉していたのかもしれません、原因はあわかりませんでした。

そこで、以下のような運用にしました。

1. ffmpegで「切り出し撮影」

Pythonではなく、軽量な ffmpeg コマンドをサブプロセスで呼び出して録画します。

# 3分間(180秒)録画して終了するイメージ
ffmpeg -f avfoundation -i "0" -t 180 -r 30 output.mp4

2. 頻度の調整

何分で計算処理を終えたか、というログを数時間取り、他の作業をしていても負担のない間隔を設定しました。結局 「1時間に4回(15分おき)」 に設定。もっと高頻度でも可能でしたが、余裕をもたせたということと、これ以上の時間解像度は不要と判断しました。

3. データは即削除

動画データはディスク容量を圧迫します。

  1. 動画を撮影
  2. Pythonで読み込んで PERCLOS を計算
  3. 数値データをDB (sqlite) に保存
  4. 動画ファイルは削除

このようにして長期間のライフログを取りました。

まとめ

時系列データを集めるためには、事象をデータ化する必要がありますが、「どのように運用するか」の計画が重要です。記録時間だけでなく、処理時間や記憶容量、データ帯域や通信コストが課題になることもありますね。今回は比較的短い記録ですが、これが長期間になり、さらに複数人からの記録となるとさらに課題は増えていきます。

−−−

 Qiita Advent Calendar 2025 - 時系列データ 4日目も何か書きます


参考リンク

  • Dasgupta et al. (2015) "A Vision Based System for Monitoring the Loss of Attention in Automotive Drivers" arXiv:1505.03352
  • Soukupová & Čech (2016) "Real-Time Eye Blink Detection Using Facial Landmarks" CVWW 2016
  • Sleep Advances (2023) "PERCLOS-based technologies for detecting drowsiness: current evidence and future directions" Oxford Academic
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?