274
147

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-07-31

はじめに

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

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

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

定点カメラの概要

外観

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

274
147
13

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
274
147

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?