植物健康診断システムを作ってみた！

<h1>動機
<p>大学の授業で、生物生産に関わるものを作ることになったからです。あと、自分でなんか作ってみたかったからというのがでかいです!

<h1>何を作ったのか
<p>植物健康診断システムをつくりました。

流れはこんな感じ
①RaspberryPiを使って、植物の画像を取得します。
②その情報をAPI(人工知能モデル)に渡します。そして、どんな病気を持っているのか、対策方法をAPIから返してもらいます。
③LINE APIを利用し、LINEに通知します。農家の方が、わざわざ畑に行かなくても作物の健康状態を把握出来ればと思い作成しました。
<h1>使用したもの,使ったAPI
<p>RaspberryPi3 model B+
USBカメラ、脚立
植物(今回は写真)
LINE notify API(https://notify-bot.line.me/ja/)
植物健康診断API(https://github.com/nandakishormpai/Plant_Disease_Detector)

![file.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001770/82dc011a-78bc-12ab-261e-1b4c77d21e82.jpeg)
<h1>コード

<p>

```python:plant_disease.py
import cv2
import requests
import base64
import os
import schedule
import time

#plant API
plant_url = "https://plant-disease-detector-pytorch.herokuapp.com/"
# LINEAPI
url = "https://notify-api.line.me/api/notify"
access_token = 'Your Token'
headers = {'Authorization': 'Bearer ' + access_token}

def plant_dia():
    # APIを使用する画像の前処理
    def encodeToBase64(filename):
        with open(filename, "rb") as f:
            img_base64 = base64.b64encode(f.read())
        return img_base64

    #capture = cv2.VideoCapture(1)
    # capture = cv2.VideoCapture("/dev/video1")
    capture = cv2.VideoCapture(0)
    ret, plant_photo = capture.read()
    cv2.imwrite('plant.jpg', plant_photo)

    imgdata = encodeToBase64('plant.jpg').decode('utf-8')

    res = requests.post(plant_url,json = {"image":imgdata})

    message = res
    image = 'plant.jpg'  # png or jpg
    payload = {'message': message}
    files = {'imageFile': open(image, 'rb')}
    r = requests.post(url, headers=headers, params=payload, files=files,)

#x分毎のjob実行を登録
schedule.every(0.5).minutes.do(plant_dia)

#x時間毎のjob実行を登録
#schedule.every(x).hours.do(plant_dia)

# plant_diaの実行監視、指定時間になったらplant_dia関数を実行
while True:
    schedule.run_pending()
    time.sleep(1)


```
<h1>結果

![Screenshot_20211117-160009_LINE.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001770/dc88a5a7-6b37-becd-715d-937437a0604a.jpeg)

<h1>エラー事件簿
<p>事件１：マイコンがネットに繋がらない問題
　大学からのwifiがラズパイ(Linux)に対応していないという事件が起きました。色々やってみたが、全て失敗。考えた末、デザリング的なことをパソコンでもできないかと…Windowsのデフォルトの機能であるモバイルフォットスッポト機能を使って、ラズパイをネットに繋げることになんとか成功しました。何が起こるかわかりませんね！

事件2：opencvをインストールできない問題
　Opencvをラズパイにインストールできず、泣きそうになった。「俺のpipはどこにいったの？」と思いました。Udemy（オンライン講座）を視聴し、解決しました。有料はやっぱり違いますね。
Udemyで[見た講座](https://www.udemy.com/course/draft/2874584/learn/lecture/20730550?start=30#overview)。

事件３：人工知能（API）がなぜか使えなくなった問題
　今回のAPIは無料のものを利用させて頂きました。そのせいか、アクセスしまくるとAPIが反応しなくなりました。これには焦りました。完成したのに完成していないからです。自分でサーバー(Flask)を立て、ローカルでAPIを公開しようとしました、エラーの出まくりで泣きそうになりました。しかし、しばらく放っておくと、ちゃんと人工知能が構ってくれるようになりました。無料はいいですよね！しかし、品質が当然のことながら保証されていないという点を注意しなければならないと痛感。

事件４：お金がない問題
　家が裕福ではないので、買いたい機材があっても経済的理由で買えませんでした。そこで、授業担当の先生に「これが欲しい」という旨を伝えたところ、準備して下さりました。大変ありがたかったです。ご厚意に感謝！

事件５：その他諸々
　他にも色々あったが、ググって何とかしました。「全てのエラーの解決策はネットにある！」と信じてます！


<h1>解説
<p>APIの要件に従い、Githubに記載通りに、


https://github.com/nandakishormpai/Plant_Disease_Detector

Base64(文字列)に画像を処理しました。APIを使用するためには、生データでは受け付けてくれないので、文字列に変換！
LINEの通知の仕方に関しては、こちらの記事をご参照下さい。

https://qiita.com/moriita/items/5b199ac6b14ceaa4f7c9
<h1>課題
<p>無料の学習済み人工知能（API）を利用しているので、精度がいまいちですね…次は自分自身で学習させた人工知能を使ってみたいです！また、raspberryPi3modelB+はオーバースペックであるようないような。パフォーマンスとコスト、この二つのバランスを将来的には見極めたいです。また、今回はやりませんでしたが、カメラの歪みをopencvで補正したらより見やすくなるな～と思いました。

<h1>感想
<p>　農家の方がわざわざ圃場に行かなくても、植物の状態を知ることが出来たらいいなと思い、作成しました。このプロダクトは農家の新規参入の敷居をさげる役割も果たせるのではないでしょうか。夢がありますね！自分ではなく、他人が使っていて「これ、助かる～」と思うようなプロダクトを今後、つくりたいです。
<h1>参考文献
<p>

https://github.com/nandakishormpai/Plant_Disease_Detector


https://qiita.com/moriita/items/5b199ac6b14ceaa4f7c9


https://qiita.com/PlanetMeron/items/2905e2d0aa7fe46a36d4


https://qiita.com/dgkmtu/items/3bd3794b44a0aa03bfe3