はじめに
水田における水の管理が重要であることは皆さんよくご存知のことと思われますが、人が頻繁に確認するのはそれほど楽ではなく、兼業農家ではこれがさらに難しくなるという課題があるようです。
家の近くにある水田であれば何かのついでに見るということも可能ですが、少し離れたところにある水田の確認はどうしても不十分になってしまう。
上記のような相談があったことから、タイトルのとおり水田の取水バルブを定点カメラで監視し、水田の水があるかないか、給水できているか否かを遠隔地で確認できる仕組みを作りました。
遠隔監視ができるだけでも便利だと言われているのですが、せっかく画像がそろってきたので画像から状況を識別してみたいと試してみた経過を記録しておきます。
定点カメラの概要
外観
構成機器
- RaspberryPI Zero
- USBカメラ
- Soracom Air SIM
- ソーラーパネル
- バッテリー
- タイマーリレー
- さくらのVPS
機能
- RaspberryPIが起動したら接続されたUSBカメラの画像をSoracomの回線でVPSサーバーに送信
- 待機時の電力消費を少なくするため、タイマーリレーで1時間おきに電源を投入し、画像の送信が終わったらRaspberryPIをシャットダウン
- 日中はソーラーパネルから給電とバッテリーの充電を行い、夜間はバッテリーにより給電
データ
画像
取得している画像のサイズは1280x720。
これら3つ状態を画像から識別できるか否かを試してみました。
動画
参考までに、取得したデータをつなげて動画を作ってみたのであわせてご覧ください。
ラベル
以下のとおりラベルデータを作成。
状態 | 値 |
---|---|
水田に水がある状態 | 0 |
水田に水がない状態 | 1 |
給水している状態 | 2 |
データ形式
files | status |
---|---|
201907011200.jpg | 0 |
201907011300.jpg | 0 |
201907011400.jpg | 1 |
: | : |
201907301200.jpg | 1 |
機械学習
以下のコードで学習と検証を実施。
import cv2
import pandas as pd
import numpy as np
from sklearn import model_selection
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
# ラベルデータの読込
df = pd.read_csv("dat.csv")
y = df["status"]
# 画像データの読込
X = []
i = 16
for file in df.files:
img = cv2.imread(file)
# 画像サイズが大きいので縮小
img = cv2.resize(img, (int(1280/i), int(720/i)))
X.append(img.flatten())
X = np.array(X)
X.shape
# 学習と検証のデータを分割
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=.1, random_state=42)
# 学習
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)
# 検証
print(model.score(X_test, y_test))
print(metrics.confusion_matrix(y_test, model.predict(X_test)))
実行した結果。
1.0
[[40 0 0]
[ 0 14 0]
[ 0 0 5]]
完璧。
...でも、完璧すぎて少し心配(^_^;)
なにはともあれ、次は画像取得時にこの予測を実施し、水田の水がなくなったら通知するというようにサーバーのスクリプト修正をしてみようかな。
追記
本記事で使用した技術を応用して、別の取り組みを行った内容も記事にしてみました。
もし興味のある方がおられましたらあわせてご覧下さい。
畑に農作物を植えてみたけど、忙しくて毎日水やりにいけないのに日照り続きてどうしたものかと悩んでいたら、自動で散水する方法を思いついて試してみたという話
その後
今はこんな感じ(^_^;)
草が生い茂ってきて、人の目で見ても水が出ているかどうか判別が難しいです...