基YOLOV5实现的AI智能盒子

基于yolov5实现的AI智能盒子框架

  • 开发背景
  • 技术实现
  • 产品效果
  • 源码预览
  • 功能介绍

2021-2023是沉淀的几年,经济不景气,各行各业都不太好混,所以这几年也没有太多心思花在csdn上为各大网友写一些技术文章,2024年初,也算是给自己留下一点岁月的足迹吧,所以把这段时间精心研究的东西写出来供大家交流,顺带也看看是否有机会遇到能帮助到其他技术公司或朋友,在交流中实现双赢,有需要的朋友可以威信(幺捌零叁捌捌伍陆柒零贰,威信与电画同号),具体合作方式具体交流。

开发背景

从事安防多年,但基本都是从事音视频的编解码工作,很少处理图形图像相关算法,原因如下:
(1)图形图像相关算法如车牌识别识别、人脸识别等如果是自己研发,涉及到高等数学等及图形图像处理等高深的支持,开发难度较大;
(2)前n年基本没有开源的、简易的不需要熟悉底层算法的AI识别框架,很难将生活中涉及的AI识别或机器学习的相关算法变成现实;
主要基于以上两点,导致AI相关的算法落地很难、实现很难、应用更难!

然后,基于百度paddle和yolo的开源框架出现了,这使得AI识别难度大大下降,应用门槛大大降低,然而paddle则是面向服务器,对硬件要求较高,部署也相对复杂,很难将普遍应用到生活中,所以经过多番调研yolo则是我们最好的选择。
选择yolo有如下优势
(1)开源且识别效率非常高,仅需一次识别即可完成所有对象的分类识别。
(2)可以应用到服务器中,也可以应用到小型硬件中,本文部署的硬件就支持windows/ubun,支持jetson nano、jetson orin nano等3款中高低档硬件(约5000元、3000元、1000元)
(3)开源技术论坛和资料较多
(4)支持使用python,支持跨平台部署(一套代码,多套环境部署)

在安防领域,基于音视频的基础操作已经基本上没有任何难度(看视频、直播、录像等),但基于音视频的AI应用却很难,但随着技术的成熟,这些应用也变得越来越多,结合生活实际需求的场景就有很多,例如
(1)非法闯入:夜间无人值守或重要地点进出监控
(2)摔倒检测:关爱老人,老人摔倒检测或打架斗殴跌倒检测,可用于社区、监狱、广场、学校等场所。
(3)明火识别:严禁烟火的第三方识别火焰,防止火宅,可用于森林、车间、化工产等场所。
(4)烟雾排放:同明火场景。
(5)越界检测:越过指定边界,产生报警,一般用于行人识别与闯入检测,结合视频区域检测。可用于无人值守场景。
(6)睡岗检测:工作期间睡觉检测,避免安全事故发生。
(7)离岗检测:工作期间离开岗位检测,避免安全事故发生。
(8)人群聚众:检测人员聚集,避免打群架、避免踩踏事件发生。
(9)攀高检测:检测人员是否进行攀爬,避免安全事故发生。
(10)打架斗殴:检测人员是否打架,可用于学校、公共场所。
(11)人脸抓拍:人脸数据抓拍,可推送给人脸识别服务进行1&1识别及陌生人识别。
(12)遮挡检测:检测摄像机是否被人为遮挡或被损坏。协调运维人员进行维护。
(13)垃圾满溢:检测垃圾桶垃圾是否满溢,协助环卫人员智能调度环卫车辆,节省人力和物力。
(14)占道经营:检测是否有占用道路非法经营,协助城管管理,减轻工作量。
(15)安全帽识别:工地安全帽识别,提高工地安全。
(16)反光衣识别:工地反光衣识别,防止非工作人员闯入工地区域。
(17)电动车进电梯:检测电动车进出电梯,防止火灾发生。
(18)口罩检测:明厨亮灶,检测食品从业人员是否佩戴口罩。
(19)虫害识别:智慧农业,通过AI识别虫害,智能指导农户作业。
(20)动物识别:公共场所,不允许动物进出场所。
(21)电梯超员检测:电梯人员是否超载工作。
(22)河边垂钓检测:严禁垂钓河边检测人员是否有钓鱼或捕鱼行为。
(23)河边游泳检测:严禁游泳河边检测人员是否有下水游泳行为。
(24)人数统计:人数统计或客流统计,通过AI方式统计绘制市场的客流热力图。
(25)抽烟检测:明厨亮灶,检测从业人员是否有吸烟行为。
(25)泥头车识别:街道泥头车随意、掉土的事件。
(27)打电话识别:检测开车是否有打电话行为。
(28)机动车/非机动车识别:机动车和非机动车识别。
(29)车流量统计:识别车辆及统计车流量
以上是我总结的贴近生活,很有可能在生活中非常实用的场景,这些算法都是可以通过数据采集进行一一训练的。

技术实现

开发环境:pycharm
开发语言:python、vue2.0、pytorch、vision
部署环境:
(1)windows-conda、jetson-nano:conda(低配)、
(2)jetson orin nano:python、cuda、cudnn(sdk)(中高配)
(3)orange PI(正在适配中)
硬件选型:
(1)低配jetson naco(b01替换版本),ubuntu,价格1312元(含外壳),0.5tops,分析实时视频约4路;一张图约200ms~300ms耗时;
(2)中配jetson orin nano,ubuntu,价格3200元上下,20tops,分析实时视频约8路;一张图约100ms耗时;
(3)高配jetson orin nano,Ubuntu,价格在5200元上下,70-100tops,分析实时视频约16路;一张图约30ms耗时;
(4)国产华为芯片orange PI,4G,16核心,价格在1000元左右,分析视频预估在16路;(正在适配中,硬件一片难求)
在这里插入图片描述

产品效果

为此,我开发了一个AI盒子框架,这个框架可以动态添加训练好的模型、动态添加需要分析的网络摄像机、动态为每一路摄像机添加不同的分析场景(算法)、动态配置AI盒子参数、动态重启AI盒子等功能;
AI盒子提供了

(1)登录AI盒子
AI盒子登录页面提供用户名和密码模式登录,登录后可以修改初始密码。
在这里插入图片描述

为适配不同的地方需求,AI盒子最新版本,支持中文简体版本、英文版本和中文繁体版本。
在这里插入图片描述

(2)系统首页
AI盒子主要提供设备管理、报警管理、录像管理、模型配置以及系统设置功能。
在这里插入图片描述

(3)设备管理
可以动态添加需要分析的设备,此处的设备为网络设备,AI盒子通过设备的rtsp标准协议从摄像机获取视频流,然后进行抽帧分析,抽帧间隔可以动态进行配置。
在这里插入图片描述
可以控制设备进行AI抽帧的分析时间段控制,如早上08:00开始分析,到晚上23:00截止。在这里插入图片描述
可以配置设备分析的区域,区域支持多边形绘制(区域入侵)、绘制边界线段(周界检测)在这里插入图片描述

(4)场景管理
一个设备抽帧的图片,可以做不同场景的算法分析,例如一个摄像机可以同时分析明火烟雾检测、攀爬检测,也可以分析更多的算法(当然,算法越多,耗时就增加,不过对于在1-3秒内能实时响应就已经是非常适用了,可以忽略)在这里插入图片描述

(5)报警管理
当分析场景检测到超过设定置信度的预警时,会存储到AI盒子中,AI盒子会将报警异步推送到配置的第三方平台中,可以在AI盒子中保存n天
在这里插入图片描述
如果AI盒子打开报警录像功能,AI盒子会自动录取事件发生的前3秒以及后3秒,总共6秒录像,这些录像也会被推送给第三方平台
在这里插入图片描述

(6)录像管理
此外AI盒子支持视频转发(rtmp)、手动抓拍、远程录像功能,录像后可以存储在AI盒子,当推送给第三方平台后会自动从本地移除
在这里插入图片描述

(7)模型管理
AI盒子提供模型载入、识别、上报等完整框架,并不固化整个流程,所以对AI盒子而已,算法、设备、场景都是灵活可以配置的,支持动态的模型添加功能,我们可以将训练好的模型动态添加到AI盒子中
在这里插入图片描述
模型可以包括所有分析,哪些是属于正常的(不会报警的),哪些属于异常的(显示红框,可能要报警的)
在这里插入图片描述

(8)系统配置
AI盒子支持系统配置,配置项目包括AI盒子编码(推送到第三方,区别多个盒子)、报警保存天数、并发分析数量控制、识别后是否显示标签、是否支持报警联动录像、是否凌晨自动重启、报警第三方平台介绍地址、长连接控制地址。
在这里插入图片描述
(9)GPIO及modbus联动
此外,AI盒子支持自身引脚联动或t通过外接modbus协议进行对接,以下为AI盒子定制的一个仓库物料领取场景:
A、人通过人脸机刷脸开门进入物料仓库(人脸机器联动门磁)
B、门禁从常开(1状态)变为断点开门状态(0),AI盒子检测到人员进入,开始联动摄像机进行录像;
C、人员进入仓库后领取物料,拿去完成之后将物料放置到物料台,然后按墙壁上的拍照IO开关;
D、AI盒子检测到AI开关后,联动摄像机视频进行物料实物抓拍,可以抓图多张;
E、人员拍照后拿取物料并离开物料仓库,门磁从开门(0)状态恢复为常闭状态(0);
F、AI盒子检测到关门信号,停止联动录像,并将从门禁到出门的录像+物料拍照打包存储并发送给第三方平台;
这样,一个人从进门领取物料开始录像==>物料拍照==>停止录像整个过程留影留像,保留了整个过程的证据。如果是非法闯入则自动通过AI预警进行报警录像,产生非法闯入预警,如果正常人脸刷脸进入则不会产生非法报警。

源码预览

(1)服务启动

"""===========导入安装的python库==========="""
import sys
from pathlib import Pathfrom box.box import Box
from utils.general import check_requirements# 获取当前文件路径
FILE = Path(__file__).resolve()
# 获取当前文件父目录-YOLOv5根目录
ROOT = FILE.parents[0]
# 获取绝对路径
PARENT = ROOT
# 将根目录添加到系统path中
if str(ROOT) not in sys.path:sys.path.append(str(ROOT))# 程序启动入口
if __name__ == '__main__':# 检查请求参数check_requirements(ROOT / 'requirements.txt', exclude=('tensorboard', 'thop'))# 创建AI盒子box = Box()# 初始化盒子box.init()# 启动AI盒子box.start()# 等待盒子退出box.join()# 停止AI盒子box.stop()

(2)websocket协议


# 报警推送实现
class SocketService(threading.Thread):# 构造函数def __init__(self):# 重写父类方法threading.Thread.__init__(self)# 套接口self.ws = Noneself.connected = Falseself.do_run = True# 数据接收self.msg_thread = None# 视频数量self.count = 0# 视频回调self.video_back = Nonepass# 停止服务def stop(self):self.do_run = False# 关闭套接口if self.ws is not None:self.ws.close()# 等待接收退出if self.msg_thread is not None:if self.msg_thread.is_alive():self.msg_thread.join()pass# 设置命令回调def set_video_back(self, call):self.video_back = call# 响应结果def send_result(self, url, cmdId, state, desc, data=None, file_path=None):try:if url is None or cmdId is None:return# 请求字典dict_info = {}# 追加文件if file_path is not None:# 读取文件内容file = open(file_path, "rb")name = os.path.basename(file_path)dict_info['file'] = (name, file, 'application/octet-stream')# 追加数据if data is not None:dict_info['data'] = data# multipart编码encoder = MultipartEncoder(fields=dict_info)# 请求头部headers = {'Content-Type': encoder.content_type}# 发送到第三方result_url = (url + "?boxId=" + SystemConfig.ID + "&cmdId=" + cmdId +"&state=" + str(state) + "&desc=" + desc)response = requests.post(result_url, json=data, headers=headers)if response.status_code != 200:return False# 处理返回结果result = response.json()# 处理返回结果if result['error'] != 0:error = result['error']LOGGER.error(f'upload box {SystemConfig.ID} command result failed, reason: {error}')return False# 返回成功结果return Trueexcept Exception as e:LOGGER.error(f'upload alarm error {e}')pass# 报警推送def run(self) -> None:# 开始时间last_time = datetime.datetime.now()while not Global.restart and self.do_run:try:# 查询通信地址result_url = SystemConfig.ALARM_URLif SystemConfig.ALARM_URL is not None:if not result_url.endswith("/"):result_url += "/"result_url += "result"# 系统重启if Global.restart:break# 连接服务器if not self.connected:if SystemConfig.SOCKET_URL is None or SystemConfig.SOCKET_URL == '':time.sleep(1)continuetry:# 连接服务self.ws = create_connection(SystemConfig.SOCKET_URL)self.connected = self.ws.connected# 连接成功if self.ws.connected:LOGGER.info(f'@connect websocket success: {SystemConfig.SOCKET_URL}')# 连接信息box = {'id': SystemConfig.ID,'ip': Global.ip,'port': Global.port,'cmd': 'connect'}# 发送连接self.ws.send(json.dumps(box))# 更新心跳时间last_time = datetime.datetime.now()# 同步盒子数据self.sync_server_data()passexcept Exception as e2:LOGGER.error(f'websocket connect error:{e2}')self.connected = Falsepass# 链接失败等待if not self.connected:time.sleep(3)continue

(3)系统配置

# 系统全局配置
import uuidfrom box.util import SystemUtil# 全局配置
class Global:# 数据库配置dbIp = '127.0.0.1'dbPort = 3306dbUser = 'root'dbPwd = 'root'dbName = 'box3'# web配置ip = '127.0.0.1'port = 5700# 系统重启标志restart = False# 启用串口信号读取enableIO = False# linux-设备名LUX_IO_NAME = '/dev/ttyCH341USB0'# win-设备名WIN_IO_NAME = 'COM13'# 初始化def __init__(self):pass# 获取本机ip@staticmethoddef local_ip():try:if Global.ip == '127.0.0.1':Global.ip = SystemUtil.get_local_ip()except Exception as e:print(f'get local ip error {e}')# 系统配置
class SystemConfig:# 盒子当前编码ID = str(uuid.uuid1()).replace("-", "")# 系统登录账号ADMIN = 'admin'# 系统账号密码PASSWORD = 'dd123456'# 系统并发分析数PATROL_NUM = 4# 报警保存天数SAVE_DAYS = 1# 是否显示标签SHOW_LABEL = 1# 是否报警录像ALARM_RECORD = 1# 是否定时重启AUTO_RESTART = 1# 报警推送地址ALARM_URL = ''# 长连接地址SOCKET_URL = ''

(4)文件清理

import threading
import os
import time
from threading import Lockfrom box.config import Global
from utils.general import LOGGER# 文件异步清理
class FileClear(threading.Thread):# 待清理文件列表files = []# 全局文件列表锁lock = Lock()# 构造函数def __init__(self):# 重写父类方法threading.Thread.__init__(self)pass# 添加清理文件@classmethoddef push(cls, file):if file is None:returncls.lock.acquire()try:cls.files.append(file)except Exception as e:LOGGER.warning(f'add clear file error {e}')finally:cls.lock.release()pass# 报警推送def run(self) -> None:# 系统未重启while not Global.restart:try:# 系统重启if Global.restart:break# 尝试清理try:# 获取文件大锁self.lock.acquire()# 当前系统无任务if len(self.files) <= 0:# 释放文件大锁self.lock.release()# 睡眠等待1秒time.sleep(1)continue# 删除所有文件-忽略异常for file in self.files:try:os.remove(file)except Exception as e1:LOGGER.warning(f'{e1}')passpass# 清空数据self.files.clear()# 释放文件大锁self.lock.release()time.sleep(0.1)except Exception as e:# 释放文件大锁self.lock.release()LOGGER.warning(f'clear file error {e}')passexcept Exception as e:LOGGER.warning(f'clear file error: {e}')

由于功能较多,此处不在一一赘述,有需要合作的请联系我(威信:幺捌零叁捌捌伍陆柒零贰,威信与电画同号),咱们在进一步沟通。

功能介绍

AI盒子是基于yolov5框架开发的一套AI识别框架,可以支持多模型、多设备、多场景(算法)识别,支持http协议(同一个局域网)通信、支持websocket协议(不同局域网)通信,支持视频取流识别,支持接口图片AI识别、支持媒体视频转发(视频播放)等功能。
AI盒子是独立的个体,可以单独部署(外接显示器,通过浏览器即可实时查看报警、实时播放报警),AI盒子也可以集成外部平台,通过AI盒子对接接口(包括http协议、websocket协议),将报警及录像等信息推送至第三方平台。

具体功能介绍如下所示
(1)系统配置
可以配置AI盒子的基本配置,包括AI盒子的编码(多个盒子时对接外部使用)、录像及报警保存天数、并发AI分析设备路数、AI预警是否显示预警标签、是否12点自动重启(用不上,异常情况下处理)、第三方报警推送地址、第三方平台信令下发连接地址(服务端下发指令到AI盒子,如模型下发、设备下发、场景下发、设备重启、系统配置等)。这些配置都可以实时配置实时生效,不需要重启。
在这里插入图片描述

(2)模型管理
可以通过AI盒子自带的web端管理界面管理AI盒子中的模型,也可以通过AI盒子对接协议管理AI盒子模型,AI提供与模型无关的处理框架,训练的模型分类根据实际填写即可
在这里插入图片描述

(3)设备管理
AI盒子主要通过rtsp协议(标准)分析设备视频流(海康、大华等都可以),通过视频流帧采样的方式(采样帧频率可以动态配置)分析对应设备的图片流,并且支持指定时间段内进行分析(如工作时间或下班时间进行AI分析),实现设备动态管理、动态配置,除支持分析视频流之外,当然AI盒子也提供了图片分析接口(可以第三方通过接口投递图片并进行分析)并返回结果
在这里插入图片描述

(4)场景管理
AI分析的每一个设备(视频流)都可以配置多个场景,如一个摄像机同时支持火焰识别、安全帽识别、摔倒检测、打架斗殴等多个场景,由于AI盒子是框架,摄像机配置哪些场景都是可以动态灵活配置的。
在这里插入图片描述

(5)录像管理
AI具有设备远程录像动能,当AI盒子启动视频转发之后,可以通过websocket接口控制AI盒子进行手动录像,AI会临时存储录像信息在本地,当服务器正常时会自动将录像信息推送给第三方平台,然后清理本地的临时录像。
AI盒子也提供了web管理页面对这些录像进行管理,包括查询、录像播放、录像清理等功能
在这里插入图片描述
在这里插入图片描述

(6)协议支持
AI盒子支持通过Http协议管理AI盒子配置、模型、设备、场景等(如AI的WEB端),也可以通过websocket协议下发和操作AI盒子,实现与AI和的多协议交互。

Http协议代码案例

# 登录盒子
@app.route("/user/login", methods=["POST"])
def login():# 获取用户信息json对象user_data = request.json#  获取post的form表单账号密码username = user_data['username']password = user_data['password']# 账号密码无效if username is None or password is None:return jsonify({"error": -1, "description": "账号或密码无效!"})# 账号信息校验if username != SystemConfig.ADMIN:return jsonify({"error": -1, "description": "用户名或密码错误!"})# 用户密码校验if password != SystemConfig.PASSWORD:return jsonify({"error": -1, "description": "用户或密码不正确!"})# 用户密码正确md5 = get_md5(username + ":" + password)# map字典转jsonreturn jsonify({"error": 0, "description": "success", "value": md5})# 更新密码
@app.route("/user/setPwd", methods=["PUT"])
def set_pwd():# 校验用户令牌result = check_token()if result['error'] != 0:return jsonify({"error": result['error'], "description": result['description']})# 获取用户信息user_data = request.jsonif user_data['oldPassword'] is None:return jsonify({"error": -1, "description": "原密码为空"})if user_data['newPassword'] is None:return jsonify({"error": -1, "description": "新密码为空"})if SystemConfig.PASSWORD != user_data['oldPassword']:return jsonify({"error": -1, "description": "原密码不正确"})# 更新密码SystemConfig.PASSWORD = user_data['newPassword']# 更新系统用户user_info = {"username": SystemConfig.ADMIN, "password": user_data['newPassword']}config_mapper.update('ADMIN', json.dumps(user_info), 1)# map字典转jsonreturn jsonify({"error": 0, "description": "success"})# 重启盒子
@app.route("/system/reboot", methods=["GET"])
def reboot():# 停止web应用服务print("reboot box...")try:# 获取app停止函数func = request.environ.get('werkzeug.server.shutdown')if func is None:raise RuntimeError('Not running with the Werkzeug Server')# 停止app服务func()except Exception as e:print(e)# 设置为重启标志Global.restart = True# 等待5秒主程退出time.sleep(5)# posix:linux nt:windowsSystemUtil.reboot()# 如果机器还未重启先返回成功return jsonify({"error": 0, "description": "success"})

websocket协议代码

# 报警推送实现
class SocketService(threading.Thread):# 构造函数def __init__(self):# 重写父类方法threading.Thread.__init__(self)# 套接口self.ws = Noneself.connected = Falseself.do_run = True# 数据接收self.msg_thread = None# 视频数量self.count = 0# 视频回调self.video_back = Nonepass# 停止服务def stop(self):self.do_run = False# 关闭套接口if self.ws is not None:self.ws.close()# 等待接收退出if self.msg_thread is not None:if self.msg_thread.is_alive():self.msg_thread.join()pass# 设置命令回调def set_video_back(self, call):self.video_back = call# 响应结果def send_result(self, url, cmdId, state, desc, data=None, file_path=None):try:if url is None or cmdId is None:return# 请求字典dict_info = {}# 追加文件if file_path is not None:# 读取文件内容file = open(file_path, "rb")name = os.path.basename(file_path)dict_info['file'] = (name, file, 'application/octet-stream')# 追加数据if data is not None:dict_info['data'] = data# multipart编码encoder = MultipartEncoder(fields=dict_info)# 请求头部headers = {'Content-Type': encoder.content_type}# 发送到第三方result_url = (url + "?boxId=" + SystemConfig.ID + "&cmdId=" + cmdId +"&state=" + str(state) + "&desc=" + desc)response = requests.post(result_url, json=data, headers=headers)if response.status_code != 200:return False# 处理返回结果result = response.json()# 处理返回结果if result['error'] != 0:error = result['error']LOGGER.error(f'upload box {SystemConfig.ID} command result failed, reason: {error}')return False# 返回成功结果return Trueexcept Exception as e:LOGGER.error(f'upload alarm error {e}')pass

(7)视频转发
AI盒子具有视频转发功能,如AI盒子一般是最靠近摄像机的硬件(从服务器资源、带宽和延时、效率等多方面考虑),所以AI盒子是可以访问摄像机的,如果平台是云端的或者服务端与AI盒子或摄像机不在同一个局域网,那么这样就很有可能平台无法播放摄像机视频(除非使用海康的平台-ehome协议或萤石云协议播放,或大华的自动注册协议播放),为了能通过AI盒子查看摄像机的视频,AI盒子就集成了这个功能,通过AI盒子就可以将视频转发到rtmp服务器,可以使用srs进行部署,使得视频播放支持rtmp、http-flv、webrtc、hls等协议。
在这里插入图片描述

(8)报警预览
AI盒子是独立的个体,我们通过AI盒子的WEB端即可实时查看报警信息,当报警发生时候,AI盒子即可接收到报警信息,如下所示
在这里插入图片描述

(9)语音播报
web端支持tts预警语音播报功能,当开启报警预览时,接收到报警后,浏览器端就会播放对应的报警语音,只需要查看一个小音箱即可实现安保语音通知功能。

(10)web管理
AI盒子提供以上所有功能的web端管理功能。

(11)GPIO联动录像
AI盒子可以通过硬件连接的释放实现对AI盒子联动接入的摄像机进行实时录像,也可以进行抓拍,这个场景主要用于仓库物料管理系统的解决方案:
当人员通过人脸机正常刷脸进入仓库时,人脸机联动门磁开门,AI盒子通过APIO信号监测门磁开启联动关联摄像机开始录像;当人员进入仓库后,领取物料,将物料放置到物料台,按IO开关进行实物拍照(可以按多次),AI盒子通过信号监测联动关联摄像机进行抓拍,人员携带物料走出仓库,关闭门禁,AI盒子通过检测停止关联摄像机的联动录像;
当人员通过非人脸方式非法闯入仓库时,AI盒子通过区域入侵、人形识别等算法进行抓拍、录像,并将报警信息实时推送给后台管理员(第三发平台或web端),管理员安排安保人员介入预警事件,保证公司财产安全;

实现场景如下所示
在这里插入图片描述
演示视频如下所示

仓库领料系统解决方案

第三方平台进出仓库记录以及录像信息
在这里插入图片描述
在这里插入图片描述

(12)远程录像
同GPIO联动录像之外,AI盒子 也支持手动远程录像和停止录像功能,接口如下所示
在这里插入图片描述
在这里插入图片描述

(13)远程抓拍
如图上所示,AI盒子也支持播放视频的同时进行实时抓拍。

(14)报警推送
AI可通过接口将报警推送到第三方平台,如下所示
在这里插入图片描述

(15)录像推送
如上所示,推送的报警包含录像信息
在这里插入图片描述

(16)区域配置
AI盒子可以配置检测视频范围的某一部分区域,可以配置区域内检测,也可以配置边界检测,当检测物体跨过边界触发报警
在这里插入图片描述

(17)文件清理
AI盒子会定期清理报警信息、报警录像信息、联动录像信息等;

(18)资源国际化(多语言支持)
支持简体中文、繁体中文、英文3中语言
在这里插入图片描述

(19)报警管理
AI盒子可以管理产生的报警信息、报警录像等信息
在这里插入图片描述
在这里插入图片描述

以上是AI盒子具备的所有功能,由于盒子由python+vue框架开发,支持ubuntu、windows,支持CPU和 GPU,已经经过jetson nano、jetson orin nx高中低3种型号的适配,欢迎有需要的朋友请来电沟通交流(幺捌零叁捌捌伍陆柒零贰,威信与电画同号),如果需要实物演示效果,可以提供远程连接或实时视频查看,目前产品已经经过3个版本(轮询版本、实时版本、国际化版本),非常成熟,已经在项目中使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/713904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

光栅化算法

多数计算机图形图像&#xff0c;是通过光栅显像显示给用户的&#xff0c;这种系统将图像作为像素阵列进行显示&#xff0c;像素&#xff08;pixel&#xff09;即图像元素&#xff08;picture element&#xff09;的简称。这些像素采用RGB颜色空间。本文讨论光栅显像的基本原理&…

蓝牙耳机哪个好用性价比高?2024热销蓝牙耳机大测评!选购不焦虑

​近年来&#xff0c;蓝牙耳机已经成为了一个非常热门的选择&#xff0c;不仅因为它们小巧便捷&#xff0c;还因为它们的防水性能、音质和佩戴体验已经逐渐超越了有线耳机。随着越来越多的品牌加入蓝牙耳机的市场竞争&#xff0c;各种类型的蓝牙耳机层出不穷。特别是对于运动爱…

2024年全国乙卷高考理科数学备考:十年选择题真题和解析

今天距离2024年高考还有三个多月的时间&#xff0c;今天我们来看一下2014~2023年全国乙卷高考理科数学的选择题&#xff0c;从过去十年的真题中随机抽取5道题&#xff0c;并且提供解析。后附六分成长独家制作的在线练习集&#xff0c;科学、高效地反复刷这些真题&#xff0c;吃…

GEE数据集——GLC_FCS30D - 全球 30 米土地覆被变化数据集(1985-2022 年)

GLC_FCS30D - 全球 30 米土地覆被变化数据集&#xff08;1985-2022 年&#xff09; 注 本数据集是正在提交的论文的一部分&#xff0c;因此没有引用和 DOI 信息。请在使用本数据集时注意这一点。 GLC_FCS30D 数据集是全球土地覆被监测领域的一项开创性进展&#xff0c;它以 30…

SpringBoot 整合WebService

文章目录 WebService1.简单介绍WebService1.1. 类型1.2. 架构1.3. 主要特点1.4. 使用场景1.5. Web服务标准和技术 2.案例-WebServiceDemo2.1.引入配置文件2.2.创建接口2.3.创建接口实现类2.4.创建WebService配置类2.5.测试 WebService Web服务&#xff08;Web Services&#xf…

2024年腾讯云优惠券/代金券领取三个方法整理(收藏级)

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

CentOS系统上安装幻兽帕鲁/Palworld服务端的详细步骤是什么?

CentOS系统上安装幻兽帕鲁/Palworld服务端的详细步骤是什么&#xff1f; 首先&#xff0c;需要确认Docker是否已经安装。如果未安装&#xff0c;则需要进行安装。接下来&#xff0c;运行Docker容器。这一步是为了创建一个可以运行幻兽帕鲁服务端的环境。然后&#xff0c;在容器…

民爆5G智能制造工厂数字孪生可视化平台,推进民爆工业数字化转型

民爆5G工厂智能制造数字孪生可视化平台&#xff0c;推进行业数字化转型。民爆行业作为国家经济发展的重要支柱产业&#xff0c;其数字化转型对于提高生产效率、降低成本、保障安全等方面具有重要意义。而民爆5G工厂智能制造数字孪生可视化平台正是推进行业数字化转型的关键技术…

Flutter中Future和Stream关系

Future和Stream类是Dart异步编程的核心。 Future 表示一个不会立即完成的计算过程。与普通函数直接返回结果不同的是异步函数返回一个将会包含结果的 Future。该 Future 会在结果准备好时通知调用者。 Stream 是一系列异步事件的序列。其类似于一个异步的 Iterable&#xff0c;…

AutoEncoder和 Denoising AutoEncoder学习笔记

参考&#xff1a; 【1】 https://lilianweng.github.io/posts/2018-08-12-vae/ 写在前面&#xff1a; 只是直觉上的认识&#xff0c;并没有数学推导。后面会写一篇&#xff08;抄&#xff09;大一统文章&#xff08;概率角度理解为什么AE要选择MSE Loss&#xff09; TOC 1 Au…

1907_Arm Cortex-M3的基本了解

1907_Arm Cortex-M3的基本了解 全部学习汇总&#xff1a; g_arm_cores: ARM内核的学习笔记 (gitee.com) 我发现Arm Coretex-M3有一个专门的DataSheet&#xff0c;看起来这个的确是被当做了一个设计的产品来对待的。正好&#xff0c;基于这个文件来看看M3具备哪些基本的特性&…

vue 使用vue-scroller 列表滑动到底部加载更多数据

安装插件 npm install vue-scroller -dmain.js import VueScroller from vue-scroller Vue.use(VueScroller)<template><div class"wrap"><div class"footer"><div class"btn" click"open true">新增</d…

多层控制上身姿态的方法

1选择要施加的clip并调出层控制窗口 2点选motion层控制 3选择并复制pose&#xff08;注意在哪个层中选中的情况下复制的是那个层中的pose&#xff09; 4在新建层中分别选择头帧粘贴pose和尾帧粘贴pose因是上半身&#xff0c;因此mask中把下半身去掉即变灰

提升工作能力的方法

1.接受工作&#xff0c;只问标准 2.请示工作&#xff0c;必带方案&#xff1b; 3.汇报工作&#xff0c;突出成果&#xff1b; 4.分享工作&#xff0c;细说流程&#xff1b; 5.复盘工作&#xff0c;总结SOP 如果能这么做&#xff0c;那将是一个非常通透的高手&#xff0c;所以高…

2024年春招小红书前端实习面试题分享

文章目录 导文面试重点一、方便介绍一下&#xff0c;你之前实习都做了什么嘛&#xff1f;二、 可以讲一下封装组件相关逻辑嘛&#xff1f;1. 为什么要封装组件&#xff1f;2. 封装组件的步骤3. 封装组件的原则4. 组件的复用和扩展5. 组件的维护和文档 三、项目的性能优化你有什…

selenium测试工具用来模拟用户浏览器的操作

执行JS的类库&#xff1a;execjs&#xff0c;PyV8&#xff0c;selenium&#xff0c;node pip list pip install selenium pip install xlrd pip install xlwt pip install PyExecJS pip install xlutils selenium测试工具可以用来模拟用户浏览器的操作&#xff0c;其支持的浏览…

能当老板的AI大模型多智体框架MetaGPT自动完成项目

能当老板的AI大模型多智体框架MetaGPT自动完成项目。 MetaGPT是一个创新的多智能体框架&#xff0c;它结合了大语言模型&#xff08;LLM&#xff09;和多智能体协作系统&#xff0c;旨在通过模拟人类工作流程来解决复杂问题。这个框架的核心在于将标准化操作程序&#xff08;SO…

Python实现MACD工具判断信号:股票技术分析的工具系列(1)

Python实现MACD工具判断信号&#xff1a;股票技术分析的工具系列&#xff08;1&#xff09; 介绍代码rolling函数介绍核心代码计算指数移动平均值计算MACD指标 完整代码 介绍 先看看官方介绍&#xff1a; MACD (平滑异同平均线&#xff09; 指标说明 DIF线&#xff1a;收盘价短…

#单片机(TB6600驱动42步进电机)

1.IDE:keil 2.设备:保密 3.实验&#xff1a;使用单片机通过普通IO口控制TB6600驱动42步进电机 4.时序图&#xff1a; TB6600 ENA、ENA-DIR-、DIRPUL-、PULB-、BA、A-VCC、GND使能电机&#xff08;直接悬空不接&#xff09;方向脉冲输入&#xff08;普通IO口模拟即可&#xff…

Linux系统编程7--线程 写个测试脚本

Linux系统编程7–线程_写个测试脚本 参考博客&#xff1a; Linux多线程编程初探 - 峰子_仰望阳光 - 博客园 (cnblogs.com) 我的PC是8核*16进程&#xff0c;所以在固定的时间点&#xff0c;我可以同时运行8 * 16的进程&#xff0c;更多的线程&#xff08;任务管理器&#xff09;…