ステイホームで乱れた生活習慣を機械学習を使って改善する話 #kuac2020

この記事は、Kyoto University Advent Calendar 2020の13日目の記事です。

[![card.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118083/c1c9bbc0-e73d-196a-7c51-7dce7186ef73.png)](https://adventar.org/calendars/5040)

12日目の記事はれおまるさんの「[ワインに惹き込まれた経緯とそのススメ](https://note.com/reo_g/n/n064215d52982)」でした。臨場感溢れる表現でワインと出会った衝撃と魅力を語られていたのが印象的で読み応えのある記事でした。

この記事で触れているプロジェクトの詳細は以下をご覧ください。

https://github.com/lzpel/cloudmama

![camera v11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118083/39c664e0-81a9-227b-e3ac-f62c7fe38b80.png)


## 自己紹介

lzpelと申します、工学部地球工学科というところの学生です。地盤や土木構造物などの勉強をしています。他の登録者、Twitterで有名（？）な人々なのに文章力低い自分が参戦していいのだろうかと戦々恐々です。今回はコロナで怠け者になったけど電子工作と機械学習で改善できたよという話を書きます。

## 外出自粛

コロナで春から大学の授業形態が変わりオンライン授業が続いています。そこで映像授業に積極的に参加して各自学習するのがあるべき姿ですがカメラオフで授業をBGMに寝てしまったりと理想から遠ざかっています。

大学以外が充実しているわけでもないです。何のやる気も出なくてベッドに貼り付いている時間が増えました。空腹に耐えられなくなった深夜三時頃に初めて外出し、24時間営業のスーパーでお惣菜を買って食べたりします。

## 怠惰になった原因

ここまで怠惰になってしまった直接的な原因は書き連ねると

- 一人暮らし
- オンライン授業
- スマートフォン依存
- 折り畳みベッドを折りたたまない
- 一日の計画という物が特に無い。

といった感じです。もっと根本的な原因は以下の二つです。

- 人に見られないので社会性が下げ止まらない
- 無駄に時間を溶かしている間に意識がない

意識が無いということを補足すると、ネットサーフィンなどに没入して周囲が見えなくなっている状態を指しています。気が付くと何時間も経っていて生産的な活動に充てる時間が無くなってしまいます。

## 対策

### 意識より環境や仕組みを変えて習慣を正す

「気を引き締める」「甘えをやめる」など「意識改革」は効果が無いことは失敗から学んできました。スローガン程度で変わらないから今の自分があります。習慣を変えるには仕組みや環境からアプローチするしかないと考えています。怠惰な人間でも人並みの社会性と進捗を維持できるシステムを作りました。

### 自己監視システムというのを考えた

まず現状の生活の様子を定点観測する必要があります。ツイート状況から活動時間を推定するアプローチでは @p1ass さんが製作した[生活習慣の乱れを可視化するやつ](https://midare.p1ass.com/) などがありますが、ツイート数が少なければ正確な推定ができない問題があります。このシステムではマイコンとカメラを使い画像として観測する手法を用いました。加えて画像分類タスクとして機械学習を導入することで起床と睡眠のみならずスマートフォンで時間を溶かしているのか、勉強しているのかなど活動内容も可視化します。

監視だけではなく能動的に生活改善を促す必要があります。何をしていてもどこを向いていても確実に情報を伝達できる手段といえばやはり音ではないでしょうか。ごろごろしていたら「起きろー！」と喝を入れるように観測結果に即した音声をマイコンから放送することにします。

これら二つの機能を持つ自己監視システムを作ろうと思いました。

### ESP32の布教

ESP32は中国のEspressif Systems社が作成した安価で高性能なマイクロコントローラです。WifiとBluetoothに接続できるのでIoTへよく応用されています。ESP32とOV2640というカメラがセットになったESP32-CAMという開発ボードがあり、撮影と送受信がワンチップで済む点で都合が良いので今回利用しました。写真の右側基板中央にカメラが確認できます。

![esp32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118083/39df5156-a559-47a6-f9c4-093c933255d1.jpeg)

ESP32とESP32-CAMは個人的に好きな製品なのでこの場を借りてお勧めしたいと思います。Arduino IDEで開発できるので開発環境を揃えやすく入門しやすいです。加えて安価でカメラ付きでも800円前後で買えます。[金魚の餌やり](https://homemadegarbage.com/ai14)から[ロボット開発](https://youtu.be/Ch2ITCp3Itg)まで様々な応用が見つかり日本語の情報も豊富です。「ちょっと電子工作してみたいなー」と思う方がいれば是非。

### システム構成

システムの構成は以下の通りです。

![構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118083/0624be97-6f26-93af-e46a-7c98ed49a4ec.png)

ESP32-CAMはArduino IDEを用いてC言語で開発します。開発環境を揃える方法については[約800円のESP32-CAMで乾電池駆動のWebカメラサーバーを立てる](https://qiita.com/Nabeshin/items/b195cad1afe99ce29f1e)というよくまとまった記事があります。10分毎に撮影し画像をWifi経由でサーバーにPOSTしています。撮影やHTTP通信は[Espressif Systems公式のC言語ライブラリ](https://github.com/espressif/arduino-esp32/)があり便利でした。レスポンスは画像に応じたアドバイスをogg形式の音声で出力するURLです。レスポンスされたURLを@horihiro氏の[ESP8266 から Google Home に喋らせるライブラリ](https://qiita.com/horihiro/items/4ab0edf415916a2cd542)を用いてGoogle Homeに喋らせています。

サーバーはgo言語で開発しGoogle App Engineにホストします。画像を後述の判定機に送り、判定結果と時刻から文章を作ります。現状のルールは以下の通り。

- label: phone
    - スマートフォンを持っている状態と判断。
    - 音声「スマートフォンで時間を浪費しています」
- label: laying
    - 寝ている状態と判断
    - 朝7時から21時までに該当した場合
    - 音声「生活習慣が乱れています」
- label: sitting
    - 座っている状態と判断
    - 生産的な活動をしていると思われるので音声を流さない。

機械学習による画像判定はGoogle Cloud AutoML Visionで行います。AutoMLは教師データを送れば、画像分類またはオブジェクト検出の予測モデルを自動で作ってくれるので機械学習に詳しくない人には便利です。教師画像はESP32-CAMで撮影した写真を100枚用意しました。その一部がこちらになります。三種類のラベル（スマートフォンを持っている状態：phone、寝ている状態：lying、座っている状態：sitting）を教師画像に付与しています。

![dataset.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118083/cf5f769f-3392-5325-fb3f-86dfaaf5f186.jpeg)

### 可視化

とりあえず簡単に当日の写真と判定結果を時系列で表示するページをサーバーに作りました。分析に力を割きすぎて可視化が片手落ちになっている感があります。時間があれば格好いいグラフを表示したいなと思っています。

![visible.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118083/66084989-160f-fe0b-fdf2-9f5e58b7cc13.png)


## 結果と課題

このシステムを作ってから徐々に生活は改善しているように感じられます。特にスマートフォンを見続けていると叱ってくれる機能は没頭した精神を引き戻す強制力がありました。可視化ページを見ても適切な時間に起きている日が増えているように思われます。その意味では効果があったと言えるでしょう。ただ幾つか課題が残りました。Google Homeの音量は音声操作で調節できてしまうので、「生活習慣が乱れています」という音声が煩わしいとき最小音量に設定してしまうことがよくあります。なので3Ω4W程度のスピーカーをESP32に直接接続し音量を固定するとともにGoogle Homeに依存しないシステムに改善したいと考えています。また裸の基盤は扱いにくいのでUSBコネクタを持ちESP32とスピーカーを接続する基盤をKiCADとかで設計・外注したいと考えています。加えて可視化ページに一日や一週間の活動内容をグラフ化する機能を実装して一目で客観的に活動を把握できる機能があれば便利だと思います。今後はこれらの課題を解消していきたいです。

## 終わりに

読めばわかると思いますが記事で取り上げた電子工作も機械学習も既存の便利な道具に甘えています。CADでプリント基盤を設計したり、Tensorflowで機械学習のモデルを作ったり、サーバーを買って設置したりしたわけではありません。これらの便利な道具の中身を全て理解しているとは言えません。理解していない道具を駆使することを全肯定するわけではないですが、ありもので完成させてから理解を深めていく順番の方が好きです。関連する技術が増えるにつれて、ブラックボックスを扱う弊害より関連知識の脇道に逸れ続けていつまでも完成しない間にやる気や時間や資金が尽きるリスクの方が大きくなっていると思います。

この記事を読んでArduinoやESP32を使ってみたいなという方がいたらまずは市販の開発キットを買ってみたらどうでしょうか？私は今年の春まで全く触れていませんでしたが、[ELEGOO Arduino用UNO R3スターターキット](https://www.amazon.co.jp/dp/B06XF2HZGT/ref=cm_sw_r_tw_dp_x_enm1Fb0CAA0VJ) を買って一か月ぐらいサンプルを動かしていたらこの記事を書ける程度には理解が深まりました。まだ入門から半年しか経っておらず知らないことが沢山あるので一緒に学び楽しむ方が増えてくれたら幸いです。

プログラミングや電子工作などの創作全般に興味があるならサークル活動に参加するのも良いと思います。私が所属する[京大マイコンクラブ](https://twitter.com/KMC_JP)ではプログラミング、ゲーム制作、電子工作、ウェブサービス開発など手広く活動しています。他大生でも社会人でも初心者でも誰でも入れるので意欲のある人をお待ちしております。コロナ禍の現在はSlackとZoomとDiscordで活動しています。

ここまで拙い長文を読んでいただきありがとうございました。さて明日はお伊勢志摩さんの14日目の記事です。楽しみにしています。