文章目录
- 0 前言
- 1 项目运行效果
- 2 课题背景
-
- 2.1 研究背景与意义
- 2.2 国内外研究现状
- 2.3 研究内容与目标
- 2.4 研究方法与技术路线
- 2.5 预期成果
- 2.6 创新点与难点
- 3 设计框架
-
- 3.1 技术架构概述
-
- 3.1.1 数据采集层
- 1.1.2 目标检测层
- 3.1.3 行为分析层
- 3.1.4 用户交互层
- 3.2 关键技术详解
-
- 3.2.1 YOLOv11 目标检测
-
- YOLOv11 检测流程伪代码
- 3.2.2 非极大值抑制(NMS)
-
- NMS 实现伪代码
- 1.2.3 PyQt5 用户界面
-
- UI 核心模块设计
- PyQt5 主要交互流程
- PyQt5 核心交互逻辑伪代码
- 3.3 系统工作流程
- 3.4 数据集训练流程
-
- 3.4.1 数据准备
- 3.4.2 模型训练
- 3.4.3 模型评估
- 3.5 UI 交互系统设计逻辑
-
- 3.5.1 界面布局
- 3.5.2 控件设计
- 1.5.3 交互逻辑
- 3.6 可视化图表显示逻辑
-
- 3.6.1 检测结果统计图
-
- 示例:检测结果统计
- 3.6.2 日志记录与显示
-
- 示例:日志记录函数
- 4 最后
0 前言
🔥这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。并且很难找到完整的毕设参考学习资料。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目提供大家参考学习,今天要分享的是
🚩 毕业设计 yolo11智能安防偷盗行为识别系统(源码+论文)
🥇学长这里给一个题目综合评分(每项满分5分)
难度系数:3分 工作量:4分 创新点:5分
🧿项目分享:见主页任意置顶文章
1 项目运行效果




2 课题背景
2.1 研究背景与意义
随着城市化进程的加快和社会经济的不断发展,公共安全问题日益凸显,盗窃等违法犯罪行为在特定区域和时段仍然存在较高的发生率。传统的安防手段主要依赖于人工监控和报警系统,但这种方式存在效率低、响应慢、误报率高等问题,难以满足现代社会对高效智能安防系统的迫切需求。因此,如何利用先进的计算机视觉技术和人工智能算法,开发出一种能够实时、准确识别盗窃行为的智能监控系统,成为当前安防领域的重要研究方向。
近年来,深度学习技术在计算机视觉领域取得了显著进展,特别是在目标检测、行为识别等方面展现出强大的性能优势。YOLO系列算法作为单阶段目标检测模型的代表,以其高速度和高精度的特点广泛应用于实时视频分析场景。最新版本的YOLOv8进一步优化了网络结构和训练策略,提升了小目标检测能力和复杂环境下的鲁棒性,为开发高效的盗窃行为识别系统提供了坚实的技术基础。
本课题旨在基于YOLOv8模型构建一个智能安防盗窃行为识别系统,通过深度学习技术实现对可疑行为的自动检测和预警。该系统不仅可以提高安防工作的智能化水平,减少人工监控的工作强度,还能有效提升对盗窃行为的及时发现能力,为公安机关提供有力的技术支持。此外,该系统的研发对于推动人工智能技术在公共安全领域的应用落地也具有重要的实践价值。
2.2 国内外研究现状
在盗窃行为识别领域,国内外学者已经开展了大量的研究工作。早期的研究主要集中在传统计算机视觉方法的应用上,如基于运动特征提取、人体姿态估计、轨迹分析等方法。这些方法虽然在特定场景下取得了一定的效果,但由于缺乏对复杂行为模式的有效建模能力,在实际应用中往往面临着识别精度低、泛化能力差等问题。
随着深度学习技术的发展,基于卷积神经网络(CNN)的行为识别方法逐渐成为研究热点。国内外许多高校和科研机构都在积极探索深度学习在视频监控和行为识别方面的应用。例如,美国麻省理工学院(MIT)提出了基于时空卷积网络的行为识别框架,中国科学院自动化研究所开发了基于多模态特征融合的异常行为检测系统,清华大学则在基于图神经网络的人体动作识别方面取得了重要进展。
在具体应用方面,一些企业和研究机构已经开始尝试将深度学习技术应用于智能安防系统。如海康威视推出了基于深度学习的智能视频分析平台,大华股份开发了具备行为识别功能的智能摄像头,商汤科技则在公共场所的安全监控系统中集成了异常行为检测模块。然而,目前大多数商用系统仍然存在着成本高、部署难、实时性差等问题,难以大规模推广应用。
2.3 研究内容与目标
本课题的主要研究内容是基于YOLOv8模型开发一套智能安防盗窃行为识别系统。该系统应具备以下核心功能:
本课题的研究目标主要包括以下几个方面:
2.4 研究方法与技术路线
本课题将采用理论研究与实验验证相结合的方法,按照“文献调研→需求分析→模型设计→系统实现→测试验证”的总体思路开展研究工作。具体的技术路线如下:
文献调研与需求分析:通过查阅国内外相关文献和技术资料,了解当前盗窃行为识别领域的研究现状和发展趋势,明确系统的需求和功能定位。
数据采集与预处理:收集包含各种盗窃行为场景的视频数据集,并对其进行标注、清洗和增强等预处理操作,为模型训练提供高质量的数据支持。
模型设计与训练:基于YOLOv8模型进行改进,设计适用于盗窃行为识别的深度学习模型,并使用预处理后的数据集进行训练和调优。
系统实现与集成:利用Python编程语言和相关开源库(如OpenCV、PyQt等),开发具备图形用户界面的智能安防盗窃行为识别系统,并将其与训练好的模型进行集成。
测试与优化:在实际环境中对系统进行测试,根据测试结果不断调整和优化模型参数及系统配置,提高系统的稳定性和可靠性。
总结与展望:对整个研究过程进行总结,分析存在的问题和不足,并对未来的研究方向提出建议。
2.5 预期成果
通过本课题的研究,预计可以获得以下几方面的成果:
构建一个基于YOLOv8的盗窃行为识别模型:该模型能够在多种场景下准确地检测和识别出潜在的盗窃行为。
开发一套完整的智能安防盗窃行为识别系统:该系统具备良好的用户交互界面和实用的功能模块,能够满足实际应用的需求。
形成一套完整的系统设计方案和技术文档:包括系统架构设计、模块划分、接口定义等内容,为后续的系统维护和升级提供依据。
撰写并发表相关的学术论文和技术报告:分享研究成果,推动相关领域的学术交流和技术进步。
2.6 创新点与难点
本课题的创新点主要体现在以下几个方面:
应用场景创新:将最新的YOLOv8目标检测模型应用于盗窃行为识别领域,探索其在智能安防中的实际应用效果。
技术集成创新:结合计算机视觉、深度学习和嵌入式开发等多种技术,构建一个完整的智能安防盗窃行为识别系统。
实时性优化:针对YOLOv8模型进行轻量化改造和加速优化,确保系统能够在资源受限的设备上实现实时检测。
本课题的难点主要包括:
数据获取与标注:由于盗窃行为属于相对少见的事件,公开可用的数据集较为有限,需要自行收集和标注大量高质量的训练数据。
模型泛化能力:如何使模型在不同场景、不同光照条件、不同视角下都能保持稳定的识别性能是一个挑战。
系统稳定性与鲁棒性:在实际部署过程中,系统可能会遇到各种复杂的环境干扰,需要采取有效的措施来提高系统的稳定性和抗干扰能力。
用户体验优化:为了便于用户使用,需要设计简洁直观的操作界面,并提供清晰的提示信息和帮助文档。
3 设计框架
3.1 技术架构概述
本系统采用分层架构设计,主要包括以下四个层次:
#mermaid-svg-vetKjSSWdzwaIDwr{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-vetKjSSWdzwaIDwr .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-vetKjSSWdzwaIDwr .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-vetKjSSWdzwaIDwr .error-icon{fill:#552222;}#mermaid-svg-vetKjSSWdzwaIDwr .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vetKjSSWdzwaIDwr .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-vetKjSSWdzwaIDwr .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vetKjSSWdzwaIDwr .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vetKjSSWdzwaIDwr .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-vetKjSSWdzwaIDwr .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vetKjSSWdzwaIDwr .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vetKjSSWdzwaIDwr .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vetKjSSWdzwaIDwr .marker.cross{stroke:#333333;}#mermaid-svg-vetKjSSWdzwaIDwr svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vetKjSSWdzwaIDwr p{margin:0;}#mermaid-svg-vetKjSSWdzwaIDwr .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-vetKjSSWdzwaIDwr .cluster-label text{fill:#333;}#mermaid-svg-vetKjSSWdzwaIDwr .cluster-label span{color:#333;}#mermaid-svg-vetKjSSWdzwaIDwr .cluster-label span p{background-color:transparent;}#mermaid-svg-vetKjSSWdzwaIDwr .label text,#mermaid-svg-vetKjSSWdzwaIDwr span{fill:#333;color:#333;}#mermaid-svg-vetKjSSWdzwaIDwr .node rect,#mermaid-svg-vetKjSSWdzwaIDwr .node circle,#mermaid-svg-vetKjSSWdzwaIDwr .node ellipse,#mermaid-svg-vetKjSSWdzwaIDwr .node polygon,#mermaid-svg-vetKjSSWdzwaIDwr .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vetKjSSWdzwaIDwr .rough-node .label text,#mermaid-svg-vetKjSSWdzwaIDwr .node .label text,#mermaid-svg-vetKjSSWdzwaIDwr .image-shape .label,#mermaid-svg-vetKjSSWdzwaIDwr .icon-shape .label{text-anchor:middle;}#mermaid-svg-vetKjSSWdzwaIDwr .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-vetKjSSWdzwaIDwr .rough-node .label,#mermaid-svg-vetKjSSWdzwaIDwr .node .label,#mermaid-svg-vetKjSSWdzwaIDwr .image-shape .label,#mermaid-svg-vetKjSSWdzwaIDwr .icon-shape .label{text-align:center;}#mermaid-svg-vetKjSSWdzwaIDwr .node.clickable{cursor:pointer;}#mermaid-svg-vetKjSSWdzwaIDwr .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-vetKjSSWdzwaIDwr .arrowheadPath{fill:#333333;}#mermaid-svg-vetKjSSWdzwaIDwr .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vetKjSSWdzwaIDwr .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vetKjSSWdzwaIDwr .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vetKjSSWdzwaIDwr .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-vetKjSSWdzwaIDwr .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vetKjSSWdzwaIDwr .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-vetKjSSWdzwaIDwr .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vetKjSSWdzwaIDwr .cluster text{fill:#333;}#mermaid-svg-vetKjSSWdzwaIDwr .cluster span{color:#333;}#mermaid-svg-vetKjSSWdzwaIDwr div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vetKjSSWdzwaIDwr .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-vetKjSSWdzwaIDwr rect.text{fill:none;stroke-width:0;}#mermaid-svg-vetKjSSWdzwaIDwr .icon-shape,#mermaid-svg-vetKjSSWdzwaIDwr .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vetKjSSWdzwaIDwr .icon-shape p,#mermaid-svg-vetKjSSWdzwaIDwr .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-vetKjSSWdzwaIDwr .icon-shape .label rect,#mermaid-svg-vetKjSSWdzwaIDwr .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vetKjSSWdzwaIDwr .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-vetKjSSWdzwaIDwr .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-vetKjSSWdzwaIDwr :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
视频流/图片
检测结果
风险评估
用户反馈
数据采集层
目标检测层
行为分析层
用户交互层
3.1.1 数据采集层
- 功能:负责视频流或图片的采集与预处理
- 关键技术:OpenCV 视频读取与处理
- 输入:摄像头视频流、本地视频文件、单张图片
- 输出:经过预处理的图像帧
1.1.2 目标检测层
- 功能:使用 YOLOv11 模型进行目标检测
- 关键技术:YOLOv11 目标检测算法、非极大值抑制(NMS)
- 输入:原始图像帧
- 输出:检测到的目标及其类别信息
3.1.3 行为分析层
- 功能:分析检测结果,识别危险行为
- 关键技术:行为模式匹配、风险评估算法
- 输入:目标检测结果
- 输出:行为风险等级、预警信息
3.1.4 用户交互层
- 功能:提供图形用户界面,展示检测结果和预警信息
- 关键技术:PyQt5 GUI 开发、QThread 多线程处理
- 输入:用户操作指令
- 输出:可视化检测结果、日志信息、警告提示
3.2 关键技术详解
3.2.1 YOLOv11 目标检测
YOLOv11 是目前最先进的实时目标检测模型之一,具有以下特点:
- 高速度:能够在普通GPU上实现实时检测
- 高精度:在COCO数据集上达到SOTA性能
- 多尺度预测:支持多种尺寸输入,适应不同场景需求
YOLOv11 检测流程伪代码
# 加载YOLOv11模型
model = YOLO("best.pt")
# 图像预处理
def preprocess(image):
# 调整尺寸至640×640
resized_image = cv2.resize(image, (640, 640))
# 归一化处理
normalized_image = resized_image / 255.0
return normalized_image
# 执行目标检测def detect(image):
# 预处理
processed_img = preprocess(image)
# 模型推理
results = model(processed_img)
# 解析结果
detections = []
for result in results:
boxes = result.boxes
for box in boxes:
x1, y1, x2, y2 = box.xyxy[0].cpu().numpy().astype(int)
conf = float(box.conf[0].cpu().numpy())
cls = int(box.cls[0].cpu().numpy())
class_name = result.names[cls]
detections.append((x1, y1, x2, y2, conf, class_name))
return detections
3.2.2 非极大值抑制(NMS)
NMS 是目标检测中用于去除重复检测框的关键技术。其实现原理如下:
NMS 实现伪代码
def non_max_suppression(detections, iou_threshold=0.5):
if not detections:
return []
# 按置信度排序
detections.sort(key=lambda x: x[4], reverse=True)
keep_detections = []
while detections:
best_detection = detections.pop(0)
keep_detections.append(best_detection)
# 计算与其余检测的IoU并移除高重叠的检测
new_detections = []
for detection in detections:
iou = calculate_iou(best_detection, detection)
if iou < iou_threshold:
new_detections.append(detection)
detections = new_detections
return keep_detections
# 计算两个框之间的IoUdef calculate_iou(box1, box2):
# 解包边界框坐标
x1_min, y1_min, x1_max, y1_max = box1[:4]
x2_min, y2_min, x2_max, y2_max = box2[:4]
# 计算交集区域的坐标
inter_xmin = max(x1_min, x2_min)
inter_ymin = max(y1_min, y2_min)
inter_xmax = min(x1_max, x2_max)
inter_ymax = min(y1_max, y2_max)
# 计算交集面积
inter_area = max(0, inter_xmax – inter_xmin) * max(0, inter_ymax – inter_ymin)
# 计算两个框各自的面积
box1_area = (x1_max – x1_min) * (y1_max – y1_min)
box2_area = (x2_max – x2_min) * (y2_max – y2_min)
# 计算并集面积
union_area = box1_area + box2_area – inter_area
# 计算IoU
return inter_area / union_area if union_area > 0 else 0
1.2.3 PyQt5 用户界面
用户界面采用 PyQt5 开发,主要包含以下几个核心组件:
- 主窗口类 SecurityApp:继承自 QMainWindow,管理整个应用程序的界面布局和事件处理
- 视频处理线程 VideoThread:继承自 QThread,负责视频流的处理和检测结果的更新
- 图像处理器 ImageProcessor:负责静态图像的处理和检测
UI 核心模块设计
#mermaid-svg-tVEt0I3QGP9c5oGB{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-tVEt0I3QGP9c5oGB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tVEt0I3QGP9c5oGB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tVEt0I3QGP9c5oGB .error-icon{fill:#552222;}#mermaid-svg-tVEt0I3QGP9c5oGB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tVEt0I3QGP9c5oGB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tVEt0I3QGP9c5oGB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tVEt0I3QGP9c5oGB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tVEt0I3QGP9c5oGB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tVEt0I3QGP9c5oGB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tVEt0I3QGP9c5oGB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tVEt0I3QGP9c5oGB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tVEt0I3QGP9c5oGB .marker.cross{stroke:#333333;}#mermaid-svg-tVEt0I3QGP9c5oGB svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tVEt0I3QGP9c5oGB p{margin:0;}#mermaid-svg-tVEt0I3QGP9c5oGB .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-tVEt0I3QGP9c5oGB .cluster-label text{fill:#333;}#mermaid-svg-tVEt0I3QGP9c5oGB .cluster-label span{color:#333;}#mermaid-svg-tVEt0I3QGP9c5oGB .cluster-label span p{background-color:transparent;}#mermaid-svg-tVEt0I3QGP9c5oGB .label text,#mermaid-svg-tVEt0I3QGP9c5oGB span{fill:#333;color:#333;}#mermaid-svg-tVEt0I3QGP9c5oGB .node rect,#mermaid-svg-tVEt0I3QGP9c5oGB .node circle,#mermaid-svg-tVEt0I3QGP9c5oGB .node ellipse,#mermaid-svg-tVEt0I3QGP9c5oGB .node polygon,#mermaid-svg-tVEt0I3QGP9c5oGB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tVEt0I3QGP9c5oGB .rough-node .label text,#mermaid-svg-tVEt0I3QGP9c5oGB .node .label text,#mermaid-svg-tVEt0I3QGP9c5oGB .image-shape .label,#mermaid-svg-tVEt0I3QGP9c5oGB .icon-shape .label{text-anchor:middle;}#mermaid-svg-tVEt0I3QGP9c5oGB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-tVEt0I3QGP9c5oGB .rough-node .label,#mermaid-svg-tVEt0I3QGP9c5oGB .node .label,#mermaid-svg-tVEt0I3QGP9c5oGB .image-shape .label,#mermaid-svg-tVEt0I3QGP9c5oGB .icon-shape .label{text-align:center;}#mermaid-svg-tVEt0I3QGP9c5oGB .node.clickable{cursor:pointer;}#mermaid-svg-tVEt0I3QGP9c5oGB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-tVEt0I3QGP9c5oGB .arrowheadPath{fill:#333333;}#mermaid-svg-tVEt0I3QGP9c5oGB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tVEt0I3QGP9c5oGB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tVEt0I3QGP9c5oGB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tVEt0I3QGP9c5oGB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-tVEt0I3QGP9c5oGB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tVEt0I3QGP9c5oGB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-tVEt0I3QGP9c5oGB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tVEt0I3QGP9c5oGB .cluster text{fill:#333;}#mermaid-svg-tVEt0I3QGP9c5oGB .cluster span{color:#333;}#mermaid-svg-tVEt0I3QGP9c5oGB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-tVEt0I3QGP9c5oGB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-tVEt0I3QGP9c5oGB rect.text{fill:none;stroke-width:0;}#mermaid-svg-tVEt0I3QGP9c5oGB .icon-shape,#mermaid-svg-tVEt0I3QGP9c5oGB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tVEt0I3QGP9c5oGB .icon-shape p,#mermaid-svg-tVEt0I3QGP9c5oGB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-tVEt0I3QGP9c5oGB .icon-shape .label rect,#mermaid-svg-tVEt0I3QGP9c5oGB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tVEt0I3QGP9c5oGB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-tVEt0I3QGP9c5oGB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-tVEt0I3QGP9c5oGB :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
控制
调用
信号
返回结果
SecurityApp
VideoThread
ImageProcessor
PyQt5 主要交互流程
PyQt5 核心交互逻辑伪代码
class SecurityApp(QMainWindow):
def __init__(self):
super().__init__()
self.model_path = "best.pt" # 模型路径
self.image_processor = ImageProcessor(self.model_path)
self.video_thread = None
self.current_mode = None # 'image', 'video', 'camera'
self.camera_index = 0 # 默认摄像头索引
self.init_ui()
def init_ui(self):
# 初始化界面元素
self.create_buttons()
self.create_display_areas()
self.setup_layout()
self.connect_signals()
def create_buttons(self):
# 创建模式选择按钮和开始按钮
self.image_btn = QPushButton("图片识别")
self.video_btn = QPushButton("视频识别")
self.camera_btn = QPushButton("实时识别")
self.start_btn = QPushButton("开始识别")
def create_display_areas(self):
# 创建显示区域和结果区域
self.display_label = QLabel()
self.result_text = QTextEdit()
self.log_text = QTextEdit()
self.warning_label = QLabel()
def connect_signals(self):
# 连接按钮信号
self.image_btn.clicked.connect(self.select_image_mode)
self.video_btn.clicked.connect(self.select_video_mode)
self.camera_btn.clicked.connect(self.select_camera_mode)
self.start_btn.clicked.connect(self.start_detection)
def start_detection(self):
# 启动检测过程
if self.current_mode == 'image':
self.start_image_detection()
elif self.current_mode == 'video':
self.start_video_detection()
elif self.current_mode == 'camera':
self.start_camera_detection()
def update_frame(self, frame, detections):
# 更新视频帧显示
frame_with_boxes = self.draw_boxes(frame, detections)
self.display_image(frame_with_boxes)
self.update_result_text(detections)
self.check_dangerous_behavior(detections)
def draw_boxes(self, frame, detections):
# 绘制检测框
for x1, y1, x2, y2, conf, class_name in detections:
color = (0, 0, 255) if class_name in DANGEROUS_CLASSES else (0, 255, 0)
cv2.rectangle(frame, (x1, y1), (x2, y2), color, 2)
# 绘制标签
label = f"{class_name} {conf:.2f}"
cv2.putText(frame, label, (x1, y1 – 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 1)
return frame
def check_dangerous_behavior(self, detections):
# 检查是否有危险行为
dangerous_classes = [d[5] for d in detections if d[5] in DANGEROUS_CLASSES]
if dangerous_classes:
self.warning_label.setText(f"⚠️ 警告:检测到危险行为!{', '.join(set(dangerous_classes))}")
self.warning_label.setVisible(True)
else:
self.warning_label.setVisible(False)
3.3 系统工作流程
#mermaid-svg-DmSg6rH4um82gZFJ{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DmSg6rH4um82gZFJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DmSg6rH4um82gZFJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DmSg6rH4um82gZFJ .error-icon{fill:#552222;}#mermaid-svg-DmSg6rH4um82gZFJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DmSg6rH4um82gZFJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DmSg6rH4um82gZFJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DmSg6rH4um82gZFJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DmSg6rH4um82gZFJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DmSg6rH4um82gZFJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DmSg6rH4um82gZFJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DmSg6rH4um82gZFJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DmSg6rH4um82gZFJ .marker.cross{stroke:#333333;}#mermaid-svg-DmSg6rH4um82gZFJ svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DmSg6rH4um82gZFJ p{margin:0;}#mermaid-svg-DmSg6rH4um82gZFJ .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-DmSg6rH4um82gZFJ .cluster-label text{fill:#333;}#mermaid-svg-DmSg6rH4um82gZFJ .cluster-label span{color:#333;}#mermaid-svg-DmSg6rH4um82gZFJ .cluster-label span p{background-color:transparent;}#mermaid-svg-DmSg6rH4um82gZFJ .label text,#mermaid-svg-DmSg6rH4um82gZFJ span{fill:#333;color:#333;}#mermaid-svg-DmSg6rH4um82gZFJ .node rect,#mermaid-svg-DmSg6rH4um82gZFJ .node circle,#mermaid-svg-DmSg6rH4um82gZFJ .node ellipse,#mermaid-svg-DmSg6rH4um82gZFJ .node polygon,#mermaid-svg-DmSg6rH4um82gZFJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DmSg6rH4um82gZFJ .rough-node .label text,#mermaid-svg-DmSg6rH4um82gZFJ .node .label text,#mermaid-svg-DmSg6rH4um82gZFJ .image-shape .label,#mermaid-svg-DmSg6rH4um82gZFJ .icon-shape .label{text-anchor:middle;}#mermaid-svg-DmSg6rH4um82gZFJ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DmSg6rH4um82gZFJ .rough-node .label,#mermaid-svg-DmSg6rH4um82gZFJ .node .label,#mermaid-svg-DmSg6rH4um82gZFJ .image-shape .label,#mermaid-svg-DmSg6rH4um82gZFJ .icon-shape .label{text-align:center;}#mermaid-svg-DmSg6rH4um82gZFJ .node.clickable{cursor:pointer;}#mermaid-svg-DmSg6rH4um82gZFJ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DmSg6rH4um82gZFJ .arrowheadPath{fill:#333333;}#mermaid-svg-DmSg6rH4um82gZFJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DmSg6rH4um82gZFJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DmSg6rH4um82gZFJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DmSg6rH4um82gZFJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DmSg6rH4um82gZFJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DmSg6rH4um82gZFJ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DmSg6rH4um82gZFJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DmSg6rH4um82gZFJ .cluster text{fill:#333;}#mermaid-svg-DmSg6rH4um82gZFJ .cluster span{color:#333;}#mermaid-svg-DmSg6rH4um82gZFJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DmSg6rH4um82gZFJ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DmSg6rH4um82gZFJ rect.text{fill:none;stroke-width:0;}#mermaid-svg-DmSg6rH4um82gZFJ .icon-shape,#mermaid-svg-DmSg6rH4um82gZFJ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DmSg6rH4um82gZFJ .icon-shape p,#mermaid-svg-DmSg6rH4um82gZFJ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DmSg6rH4um82gZFJ .icon-shape .label rect,#mermaid-svg-DmSg6rH4um82gZFJ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DmSg6rH4um82gZFJ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DmSg6rH4um82gZFJ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DmSg6rH4um82gZFJ :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
是
否
是
否
是
否
用户选择模式
实时识别?
启动摄像头视频流
视频识别?
加载视频文件
加载图片文件
逐帧处理
一次性处理
执行目标检测
应用NMS去重
危险行为?
显示警告信息
正常显示结果
记录日志
等待下一次输入
3.4 数据集训练流程
#mermaid-svg-6svIrpNAKXQ9Si0n{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-6svIrpNAKXQ9Si0n .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-6svIrpNAKXQ9Si0n .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-6svIrpNAKXQ9Si0n .error-icon{fill:#552222;}#mermaid-svg-6svIrpNAKXQ9Si0n .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-6svIrpNAKXQ9Si0n .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-6svIrpNAKXQ9Si0n .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-6svIrpNAKXQ9Si0n .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-6svIrpNAKXQ9Si0n .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-6svIrpNAKXQ9Si0n .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-6svIrpNAKXQ9Si0n .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-6svIrpNAKXQ9Si0n .marker{fill:#333333;stroke:#333333;}#mermaid-svg-6svIrpNAKXQ9Si0n .marker.cross{stroke:#333333;}#mermaid-svg-6svIrpNAKXQ9Si0n svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-6svIrpNAKXQ9Si0n p{margin:0;}#mermaid-svg-6svIrpNAKXQ9Si0n .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-6svIrpNAKXQ9Si0n .cluster-label text{fill:#333;}#mermaid-svg-6svIrpNAKXQ9Si0n .cluster-label span{color:#333;}#mermaid-svg-6svIrpNAKXQ9Si0n .cluster-label span p{background-color:transparent;}#mermaid-svg-6svIrpNAKXQ9Si0n .label text,#mermaid-svg-6svIrpNAKXQ9Si0n span{fill:#333;color:#333;}#mermaid-svg-6svIrpNAKXQ9Si0n .node rect,#mermaid-svg-6svIrpNAKXQ9Si0n .node circle,#mermaid-svg-6svIrpNAKXQ9Si0n .node ellipse,#mermaid-svg-6svIrpNAKXQ9Si0n .node polygon,#mermaid-svg-6svIrpNAKXQ9Si0n .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-6svIrpNAKXQ9Si0n .rough-node .label text,#mermaid-svg-6svIrpNAKXQ9Si0n .node .label text,#mermaid-svg-6svIrpNAKXQ9Si0n .image-shape .label,#mermaid-svg-6svIrpNAKXQ9Si0n .icon-shape .label{text-anchor:middle;}#mermaid-svg-6svIrpNAKXQ9Si0n .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-6svIrpNAKXQ9Si0n .rough-node .label,#mermaid-svg-6svIrpNAKXQ9Si0n .node .label,#mermaid-svg-6svIrpNAKXQ9Si0n .image-shape .label,#mermaid-svg-6svIrpNAKXQ9Si0n .icon-shape .label{text-align:center;}#mermaid-svg-6svIrpNAKXQ9Si0n .node.clickable{cursor:pointer;}#mermaid-svg-6svIrpNAKXQ9Si0n .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-6svIrpNAKXQ9Si0n .arrowheadPath{fill:#333333;}#mermaid-svg-6svIrpNAKXQ9Si0n .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-6svIrpNAKXQ9Si0n .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-6svIrpNAKXQ9Si0n .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-6svIrpNAKXQ9Si0n .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-6svIrpNAKXQ9Si0n .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-6svIrpNAKXQ9Si0n .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-6svIrpNAKXQ9Si0n .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-6svIrpNAKXQ9Si0n .cluster text{fill:#333;}#mermaid-svg-6svIrpNAKXQ9Si0n .cluster span{color:#333;}#mermaid-svg-6svIrpNAKXQ9Si0n div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-6svIrpNAKXQ9Si0n .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-6svIrpNAKXQ9Si0n rect.text{fill:none;stroke-width:0;}#mermaid-svg-6svIrpNAKXQ9Si0n .icon-shape,#mermaid-svg-6svIrpNAKXQ9Si0n .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-6svIrpNAKXQ9Si0n .icon-shape p,#mermaid-svg-6svIrpNAKXQ9Si0n .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-6svIrpNAKXQ9Si0n .icon-shape .label rect,#mermaid-svg-6svIrpNAKXQ9Si0n .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-6svIrpNAKXQ9Si0n .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-6svIrpNAKXQ9Si0n .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-6svIrpNAKXQ9Si0n :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
是
否
收集盗窃行为相关数据
标注数据
划分训练集/验证集/测试集
配置训练参数
训练YOLOv11模型
评估模型性能
满足要求?
保存最优模型
调整参数重新训练
3.4.1 数据准备
- 数据来源:公开数据集 + 自建数据集
- 标注工具:LabelImg 或其他标注工具
- 数据增强:随机翻转、旋转、亮度调整等
- 数据格式:YOLO 标准格式(每个图像对应一个 .txt 文件)
3.4.2 模型训练
- 训练工具:Ultralytics 提供的 YOLOv11 训练接口
- 训练参数:
- epochs: 100
- batch_size: 16
- imgsz: 640
- optimizer: AdamW
- learning_rate: 0.001
- 硬件要求:NVIDIA GPU(建议至少 RTX 3060)
3.4.3 模型评估
- 评估指标:mAP@0.5, mAP@0.5:0.95, Precision, Recall
- 可视化工具:TensorBoard, Confusion Matrix
3.5 UI 交互系统设计逻辑
3.5.1 界面布局
#mermaid-svg-3Ra5WjtGnTvTNcHN{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3Ra5WjtGnTvTNcHN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3Ra5WjtGnTvTNcHN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3Ra5WjtGnTvTNcHN .error-icon{fill:#552222;}#mermaid-svg-3Ra5WjtGnTvTNcHN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3Ra5WjtGnTvTNcHN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3Ra5WjtGnTvTNcHN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3Ra5WjtGnTvTNcHN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3Ra5WjtGnTvTNcHN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3Ra5WjtGnTvTNcHN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3Ra5WjtGnTvTNcHN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3Ra5WjtGnTvTNcHN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3Ra5WjtGnTvTNcHN .marker.cross{stroke:#333333;}#mermaid-svg-3Ra5WjtGnTvTNcHN svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3Ra5WjtGnTvTNcHN p{margin:0;}#mermaid-svg-3Ra5WjtGnTvTNcHN .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-3Ra5WjtGnTvTNcHN .cluster-label text{fill:#333;}#mermaid-svg-3Ra5WjtGnTvTNcHN .cluster-label span{color:#333;}#mermaid-svg-3Ra5WjtGnTvTNcHN .cluster-label span p{background-color:transparent;}#mermaid-svg-3Ra5WjtGnTvTNcHN .label text,#mermaid-svg-3Ra5WjtGnTvTNcHN span{fill:#333;color:#333;}#mermaid-svg-3Ra5WjtGnTvTNcHN .node rect,#mermaid-svg-3Ra5WjtGnTvTNcHN .node circle,#mermaid-svg-3Ra5WjtGnTvTNcHN .node ellipse,#mermaid-svg-3Ra5WjtGnTvTNcHN .node polygon,#mermaid-svg-3Ra5WjtGnTvTNcHN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3Ra5WjtGnTvTNcHN .rough-node .label text,#mermaid-svg-3Ra5WjtGnTvTNcHN .node .label text,#mermaid-svg-3Ra5WjtGnTvTNcHN .image-shape .label,#mermaid-svg-3Ra5WjtGnTvTNcHN .icon-shape .label{text-anchor:middle;}#mermaid-svg-3Ra5WjtGnTvTNcHN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3Ra5WjtGnTvTNcHN .rough-node .label,#mermaid-svg-3Ra5WjtGnTvTNcHN .node .label,#mermaid-svg-3Ra5WjtGnTvTNcHN .image-shape .label,#mermaid-svg-3Ra5WjtGnTvTNcHN .icon-shape .label{text-align:center;}#mermaid-svg-3Ra5WjtGnTvTNcHN .node.clickable{cursor:pointer;}#mermaid-svg-3Ra5WjtGnTvTNcHN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3Ra5WjtGnTvTNcHN .arrowheadPath{fill:#333333;}#mermaid-svg-3Ra5WjtGnTvTNcHN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3Ra5WjtGnTvTNcHN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3Ra5WjtGnTvTNcHN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3Ra5WjtGnTvTNcHN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3Ra5WjtGnTvTNcHN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3Ra5WjtGnTvTNcHN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3Ra5WjtGnTvTNcHN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3Ra5WjtGnTvTNcHN .cluster text{fill:#333;}#mermaid-svg-3Ra5WjtGnTvTNcHN .cluster span{color:#333;}#mermaid-svg-3Ra5WjtGnTvTNcHN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3Ra5WjtGnTvTNcHN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3Ra5WjtGnTvTNcHN rect.text{fill:none;stroke-width:0;}#mermaid-svg-3Ra5WjtGnTvTNcHN .icon-shape,#mermaid-svg-3Ra5WjtGnTvTNcHN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3Ra5WjtGnTvTNcHN .icon-shape p,#mermaid-svg-3Ra5WjtGnTvTNcHN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3Ra5WjtGnTvTNcHN .icon-shape .label rect,#mermaid-svg-3Ra5WjtGnTvTNcHN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3Ra5WjtGnTvTNcHN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3Ra5WjtGnTvTNcHN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3Ra5WjtGnTvTNcHN :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
标题栏
模式选择区
摄像头选择区
显示区域
结果与日志区域
状态栏
3.5.2 控件设计
- 模式选择按钮:用于切换图片识别、视频识别、实时识别模式
- 摄像头选择复选框:允许用户选择本机摄像头或外接摄像头
- 结果显示区域:以文本形式展示检测到的目标类别及数量
- 日志记录区域:显示系统运行状态和关键事件
- 警告提示区域:当检测到危险行为时,显示醒目的警告信息
1.5.3 交互逻辑
3.6 可视化图表显示逻辑
3.6.1 检测结果统计图
#mermaid-svg-WUGFdmNlEmUuywMu{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WUGFdmNlEmUuywMu .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WUGFdmNlEmUuywMu .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WUGFdmNlEmUuywMu .error-icon{fill:#552222;}#mermaid-svg-WUGFdmNlEmUuywMu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WUGFdmNlEmUuywMu .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WUGFdmNlEmUuywMu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WUGFdmNlEmUuywMu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WUGFdmNlEmUuywMu .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WUGFdmNlEmUuywMu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WUGFdmNlEmUuywMu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WUGFdmNlEmUuywMu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WUGFdmNlEmUuywMu .marker.cross{stroke:#333333;}#mermaid-svg-WUGFdmNlEmUuywMu svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WUGFdmNlEmUuywMu p{margin:0;}#mermaid-svg-WUGFdmNlEmUuywMu .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-WUGFdmNlEmUuywMu .cluster-label text{fill:#333;}#mermaid-svg-WUGFdmNlEmUuywMu .cluster-label span{color:#333;}#mermaid-svg-WUGFdmNlEmUuywMu .cluster-label span p{background-color:transparent;}#mermaid-svg-WUGFdmNlEmUuywMu .label text,#mermaid-svg-WUGFdmNlEmUuywMu span{fill:#333;color:#333;}#mermaid-svg-WUGFdmNlEmUuywMu .node rect,#mermaid-svg-WUGFdmNlEmUuywMu .node circle,#mermaid-svg-WUGFdmNlEmUuywMu .node ellipse,#mermaid-svg-WUGFdmNlEmUuywMu .node polygon,#mermaid-svg-WUGFdmNlEmUuywMu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WUGFdmNlEmUuywMu .rough-node .label text,#mermaid-svg-WUGFdmNlEmUuywMu .node .label text,#mermaid-svg-WUGFdmNlEmUuywMu .image-shape .label,#mermaid-svg-WUGFdmNlEmUuywMu .icon-shape .label{text-anchor:middle;}#mermaid-svg-WUGFdmNlEmUuywMu .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-WUGFdmNlEmUuywMu .rough-node .label,#mermaid-svg-WUGFdmNlEmUuywMu .node .label,#mermaid-svg-WUGFdmNlEmUuywMu .image-shape .label,#mermaid-svg-WUGFdmNlEmUuywMu .icon-shape .label{text-align:center;}#mermaid-svg-WUGFdmNlEmUuywMu .node.clickable{cursor:pointer;}#mermaid-svg-WUGFdmNlEmUuywMu .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-WUGFdmNlEmUuywMu .arrowheadPath{fill:#333333;}#mermaid-svg-WUGFdmNlEmUuywMu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WUGFdmNlEmUuywMu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WUGFdmNlEmUuywMu .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WUGFdmNlEmUuywMu .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-WUGFdmNlEmUuywMu .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WUGFdmNlEmUuywMu .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-WUGFdmNlEmUuywMu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WUGFdmNlEmUuywMu .cluster text{fill:#333;}#mermaid-svg-WUGFdmNlEmUuywMu .cluster span{color:#333;}#mermaid-svg-WUGFdmNlEmUuywMu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WUGFdmNlEmUuywMu .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-WUGFdmNlEmUuywMu rect.text{fill:none;stroke-width:0;}#mermaid-svg-WUGFdmNlEmUuywMu .icon-shape,#mermaid-svg-WUGFdmNlEmUuywMu .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WUGFdmNlEmUuywMu .icon-shape p,#mermaid-svg-WUGFdmNlEmUuywMu .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-WUGFdmNlEmUuywMu .icon-shape .label rect,#mermaid-svg-WUGFdmNlEmUuywMu .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WUGFdmNlEmUuywMu .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-WUGFdmNlEmUuywMu .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-WUGFdmNlEmUuywMu :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
获取检测结果
统计各类别数量
生成柱状图
显示类别解释
示例:检测结果统计
def update_result_text(self, detections):
# 清空结果文本
self.result_text.clear()
if not detections:
self.result_text.append("未检测到任何目标")
return
# 统计各类别数量
class_counts = {}
for _, _, _, _, conf, class_name in detections:
if class_name in class_counts:
class_counts[class_name] += 1
else:
class_counts[class_name] = 1
# 显示检测结果统计
self.result_text.append(f"<h3>检测到 {len(detections)} 个目标</h3>")
for class_name, count in class_counts.items():
# 设置危险行为的文本颜色
if class_name in DANGEROUS_CLASSES:
self.result_text.append(f"<p style='color: red;'><b>{class_name}</b>: {count} 个 ⚠️</p>")
else:
self.result_text.append(f"<p><b>{class_name}</b>: {count} 个</p>")
# 添加类别解释
self.result_text.append("<h3>类别解释:</h3>")
for class_name in class_counts.keys():
description = CLASS_DESCRIPTIONS.get(class_name, "无描述")
# 设置危险行为的文本颜色
if class_name in DANGEROUS_CLASSES:
self.result_text.append(f"<p style='color: red;'><b>{class_name}</b>: {description}</p>")
else:
self.result_text.append(f"<p><b>{class_name}</b>: {description}</p>")
3.6.2 日志记录与显示
#mermaid-svg-KEZkxABLCwN0JGsF{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KEZkxABLCwN0JGsF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KEZkxABLCwN0JGsF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KEZkxABLCwN0JGsF .error-icon{fill:#552222;}#mermaid-svg-KEZkxABLCwN0JGsF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KEZkxABLCwN0JGsF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KEZkxABLCwN0JGsF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KEZkxABLCwN0JGsF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KEZkxABLCwN0JGsF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KEZkxABLCwN0JGsF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KEZkxABLCwN0JGsF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KEZkxABLCwN0JGsF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KEZkxABLCwN0JGsF .marker.cross{stroke:#333333;}#mermaid-svg-KEZkxABLCwN0JGsF svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KEZkxABLCwN0JGsF p{margin:0;}#mermaid-svg-KEZkxABLCwN0JGsF .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-KEZkxABLCwN0JGsF .cluster-label text{fill:#333;}#mermaid-svg-KEZkxABLCwN0JGsF .cluster-label span{color:#333;}#mermaid-svg-KEZkxABLCwN0JGsF .cluster-label span p{background-color:transparent;}#mermaid-svg-KEZkxABLCwN0JGsF .label text,#mermaid-svg-KEZkxABLCwN0JGsF span{fill:#333;color:#333;}#mermaid-svg-KEZkxABLCwN0JGsF .node rect,#mermaid-svg-KEZkxABLCwN0JGsF .node circle,#mermaid-svg-KEZkxABLCwN0JGsF .node ellipse,#mermaid-svg-KEZkxABLCwN0JGsF .node polygon,#mermaid-svg-KEZkxABLCwN0JGsF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-KEZkxABLCwN0JGsF .rough-node .label text,#mermaid-svg-KEZkxABLCwN0JGsF .node .label text,#mermaid-svg-KEZkxABLCwN0JGsF .image-shape .label,#mermaid-svg-KEZkxABLCwN0JGsF .icon-shape .label{text-anchor:middle;}#mermaid-svg-KEZkxABLCwN0JGsF .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-KEZkxABLCwN0JGsF .rough-node .label,#mermaid-svg-KEZkxABLCwN0JGsF .node .label,#mermaid-svg-KEZkxABLCwN0JGsF .image-shape .label,#mermaid-svg-KEZkxABLCwN0JGsF .icon-shape .label{text-align:center;}#mermaid-svg-KEZkxABLCwN0JGsF .node.clickable{cursor:pointer;}#mermaid-svg-KEZkxABLCwN0JGsF .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-KEZkxABLCwN0JGsF .arrowheadPath{fill:#333333;}#mermaid-svg-KEZkxABLCwN0JGsF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-KEZkxABLCwN0JGsF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-KEZkxABLCwN0JGsF .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KEZkxABLCwN0JGsF .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-KEZkxABLCwN0JGsF .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KEZkxABLCwN0JGsF .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-KEZkxABLCwN0JGsF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-KEZkxABLCwN0JGsF .cluster text{fill:#333;}#mermaid-svg-KEZkxABLCwN0JGsF .cluster span{color:#333;}#mermaid-svg-KEZkxABLCwN0JGsF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-KEZkxABLCwN0JGsF .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-KEZkxABLCwN0JGsF rect.text{fill:none;stroke-width:0;}#mermaid-svg-KEZkxABLCwN0JGsF .icon-shape,#mermaid-svg-KEZkxABLCwN0JGsF .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KEZkxABLCwN0JGsF .icon-shape p,#mermaid-svg-KEZkxABLCwN0JGsF .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-KEZkxABLCwN0JGsF .icon-shape .label rect,#mermaid-svg-KEZkxABLCwN0JGsF .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KEZkxABLCwN0JGsF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-KEZkxABLCwN0JGsF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-KEZkxABLCwN0JGsF :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
系统事件发生
添加时间戳
写入日志文本框
自动滚动到底部
示例:日志记录函数
def log(self, message):
# 添加时间戳
timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
log_message = f"[{timestamp}] {message}"
# 添加到日志文本框
self.log_text.append(log_message)
# 滚动到底部
self.log_text.verticalScrollBar().setValue(self.log_text.verticalScrollBar().maximum())
4 最后
项目包含内容

论文摘要

🧿项目分享:见主页任意置顶文章



