1.1 研究の背景と目的
新型コロナウイルスの流行により血中酸素濃度が注目されている。肺炎になっ た場合血液中の酸素が不足し,酸素飽和度が低下するため新型コロナウイルス の感染判断目安になり得るからである。厚生労働省の新型コロナウイルス感染症 (COVID-19)診察の手引き[1]では酸素飽和度が93%以下なら呼吸不全あり等と 数値で定義されている。これはパルスオキシメータを使用することで測定可能であ るが,数値で示されても何%以下が危険か知らなければいけないためわかりにく い。そこで本研究では,鏡の前に立つと自身の顔に健康状態が可視化されるという ような,直感的な健康可視化システムを提案する。これによりニューノーマル時代 の健康管理の一助になることが本研究の目的である。
1.2 研究の概要
本研究では,鏡の前に立つと,血中酸素濃度を用いて自身の顔に健康状態が可視 化されるというような,直感的な健康可視化システムを開発した。
血中酸素濃度を測定し送信するO2Touchは,シングルボードコンピュータとし てArduino互換機KEYESTUDIO⊔KS0486,指用パルスオキシメータモジュール としてSparkFun⊔SEN-15219を使用した。これらを一つの装置として収納するた めの筐体は,OpenSCAD 2021.01を使用して設計した。その際,ケース部分,蓋部 分,パルスオキシメータモジュール固定用蓋部分と,別個に設計し,それぞれ3D プリンタによって出力を行い組み立てた。ソフトウェアの実装は,Arduino IDE 1.8.5とSparkFun Bio Sensor Arduino Libraryで行った。血中酸素濃度を検出し たらその値を文字列としてUSB ケーブルを通じてO2Mirrorにシリアル送信を行 うようにした。
受信側であるO2Mirrorは,PC,液晶ディスプレイ,WebカメラLogicool C615n で構成されており,ディスプレイを鏡と見立てる。ソフトウェアの実装は,C++, Dlib 19.22,DXライブラリ 3.23,OpenCV 4.2で行った。受信にはezSerialLib⊔
1.4.0を用いた。カメラはユーザを向いて設置し,映像は左右反転しディスプレイ
にフルスクリーン表示した。これにより血中酸素濃度を受信するまでは単なる鏡と して動作する。値を受信すると,ディスプレイ左上に血中酸素濃度を表示するよう にした。またそれがが93%以下の場合は以下の動作を行った。まずDlibで顔認識 を行い,顔のランドマークを検出した。これにより目の位置等が特定でき,目には バツ印,口には咳のアイコンを描画するようにした。これらをミラー・ユーザ間の 距離に応じて動的に大きさを変化させることで違和感を少なくした。
実験は正常な血中酸素濃度の場合と,血中酸素濃度が93%以下を想定して行っ
@@CHECKED@@
本章では,研究に用いたパルスオキシメータ,KEYESTUDIO⊔KS0486,ezSe- rialLib,Dlib,DXライブラリ,OpenCVについて説明する。
※ 順番が変。@@CHECKED@@
2.2 パルスオキシメータ
パルスオキシメータ[2]とは,皮膚を通して採血することなく動脈血酸素飽和度 と,脈拍数を測定する装置である。新型コロナウイルス感染症患者の自宅療養の 際に使用されるなど,新型コロナウイルスが流行している中で ,感染判断の目安 等に欠かせないものとなっている。図 2.1に今回使用したパルスオキシメータモ ジュールSparkFun⊔SEN-15219の画像を示す*1。
図2.1: SparkFun⊔SEN-15219
@@CHECKED@@
*1SparkFun, CC BY 2.0.
@@CHECKED@@
2.3 KEYESTUDIO⊔KS0486
KEYESTUDIO⊔KS0486[5]とはシングルボードコンピュータの Arduino互換 機である。Arduino UNO R3と比較し,USB Type-Cでの接続,I2C接続,3.3Vお よび5Vの出力をスイッチで変更可能等様々な改良や拡張が施されている。図2.2 にこれらを比較したものを示す。*2。図 2.3 に今回使用したシングルボードコン ピュータKEYESTUDIO⊔KS0486の画像を示す。
図2.2: Arduino UNO R3との比較
*2[6]より引用
@@CHECKED@@
2.4 ezSerialLib
ezSerialLibとは,シリアル通信を簡単にするために,本研究室で開発されたC++
用ライブラリである。Arduino等のシングルボードコンピュータと PCをシリア ル接続する際,プログラミングではCOM ポートを扱うための複雑な知識が必要 となる。ezSerialLibはこれを抽象化するものである。本研究ではKEYESTUDIO
⊔KS0486が仮想シリアルポートとして認識されるため,KEYESTUDIO⊔KS0486 とのシリアル通信に利用している。
@@CHECKED@@
2.5 Dlib
※ ライブラリは行うものではない。@@CHECKED@@
Dlib[3]とは C++言語で書かれたソフトウェアライブラリである。顔認識等の 画像処理ライブラリを高速に行える利点がある。図 2.4にDlibを用いた顔認識の サンプルを示す。このようにWebカメラを用いて,リアルタイムで顔認識を行う ことができる。またある程度顔の位置がわかっていればよいため,正面だけでな く,少し横を向いた状態,マスクを少し下げた程度でも認識が可能である。図2.5, 図 2.6 にそれぞれ顔認識を行った様子を示す。また画像を用いての顔認識も可能 である 。
図2.4: Webカメラを用いた顔認識の実行結果画像
@@CHECKED@@
2.6 DX ライブラリ
DXライブラリ[4]とはコンピュータゲーム開発用のC/C++言語用のライブラ リである。スクリーン表示や画像描画など,キオスクシステムの構築に有用であ る。ライブラリ独自の仕様が少なく,C言語の知識だけでも扱えるように工夫され ている。図2.7にDXライブラリでの画像描画例を示す。
図2.7: DXライブラリでの画像描画例
@@CHECKED@@
3.1 緒論
本章では,O2Touchの仕様,筐体の設計,O2Mirrorの仕様,実装,実験,考察 について述べる。
3.2 本研究で提案する O2Mirror
※ 仕様には実装を書かない@@CHECKED@@
図 3.1 にO2Mirrorの使用イメージを示す。ユーザはO2Touchに指を置き,ミ ラーに自分の姿を映す。パルスオキシメータモジュールSparkFun⊔SEN-15219と,
Arduino互換機KEYESTUDIO⊔KS0486を収めた箱,血中酸素濃度が93%以下 の場合,鏡に映る自分の目や口に不健康を表す表現が重畳表示される。
oxygen:93
図3.1: O2Mirrorの使用イメージ
@@CHECKED@@
3.3 実装
本研究のシステムは,指の血中酸素濃度を測るO2Touchと,健康状態をディス プレイに表示するO2Mirror からなり,これらは USB ケーブルにより有線通信 する。
3.3.1 O2Touch 作成
O2Touchでは,パルスオキシメータモジュールSparkFun SEN-15219で血中酸 素濃度を計測し,これにI2C接続したArduino互換機KEYESTUDIO KS0486で その値を取り込む。またそれをO2MirrorへとUSBケーブルを通じてシリアル送 信する。
ソフトウェアの実装は Arduino IDE 1.8.15 とSparkFun Bio Sensor Arduino Libraryを使用し,参考文献[7]のExample1からExample4を参考にして作成し た。今回使用したパルスオキシメータモジュール SEN-15219では,血中酸素濃度 を測定する際に,指を置いてからすぐに血中酸素濃度が検出される訳ではなく,数 秒間必ず0という値が検出される。そのため血中酸素濃度が0の場合はO2Mirror へは送信しないものとした。血中酸素濃度を検出し始めたらそれをO2Mirrorへと 送信する。ただし本研究では,将来の拡張を見越して心拍数も同時に送信すること とした。この2つの値を同時に送信するために,専用のプロトコルを設計した。具 体的には,これらをカンマをデリミタとして結合し,その文字列を1パケットとし てO2Mirrorに送信するようにした。
O2Touch では専用の筐体を設計製作した。設計は OpenSCAD2021.01 で行っ た。筐体としてケースと蓋を設計した。ケースにはUSB コネクタ用の穴を開け,
蓋はパルスオキシメータモジュールSEN-15219のセンサ部分のみ露出するような 設計としし,同モジュールSEN-15219は蓋に固定するようにした。そのため蓋の 裏側に露出するセンサ部分に,幅5mmの突起を2つ付け,その突起と合わせて,
同モジュールSEN-15219を上から押さえて固定するための蓋を別途設計した。
図 3.2にケースの3Dモデル,図 3.3,図 3.4に蓋の3Dモデルの表と裏,図 3.5 にパルスオキシメータモジュールSEN-15219固定用蓋の3Dモデルを示す。図 3.6 に蓋とパルスオキシメータモジュールSEN-15219固定用蓋を合わせた3Dモデルを 示す。
@@CHECKED@@
図3.2: ケース3Dモデル
@@CHECKED@@
※ 配置指定オプションは[p]のみ@@CHECKED@@
図3.3: 蓋3Dモデル表
※ 配置指定オプションは[p]のみ@@CHECKED@@ @@CHECKED@@
図3.6: 蓋パルスオキシメータモジュール SEN-15219固定用蓋を合わせた3Dモデル
※ ここでYclearpage@@CHECKED@@
図 3.7にケースの三面図,図 3.8に蓋の三面図,図 3.9にパルスオキシメータモ ジュール SEN-15219固定用蓋の三面図を示す。
@@CHECKED@@
100.00
30 .0 0 11 .0 0
19.00 70.00
10.50
5.0 0
5.0 0
5.00
8.4 9
30.66
45.33
23 .0 0
13 .4 9
43 .5 1
4.0 0
10.01
※ 同 じ フ ォ ル ダ にcase.pdfと case.pngが あ る の で サ イ ズ 判 定 が 狂 う 。拡 張 子 以 前 が 同 じ 名 前 の フ ァ イ ル を 複 数 置 か な い 。ど ち ら か を リ ネ ー
ム@@CHECKED@@ @@CHECKED@@
図3.7: ケースの三面図
95.40
5.0 0 65
.4 0
8.00
5.0 0
20 .0 0
5.00 27.70
22 .7 0
22 .7 0
5.0 0
※ 同@@CHECKED@@ @@CHECKED@@
図3.8: 蓋の三面図
16.00
5.0 0
3.0 0 20
.0 0
8.00
4.0 0
※ 同@@CHECKED@@ @@CHECKED@@
図3.9: パルスオキシメータモジュール SEN-15219固定用の蓋三面図
※ ここでYclearpage@@CHECKED@@
これらの3DモデルをスライスソフトウェアQidi Print 5.5.5でgcode化し,3D プリンタQIDI X-Smart により出力した。フィラメントには DARCOS製 PLA 1.75mm径 スイカレッドを使用した。
3Dプリント出力結果として,図3.10にケース,図 3.11と図3.12に蓋の表と裏,
図3.13 にパルスオキシメータモジュール SEN-15219を固定するための蓋を示す。
図 3.14に実際に蓋とパルスオキシメータモジュール SEN-15219用蓋でパルス オキシメータモジュール SEN-15219を固定したもの,図 3.15にケースに実際に KEYESTUDIO⊔KS0486を固定したものを示す。
図 3.16にこれらを組み立て作成したO2Touchの図を示す。それぞれはねじで 固定されている。O2Touchの中は図 3.17 のようになっており,KEYESTUDIO
⊔KS0486とパルスオキシメータモジュール SEN-15219は,I2C接続されている ため,パルスオキシメータモジュールSEN-15219固定用蓋には,それらを接続す るためのQwiicコネクタ用の隙間を設計してある。O2Touchの裏には測定する際 に滑りにくいように,ゴム足を接着した。その様子を図 3.18 に示す。図 3.19に USBケーブルを使用し,PCと接続した様子を示す。
@@CHECKED@@
図3.10: 3Dプリントされたケース
@@CHECKED@@
※ 配置指定オプションは[p]のみ@@CHECKED@@ @@CHECKED@@
図3.11: 3Dプリントされた蓋 表
@@CHECKED@@
図3.12: 3Dプリントされた蓋 裏
@@CHECKED@@
図3.13: 3Dプリントされたパルスオキシメータモジュール SEN-15219固定用蓋
図3.14: パルスオキシメータモジュール SEN-15219を固定したもの
@@CHECKED@@
図3.15: KEYESTUDIO⊔KS0486を固定したもの
@@CHECKED@@
@@CHECKED@@
図3.16: 組み立て作成したO2Touch
図3.17: O2Touchの中の様子
図3.18: O2Touchの裏にゴム足を接着した様子
@@CHECKED@@
図3.19: PCと接続した様子
表 3.1にO2Touchの全ての部品リストを示す。@@CHECKED@@
※YtinyをYscriptsizeに@@CHECKED@@
表3.1: O2Touch部品リスト
部品名 メーカ/型番 数量 購入先
シングルボードコンピュータ KEYESTUDIO/KS0486 1 Amazon
パルスオキシメータモジュール SparkFun/SEN-15219 1 スイッチサイエンス
qwiicケーブル Qwiic-4ピンメス 1 自作
筐体 3Dプリント 1 自作
ねじ Wilco/F-0204EB-B1 10 Wilco
ゴム足 タカチ/B-PG41 4 モノタロウ
@@CHECKED@@
3.3.2 O2Mirror 作成
O2Mirrorの作成はPC,ディスプレイ,WebカメラLogicool C615nからなり,
ディスプレイを鏡に見立てる。(改段落)
ソフトウェアの実装は,C++,Dlib 19.22[3],DXライブラリ3.23[4],OpenCV 4.2[6]で行った。受信にはezSerialLib⊔1.4.0を用いた[8]。(改段落)
Web カメラLogicoolC615nはユーザを向いて設置してあり,OpenCV により キャプチャする。キャプチャ映像をOpenCVにより左右反転し,DXライブラリ を用いてディスプレイにフルスクリーン表示することで,通常は単なる鏡として動
作する。O2Touchからパケットを受信したらこれをパースし,血中酸素濃度を取
り出す。(改段落)
血中酸素濃度が93 より大きい健康な状態の場合は,左上に血中酸素濃度を
「oxygen:98」のように表示し,それ以上の情報提示は行わない。表示に使用した
フォントは超極細ゴシック体[9]である。(改段落)
血中酸素濃度が 93%以下の不健康状態だった場合は以下の動作を行う。まず Dlibで顔認識を行うことで顔のランドマークを検出する。顔のランドマークを 図3.20に示す。*1ランドマークの座標を利用して,目にはバツ印,口には咳のアイ コンを描画するようにした。従ってユーザが顔を動かせばこれらの表示はそれに リアルタイムに追随するので,自分の顔そのものに変化が生じているように見え る。またこれらはユーザ・ミラー間の距離に応じて,大きさが変化するようになっ ている。
図 3.21に目のバツ印の描画方法を示す。検出できる各ランドマークには番号が あり,目に関しては右目外側目尻が37番,右目内側目尻が40番,左目内側目尻が 43番,左目外側目尻が48番である。ただし本研究では左右反転しているため右目 と左目は実際は逆になっている。 バツ印の各端点を図3.21のように点$a$から点
$h$とする。(これ以降点名等の書き方は同様)これらの座標は目のランドマーク座標から算 出する。左目の両目尻間からその中点までの距離を$Ymathit{disleft}$,右目
のそれをdisright とすると,点aから点hの座標は以下のようになる。
• a(x37, y37−disleft)
• b(x40, y40−disleft)
• c(x40, y40+disleft)
• d(x37, y37+disleft)
• e(x43, y43−disright)
*1i・bug-resoures-300 Fases In-the-wild challenge(300w)より引用
@@CHECKED@@
• f(x46, y46−disright)
• g(x46, y46+disright)
• h(x43, y43+disright)
これらを使用することで,顔が動いても,大きさが合うようになっている。
咳の描画には6番と12番のランドマークを使用した。また最初にカメラに映っ た場所の,6番と12番のそれぞれのx座標間の差を基準値とし,毎フレームごとに その差を求める。これにより基準値より小さい場合は咳のアイコンも小さくさせる ことで,描画の違和感を少なくした。
※ 強制改行YYを文中で使用してはいけないことはScrapboxで解説している@@CHECKED@@
Dlibの顔認識APIは複数認識が可能だが,本研究ではそのうち第0番の顔情報 のみを利用することで,可視化対象を一人に制限している。
図3.20: 顔のランドマーク
@@CHECKED@@
※Illustratorで描き直し@@CHECKED@@ @@CHECKED@@
図3.21: 目のバツ印の描画方法
3.4 実験
実際に自分の現在の血中酸素濃度を測定した場合と,血中酸素濃度が93%以下 の場合を想定して実験を行った。図 3.22に指を置く前,鏡として動作している様 子を示す。次に図 3.23にO2Touchに指を置いた様子を示す。この時点では血中 酸素濃度を受信していないため,この時もディスプレイは鏡として動作している。
始めにリアルタイムで自分自身の血中酸素濃度を測定した結果を,図 3.24に血中 酸素濃度95%,図 3.25に血中酸素濃度97%,図 3.26に血中酸素濃度98%を表示 した様子を示す。図 3.24,図3.25,図3.26のようにリアルタイムで測定した血中 酸素濃度は,値が常時変化した。
次に呼吸不全あり等と診断される血中酸素濃度が93%以下の場合である。実際 に血中酸素濃度が93%以下の人で実験を行うことはできないため,ソースコード 中で強制的に数値を指定し実験を行った。図 3.27に結果を示す。また6と12のx 間の距離である基準値より距離が遠くなった場合の咳アイコンの様子を図3.28に 示す。図 3.29には通常時のディスプレイ画面,図3.30に咳縮小時のディスプレイ 画面を示す。ユーザ・ミラー間の距離に応じて咳のアイコンの大きさが変化した様 子が見て取れる。基準値より少しでも値が小さいと変化する。そのためほんの少し 顔を動かした程度でも変化するため,場合によってはせわしなく変化する様子が見 て取れた。
正常な血中酸素濃度の場合と,血中酸素濃度が93%以下に分けて実験を行った。
結果は成功である。
※ 強制改行しない@@CHECKED@@
※widthはすべて1.0Yhsize@@CHECKED@@
@@CHECKED@@
3.5 考察
O2Touchに指を置いてからO2Mirror側に血中酸素濃度が表示されるまでタイ ムラグがあった。また血中酸素濃度を測定する際には,親指と人差し指どちらかを 使用し測定してきた。その際,O2Touchを作成する前は親指の方が反応がよいと 感じていた。そこで,O2Touchに親指を置いた場合(図 3.31)とO2Touchに人差 し指を置いた場(図 3.32),各10回ずつ,O2Touchに指を置いてからO2Mirror に値が表示されるまでの時間を測定した。
結果を表 3.2,表3.3 に示す。また,その結果を箱ひげ図にしたものを図 3.33 に示す。結果として人差し指の方が反応が早く,平均時間としては約10秒の差が あった。また親指は表示されるまでの時間にばらつきがあったが,人差し指はほと んど同じ時間で表示された。表と図からわかるように,人差し指の方が反応が早い ことがわかった。またO2Touchを作成する前は親指の方が反応がよいと感じてい
たが,O2Touchを使用すると人差し指の方が反応がよいこともわかった。
親指と人差し指で差が出てしまうのは,指の長さと指の状態が関係していると考 えた。O2Touchを作成する前は図3.34のように,親指か人差し指の一方をセンサ に,もう一方をパルスオキシメータモジュールを固定するように挟んで測定してい た。しかしO2Touchではセンサの位置が真ん中にくるよう設計しているため,親 指では長さが足りずに曲がってしまう。図 3.31からもわかるように,親指自体が 人差し指よりも反っているため,センサの上で平らにならないといった問題があ り,光が正しく当たらず値が表示されるまで人差し指より時間がかかると考えた。
図 3.34に近いようなO2Touchを挟むような持ち方を,親指で測定する際に行っ てみたが,そちらの方が少しだけ早く血中酸素濃度が表示された場合もあった。し
かしO2Touchは机等の上に置き,使用することを前提としているので,この方法
では測定することはできない。
今回各10回ずつ測定した時間は午後 1時頃であり,その日はある程度指が温 まっていたと考えられる。午前9時頃測定した際は,カイロ等で温かくし,人差し 指で測定しても,30秒程度かかってしまったり,正常な血中酸素濃度のはずが,測 定された血中酸素濃度が93%以下になってしまう場合もあった。またその1,2時 間後でも17秒程度かかってしまい,親指と変わらない時間になってしまった。(改 段落しない)指の置き方にも問題がある場合もあるが,基本的に指の置き方に変わりは ない。(図 のように測定した) 考えられる理由として血流が悪いためだと予想でき る。冬の午前中であると寒く指先が冷えるため,このように正しい血中酸素濃度が 測定できなくなってしまったり,表示されるまでの時間が長くなってしまったと考 えられる。血中酸素濃度を正しく測定するには指の状態が大切である[10]。
@@CHECKED@@
各10回ずつ時間を測定して,親指の方が時間がかかるのを秒数を見ずとも感じ た。これらのことから表示されるまでの時間が,指により10秒程度違うのでは ユーザにとって大変大きな差であると考えた。今回親指と人差し指以外での測定は 行っていないが,5本のどの指が一番早くディスプレイに血中酸素濃度が表示され るか測定したり,自分以外の人に使用してもらいどう感じるかテストを行い,その 結果から改善をすべき場所を検討したい。
※ 強制改行削除@@CHECKED@@
※Yclearpage@@CHECKED@@
@@CHECKED@@
図3.31: O2Touchに親指を置いた様子
※ 配置指定オプションは[p]のみ@@CHECKED@@
図3.32: O2Touchに人差し指を置いた様子
※ 配置指定オプションは[p]のみ@@CHECKED@@
@@CHECKED@@
表3.2: 値表示までの時間(親指)
※ 配置指定オプションは[p]のみ@@CHECKED@@
測定回数 時間(秒)
1 20
2 15
3 28
4 15
5 12
6 19
7 12
8 13
9 26
10 27
平均 18.7
@@CHECKED@@
表3.3: 値表示までの時間(人差し指)
※ 配置指定オプションは[p]のみ@@CHECKED@@
測定回数 時間(秒)
1 10
2 6
3 9
4 8
5 10
6 9
7 7
8 9
9 9
10 6
平均 8.3
@@CHECKED@@
0 5 10 15 20 25 30
親指 ⼈差し指
値表⽰までの時間(s)
図3.33: 値が表示されるまでの時間の指依存性比較
@@CHECKED@@
図3.34: パルスオキシメータモジュールを用いて測定する様子
3.6 ソースコード
3.6.1 O2Touch
リスト 3.1にO2Touchのソースコードを示す。開発にはArduino IDE 1.8.5及 びArduino言語を用いた。ライブラリとしては,SparkFun Bio Sensor Arduino Library[7]を使用した。
※ 統一コメントのcopyrightにM. Kujiraiが入ってない@@CHECKED@@
リスト3.1: O2Touchソースコード(O2Touch.ino)
1 /*
2 * O2Mirror: 肺 炎 早 期 発 見 の た め の 健 康 可 視 化 ミ ラ ー 血 中 酸 素 濃 度 送 信 用 ソ ー ス
3 *
4 * copyright(c) 2021-2022 A. saito
5 * [email protected], http://kujiraiken.sit.ac.jp/
6 */
7
8 #include <SparkFun_Bio_Sensor_Hub_Library.h>
9 #include <Wire.h>
10
11 // Reset pin, MFIO pin
12 int resPin = 4;
13 int mfioPin = 5;
14
15 int width = 411;
16 int samples = 400;
17
18 // Takes address, reset pin, and MFIO pin.
19 SparkFun_Bio_Sensor_Hub bioHub(resPin, mfioPin);
20
21 bioData body;
22
23 void setup() {
24 Serial.begin(115200);
25 Wire.begin();
26 int result = bioHub.begin();
27 int error = bioHub.configSensorBpm(MODE_ONE); // Configuring just the BPM settings.
28 }
29 30
31 void loop() {
32 body = bioHub.readSensorBpm();
33 if(body.oxygen != 0){
34 String transmit = String(body.heartRate);
35 transmit.concat(",");
36 transmit.concat(body.oxygen);
37 Serial.println(transmit);
38 delay(250);
39 }
40 else {
41 delay(250);
42 }
43 }
@@CHECKED@@
3.6.2 O2Mirror
リスト 3.5にO2Mirrorのソースコードを示す。参考文献[8]を参考に,言語は C++を,ライブラリとしては,Dlib 19.22[3],DXライブラリ 3.23[4],OpenCV 4.2[6],ezSerialLib 1.4.0,ewclib 2.8を利用した。開発環境はVisual Studio 2019 を使用した。Dlib,DXライブラリ,OpenCVはVisual Studio 2019のNuGetか ら導入した。
※ 統一コメントのcopyrightにM. Kujiraiが入ってない@@CHECKED@@
リスト 3.5: O2Mirrorソースコード(O2Mirror.cpp)
1 //
2 //O2Mirror: 肺 炎 早 期 発 見 の た め の 健 康 可 視 化 ミ ラ ー メ イ ン ソ ー ス
3 //
4 //copyright(c) 2021-2022 A. saito
5 //[email protected], http://kujiraiken.sit.ac.jp/
6 //
7
8 #include <dlib/opencv.h>
9 #include <opencv2/highgui/highgui.hpp>
10 #include <dlib/image_processing/frontal_face_detector.h>
11 #include <dlib/image_processing/render_face_detections.h>
12 #include <dlib/image_processing.h>
13 #include <dlib/gui_widgets.h>
14 #include <iostream>
15 #include <vector>
16 #include <DxLib.h>
17 #include<opencv2/opencv.hpp>
18 #include <string>
19 #include "ewclib.h"
20 #include "ezseriallib.h"
21
22 std::string heartrate;
23 std::string oxygen;
24 int numheartrate;
25 int numoxygen;
26 int pos;
27
28 void serialMesgCallbackFunc(std::string mesg)
29 {
30 pos = mesg.find(’,’);
31
32 heartrate = mesg.substr(0, pos);
33 oxygen = mesg.substr(pos + 1, 3);
34
35 numheartrate = atoi(heartrate.c_str());
36 numoxygen = atoi(oxygen.c_str());
37 }
38 // 距 離 を 求 め る
39 int FindDistance(int x1, int x2) {
40 int dis = 0;
41 dis = x2 - x1;
42 return dis;
43 }
44 // 足 す
45 int Add(int num1, int num2) {
46 int addition = 0;
47 addition = num1 + num2;
48 return addition;
49 }
50 // 中 点 を 求 め る
51 int FindMidpoint(int val1, int val2) {
@@CHECKED@@
4.1 まとめ
本研究は血中酸素濃度を用いて鏡の前に立つと,自身の顔に健康状態が可視化さ れるというような,直感的な健康可視化システムを開発した。
血中酸素濃度を測定し送信するO2Touchは,Arduino互換機KEYESTUDIO
⊔KS0486,パルスオキシメータモジュール SparkFun⊔SEN-15219を使用し,これ らを一つの装置として収納するための筐体O2Touchは,OpenSCAD 2021.01を使 用し設計した。ケース,蓋,パルスオキシメータモジュールを固定するための蓋 のそれぞれを設計した。ソフトウェアの実装は,Arduino IDE 1.8.5とSparkFun Bio Sensor Arduino Libraryで行った。血中酸素濃度を検出したら,その値を文字 列として送信を行うとした。
受信側であるO2Mirrorは,PC,液晶ディスプレイ,Webカメラで構成されて おり,ディスプレイを鏡と見立てフルスクリーン表示した。血中酸素濃度を受信す るまで単なる鏡として動作し,値を受信したら,ディスプレイ左上に血中酸素濃 度を表示した。ソフトウェアの実装は,C++,Dlib 19.22,DXライブラリ 3.23, OpenCV 4.2で行った。受信にはezSerialLib1.4.0を用いた。また血中酸素濃度が 93%以下の場合は以下の動作を行った。まずDlibで顔認識を行い,顔のランド マークを検出した。これにより目の位置等が特定でき,目にはバツ印,口には咳の アイコンを描画するようにした。これらをミラー・ユーザ間の距離に応じて動的に 大きさを変化させることで違和感を少なくした。
実験では正常な血中酸素濃度の場合と,93%以下を想定しての場合でそれぞれ 正しく動作したことを確認した。また自身の血中酸素濃度が一定ではなく変化する 様子も確認することができた。
このように直感的な健康可視化システムを開発した。
改善点としては以下3点挙げられる。1つめはO2Touchでは血中酸素濃度と同 時に心拍数も送信している。今回心拍数を使用しての表現はできなかった。2つめ は目の部分の描画の際にカメラに映る測定者の肌色を顔のランドマーク2番と31 番の中点を使用して抽出し,バツ印の描画の前に目の辺りを塗りつぶすことで,よ り自然な顔を再現する予定であった。肌色に近い色で塗りつぶすことはできたが,
その色を継続できる訳ではなく,顔の向き,光によっては肌色から遠い色になって しまった。当初予定していた違和感なく顔の塗りつぶしを行うことができなかった ので,今回は断念した。3つめは,今回鏡のようにフルスクリーン表示する際に顔 認識ができていないといけないようになっている。Dlibでの顔認識では,ある程 度は認識を行うことが可能であるが,顔が下を向いていたりすると顔認識を行うこ とが不可能である。本来鏡として使用するとなるとこれでは不便である。システム としてまだ多くの改善点があるためその部分を今後の課題とする。
@@CHECKED@@
4.2 今後の課題
※quote環境は不要@@CHECKED@@
※Yend{itemize}の後に空行を入れない@@CHECKED@@
今後の課題として,
• 心拍数を使用した表現
• 測定者の肌色塗りつぶし
• 鏡としての機能 が挙げられる。
心拍数を用いた具体的な案として,血中酸素濃度と同じく左上に表示し,心臓の あたりにハートを表示する,警告音を鳴らす。測定者の自然な肌色塗りつぶしと,
鏡としての機能に関しては,ソースコードの見直しと修正を行うなどをしていき たい。
@@CHECKED@@