假期来啦!技术人如何用 Python 实现景区安防系统

2022-09-04 09:43:37 浏览数 (2)

作者 | 李秋键

出品 | AI科技大本营(ID:rgznai100)

引言:近年来,随着我国旅游业的持续快速发展,国内游客人次逐年增加,各地旅游景点游客爆满。在旅游消费需求高速增长的同时,伴随着越来越多的旅游景区管理问题,景区公共安全存在着严重隐患。因此设计一套关于景区安全防护的智能系统,对景区安全防护与景区智能化建设具有重要的现实意义。本项目旨在采用计算机视觉和PC软件开发技术,围绕景区安全问题展开一系列的实践,最终搭建了一套智能景区安防系统,应用于景区中火灾预防与监测、疫情防控、游客安全定位等工作中。

本设计中,利用YOLO目标检测算法、Openpose姿态识别算法、deepsort跟踪算法、MSCNN人群密度估计算法实现了火灾监测、吸烟监测、行为安全监测、人群密度监测、口罩率监测、人员定位监测六大功能。系统运用智能视觉交互技术,用户可以通过手势操作系统,用户操作方便简洁。在多角度多方位辅助景区安防管理,消减了景区存在的隐形安全隐患,推动景区智慧化建设。本套系统各类功能之间实现了数据的实时传输与反馈,保证了信息的有效性,可以运行在手机端、电脑端和物联网平台多个平台,同时也真正意义上实现了“多平台应用”。

结合多种算法设计的多功能的智能安防系统,主要应用于景区中火灾预防与监测、疫情防控、游客安全定位等,对景区安全防护与景区智能化建设具有重要的应用价值。

基本介绍

该系统以计算机多媒体技术、智能图像分析技术、数据挖掘技术等为基础,建设旅游景区综合安防管理系统。针对景区公共活动区域的人身安全,森林防火管理,疫情防控管理等需求,要求建设全方位、全天候、高清化、智能化的视频监控系统,以满足现代旅游景区安全管理的需求,实现大场景全景监控,对景区火灾、游客危险行为等突发情况进行检测。实现对人员实时定位、轨迹查询,当发生紧急情况时联动地图进行闪烁警示,并便于应急指挥。同时满足人员管理与客流分析系统,需要对出入口客流量进行统计和分析,当景区超过一定的客流容量之后可及时预警停止游客进入并进行适当的游客分流处置。

结合实际需求及智慧景区的系统架构规划,旅游景区综合安防系统由智能监控系统、智能视觉交互、多角度多方位、多平台应用四个模块构成,整合火灾监测、吸烟监测、行为安全监测、人群密度监测、口罩率监测、人员定位监测异构安防子系统。

系统总体设计架构如下图:

基本功能展示

1、系统概述

本智能监控系统开发平台为Pycharm,使用python语言,共分为六大系统。

2、火灾监测系统

本模块通过实时的视频监控,分析视频是否有火灾产生。如图中所示,如果景区发生火灾,系统会及时的发出预警信息,反馈给调度室,使得火灾得到有效控制,极大的提高应对火灾的效率。

3、吸烟监测系统

为了防止景区发生火灾,景区多数区域为禁烟区。本模块通过实时的视频监控,分析视频是否存在吸烟行为。如图中所示,如果有游客存在吸烟行为,系统会及时的发出预警信息,反馈给调度室,第一时间发现游客吸烟的安全隐患,预防火灾发生,确保景区安全。

4、行为安全监测系统

景区旅游过程中,游客人身安全须受到保障。本模块通过实时的视频监控,分析视频中人的躯体动作,如果发生异常行为如图中“摔倒”等危险行为可以及时的发出预警信息。能够大大缩短救援时间,减少突发事件造成的损失,保护游客的生命财产安全。

5、人群密度监测系统

受新冠疫情的影响,景区需要合理控制景区内的人口密度。通过本模块可以实现对景区游客人口密度的动态监控,通过智能分析,将人群密度实时的展现在系统页面上,帮助用户管理景区,切实保障广大游客、员工的身体健康和生命安全,维护景区和社会稳定大局。

6、口罩率监测系统

为防止新冠病毒的传播,根据景区相关规定,进入景区之前需要确定乘客。本模块通过实时的视频监控,分析视频中游客是否佩戴口罩,将标记每个游客是否佩戴口罩,将结果显示在系统上,并实时的显示场景佩戴口罩率。用于景区疫情防疫工作,保护游客,保护景区。

7、人员跟踪定位监测

本模块对景区进行实时的视频监控,分析并识别视频中游客,自动生成识别标签,将游客标签在场景中的位置实时记录下来,并显示在系统页面中,并且可以对场景中人数进行监测,动态显示在系统页面左侧。辅助用户管理景区。

8、智能视觉交互

本系统可代替了传统鼠标点击模块应用的方法,用户可以不需要使用鼠标等输入设备即可完成与系统之间的信息交互。用户通过肢体动作就可以完成模块的选择工作,系统操作更加简洁,用户使用更加方便。(这里只设计了火灾检测功能,其他功能可以根据代码参考写入。)

涉及算法

1、目标检测算法

本项目使用的目标检测算法主要为YOLO算法,分别应用在火灾监测、吸烟行为监测、人员定位跟踪以及口罩率监测上。YOLO目标检测算法是考虑到双阶段目标检测算法的检测效率比较低,所以一些学者提出了单阶段目标检测。由JosephRedmon等人在2016年提出。

2、目标跟踪算法

本项目在人员定位跟踪系统中使用到了deepsort目标跟踪算法。本系统跟踪的流程如下:

(1)使用卷积神经网络对视频中的行人进行检测和跟踪。

(2)视频帧输入之后首先进入YOLOv3目标检测的网络,经过Darknet-53提取特征;

(3)其次,进行上采样和特征融合,再进行回归分析;

(4)再次,把得出的预测框信息输入SORT算法进行目标特征建模,匹配和跟踪;

(5)最后,输出结果。下图为定位跟踪算法流程图:

3、人群密度估计算法

人群密度计数是指估计图像或视频中人群的数量、密度或分布,它是智能视频监控分析领域的关键问题和研究热点,也是后续行为分析、拥塞分析、异常检测和事件检测等高级视频处理任务的基础。

本项目通过采用深度学习方法获取人群密度图已估计人群数量,使用python语言搭建MSCNN网络实现实时生成人群密度图以达到估计人群数量的目的。

4、姿态估计算法

本项目在人体行为安全监测系统上使用了Openpose的人体姿态识别算法。通过Openpose的姿态识别技术对不同肢体之间的协调关系搭建分类算法,并通过不同的分类算法比较,选择出最优模型搭建多目标的分类方法,其可以实现多个目标的姿态显示、目标检测和分类的实时显示。

部分界面操作代码如下:

代码语言:javascript复制
cap = cv2.VideoCapture(0)
cap.set(3, 1280)
cap.set(4, 720)
detector = HandDetector(detectionCon=0.8)
keys = [["火灾检测", "吸烟检测", "行为安全监测", "人群密度监测", "口罩率检测", "行人定位跟踪"]]
finalText = ""
while True:
    success, img = cap.read()
    img = detector.findHands(img)
    lmList, bboxInfo = detector.findPosition(img)
    img = drawAll(img, buttonList)
    if lmList:
        for button in buttonList:
            x, y = button.pos
            w, h = button.size
            if x < lmList[8][0] < x   w and y < lmList[8][1] < y   h:
                cv2.rectangle(img, (x - 5, y - 5), (x   w   5, y   h   5), (175, 0, 175), cv2.FILLED)
                if l < 30:
                    if press_state:
                        cv2.rectangle(img, button.pos, (x   w, y   h), (0, 255, 0), cv2.FILLED)
                        cv2.putText(img, "start", (x   20, y   65),cv2.FONT_HERSHEY_PLAIN, 4, (255, 255, 255), 4)
                        finalText  = button.text
                        sleep(0.15)
                        press_state=False
                        state=True
                        print(button.text)
                        text=button.text
                else:
                    press_state=True
    if state:
        if os.path.exists("img.txt"):
            try:
                img2 = cv2.imread("img.jpg")
                img2 = cv2.resize(img2, (img.shape[1], img.shape[0]))
                img = cv2.addWeighted(img, alpha, img2, beta, gamma)
            except:
                pass
    if state:
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
        draw = ImageDraw.Draw(img)
        myfont0 = ImageFont.truetype(r'./HGDH_CNKI.TTF', 50)
        for button in buttonList:
            x, y = button.pos
            w, h = button.size
            draw.text((500, 180), text, font=myfont0, fill=(0, 0, 0))
        img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
    cv2.imshow("Image", img)
    cv2.waitKey(1)

完整代码:

https://download.csdn.net/download/qq_42279468/85833771

李秋键,CSDN博客专家,CSDN达人课作者。硕士在读于中国矿业大学,开发有taptap竞赛获奖等。

0 人点赞