在智能家居安全领域,摄像头的选择从廉价且功能有限的到功能丰富但价格昂贵的应有尽有。作为一个预算有限的用户,选择了Wyze摄像头。它们售价30美元,具有防水和无线功能。目标——实际上是需求——是建立一个系统,能够在浣熊出现在阳台上时检测到它,这样就可以对这些小毛茸茸的破坏者进行惩罚。
曾经与这些驼背恶魔对峙过。它,一边盯着,一边发出嘶嘶声,退到了角落;,一边盯着它,一边拿着一块大木头,却不知道要拿它做什么。在澳大利亚,没有浣熊。知道这东西是个麻烦,但只是不确定它会带来多大的麻烦。
微风轻轻吹拂。一只黄蜂飞过。然后飞回来,落在了这个生物那孩子般的手上。哦,这将很有趣,想。它没有眨眼。相反,它用它那长着胡须的鼻子把黄蜂从手上拿下来,用黄色的牙齿开始咀嚼。与此同时,它一直没有把目光从身上移开。觉得很幸运吗,小子?是吗?
本文将为提供使用CodeProject.AI Server检测浣熊的基础知识。将设置一个带有测试固件的Wyze摄像头,以暴露RTSP流,使用一小段Python代码吸收该流,然后将流中的帧发送到CodeProject.AI Server进行对象检测。第二部分将处理训练一个专门用于检测浣熊的模型。
Wyze并不提供直接从他们的摄像头访问视频流的功能,但他们确实提供了一种测试固件,该固件启用了RTSP(实时流协议)。RTSP是一种流媒体协议,Wyze摄像头的实现最初作为测试版发布,但由于稳定性问题被移除,然后重新发布,更新,发布为v3版本,然后再次被移除。现在它处于一种奇怪的停滞状态,但固件仍然可以从Wyze下载。
要更新摄像头,请下载相应的固件并按照说明操作。只需记住将bin文件重命名为demo.bin(V2)或demo_wcv3.bin(V3),并将文件放置在SD卡的根目录。
一旦刷入了更新固件并重新启动了摄像头,将在Wyze应用中看到RTSP选项。只需选择摄像头,进入设置→高级设置,RTSP设置就在底部。
RTSP流的位置使用以下形式的URL指定:
rtsp://<用户名>:<密码>@<IP地址>:<端口>/<端点>
在Wyze应用中选择摄像头设置的高级设置中的'RTSP',系统将提示生成一个URL。选择一个用户名和密码,URL将显示如下:
rtsp://user:pass@192.168.0.189/live
在这里,选择了'user'和'pass'作为超安全凭证。摄像头的IP地址是192.160.0.189,它将使用默认端口。
使用imutils.video来获取流,使用OpenCV来显示每一帧。代码非常简单:
import cv2
import imutils
from imutils.video import VideoStream
rtsp_url = "rtsp://user:pass@192.168.0.189/live"
def main():
vs = VideoStream(rtsp_url).start()
while True:
frame = vs.read()
if frame is None:
continue
frame = imutils.resize(frame, width=1200)
cv2.imshow('WyzeCam', frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
cv2.destroyAllWindows()
vs.stop()
if __name__ == "__main__":
main()
查看是一回事,但让让它做一些有用的事情:添加对象检测。
第一步。安装CodeProject.AIServer。
第二步。将视频流中的每帧发送到CodeProject.AI Server进行处理。
第三步。显示结果
首先,在代码中添加一个do_detection方法。这个方法将接受一个帧,将其转换为适合发送到CodeProject.AIServer的形式,进行检测,然后在检测到的项目上标注标签和边界框。
import io
import requests
import numpy as np
from PIL import Image, ImageDraw
codeprojectai_api_url = 'http://localhost:32168/v1/vision/detection'
def do_detection(image):
buf = io.BytesIO()
image.save(buf, format='PNG')
buf.seek(0)
with requests.Session() as session:
response = session.post(codeprojectai_api_url, files={"image": ('image.png', buf, 'image/png')}, data={"min_confidence": 0.5}).json()
predictions = response["predictions"]
if predictions is None:
predictions = []
draw = ImageDraw.Draw(image)
for object in predictions:
label = object["label"]
conf = object["confidence"]
y_max = int(object["y_max"])
y_min = int(object["y_min"])
x_max = int(object["x_max"])
x_min = int(object["x_min"])
draw.rectangle([(x_min, y_min), (x_max, y_max)], outline="red", width=5)
draw.text((x_min, y_min), f"{label}")
draw.text((x_min, y_min - 10), f"{round(conf*100.0,0)}")
return image
def main():
vs = VideoStream(rtsp_url).start()
while True:
frame = vs.read()
if frame is None:
continue
image = Image.fromarray(frame)
image = do_detection(image)
frame = np.asarray(image)
frame = imutils.resize(frame, width=1200)
cv2.imshow('WyzeCam', frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
cv2.destroyAllWindows()
vs.stop()
通过使用Wyze摄像头并更新其固件,能够访问RTSP流进行处理。一段Python代码从这个流中提取帧,允许将帧发送到CodeProject.AIServer进行对象检测。
代码包含在CodeProject.AI Server源代码中(在Demos/Python/ObjectDetect下)。整个文件不到100行。