在网上怎么建立自己的网站,注册网络科技公司需要多少钱,使用他人商标做网站搜索词,厦门网站建设公司基于yolov5实现的AI智能盒子框架 开发背景技术实现产品效果源码预览功能介绍 2021-2023是沉淀的几年#xff0c;经济不景气#xff0c;各行各业都不太好混#xff0c;所以这几年也没有太多心思花在csdn上为各大网友写一些技术文章#xff0c;2024年初#xff0c;也算是给自… 基于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人脸抓拍人脸数据抓拍可推送给人脸识别服务进行11识别及陌生人识别。 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 部署环境 1windows-conda、jetson-nanoconda低配、 2jetson orin nanopython、cuda、cudnnsdk中高配 3orange PI正在适配中 硬件选型 1低配jetson nacob01替换版本ubuntu价格1312元含外壳0.5tops分析实时视频约4路一张图约200ms~300ms耗时 2中配jetson orin nanoubuntu价格3200元上下20tops分析实时视频约8路一张图约100ms耗时 3高配jetson orin nanoUbuntu价格在5200元上下70-100tops分析实时视频约16路一张图约30ms耗时 4国产华为芯片orange PI4G16核心价格在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盒子编码推送到第三方区别多个盒子、报警保存天数、并发分析数量控制、识别后是否显示标签、是否支持报警联动录像、是否凌晨自动重启、报警第三方平台介绍地址、长连接控制地址。 9GPIO及modbus联动 此外AI盒子支持自身引脚联动或t通过外接modbus协议进行对接以下为AI盒子定制的一个仓库物料领取场景 A、人通过人脸机刷脸开门进入物料仓库人脸机器联动门磁 B、门禁从常开1状态变为断点开门状态0AI盒子检测到人员进入开始联动摄像机进行录像 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()2websocket协议 # 报警推送实现
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, dataNone, file_pathNone):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(fieldsdict_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, jsondata, headersheaders)if response.status_code ! 200:return False# 处理返回结果result response.json()# 处理返回结果if result[error] ! 0:error result[error]LOGGER.error(fupload box {SystemConfig.ID} command result failed, reason: {error})return False# 返回成功结果return Trueexcept Exception as e:LOGGER.error(fupload 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(fconnect 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(fwebsocket connect error:{e2})self.connected Falsepass# 链接失败等待if not self.connected:time.sleep(3)continue3系统配置
# 系统全局配置
import uuidfrom box.util import SystemUtil# 全局配置
class Global:# 数据库配置dbIp 127.0.0.1dbPort 3306dbUser rootdbPwd rootdbName box3# web配置ip 127.0.0.1port 5700# 系统重启标志restart False# 启用串口信号读取enableIO False# linux-设备名LUX_IO_NAME /dev/ttyCH341USB0# win-设备名WIN_IO_NAME COM13# 初始化def __init__(self):pass# 获取本机ipstaticmethoddef local_ip():try:if Global.ip 127.0.0.1:Global.ip SystemUtil.get_local_ip()except Exception as e:print(fget 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(fadd 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(fclear file error {e})passexcept Exception as e:LOGGER.warning(fclear 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, dataNone, file_pathNone):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(fieldsdict_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, jsondata, headersheaders)if response.status_code ! 200:return False# 处理返回结果result response.json()# 处理返回结果if result[error] ! 0:error result[error]LOGGER.error(fupload box {SystemConfig.ID} command result failed, reason: {error})return False# 返回成功结果return Trueexcept Exception as e:LOGGER.error(fupload alarm error {e})pass7视频转发 AI盒子具有视频转发功能如AI盒子一般是最靠近摄像机的硬件从服务器资源、带宽和延时、效率等多方面考虑所以AI盒子是可以访问摄像机的如果平台是云端的或者服务端与AI盒子或摄像机不在同一个局域网那么这样就很有可能平台无法播放摄像机视频除非使用海康的平台-ehome协议或萤石云协议播放或大华的自动注册协议播放为了能通过AI盒子查看摄像机的视频AI盒子就集成了这个功能通过AI盒子就可以将视频转发到rtmp服务器可以使用srs进行部署使得视频播放支持rtmp、http-flv、webrtc、hls等协议。
8报警预览 AI盒子是独立的个体我们通过AI盒子的WEB端即可实时查看报警信息当报警发生时候AI盒子即可接收到报警信息如下所示
9语音播报 web端支持tts预警语音播报功能当开启报警预览时接收到报警后浏览器端就会播放对应的报警语音只需要查看一个小音箱即可实现安保语音通知功能。
10web管理 AI盒子提供以上所有功能的web端管理功能。
11GPIO联动录像 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盒子具备的所有功能由于盒子由pythonvue框架开发支持ubuntu、windows支持CPU和 GPU已经经过jetson nano、jetson orin nx高中低3种型号的适配欢迎有需要的朋友请来电沟通交流(幺捌零叁捌捌伍陆柒零贰威信与电画同号)如果需要实物演示效果可以提供远程连接或实时视频查看目前产品已经经过3个版本轮询版本、实时版本、国际化版本非常成熟已经在项目中使用。