Help us understand the problem. What is going on with this article?

水田の取水バルブを定点カメラで監視し、水田の水があるかないか、給水されているか否かを機械学習で識別してみた

はじめに

水田における水の管理が重要であることは皆さんよくご存知のことと思われますが、人が頻繁に確認するのはそれほど楽ではなく、兼業農家ではこれがさらに難しくなるという課題があるようです。
家の近くにある水田であれば何かのついでに見るということも可能ですが、少し離れたところにある水田の確認はどうしても不十分になってしまう。

上記のような相談があったことから、タイトルのとおり水田の取水バルブを定点カメラで監視し、水田の水があるかないか、給水できているか否かを遠隔地で確認できる仕組みを作りました。

遠隔監視ができるだけでも便利だと言われているのですが、せっかく画像がそろってきたので画像から状況を識別してみたいと試してみた経過を記録しておきます。

定点カメラの概要

外観

UNADJUSTEDNONRAW_thumb_2fab.jpg

構成機器

  • RaspberryPI Zero
  • USBカメラ
  • Soracom Air SIM
  • ソーラーパネル
  • バッテリー
  • タイマーリレー
  • さくらのVPS

機能

  • RaspberryPIが起動したら接続されたUSBカメラの画像をSoracomの回線でVPSサーバーに送信
  • 待機時の電力消費を少なくするため、タイマーリレーで1時間おきに電源を投入し、画像の送信が終わったらRaspberryPIをシャットダウン
  • 日中はソーラーパネルから給電とバッテリーの充電を行い、夜間はバッテリーにより給電

データ

画像

取得している画像のサイズは1280x720。

  • 水田に水がある状態
    201907301307.jpg

  • 水田に水がない状態
    201907271343.jpg

  • 給水している状態
    201907291339.jpg

これら3つ状態を画像から識別できるか否かを試してみました。

動画

参考までに、取得したデータをつなげて動画を作ってみたのであわせてご覧ください。

スクリーンショット 2019-10-15 6.25.12.png

ラベル

以下のとおりラベルデータを作成。

状態
水田に水がある状態 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]]

完璧。

...でも、完璧すぎて少し心配(^_^;)

なにはともあれ、次は画像取得時にこの予測を実施し、水田の水がなくなったら通知するというようにサーバーのスクリプト修正をしてみようかな。

追記

本記事で使用した技術を応用して、別の取り組みを行った内容も記事にしてみました。
もし興味のある方がおられましたらあわせてご覧下さい。

畑に農作物を植えてみたけど、忙しくて毎日水やりにいけないのに日照り続きてどうしたものかと悩んでいたら、自動で散水する方法を思いついて試してみたという話

その後

今はこんな感じ(^_^;)
草が生い茂ってきて、人の目で見ても水が出ているかどうか判別が難しいです...

草をとりにいかなきゃ!
201908291058.jpg

mix_dvd
ExcelのマクロやWebアプリケーション、iOSアプリを作っています。 また、しまねソフト研究開発センター専門研究員の業務を受託しています。http://www.s-itoc.jp
http://blueomega.jp
s-itoc
しまねソフト研究開発センター(ITOC)はITを活用する企業の支援と研究開発の拠点です。
http://www.s-itoc.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした