この記事は Qiita Advent Calendar 2025 - 時系列データ の3日目の記事です。
はじめに
前回の記事では、欠損だらけのデータではありますが、グラフ化しました。
今回は「そもそもこのデータの指標はなんなのか?」という話をします。
AIに激しく心配された
PCのカメラで自分の健康状態がわかればいいなと思い、最初は手っ取り早く 「自撮り画像をAI(LLM)に投げて判定してもらう」 というアプローチを試しました。
結果は、
「とても眠そうです。今日はもう仕事をやめて今すぐ休息をとってください。あなたのことが心配です」
と、過剰な心配をしてもらって、それはそれで気分が良かったのですが、全然客観的ではありませんでした。たぶんまばたきの瞬間などを見て「疲れている」「眠そう」とか判定しているようです。クセ毛のことを「見るからに疲れ果てた様子で」などと言われました。落ち武者のように見えたのでしょう。
客観的な疲労の指標を調べ、 PERCLOS と EAR をみつけました。
動画が必要
人間は眠くなると当然目を閉じる時間が長くなります。疲労度の測定ではこれが指標として使われているようです。しかし静止画でたまたま目を閉じていると「疲れている」と判定されてしまいます。そこで動画での計測が必要になります。
- 正常なまばたき: 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 = \frac{||p_2 - p_6|| + ||p_3 - p_5||}{2 \times ||p_1 - p_4||}
$$
仕組みはシンプルで、目の周りのランドマーク(特徴点)の「縦の距離」と「横の距離」の比率を見ます。
カメラとの距離が変わっても、顔との比率なので影響を受けにくいというメリットがあります。
多くの実装を参考に、EAR 0.2 をPERCLOSの「80%閉眼」とみなして使用しました。
PERCLOSとEARのまとめ
- 動画の全フレームを見る
-
EAR < 0.2のフレーム数をカウント -
(閉眼フレーム数 / 全フレーム数) * 100が PERCLOS値 - これが
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. データは即削除
動画データはディスク容量を圧迫します。
- 動画を撮影
- Pythonで読み込んで PERCLOS を計算
- 数値データをDB (sqlite) に保存
- 動画ファイルは削除
このようにして長期間のライフログを取りました。
まとめ
時系列データを集めるためには、事象をデータ化する必要がありますが、「どのように運用するか」の計画が重要です。記録時間だけでなく、処理時間や記憶容量、データ帯域や通信コストが課題になることもありますね。今回は比較的短い記録ですが、これが長期間になり、さらに複数人からの記録となるとさらに課題は増えていきます。
−−−
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
