【Unit4 ブログリレー6日目】
こんにちは、CTOの大垣です。 このブログはUnit4ブログリレー 6日目の記事です。前日は西川さんの"「なんとなくこっちの方が良い」からの脱却"でした。エンジニアリングは言葉の仕事なので、言語化を考えるのとても大事ですよね。なお、打ち合わせたわけではないんですが2日連続自分の飼い猫の写真が貼られています。
さて、その猫の話。私は猫と日々暮らしているんですが、猫ってちょっと目を離すとすぐに視界からいなくなりますよね。 移動がすごく静かな上に、隙間に入るのが好きなので、同じ部屋にいるのに見失っていることがよくあります。 さらにどの部屋にいるかもあてがつかなくなるともうお手上げです。
そこで今回は、Bluetoothと機械学習の技術の力で猫がどこにいるのかを探します。
本稿の流れは以下です。
- 猫につけたBluetooth Low Energy(BLE)デバイスのIDを特定し、その信号強度を計測する。
- 更にその信号強度の分布の特性を元に猫が現在いる部屋を高精度に当てる。
これらの流れで、猫の居場所ロガーが完成するまでの話を書きます。
Bluetooth Low Energyデバイスで信号強度を計測する
さて、猫の位置を知るのに使える情報ですが、うちの猫は首輪としてCatlogさんのCatlog Pendantデバイスをつけています。 こちらのデバイスと、なんとかして通信すれば手がかりになりそうですよね。
デバイスのIDが知りたい
Catlog PendantはBluetooth Low Energy(BLE)の規格のデバイスであることがわかっているため、BLEデバイスが定期的に飛ばしているAdvertisingパケット*1を拾えば通信の起点にできるのではと推測されます。 そこで、私の家で飛んでいるAdvertisingパケットをスキャンしてみたんですが、20以上のデバイスがパケットを飛ばしており、どれがCatlogのものかはっきりしませんでした。 そこで、まずはCatlogのIDを見つける方法を考えます。
簡易的な電波遮蔽環境を作る
電波暗室の中で該当デバイスとPCだけをもって計測すれば一発でIDがわかりますよね。
そこで、簡易的な電波遮蔽環境を作ります。 といっても自分が入れるレベルのものを作ることはできないので、引き算で、アルミホイルによる簡易シールドにデバイスを入れたときと、そうでないときで信号強度が変化するものを発見する、という方法を取ります。 以降本稿で用いる信号強度はRSSI(受信信号強度指標)のことをさします。
図に、アルミホイルで包んだときと開いた時の部屋の中にあったデバイスの信号強度の値を示します。 明らかに一個だけ、アルミホイルで包んだ時にのみ信号強度が下がっているデバイスがありますね。 このIDがCatlog PendantのIDだとわかりました。
各部屋にいる時の信号強度をみる
デバイスのIDが特定できました。ここから猫の位置を計測する方法を考えるんですが、先程計測した信号強度はおおよそのデバイスの近さを示す指標となります。これを猫の位置推定の手がかりとして利用できそうです。
図に示してるのが、ルンバでマッピングさせた私の部屋の間取りです。 この間取りの中の、書斎・クローゼット・リビング・キッチン・ベッド・寝室前廊下・キャットタワー のどこにいるかをトラッキングしたいです。
簡単のために、受信して信号強度を計測するデバイスの位置は書斎に固定します。 そのうえで、猫が色んな場所にいる状態で信号強度を計測してみて、1日中の計測し続けた信号強度の分布を見てみると図のようになります。
1点1点が、PCが受信した1回の信号を表します。ちなみに場所ごとに点の数が偏ってるのは猫の普段の居場所が偏ってるからです*2。
予想された通り、PCがある書斎から近いほど信号が強くなっている傾向はあるので、なんとなくは当てられそうです。 しかし、似た距離にある部屋も多いし、その時々のノイズも多く重なりが多いため、1回だけの計測を見てどこの部屋にいるかを精度良く当てるのは難しそうです。 システムの目的として毎分猫の位置を正確に把握したいので、この問題は解決したいです。
信号強度の分布を用いて居場所分類器を学習
受信する信号をよく見ると、毎分バーストが発生している
何を手がかりに精度を高めるかですが、連続して送られてくる信号を眺めていると、図のように、毎分一気にバーストで信号が送られてくるタイミングがあることがわかります。 さらに、一気に来る信号の強度も一定の幅の変動があります。 そこで、この"分布"を捉えればより精度の良い識別ができるのではないかなと考えました。
信号強度の分布の学習
分布を捉える特徴、ですが、今回は図のように、シンプルに、1分ウィンドウでの信号強度の平均値・最大値・最小値・分散・四分位範囲などの統計量を独立な次元として入力にしました。 あとは独立な数1次元のベクトルから7クラスの分類をするだけなんですが、今回は軽く試したところ十分な精度がでたRandomForestを使いました。
居場所があてられるようになった!
結果を数値的に見てみます。図のように予測を横軸、正解を縦軸とした混同行列を見てみると、正解と予測が一致する対角線上の数値が高くなり、結構あてられるシステムができたことがわかります。 ベッド・キャットタワー・寝室前廊下は混同しちゃってますが、これは場所が近すぎるから無理もないかなと思います。これらを分けるのはそもそも挑戦しないほうが良いかなと思いました。
一方、生データの段階では重なりも多かったリビングとキャットタワーはきれいに分離できるようになりました。
面白いのでリビングとキャットタワーがどうして分離できたかを見てみると、図のように、平均強度だけでは分離できないけど、平均強度✕分散の2次元にマッピングするとリビングとキャットタワーは分離できていることがわかりました。 キャットタワーは最高強度が高いときもあるけど、最低強度がかなり低いので、平均が高いときでも分散は必ず大きいようです。 この背景は推測でしかないんですが、リビングは計測器から直接見えるものの、キャットタワーは別の部屋にあり、キャットタワーから計測器までは窓越しか廊下越しに信号が伝わっている可能性が高く、パスによる強度の違いで分散が大きくなるのと推測されます。
テックブック
本稿は技術書典18に出したエムスリーテックブック8からの抜粋です。 テックブックでは学習や評価の詳細なども含めて、より詳細な内容を書いてます。今回書かなかった、データ収集の方法とか継続的学習とかも書いています。ご興味のある方は読んでみてください。
まとめ
猫の居場所を知りたいところから始めて、BluetoothデバイスのIDの確認と、得られた信号強度からの位置の推定について検証しました。 結果として、PC1台とBluetoothデバイス1つがあれば、家の中の位置をある程度あてられることがわかりました。 特にMLをやってると、普段はデジタルデータ化された後を扱うことが多いですが、実デバイスの計測から始めてみると、普段と違う戦いがあって面白いですよね。
We are Hiring!
エムスリーでは猫や、その他身近な生き物を幸せにするエンジニアを募集しています*3。