基于深度学习的行人计数与人群密度分析系统设计与实现

基于深度学习的行人计数与人群密度分析系统设计与实现

github地址:https://github.com/wuyoueeee/CrowCount

摘要

随着城市化进程的加速,公共场所、大型活动及交通枢纽的人群安全管理面临着巨大挑战。传统的依靠人工巡检或单纯通过图像观察的人群密度监控方式,在实时性、准确性和工作效率上已无法满足现代智能化管理的需求。为此,本文基于深度学习技术,设计并实现了一套功能完备的智能行人计数与人群密度分析系统。系统采用先进的 YOLOv8 目标检测算法,对静态图像、批量图像文件、离线视频流及实时摄像头画面中的行人进行高效的检测与计数,并设定了拥挤预警阈值。在系统架构上,本文采用分层软件架构设计,后端通过 Python 及 OpenCV、Pandas 进行数据流控制,采用 SQLite3 建立持久化数据存储体系,前端基于 Gradio 框架构建现代化、响应式的 Web 交互控制大屏,提供了可视化的模型微调、历史事件大盘统计、自动化 HTML 安全分析报告导出等功能。通过在 ShanghaiTech 人群计数数据集上的实验与测试,结果表明,本系统具有较高的识别准确率与卓越的推理性能,实现了软硬件资源的高效协同,具备良好的工程实用价值与可落地性。

关键词:行人计数;人群密度;YOLOv8;深度学习;Gradio;SQLite3


第一章 绪论

1.1 研究背景与意义

1.1.1 研究背景

在现代公共安全治理体系中,对公共场所、大型文娱活动、火车站及地下商超等人群密集区域的态势感知和安全监测至关重要。近年来,由于局部人群瞬时流量过载、疏导不力导致的群体踩踏事故屡见不鲜,造成了严重的人身伤亡与不良社会影响。传统的人流管控方式通常依赖于人工巡检以及监控中心值守人员的肉眼观察。这种方式存在明显的局限性:

  1. 主观性强:观测人员因疲劳或注意力分散极易造成漏检;
  2. 缺乏实时量化指标:仅凭主观感觉无法给出精准的行人数量统计和密度等级划分;
  3. 响应周期长:当发现拥挤隐患时,往往已处于危险态势,错过了最佳的预防疏导时间。

因此,借助计算机视觉与深度学习技术,开发一套能够对图像、视频及实时监控流中的行人数量进行精确统计并自动触发拥挤报警的系统,具有强烈的社会现实需求。






1.1.2 研究意义

本研究基于 YOLOv8 目标检测模型,融合 Python 后端开发技术和现代化 Web 框架,设计并实现了一个智能行人计数与人群密度分析系统。该系统在理论和实际应用两方面具有以下重要意义:

  1. 理论意义:系统结合目标检测范式,探索了在密集人群场景下如何将坐标点标注的传统人群计数数据集(如 ShanghaiTech)转换为适合标准 YOLO 检测模型的 Bounding Box 标注格式。同时,针对高密度人群识别中的遮挡问题提供了工程化解决思路,丰富了计算机视觉算法在垂直业务领域的落地实践。
  2. 实际应用意义:系统提供了一整套高度可落地的完整解决方案,支持多源输入模式(单图、多图、视频流、实时摄像头),提供可视化的硬件环境检测、参数调优、自动化报表生成、历史数据统计看板导出功能。该系统的部署使用可以显著提高相关安保部门对区域风险的主动预警能力,降低人工监测成本,为公共安全管理决策提供精准的数据支撑。

1.2 国内外研究现状

目前,国内外关于人群计数的算法研究主要分为三大流派:基于检测的方法、基于回归的方法和基于直接密度图估计的方法。

  • 早期阶段,国内外学者多采用手工提取特征(如 HOG、LBP)结合支持向量机(SVM)进行传统的行人目标检测计数。但受限于手工特征表达能力不足,在复杂光照及密集遮挡场景下的泛化性极差。
  • 近十年内,随着卷积神经网络(CNN)在计算机视觉领域的爆发,国内外学术界提出了如 MCNN、CSRNet、SANet 等基于密度图回归的模型。这类算法在大规模极端密集人群中(如数千人聚集的广场)表现良好。然而,密度图模型往往仅能给出一个总估计人数,无法精准标注出每个行人的具体坐标范围,这使得安保人员难以直观判断人群流动的方向和分布趋势,限制了其在通用监控场景中的工程应用。
  • 当前工业界和学术界交叉领域,以 YOLO 系列(YOLOv5、v7、v8 等)为代表的单阶段(One-Stage)目标检测网络日趋成熟。这类算法在保持极高推理速度的同时,检测精度大幅提升。基于此,采用轻量级目标检测模型进行人群计数、同时输出行人精准位置和置信度,已成为学术研究和工业落地兼顾的最优路径。

1.3 论文研究内容与研究方法

1.3.1 研究内容

本系统开发了一套完整的"数据处理-模型微调-核心算法检测-多维交互呈现"的闭环行人计数解决方案。核心研究工作包括:

  1. 数据转换算法设计:针对 ShanghaiTech 坐标点标注数据,编写高效转换脚本,将传统人群计数数据转换为符合标准 YOLO 的类别、中心坐标、宽高比例的标注文件。
  2. 核心业务逻辑开发:基于 Ultralytics YOLOv8 模型构建底层识别核心,开发单图、多图批量处理、长视频离线逐帧识别、USB 摄像头低延迟实时识别算法,并支持阈值触发警报(阈值设定为 50 人)。
  3. 历史数据大盘及数据库开发:利用 SQLite3 对系统检测产生的结果(任务类型、时间、识别出的行人总数、检测图片存储路径等)进行持久化存储和结构化关联。
  4. 现代化 Web UI 实现:基于 Gradio 高级组件开发响应式前端,支持模型实时微调监控、CSV 数据导出及定制化安全 HTML 评估报告生成。
1.3.2 研究方法

本文采用工程应用型研究方法:

  • 文献研究法:系统地查阅关于目标检测和密集人群计数的经典学术论文和工业界最新开源项目,确立以 YOLOv8 算法作为核心检测算法。
  • 软件工程开发方法:采用 MVC 及分层架构设计思想,按需求分析、总体设计、详细设计、模块测试、全流程综合联调的软件工程规范推进项目开发。

1.4 论文结构安排

本文共分为七个章节:

  • 第一章 绪论:阐述项目背景、理论和应用价值、国内外研究现状及论文主体内容。
  • 第二章 相关技术基础:梳理本项目所涉及的 YOLOv8、Gradio、SQLite3 等关键技术的原理。
  • 第三章 系统需求分析:深入剖析功能性需求、非功能性需求,并绘制用例图。
  • 第四章 系统总体设计:阐述系统的整体架构图、核心类/方法划分、数据库表结构。
  • 第五章 系统详细实现:结合代码实现拆解数据预处理、核心检测逻辑、数据存储与前端交互。
  • 第六章 系统测试:设计真实测试环境与测试用例,提供功能验证结果。
  • 第七章 总结与展望:对全文工作进行客观总结,指出不足并规划未来改进方向。

第二章 相关技术基础

2.1 YOLOv8 目标检测算法原理

本项目选用的核心算法为 Ultralytics 开源的 YOLOv8 模型。YOLOv8 延续了 YOLO 系列单阶段检测的高效特性,在网络结构和损失函数上做了多项创新。

复制代码
+-----------------------------------------------------------------------+
|                              YOLOv8 Architecture                      |
|                                                                       |
|   +------------------+    +-------------------+    +--------------+   |
|   |    Backbone      | -> |       PAN-FPN     | -> |     Head     |   |
|   | (Darknet53+C2f)  |    | (Path Aggregation)|    | (Decoupled)  |   |
|   +------------------+    +-------------------+    +--------------+   |
+-----------------------------------------------------------------------+
  1. 骨干网络(Backbone):其主干网络继续沿用 CSP 思想,引入了 C2f(Cross Stage Partial with 2 Convolutions)模块,将特征图进行多分支解耦合并。此举可在不增加推理时间的前提下,保留更加丰富的梯度流信息,有利于提取微小人头与多尺度行人的特征。
  2. 颈部网络(PAN-FPN):采用了改进的 PAN-FPN 融合结构。自顶向下融合深层强语义信息,自底向上融合浅层强定位细节信息,极大增强了系统对密集场景中由于严重遮挡导致的部分特征丢失情况的特征恢复能力。
  3. 检测头(Decoupled Head):从传统的 Coupled Head 改为了 Decoupled Head(解耦头),将目标分类任务与边界框回归任务分作不同的分支独立计算,加速收敛并提高了检测精度。
  4. 回归损失(Loss Function):引入了 DFL(Distribution Focal Loss)与 CIoU 损失。更细致地考虑了重叠面积、中心点距离及长宽比,有效提升了人群拥挤场景下密集框的回归质量。

2.2 Gradio 交互框架

Gradio 是专为机器学习/深度学习模型打造的轻量级前端 Web 交互界面。本项目之所以选用 Gradio,是因为其具备以下优势:

  1. 无需前端编写经验:完全基于 Python 即可快速构建出包含图片上传、滑块输入、实时画廊(Gallery)等现代化 UI 组件,降低了本科阶段全栈开发的实现难度。
  2. 多线程并发支持:Gradio 底层封装了多进程和多线程运行机制,能够直接将复杂耗时的深度学习图像推理、批量 ZIP 压缩处理置于后台执行,前台展示进度条,保障了系统的流畅体验。
  3. 事件驱动:支持组件之间的联动刷新。例如检测历史记录被清空时,可以通过 UI 事件触发统计面板自动重载刷新,贴合现代 SPA(单页面应用)的设计模式。

2.3 SQLite3 轻量级数据库

系统采用 Python 内置的 SQLite3 模块建立本地数据持久化层。

  • 零配置、免部署 :SQLite3 无需像 MySQL 一样独立安装复杂的数据库服务器。其数据以单一文件的形式(data/history.db)保存于项目目录下,极大简化了本科毕业设计项目源码的便携性和环境复现工作。
  • 完整的 ACID 事务支持:保证了在高并发读取、写入检测日志或导出历史 CSV 数据时的事务隔离性,有效防止数据库死锁与数据损坏。

2.4 本章小结

本章重点梳理了本系统的核心技术栈。算法上采用最新单阶段目标检测网络 YOLOv8,大幅优化了密集遮挡场景的检测质量;UI 交互上采用 Gradio 框架搭建响应式 Web 页面;底层数据存储使用 SQLite3 嵌入式数据库。合理的技术选型既保证了系统的学术先进性,又充分保障了系统开发效率和可落地性。


第三章 系统需求分析

3.1 系统功能性需求

结合系统核心业务,为了实现对人群流动的精准统计、密度态势感知与高效管理,本系统拆解为以下五个核心功能性模块:

复制代码
+------------------------------------------------------------------------------------+
|                                  功能性需求分解                                    |
+------------------------------------+-----------------------------------------------+
| 功能模块                           | 详细业务需求描述                              |
+------------------------------------+-----------------------------------------------+
| 1. 单张图片智能检测与报告生成      | 支持本地图片上传、灵敏度滑块调优。检测完毕后 |
|                                    | 精准绘制标注框并计数。如果人数 > 50 人,自动 |
|                                    | 触发红色告警。支持一键导出 HTML 格式分析报告 |
+------------------------------------+-----------------------------------------------+
| 2. 批量图片异步分类与导出         | 支持一次性上传数十至数百张图片,后台自动化推理|
|                                    | 自动记录每张图的人数,生成 Excel/DataFrame 汇总|
|                                    | 并提供打包压缩的检测结果 ZIP 文件下载        |
+------------------------------------+-----------------------------------------------+
| 3. 离线视频逐帧分析                | 支持大型无人机或固定监控下的巡检视频文件上传 |
|                                    | 通过后台 OpenCV 逐帧提取,调用 YOLO 模型进行 |
|                                    | 检测,最终合成为带有标注框的视频提供在线预览 |
+------------------------------------+-----------------------------------------------+
| 4. 实时视频流哨兵检测              | 通过 USB 摄像头或流媒体协议连接实时视频流,  |
|                                    | 采用流式数据推流处理,快速给出实时的检测图、  |
|                                    | 人流量及拥挤预警信息                         |
+------------------------------------+-----------------------------------------------+
| 5. 模型微调与历史管理大盘          | 支持自定义参数(Epochs, Batch size, ImgSize)|
|                                    | 进行模型微调训练。完整记录每一次检测产生的日志|
|                                    | 记录,支持大盘图表分析和数据重置清空         |
+------------------------------------+-----------------------------------------------+

3.2 系统非功能性需求

为保证系统在实际生产环境中能够长期稳定、高效地提供公共安保和人群预警服务,提出以下非功能性需求:

  1. 可靠性(Reliability):在遇到异常图像格式(如截断或损坏的 JPEG 图片)或视频文件损坏时,系统底层应具备健壮的异常捕获机制,自动中断异常并输出详细提示,防止主程序崩溃。
  2. 易用性(Usability):采用全中文的交互式 Web 页面。所有的操作路径(如灵敏度滑块调节、文件上传、一键下载按钮)均需遵循用户的操作习惯。
  3. 可扩展性(Extensibility):后台历史记录管理器及核心识别类采用面向对象的抽象类设计,代码接口结构清晰。未来若需要迁移至 YOLO11、Faster R-CNN 或外接 MySQL 数据库,可直接修改底层,无需重构上层业务逻辑。

3.3 系统用例分析

根据系统的业务角色与具体需求,系统使用者通常为公共场所的安全保卫人员或系统管理人员。系统用例图如下:

复制代码
                       +-----------------------------+
                       |           用例图            |
                       +-----------------------------+
                       
                               +---------------------+
                               |   上传单图/多图检测 |
                               +---------------------+
                              /
                             / +---------------------+
                            /--|    视频/实时监控识别 |
                           /   +---------------------+
                          /
     +-------------------+     +---------------------+
     |                   |-----|    导出安全分析报告 |
     |  系统使用者(管理)  |     +---------------------+
     |                   |-----|    查询历史检测日志 |
     +-------------------+     +---------------------+
                          \
                           \   +---------------------+
                            \--|    一键重置清空数据库|
                             \ +---------------------+
                              \
                               +---------------------+
                               |   可视化微调模型训练 |
                               +---------------------+

3.4 本章小结

本章从软件工程的角度出发,详细剖析了智能行人计数与人群密度分析系统的核心诉求。在确立了五项核心功能模块的基础上,进一步对可靠性、易用性、可扩展性等非功能性指标进行了量化规定,并通过规范的用例图刻画了系统使用者的核心交互路径,为后续的系统总体设计与详细实现提供了扎实的指导纲领。


第章 系统总体设计

4.1 系统整体架构设计

本系统基于分层架构设计思想,分为数据层、核心算法层、控制器逻辑层和 Web 前端表现层,充分体现了软件工程中"高内聚、低耦合"的优良原则。

复制代码
+----------------------------------------------------------------------------+
|                            Web 前端表现层 (Gradio UI)                      |
| (单图检测 | 批量处理 | 视频分析 | 实时哨兵流 | 历史大盘数据统计 | 模型训练)  |
+-------------------------------------+--------------------------------------+
                                      | 调用
                                      v
+----------------------------------------------------------------------------+
|                             控制器逻辑层 (Controller)                      |
|  AdvancedWebInterface 类,负责调度核心检测、文件下载打包、异步线程监控      |
+-------------------------------------+--------------------------------------+
                                      | 协同
                                      v
+----------------------------------------------------------------------------+
|                             核心算法层 (Core Engine)                       |
|  CrowdCountingSystem 类:封装 YOLO 训练与推理流程,GPU 加速状态检测        |
+-------------------------------------+--------------------------------------+
                                      | 读写
                                      v
+----------------------------------------------------------------------------+
|                              数据持久层 (Data Layer)                       |
|           SQLite3 数据库 (history.db)  |  ShanghaiTech 原生数据集          |
+----------------------------------------------------------------------------+

4.2 系统目录与核心模块职责划分

为使项目逻辑清晰、易于维护和协同开发,系统工作空间的代码目录结构如下表所示:

复制代码
CrowdCounting/
├── config.yaml                   # 存储系统核心算法、训练超参数
├── shanghaitech.yaml             # ShanghaiTech 数据集绝对路径配置文件
├── run_web_advanced.py           # Web 应用程序总启动入口
├── prepare_shanghaitech_yolo.py  # 将 ShanghaiTech 点标注转为 YOLO 标准格式
├── requirements.txt              # 项目全量依赖库清单
├── data/
│   ├── history.db                # SQLite3 本地持久化数据
│   └── (检测结果和缓存图片)
├── src/
│   ├── __init__.py               # 包初始化文件
│   ├── crowd_counting_system.py  # YOLOv8 训练/推理核心,封装核心计数逻辑
│   ├── history_manager.py        # 数据库管理类,负责增删改查、统计汇总及 CSV 导出
│   ├── gpu_utils.py              # 用于检测并格式化输出系统 CUDA 硬件运行环境
│   └── web_interface_advanced.py # 完整 Gradio UI 代码,负责所有前端事件路由
└── runs/                         # YOLOv8 训练与推理结果的自动化存储目录

4.3 数据库设计

系统使用 SQLite3 创建了两个核心实体表:detection_history(检测历史记录表)和 training_history(模型训练记录表)。

4.3.1 检测历史记录表(detection_history)

本表用于精准记录每一次行人检测任务的输入信息与结果状态。

复制代码
+-----------------------------------------------------------------------------+
|                            detection_history 表结构                         |
+-----------------+--------------+----------+---------------------------------+
| 字段名          | 数据类型     | 约束     | 含义描述                        |
+-----------------+--------------+----------+---------------------------------+
| id              | INTEGER      | 主键,自增| 任务流水唯一 ID                 |
| timestamp       | TEXT         | NOT NULL | 任务提交的标准化时间戳           |
| task_type       | TEXT         | NOT NULL | 任务类型 (如 single, batch, video) |
| source_path     | TEXT         | NOT NULL | 原图片或原视频物理存储路径       |
| source_type     | TEXT         | NOT NULL | 源文件类型                      |
| model_path      | TEXT         | -        | 使用的模型权重文件名             |
| num_defects     | INTEGER      | DEFAULT 0| 识别出的行人总数 (沿用底层字段名)|
| use_llava       | BOOLEAN      | DEFAULT 0| 是否启用了多模态深度分析        |
| result_path     | TEXT         | -        | 绘制完边界框的输出文件物理路径  |
| thumbnail_path  | TEXT         | -        | 缩略图生成路径                  |
| notes           | TEXT         | -        | 详情描述/拥挤预警状态           |
| created_at      | TEXT         | 默认当前 | 创建时间戳                      |
+-----------------+--------------+----------+---------------------------------+
4.3.2 模型训练记录表(training_history)

本表用于记录系统在 Web 端由用户发起的所有一键 YOLO 训练记录。

复制代码
+-----------------------------------------------------------------------------+
|                            training_history 表结构                          |
+-----------------+--------------+----------+---------------------------------+
| 字段名          | 数据类型     | 约束     | 含义描述                        |
+-----------------+--------------+----------+---------------------------------+
| id              | INTEGER      | 主键,自增| 训练任务流水唯一 ID             |
| timestamp       | TEXT         | NOT NULL | 训练触发的标准时间              |
| model_name      | TEXT         | NOT NULL | 训练输出的项目/网络名称         |
| epochs          | INTEGER      | -        | 训练迭代总轮数                  |
| batch_size      | INTEGER      | -        | 单批次图像大小                  |
| dataset_path    | TEXT         | -        | 数据集配置文件所在路径          |
| model_path      | TEXT         | -        | 最终生成的 best.pt 物理路径     |
| best_map        | REAL         | -        | 最高 mAP50 指标                 |
| training_time   | REAL         | -        | 训练耗时                        |
| status          | TEXT         | -        | 任务状态 (completed, running)   |
| notes           | TEXT         | -        | 备注说明                        |
| created_at      | TEXT         | 默认当前 | 创建时间戳                      |
+-----------------+--------------+----------+---------------------------------+

4.4 本章小结

本章重点规划了智能系统的总体设计蓝图。在总体架构设计中确立了基于分层解耦的组织模式;细化了物理目录分布和各子文件的分工;在数据库设计中,结合面向对象的思想,给出了两张核心数据表的结构字段、类型约束及业务含义,确保了后续代码编写中持久化功能的无缝对接。


第五章 系统详细实现

5.1 ShanghaiTech 数据集转换与预处理模块实现

5.1.1 转换思路与逻辑

ShanghaiTech 原生数据集采用 Matlab 格式的 .mat 文件进行标注。每个 .mat 文件中存储的是图像中每个人头顶中心点的二维坐标。然而标准的 YOLO 模型需要的是:类别(ID)、归一化后的中心坐标(x_center)、中心坐标(y_center)、框宽(width)、框高(height)。

为了建立适合 YOLO 训练的数据,我们在 prepare_shanghaitech_yolo.py 中实现了转换算法。由于原始点标注没有提供真实的边界框宽高,本系统结合工程经验,预设了固定的边界框大小:
box_size = 40 像素 \text{box\_size} = 40 \text{ 像素} box_size=40 像素

随后,读取原始点坐标 ( p x , p y ) (p_x, p_y) (px,py),在图像尺寸 ( w , h ) (w, h) (w,h) 的约束下,计算出符合 YOLO 规范的标注值:

cx = p x w , cy = p y h , bw = box_size w , bh = box_size h \text{cx} = \frac{p_x}{w}, \quad \text{cy} = \frac{p_y}{h}, \quad \text{bw} = \frac{\text{box\_size}}{w}, \quad \text{bh} = \frac{\text{box\_size}}{h} cx=wpx,cy=hpy,bw=wbox_size,bh=hbox_size

5.1.2 核心代码拆解分析

下面是转换逻辑的核心函数 convert_shanghaitech_to_yolo

python 复制代码
# 代码位置: prepare_shanghaitech_yolo.py
def convert_shanghaitech_to_yolo():
    base_dir = "data/ShanghaiTech/ShanghaiTech/ShanghaiTech-Dataset/ShanghaiTech"
    output_dir = "data/shanghaitech_yolo"
    # ... 省略目录创建逻辑 ...
    parts = ["part_A", "part_B"]
    box_size = 40  # 默认框大小
    
    for part in parts:
        for split in ["train_data", "test_data"]:
            # ... 路径合并逻辑 ...
            img_paths = glob.glob(os.path.join(img_dir, "*.jpg"))
            for img_path in img_paths:
                # 1. 提取图像尺寸
                img = cv2.imread(img_path)
                h, w, _ = img.shape
                
                # 2. 读取 mat 文件获取标注点坐标
                mat = sio.loadmat(mat_path)
                points = mat['image_info'][0,0][0,0][0]
                
                # 3. 写入 YOLO 标签文件
                out_label_path = os.path.join(output_dir, f"labels/{out_split}/{part}_{name}.txt")
                with open(out_label_path, "w") as f:
                    for p in points:
                        px, py = p[0], p[1]
                        
                        # 4. 生成归一化 YOLO 边界框格式
                        cx = max(0, min(1, px / w))
                        cy = max(0, min(1, py / h))
                        bw = max(0, min(1, box_size / w))
                        bh = max(0, min(1, box_size / h))
                        
                        f.write(f"0 {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}\n")

在上述实现中,使用 max(0, min(1, ...)) 进行了严格的数值阶段(Clipping),有效防止了由于人工标记误差导致的坐标越界异常,极大地提升了模型训练阶段的鲁棒性。

5.2 智能行人检测与计数核心算法实现

5.2.1 算法结构

src/crowd_counting_system.py 的核心类 CrowdCountingSystem 中,系统对 YOLO 预训练模型和推理预测过程进行了面向对象的封装。

复制代码
+---------------------------------------------------------------+
|                      CrowdCountingSystem                      |
+---------------------------------------------------------------+
| - model: YOLO                                                 |
| - root_dir: Path                                              |
| - config: dict                                                |
+---------------------------------------------------------------+
| + __init__(config_path)                                       |
| + train_model(epochs, batch_size, progress_callback)          |
| + detect_image(image_path, conf) -> (plot_img, counts, ...)   |
| + detect_batch(file_paths, conf) -> list                      |
| + detect_frame(frame, conf) -> (plot_img, is_risk)            |
| + process_video(video_path, conf, progress) -> out_path       |
+---------------------------------------------------------------+
5.2.2 核心单图检测逻辑解析

核心预测方法 detect_image 的代码如下所示:

python 复制代码
# 代码位置: src/crowd_counting_system.py 中的 detect_image 方法
def detect_image(self, image_path, conf=0.25, use_llava=False):
    # 1. 调用底层的 YOLO 模型进行预测
    results = self.model(image_path, conf=conf)
    res = results[0]
    
    # 2. 绘制检测边界框并提取处理后的图像
    plot_img = res.plot()
    
    detections = []
    for box in res.boxes:
        c = int(box.cls)
        name = self.model.names[c]
        detections.append({"class": name, "conf": float(box.conf)})
        
    count = len(detections)
    
    # 3. 超过阈值 50 人判定为高密度拥挤危险
    is_risk = count > 50 
    
    report = f"Detected {count} pedestrians in the image."
    if is_risk:
        report += " Warning: High crowd density detected!"
        
    # 4. 自动保存带有标注框的图片到本地
    timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
    save_path = os.path.join(self.history_dir, f"detect_{timestamp}.jpg")
    cv2.imwrite(save_path, plot_img)
    
    return plot_img, detections, report, save_path, is_risk

该方法集成了推理、可视化绘制、业务预警、本地磁盘缓存四大职责,能够直接向上层控制器提供结构化的检测元数据,便于前端展示。

5.3 数据存储与历史管理模块实现

系统的持久化操作由 src/history_manager.py 模块中的 HistoryManager 类提供。

5.3.1 增加检测日志实现

通过对 SQLite3 数据库的连接控制,向 detection_history 表追加检测记录:

python 复制代码
# 代码位置: src/history_manager.py 中的 add_detection_record 方法
def add_detection_record(self, task_type: str, source_path: str, source_type: str,
                       model_path: str, num_defects: int, use_llava: bool = False,
                       result_path: str = None, thumbnail_path: str = None,
                       notes: str = None) -> int:
    conn = sqlite3.connect(str(self.db_path))
    cursor = conn.cursor()
    
    timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    cursor.execute('''
        INSERT INTO detection_history 
        (timestamp, task_type, source_path, source_type, model_path, 
         num_defects, use_llava, result_path, thumbnail_path, notes)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    ''', (timestamp, task_type, source_path, source_type, model_path,
          num_defects, use_llava, result_path, thumbnail_path, notes))
    
    record_id = cursor.lastrowid
    conn.commit()
    conn.close()
    return record_id

该方法利用 SQLite3 的底层参数化查询(即 ? 占位符)完全杜绝了 SQL 注入的安全隐患,同时实现了快速的日志信息固化存储。

5.4 Gradio Web 交互界面模块实现

src/web_interface_advanced.py 中,AdvancedWebInterface 负责了前后台交互的桥接,通过对界面的设计提供了精美的现代化前端布局。

5.4.1 现代化 UI 样式定义

通过 CSS 全局注入,实现了页面的毛玻璃卡片(Glassmorphism)和响应式高亮效果:

css 复制代码
/* 代码片段: web_interface_advanced.py */
:root {
    --primary-gradient: linear-gradient(135deg, #0f172a 0%, #0e7490 100%);
    --btn-gradient: linear-gradient(to right, #0ea5e9, #0284c7);
    --surface: #ffffff;
    --background: #f8fafc;
}
.custom-card {
    background-color: var(--surface); 
    border-radius: 16px; 
    border: 1px solid #e2e8f0;
    padding: 24px;
    box-shadow: var(--shadow-card);
}
5.4.2 控制面板联动交互逻辑实现

Gradio 的多 Tab 页设计通过组件事件绑定核心代码逻辑,如下所示:

python 复制代码
# 代码位置: src/web_interface_advanced.py 中的 create_interface 方法
with gr.Tab("📷 单张图片检测", id="tab_single"):
    with gr.Row():
        with gr.Column(scale=4, elem_classes="custom-card"):
            img_input = gr.Image(sources=["upload", "webcam"], type="numpy", label="画面输入")
            conf_slider = gr.Slider(0.1, 1.0, value=0.25, step=0.05, label="🎯 灵敏度")
            detect_btn = gr.Button("🚨 立即检测", variant="primary")
            
        with gr.Column(scale=6, elem_classes="custom-card"):
            img_output = gr.Image(label="识别结果图")
            report_output = gr.Markdown("等待检测...")
            
    # 事件驱动逻辑绑定
    detect_btn.click(
        self.detect_image,
        inputs=[img_input, conf_slider, gr.State(False)],
        outputs=[img_output, report_output, status_output]
    )

这种完全基于 Python 的响应式代码结构,既实现了高效的异步推流推理,也给前端用户带来了流畅的操作反馈。

5.5 本章小结

本章为系统的核心实现部分。通过对各子模块的代码拆解分析,全面解析了数据转换、模型预测、持久化读写及 Gradio 前端页面绘制的运作逻辑,证明了该系统架构在业务功能实现和学术落地上的合理性与高效性。


第六章 系统测试

6.1 测试目的与测试环境

6.1.1 测试目的

系统测试的核心目的是验证本系统在真实生产场景下的可用性与可靠性:

  • 验证核心行人计数逻辑在不同置信度下的召回情况;
  • 验证批量图片分类打包及视频文件解析的稳定性;
  • 验证拥挤报警(人数 > 50 人)的联动响应机制是否正常触发;
  • 保证系统在高负载运行下,内存与硬件资源不会发生泄漏崩溃。
6.1.2 测试环境
  • 硬件环境:Intel Core i7-11800H 2.30GHz, 32GB RAM, NVIDIA GeForce RTX 3060 Laptop GPU (6GB VRAM)
  • 操作系统:Windows 11 (64 位)
  • 核心环境依赖:Python 3.10, PyTorch 2.1.0+cu121, Ultralytics 8.1.0, Gradio 4.12.0, OpenCV-Python 4.8.1

6.2 核心功能模块测试用例及结果

6.2.1 测试用例 1:单图检测与阈值拥挤报警
复制代码
+--------------------+---------------------------------------------------------------+
| 测试编号           | TC_SINGLE_DETECT_001                                          |
+--------------------+---------------------------------------------------------------+
| 功能模块           | 单张图片检测与预警模块                                        |
+--------------------+---------------------------------------------------------------+
| 测试场景           | 用户上传包含 62 名行人的密集街区监控图片,设置灵敏度为 0.25   |
+--------------------+---------------------------------------------------------------+
| 预期输出           | 1. 系统成功框选出所有识别出的行人目标                         |
|                    | 2. 返回计数值为 62 左右                                       |
|                    | 3. 前端输出红色危险告警:"🚨 警报: 检测到高密度人群!"         |
+--------------------+---------------------------------------------------------------+
| 实际输出           | 框选准确,计数值为 59(由于远端遮挡,漏检 3 人),红色告警触发 |
+--------------------+---------------------------------------------------------------+
| 判定结果           | 通过 (Passed)                                                 |
+--------------------+---------------------------------------------------------------+
6.2.2 测试用例 2:批量图像异步处理与打包下载
复制代码
+--------------------+---------------------------------------------------------------+
| 测试编号           | TC_BATCH_DETECT_002                                           |
+--------------------+---------------------------------------------------------------+
| 功能模块           | 批量图片处理模块                                              |
+--------------------+---------------------------------------------------------------+
| 测试场景           | 批量上传 15 张巡检照片,后台执行多进程并发识别               |
+--------------------+---------------------------------------------------------------+
| 预期输出           | 1. 前端显示 Gallery 瀑布流,预览带有标注框的结果图           |
|                    | 2. 自动生成 Dataframe 行人事件日志                           |
|                    | 3. 提供 ZIP 压缩包下载,解压后包含所有处理后的标注图          |
+--------------------+---------------------------------------------------------------+
| 实际输出           | 后台无阻塞耗时 4.2 秒识别完成,数据展示完整,ZIP 包下载并能解压|
+--------------------+---------------------------------------------------------------+
| 判定结果           | 通过 (Passed)                                                 |
+--------------------+---------------------------------------------------------------+
6.2.3 测试用例 3:大文件长视频解析性能
复制代码
+--------------------+---------------------------------------------------------------+
| 测试编号           | TC_VIDEO_DETECT_003                                           |
+--------------------+---------------------------------------------------------------+
| 功能模块           | 离线视频分析模块                                              |
+--------------------+---------------------------------------------------------------+
| 测试场景           | 上传 10 秒(30fps, 共 300 帧)的 MP4 格式广场人流监控录像     |
+--------------------+---------------------------------------------------------------+
| 预期输出           | 1. 系统前端进度条平滑滑动                                     |
|                    | 2. 生成 temp_video.mp4 视频,带有流畅的行人实时标注边界框     |
+--------------------+---------------------------------------------------------------+
| 实际输出           | 前端进度条指示正常,耗时约 8 秒生成结果视频并支持流畅在线点播|
+--------------------+---------------------------------------------------------------+
| 判定结果           | 通过 (Passed)                                                 |
+--------------------+---------------------------------------------------------------+

6.3 测试结果与分析

通过以上全量业务用例测试可以看出,系统不仅各项功能性指标均已满足软件工程需求规范,在稳定性和实时性表现上也具有明显的优势:

  • 在图像和视频识别中,通过 416 图像尺寸 的合理下采样限制,在保障推理速度的同时降低了显存开销,完全规避了显存溢出(OOM)问题。
  • 系统具备强大的容错能力。当误传了截断、损坏的非法图片或空文件夹时,系统能够捕获异常,并通过界面日志组件输出优雅的提示,极佳地满足了本科毕业设计项目对非功能性健壮性的要求。

6.4 本章小结

本章对设计并实现的完整系统进行了多层次、端到端的全面测试。通过设计科学合理的测试方案与测试用例(覆盖了单图、批量、视频文件等核心业务场景),多维验证了本系统的性能表现与识别精度。测试结果表明系统功能完备、运行稳定、具备高可靠性。


第七章 总结与展望

7.1 总结

本文针对城市治理和公共安全管理中对高效人群动态管控的迫切诉求,设计并开发了一套符合现代化安保标准的智能行人计数与人群密度分析系统。主要成果如下:

  1. 完成了算法与数据集的适配落地:编写了针对 ShanghaiTech 坐标点标注数据集的格式转换程序,构建了适合 YOLO 系列目标检测训练的数据流转换管道。
  2. 构建了健壮的分层软件系统:采用 Python、OpenCV、Pandas 实现了对数据流和检测框架的深度封装,引入了 SQLite3 关系型数据库实现了对结构化检测日志的本地化持久存储管理。
  3. 开发了卓越的可视化大屏交互系统:基于 Gradio 高级组件实现了集"多源图像输入、参数微调、实时哨兵监控、自动化 HTML 报表生成、数据重置大盘"于一体的前端大屏。

7.2 不足与展望

尽管本系统已经具备了良好的工程实践基础与较高的可靠性,但由于开发时间和本科阶段软硬件条件的限制,依然存在以下改进空间:

  1. 模型对密集遮挡行人的漏检问题:在遭遇极端密集(例如大型音乐节前排)场景时,行人的肩部、身体轮廓基本被完全遮挡。后续可以引入密度图回归网络(如 CSRNet)的分支,与目标检测网络组成双流多任务网络结构,综合两者的检测优势。
  2. 多机分布式联动:目前的数据库和检测程序均运行于单台主机。未来若推广应用到智慧城市集群中,可考虑采用 Fast API 构建微服务架构,后端挂载 MySQL/PostgreSQL 主从复制集群,支持多台监控探头的高并发推流接入与告警管理。

📄 附录:快速上手指南

1. 环境准备

bash 复制代码
# 1. 安装项目所需依赖包
pip install -r requirements.txt

2. 数据转换 (上海科技数据集)

bash 复制代码
# 2. 将 ShanghaiTech 原生 Matlab 数据转换为 YOLO 格式
python prepare_shanghaitech_yolo.py

3. 系统启动

bash 复制代码
# 3. 运行 Gradio 现代 Web 控制大屏
python run_web_advanced.py

启动成功后,请在浏览器中访问:http://localhost:7860,即可进行全部系统功能操作。

相关推荐
Raink老师1 天前
【AI面试临阵磨枪-48】GraphRAG、多模态 RAG、自适应 RAG 原理
人工智能·ai 面试题
波动几何1 天前
模式驱动的学术选题方法论——四种AI模式处理能力的系统建构与论证
人工智能
飞哥数智坊1 天前
我为我的龙虾斩分身:OpenClaw 多智能体实操
人工智能·agent
七牛开发者1 天前
HTML is the new Markdown:来自 Claude Code 团队的实践
前端·人工智能·语言模型·html
飞哥数智坊1 天前
在二线城市做AI社群,我的五一节后到底有多疯狂?
人工智能
视***间1 天前
智启边缘,魔盒藏锋——视程空间Pandora系列魔盒,解锁边缘计算普惠新范式
人工智能·区块链·边缘计算·ai算力·视程空间
蛐蛐蛐1 天前
昇腾910B4上安装新版本CANN的正确流程
人工智能·python·昇腾
沪漂阿龙1 天前
AI大模型面试题:线性回归是什么?最小二乘法、平方误差、正规方程、Ridge、Lasso 一文讲透
人工智能·机器学习·线性回归·最小二乘法
Lyon198505281 天前
《文字定律》让AI体验,汉字逻辑与字母逻辑的差异——ChatGPT
人工智能·ai·chatgpt·ai写作
2601_957780841 天前
Claude 4.6 对阵 GPT-5.4:2026 开发者大模型 API 选型深度解析
人工智能·python·gpt·ai·claude