RaspberryPi+Neural Compute Stick2で、ネコ監視AIカメラ(LINE通知入り)を作ってみる

手前がキッチンです。

うちには猫が2匹います。キッチンに入れないように、猫ゲートを設置していますが、最近、どうやら突破している模様。

どのルートから侵入されているのか不明なので、猫カメラを作成してみましょう。

設置場所も限定されるので、Raspberry Pi(RasPi)で実装します。

RaspberryPi

OpenVINOの環境を構築済のRasPi 4とNeural Compute Stick 2(NCS2)を使いました。

OpenVINO構築については以下の記事をご参照ください。

LINE Notifyの設定

猫を検知した時にLINEで通知を行うため、LINE Notifyの設定を行います。

  • LINEで通知用グループを作成する
  • LINE Notifyでアクセストークンを発行する
  • プログラム

    openvino-wrapperを借用させて頂きました。ありがとうございます。

    https://github.com/yas-sim/openvino-wrapper

    LINE Notifyに画像を送るという部分を追記しています。

    import iewrap
    
    import time
    
    import cv2
    import numpy as np
    
    import requests,os # for LINE notify
    import base64
    
    imgBuf = {}
    label  = []
    
    send_time = time.time()
    
    def callback(infId, output):
        global imgBuf, label, send_time
    
        # Draw bounding boxes and labels onto the image
        output = output.reshape((100,7))
        img = imgBuf.pop(infId)
        img_h, img_w, _ = img.shape
    
        find_flag = False
        for obj in output:
            imgid, clsid, confidence, x1, y1, x2, y2 = obj
            #if confidence>0.4:              # Draw a bounding box and label when confidence>0.8
            if confidence>0.7 and clsid==8:
                x1 = int(x1 * img_w)
                y1 = int(y1 * img_h)
                x2 = int(x2 * img_w)
                y2 = int(y2 * img_h)
                cv2.rectangle(img, (x1, y1), (x2, y2), (0,255,255), thickness=4 )
                cv2.putText(img, label[int(clsid)][:-1], (x1, y1), cv2.FONT_HERSHEY_PLAIN, fontScale=4, color=(0,255,255), thickness=4)
                find_flag = True
    
        cv2.imshow('result', img)
        cv2.waitKey(1)
    
        # LINE_NOTIFY
        diff_time = time.time() - send_time
        if find_flag == True and diff_time > 2.0:        
            find_flag == False
            url = "https://notify-api.line.me/api/notify"
            token = "****************************************"
            headers = {"Authorization" : "Bearer "+ token}
    
            message = 'cat detected!'
            payload = {"message" :  message}
    
            _, buffer = cv2.imencode('.jpg',img)
            jpg_as_text = base64.b64encode(buffer)
            jpg_original = base64.b64decode(jpg_as_text)
            files = {"imageFile":jpg_original}
    
            post = requests.post(url ,headers = headers ,params=payload,files=files)
            print(post)
            send_time = time.time()
    
    def main():
        global imgBuf, label
        label = open('voc_labels.txt').readlines()
    
        cap = cv2.VideoCapture(0)
        cap.set(cv2.CAP_PROP_FRAME_WIDTH , 1280)
        cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 960)
    
        ie = iewrap.ieWrapper('../models/public/mobilenet-ssd/FP16/mobilenet-ssd.xml', 'MYRIAD', 10)
        ie.setCallback(callback)
    
        while True:
            ret, img = cap.read()
            if ret==False:
                break
            refId = ie.asyncInfer(img)     # Inference
            imgBuf[refId]=img
            #time.sleep(1/30)
    
    if __name__ == '__main__':
        main()
    

    Webカメラの調整

    とりあえずゲートの正面にカメラを設置してみました。WebカメラはいつものLogicool c270です。

    猫を検知した際に、LINEに通知がきました。

    まとめ

    無事ネコ監視AIカメラを作成する事が出来ました。侵入ルートの特定はこれからですが、簡単にネコカメラが作れるのは便利ですね。

    このような仕組みを使う事で、例えば関係者以外が映ったらLINEで通知する等も簡単に出来ますね。いろいろなシーンでの活用を考えてみてください。