犬の監視はエッジAIにやらせよう

# はじめに

当初予定していた「からあげ帝国をぶっつぶす！(仮)」は、緊急事態により予定を変更して[からあげ帝国 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/karaage)の23日目をお送りします。なお、タイトルは[「面倒なことはChatGPTにやらせよう」](https://karaage.hatenadiary.jp/entry/chatgpt_book_intro)のオマージュとなっております。

# 緊急事態

我が家で起こった重大な問題。それに悩み、[からあげ帝国](https://karaage.hatenadiary.jp/entry/2023_karaage_ac)で打ち明けました。

![悩み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/40f29144-eb96-26f2-3f09-3940e414eefc.png)

こんなことを投げかけたところ、優しいからあげ帝国国民からいろんな良いアイデアをもらいました。

# 課題の整理

まず、整理して真の課題を見極める必要があります。

ゴール/目的：犬が💩を食べない
　　↓ そのための手段？
飼い主がしつける
　　↓ それができない理由は？
ベランダで💩した時に飼い主が居ればしつけできるが、飼い主はいつもベランダに居るわけではない。
　　↓ どうすれば良い？
ベランダに犬が来たことが、飼い主が分かれば、そのときに駆けつけられる = 解決方法

同時に、システムと人の境界も整理できました。

# 出来たシステムと活用方法

<img width="500" alt="システム構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/b5049a23-c666-f450-ad0c-7adcbdec4e07.png">

1. 普段は室内に居る犬が、糞をするためにベランダに現れます。
1. ベランダに設置したUSBカメラで監視し続けます。
1. ラズパイ4に搭載したAIが「カメラ映像に犬が居る？」を常に検出し続けます。
1. 検出したら、LINEのグループ(家族がメンバー)に「ベランダに来たで」とお知らせします。

LINEが来たら、飼い主はベランダまで行って、犬をしつけます。大抵、飼い主が目の前に居ると悪いことをせずに、帰っていきます。あとは、これを繰り返して「食べてはいけない」ことを覚えさせるだけです。

# 実際に稼働しているシステム

<img width="500" alt="raspberry pi 4" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/59764829-7c68-cffe-166f-4b9bc9e7f670.jpeg">
<img width="300" alt="USB Cameera" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/c4ff50ea-6500-3517-1c5f-c233cc5648c8.jpeg">

両面テープ、養生テープ、レゴで雑に取り付けました。しつけが完了したら撤去ですので、仮止めで十分。

# 「パターン青、犬です」 〜稼働するシステム〜

<img width="400" alt="LINE-1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/ab983954-a03d-15d5-50e3-2c3c3880a1f4.png">

検出は[TensorFlowLiteのラズパイ用サンプル](https://github.com/tensorflow/examples/blob/master/lite/examples/object_detection/raspberry_pi/README.md)を使ってます。精度は高くないのですが、デフォルトで犬を検出できるので、最適です。犬が検出されて、ある確率以上なら、LINEにお知らせ送信してます。

<img width="400" alt="LINE-2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/274e806d-fde6-2cb0-b10b-209e769c1ef0.png">

どうやらネコとカテゴライズされることがあるようです。あと、たまに"cow(牛)"という結果も…。なので、この3種類が検出されたら送信することにしてます。

<img width="400" alt="LINE-3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/19cf8360-bff6-049a-3400-fe949b4e5146.png">

薄暗くても頑張って検出してますね。

以上のように比較的簡単な仕組みで構築し、課題解決できました。ちなみに、まともに動いて役に立つAI+IoTのシステムを作ったのは初めてです。やったね！

# まとめ

以上のシステムを10日ほど(記事公開時点)連続稼働させています。犬が糞をしたらすぐに取りに行くことが習慣になりました。また、犬が大体何時ぐらいに行くのかも、分かるようになりました。なにより、愛犬の姿がLINEに送られてくるのは良いですね。

<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>

# 試行錯誤（おまけ）

以上で、この記事の本編は終了です。

実はこのシステムが最初から出来たわけではなく、数々の失敗がありました。ちゃんと動かないシステムに四苦八苦する私とは対象的に、のんきに💩を食べる犬。そんなことは一刻も早くやめさせたい家族。私を催促して余計なプレッシャーをかけても逆効果だと分かってて待つ家族…。

そんな温かい家族と犬に囲まれた環境で、起こった失敗の過程を書きましたので、興味があるところを読んでくださいませ。

## ChatGPTを使った検出
<details>
<summary>(折りたたみ)</summary>

ChatGPTv4はいろんなことができる、と聞いて試してみました。

![ari_mosaic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/fa69fda5-526e-0829-5ff3-af21d351c170.png)
(ブログ用にモザイクをかけています)

![nashi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/990f5013-704b-415e-5a37-ee7fc0c6d24a.png)

おお、なんと💩を検出できる！　しかも確率も返してくれますね。用意されているAPIを使って、ChatGPTに画像を送り、検出結果を受け取れます。

こんなに簡単に課題解決できるなんて！ ChatGPTすげぇよ！　と舞い上がっていたのですが、冷静に考えると、一日に何百〜何万枚という数の画像をChatGPTに送って検出し続ける必要があります。APIは従量課金なので、バンバン画像を送り付けるのは………まったく現実的ではありませんね。ChatGPTの面白く画期的な活用方法ですが、ボツになりました。

</details>

## からあげエッジAI本の実践
<details>
<summary>(折りたたみ)</summary>

![からあげ本.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/8a854ac8-ebb7-4057-65bc-4226ab0f3448.jpeg)

からあげさんが書いた電子書籍[「エッジAI コンピュータビジョン入門」](https://karaage0703.booth.pm/items/4800446)、買って読んだからには活用したいと思っていました。この本ではラズパイでAIを動かす方法やその活用方法を取り上げています。

しかしここでトラブルの山々にぶち当たります。本が書かれたのが2023年5月ですが、そこから7ヶ月しか経っていないのに、もう動かないのです。これは複雑なソフト間の依存関係で成り立っている高度なAIソフトだから仕方ないのですが、すべてトラブルシュートする実力が私に無く、諦めてしまいました。OpenCVとonnxruntimeは入ったんですが、PyTorchとTensorFlowのインストールが上手くいかず……。

いまはラズパイ4が稼働中なので、しつけが終わって稼働が空いたら、再度トライしてみたいと思います。

</details>

## 人感センサーを使った検出
<details>
<summary>(折りたたみ)</summary>

![PIRsensor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/8a3fa36f-0db2-7c37-f94c-d95b909581c0.png)

人が近づくとオンになる人感センサーは、赤外線を受光して「動く人の有無」を検知するですが、当然ながら犬でも検知できます。

人感センサーをラズパイのGPIOに繋ぎ、ベランダに人感センサーを置いてみました。部屋の中では上手く動いていたので、いざ屋外のベランダに設置！ しかし、HとLをデタラメに繰り返して、上手く検出できないのです…。可変抵抗で感度を調整したのですが、変わらず。ベランダに干してる洗濯物がヒラヒラ舞って影響してるのかも、と思いましたが、よく分からないのでボツになりました。

</details>

## 赤外線遮断センサーを使った検出
<details>
<summary>(折りたたみ)</summary>

![2168-04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/f9e87bff-1a95-9822-9d5f-88da166aafd2.jpeg)

赤外線遮断センサーとは、赤外線の発光部と受光部に分かれており、その間を何かが遮ると検知するデバイスです。犬はベランダに出るときに、犬専用の扉を通るのですが、扉の左右にセンサーを取り付ければ、犬が通過したことを検知できます。Adafruitの[IR Break Beam Sensor](https://www.adafruit.com/product/2168)を使いました。

部屋のなかで動作を確認し、いざセンサーを扉に貼り付けてみました。ずっと「何も遮っていない」と送ってくる。遮っても同じ。手で完全に覆い隠すと「何か遮ってる」と送ってきました。どうやら、日光に当たっているとダメなようです。サイトを見ると「屋内用」と書いてますね。ちゃんと選定時にスペックを確認しておくべきでした。

</details>


# 参考にしたサイト

## TensorFlow Lite

* [examples/lite/examples/object_detection/raspberry_pi/README.md at master · tensorflow/examples](https://github.com/tensorflow/examples/blob/master/lite/examples/object_detection/raspberry_pi/README.md)
* [Raspberry Pi × TensorFlow Liteで物体検出を楽しむ #RaspberryPi - Qiita](https://qiita.com/mnishiguchi/items/3ef4a1d4f8a56a995b88)

## LINE notify

* [LineNotifyを使ってメッセージ、画像を送信する #Python - Qiita](https://qiita.com/kaonashikun/items/4a4d311e26d8e7483a95)
* [【仕事の自動化】PythonでLINEを操作。メッセージや画像を自分へ送信しよう！【初心者の方もわかりやすいように解説】 | キノコード](https://kino-code.com/pythonline/)