度目视频分析盒子-案例第一篇
百度的出品的度目视频分析盒子优点:
- 价格绝对便宜,3559AV100(4T算力)的价格从500涨到3000多,度目视频分析盒子没有涨价这个要送一波广告:度目视频分析盒子购买链接
- 检测人脸和抓拍效果很好,抓拍10ms,误抓拍率低
- 识别效果很好,速度也非常快,应该还有待提升(我还没遇见过)
- 视频盒子外壳工艺很不错,有点Mac意思
- 6路基本满帧、8路15帧的样子(性能不错呦)
百度视频分析盒子的不足:主要是易用性问题
- 没有支持web的配置,连接显示虽然展示效果很Nice,但是实际部署就有点鸡肋了
- 只有鼠标的配置,不支持键盘,这个添加URL是真的有点恐怖(心惊胆战)
完整的视频分析盒子连接继电器控制闸机操作指南
物料名称 | 价格 | 购买链接 | 功能 | 备注 |
---|---|---|---|---|
视频分析会 | 3999 | 视频分析盒子 | 人脸识别和抓拍 | 核心物料 |
交换机 | 700 | 华三 | poe供电和网络传输 | 华三路由器作为华为当年的子公司质量有保障 |
继电器 | 20 | fu植本段内容 z 7 R t c b P G l j x z7RtcbPGljx z7RtcbPGljx打楷τao寶【时间继电器模块延时启动闭合断开倒计时通电开关3.3V5V12V24V】 | 用于接收IO输出控制开门 | 淘宝一大堆这里推荐一个合理的,这里注意要买3.3V或者5V的,因为视频盒子的IO输出是3.3v |
摄像头 | - | - | 传输视频流 | 市面上普通摄像头就有可以,这里不做推荐 |
网线 | - | 连接桥梁 |
1.人脸识别通过http接口上报给server(视频盒子主动上报)
2.之后server接受到人脸识别结果控制http发送一个IO请求
3.IO输出的是3.3V的电压数字信号(带不了负载,所以需要继电器)
4.通过继电器接受到3.3V电压,控制继电器闭合
完事
友情提示:测试阶段发送http的IO请求,用万用表测试一下是否3.3v电压
度目视频分析盒子,里面可以直接配置识别即GPIO输出的信号位和时长、蜂鸣器的控制(视频分析盒子内置蜂鸣器)
这个完全解决,不用server接收到识别的人脸再去控制io造成的网络延迟(极大方便用户作为解决方案)
轮巡,当人脸识别时候,所选择的通道会直接扩展为全屏,突出抓拍人脸的所在位置。
http的上传心跳、注册、人脸图及原图、IO控制代码示例
需要安装
1.pydantic
2.fastapi
- 人脸上报代码块(仅供参考)
# -*- coding: utf-8 -*-
# @time : 2020/06/03
from pydantic import BaseModel
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
import time
app = FastAPI()
class SubDeviceInfo_Capture(BaseModel):
SubDeviceIP: str = None
SubDeviceUUID: str = None
class DeviceInfo_Capture(BaseModel):
DeviceId: str
DeviceUUID: str
DeviceMac: str
DeviceIP: str
ChannelNo: int
SubDeviceInfo: SubDeviceInfo_Capture = None
class CaptureInfo_Capture(BaseModel):
SendTime: str
CaptureTime: str
CaptureCount: int
FacePicture: str = None
BodyPicture: str = None
BackgroundPicture: str = None
class FaceInfo_Capture(BaseModel):
FaceId: int = None
FaceQuality: int = None
FacePosition: str = None
class Attribute_Capture(BaseModel):
Age: int = None
Gender: int = None
Glasses: int = None
Mask: int = None
Beard: int = None
Race: int = None
class PersonExtension_Capture(BaseModel):
PersonCode1: str = None
PersonCode2: str = None
PersonCode3: str = None
PersonReserveName: str = None
PersonParam1: int = None
PersonParam2: int = None
PersonParam3: int = None
PersonParam4: int = None
PersonParam5: int = None
PersonData1: str = None
PersonData2: str = None
PersonData3: str = None
PersonData4: str = None
PersonData5: str = None
class PersonInfo_Capture(BaseModel):
PersonId: str = None
PersonName: str = None
Sex: int = None
IDCard: str = None
Nation: str = None
Birthday: str = None
Phone: str = None
Address: str = None
SaveTime: str = None
LimitTime: int = None
StartTime: str = None
EndTime: str = None
Label: str = None
PersonExtension: PersonExtension_Capture
PersonPhoto: str = None
class CompareInfo_Capture(BaseModel):
AlarmEvent: int = None
Liveness: int = None
Attribute: Attribute_Capture = None
CompareTime: str = None
PersonType: int = None
VisitsCount: int = None
Similarity: str = None
PersonInfo: PersonInfo_Capture = None
class Data_Capture(BaseModel):
DeviceInfo: DeviceInfo_Capture
CaptureInfo: CaptureInfo_Capture
FaceInfo: FaceInfo_Capture = None
CompareInfo: CompareInfo_Capture = None
class CaptureCBItem(BaseModel):
Name: str
TimeStamp: int
Session: str
Data: Data_Capture
class DeviceInfo_HeartBeat(BaseModel):
DeviceId: str
DeviceUUID: str
DeviceMac: str
ChannelNo: int
WebVersion: str
CoreVersion: str
VersionDate: str
class Data_HeartBeat(BaseModel):
DeviceInfo: DeviceInfo_HeartBeat
HTTPVersion: str
HTTPDate: str
HeartbeatCount: int
CaptureCount: int
class HeartBeatCBItem(BaseModel):
Name: str
TimeStamp: str
Session: str
Data: Data_HeartBeat
class DeviceInfo_Register(BaseModel):
DeviceId: str = None
DeviceUUID: str = None
DeviceMac: str = None
DeviceIP: str = None
DeviceType: int = None
ChannelNum: int = None
WebVersion: str = None
CoreVersion: str = None
VersionDate: str = None
class Data_Register(BaseModel):
DeviceInfo: DeviceInfo_Register = None
HTTPVersion: str = None
HTTPDate: str = None
class RegisterItem(BaseModel):
Name: str = None
TimeStamp: str = None
Data: Data_Register = None
# @app.post('/test')
# def calculate(request_data: Item):
# a = request_data.a
# b = request_data.b
# c = a + b
# # with open('./11.txt', 'w') as f_res:
# # f_res.write(str(c))
# res = {"res":c}
# return res
# def get_value_for_key(raw_value):
# """
# """
# request_info = {}
# part_str_array = raw_value.split(' ')
# print(part_str_array)
# for part_str in part_str_array:
# idx_key = part_str.find('=')
# key_value = part_str[0: idx_key]
# if part_str[-1] == ')':
# idx = part_str.find('(')
# new_raw_value = part_str[idx + 1 : -1]
# print('11111', new_raw_value)
# request_info[key_value] = get_value_for_key(new_raw_value)
# else:
# print('yyy', part_str)
# if part_str[-1] != '"' and part_str[-1] != "'" :
# print('jjj', part_str[idx_key + 1 : ])
# request_info[key_value] = part_str[idx_key + 1 : ]
# else:
# print('fff', part_str[idx_key + 2 : -1])
# request_info[key_value] = part_str[idx_key + 2 : -1]
# return request_info
@app.post('/CaptureCB')
def strore_Capturemessage(request_data: CaptureCBItem):
# print(str(request_data.Name), str(request_data.Session), flush=True)
with open('./CaptureCB.txt', 'a+') as f_res:
request_info = jsonable_encoder(request_data)
f_res.write(str(request_info) + "\n")
current_ts = round(time.time())
res = \
{
"Name": "captureInfoResponse",
"TimeStamp": current_ts,
"Session": request_data.Session,
"Code": 1,
"Message": ""
}
return res
@app.post('/HeartBeatCB')
def strore_HeartBeatmessage(request_data: HeartBeatCBItem):
"""
"""
print(jsonable_encoder(request_data))
with open('./HeartBeatCB.txt', 'a+') as f_res:
request_info = jsonable_encoder(request_data)
f_res.write(str(request_info) + "\n")
current_ts = round(time.time())
res = \
{
"Name": "heartbeatResponse",
"TimeStamp": current_ts,
"Session": request_data.Session,
"Code": 1,
"Message": ""
}
return res
@app.post('/Register')
def strore_Resgistermessage(request_data: RegisterItem):
"""
"""
print(jsonable_encoder(request_data))
with open('./Register.txt', 'a+') as f_res:
request_info = jsonable_encoder(request_data)
f_res.write(str(request_info) + "\n")
current_ts = round(time.time())
Session_name = request_info['Data']['DeviceInfo']['DeviceUUID'] + '_' + str(current_ts)
res = \
{
"Name": "registerResponse",
"TimeStamp": current_ts,
"Data":
{
"Session": Session_name,
"ServerVersion": "1.1.0"
},
"Code": 1,
"Message": ""
}
return res
if __name__ == '__main__':
import uvicorn
uvicorn.run(app=app,
host="0.0.0.0",
port=8080,
workers=1)
- http请求IO控制代码块(仅供参数)
#!/usr/bin/python
import requests as req
import base64
import json
post_url = "http://192.168.1.9:595"
data = {
'Name':'IOControlRequest',
'Data':
{
'ContinueSeconds':10
}
}
json_data = json.dumps(data)
r = req.post(url = post_url, data = json_data)
print(r.text)
具体逻辑靠大家的异想天开了哈