うちには猫が2匹います。キッチンに入れないように、猫ゲートを設置していますが、最近、どうやら突破している模様。
どのルートから侵入されているのか不明なので、猫カメラを作成してみましょう。
設置場所も限定されるので、Raspberry Pi(RasPi)で実装します。
RaspberryPi
OpenVINOの環境を構築済のRasPi 4とNeural Compute Stick 2(NCS2)を使いました。
OpenVINO構築については以下の記事をご参照ください。
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で通知する等も簡単に出来ますね。いろいろなシーンでの活用を考えてみてください。
フリーのITエンジニア(何でも屋さん)。趣味は渓流釣り、サッカー観戦、インラインホッケー、アイスホッケー、RaspberryPiを使った工作など。AI活用に興味があり試行錯誤中です。