12/9(月) 応用科学学会シンポジウムで自動運転に関する講演を担当します☆彡

1-14. 洗濯機の水栓の閉め忘れをLINE通知してみた(②LINE通知編)

やること

洗濯機の蛇口の閉め忘れを監視してLINE通知するシリーズ、前回は蛇口の撮影から学習まで行いました。

今回は「開」「閉」の判定結果をLINE通知するシステムを作ります。最後にリアルタイム監視を試してみましょう。

参考文献

YOLOv8の判定結果の取り出し方についてはこちらを参照してください。

results
Explore the details of Ultralytics engine results including classes like BaseTensor, Results, Boxes, Masks, Keypoints, Probs, and OBB to handle inference result...

Line notifyの設定

まずLINEアカウントを作成します。皆さんだいたい持っていると思います。

Suzu
Suzu

ちなみに現在は新規アカウント登録に電話番号が必須です。050では登録できません。

管理人
管理人

「電話番号が必要」と称しながら実際にはSMSが必須。誤った案内をする。050の人権を認めない。こんなサービスは使うべきではないね(暴言)

Line notifyのWebサイトにログインし、マイページに移動します。

LINE Notify
LINE NotifyはGitHub,IFTTT,MackerelなどのWebサービスからの通知を、LINEで受信することが出来る便利なサービスです。

マイページのどこかに「Generate token」というボタンがあるのでクリックします。

適当なトークン名を付けて、通知の送り先アカウントを選択します。自分と友達がずらっと並んでいるので自分を選択します。緑色の「Generate token」ボタンをクリックすると、トークン(数字とアルファベットが混ざった文字列)が生成されます。この文字列を記録しておいてください。※記録する前にページ移動してしまうとトークンが確認できなくなり再発行になります。

LINE通知を試す

こちらのコードでLINE通知のテストをします。

import requests

#トークン
token = 'your_token' #発行されたトークンをここにコピペ

#LINEにメッセージを送る
def send_line(msg):
    
    #APIのURL
    url = 'https://notify-api.line.me/api/notify'
    
    #パラメータを用意
    headers = {'Authorization': 'Bearer ' + token}
    payload = {'message': msg}
    
    #requestsモジュールのpost関数を利用してメッセージを送信
    #ヘッダにトークン情報、パラメータにメッセージを指定
    requests.post(url, headers=headers, params=payload)

#メッセージを送信
send_line('Hello, world!')

メッセージ送信にはHTTPのPOSTメソッドを使用します。POSTメソッドとはデータをURLに含めずにサーバーに送信する方式で画像データや長文の送信に適しています。これに対し、GETメソッドはリクエストパラメータをURLの末尾に追加して送信する方式です。今回はトークンという秘密の情報を送るため、セキュリティの観点からPOSTメソッドが適しています。

Line notifyの仕様は以下のようになっています。Line notifyはOAuth2(Webサービスやアプリの許可や認証を行うプロトコル)に基づいてユーザの許可を得てアクセストークンを取得します。これにより、HTTPSを通じたNotify APIを実行してリアルタイムの通知を行います。

リアルタイム検出の結果をLINE通知

いよいよメインの監視プログラムです。

判定結果は「result_value」に格納して、0なら「閉」、1なら「開」として通知を送信します。この数字は学習データに割り当てられていた数字のとおりです。

import cv2
import torch
import requests
from ultralytics import YOLO


#トークン
token = 'your_token' #発行されたトークンをここにコピペ

#学習済みモデル
model =YOLO('last.pt')


#LINEにメッセージを送る
def send_line(msg):
    
    #APIのURL
    url = 'https://notify-api.line.me/api/notify'
    
    #パラメータを用意
    headers = {'Authorization': 'Bearer ' + token}
    payload = {'message': msg}
    
    #requestsモジュールのpost関数を利用してメッセージを送信
    #ヘッダにトークン情報、パラメータにメッセージを指定
    requests.post(url, headers=headers, params=payload)


#カメラ起動
cap = cv2.VideoCapture(0)
if not cap.isOpened():
    print("Don't open camera")
    exit()


#監視開始
while True:
    
    #キャプチャ
    ret, frame = cap.read()
    if not ret:
        print("Don't get frame")
        break
    
    #判定
    results = model(frame)
    
    #判定結果を取得
    for result in results:
        result_value = result.boxes.cls
    
    #0なら"water_close"
    if (result_value == 0.).all():
        send_line('水の栓が閉まっています')
        print('close')
    
    #1なら"water_open"
    elif (result_value == 1.).all():
        send_line('水の栓が開いています')
        print('open')
    
    else:
        pass
    
    #判定画像を表示
    img_annotated = results[0].plot()
    cv2.imshow('Camera', img_annotated)
    
    #終了キー
    if cv2.waitKey(1) == ord('q'):  # qキーで終了
        break

cap.release()
cv2.destroyAllWindows()

洗濯機の前でMacbookを抱えて実行した結果、LINEに「栓が閉まっています」という通知が来ました!

蛇口を開けると「栓が開いています」という通知に変わりました!

こちらがキャプチャ動画です。

洗濯機の水栓の閉め忘れをLINE通知してみた(②LINE通知編)

毎秒2回くらい通知が来ています、、うるさい!!!!(#^ω^)

さいごに

洗濯機の水栓の開閉状況を監視してLINE通知するシステムができました!

今後の展望として

  • ラズパイ+カメラで監視できるか
  • 通知頻度の調整
  • エラー時の処理
  • 外出中でもスマホに通知が届くか
  • 水栓にサーボモータを取り付けて遠隔操作が可能か

などを考えています。まさにSwitchBotの自作ですね。

応援はリツイートなどを実行する形でお願いします!また、Qiitaとnoteもやっていますのでフォローお願いします!

Qiita

@Umamusume22のマイページ - Qiita
ロボット開発の仕事をやっています.担当はソフトウェア開発です. Iotやプログラミングが好きです. noteもやっています!: 好きなウマ娘:キタサンブラック

note

Umamusume22|note
メーカー勤務のロボットエンジニア.ソフトウェア開発担当.短大から国公立大学に編入した珍しい経歴の持ち主.情報工学専攻.ROS,ラズパイ,AI,画像処理などのスキルを所有.元ロボコニストで世界大会出場経験あり.普段はPythonとC+を活用.

SNS等でお気軽にご連絡ください

※当ブログに関することは何でもご相談・ご依頼可能です(Servicesになくても)
※TwitterはFF外の場合はDMではなく返信orメンションでお願いしますm(_ _)m

情報発信しています

質問・コメントはSlackやDiscordでお気軽に

勉強会の告知はこちらで

回帰 / クラス分類
この記事を書いた人

専門は情報工学とロボット制御。元ロボコニストでRoboCup世界部門優勝常連チーム。ご飯にシチューかける党党首。

この記事をシェアする
Vignette & Clarity(ビネット&クラリティ)
タイトルとURLをコピーしました