摘要:开发高效的夜视行人检测系统对于提升夜间安全和监控效能至关重要。本篇博客详尽介绍了如何利用深度学习技术搭建一个夜视行人检测系统,并提供了完整的实现代码。本系统采用了先进的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5进行了性能比较,展示了不同模型间的mAP、F1 Score等关键性能指标。文章深度解析了YOLOv8算法的内部机制,提供了相应的Python代码和训练数据集,以及一个基于PySide6的直观UI界面。
该系统能够在夜视仪条件下精确识别和分类图像中的行人,支持从静态图片、图片文件夹、视频以及实时摄像头输入进行检测。系统功能包括热力图分析、目标标记框、类别统计、可调节的置信度和IOU阈值、结果可视化展示等;还设计有基于SQLite的用户注册登录管理界面,允许用户通过按钮轻松切换不同的检测模型和自定义UI界面。本文旨在为深度学习领域的初学者提供实用的指导和参考,文章末尾已提供完整代码和数据集的下载链接,以便读者下载和应用。本文结构如下:
目录演示与介绍视频:https://www.bilibili.com/video/BV1iH4y1j7L9/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZubk5xw
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuZlZpt
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuYmJps
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuYmJpv
前言
在当今社会,随着夜间经济和交通活动的不断增加,夜视行人检测系统的研究与开发变得尤为重要。这项技术对于提高夜间行车安全、促进自动驾驶技术的发展、加强公共安全监控等方面发挥着关键作用。特别是在自动驾驶和智能交通系统中,高效准确地识别夜间行人是确保行车安全的前提条件。然而,夜间行人检测面临的挑战远比白天复杂,主要因为夜间光照条件差,行人的可见度低,这极大地增加了检测的难度。
近年来,深度学习技术的迅速发展为夜视行人检测提供了新的解决方案。尤其是YOLO(You Only Look Once)系列算法,从YOLOv5到最新的YOLOv8,不断地在检测速度和准确性上取得突破。这些算法的改进,包括但不限于网络架构的优化、损失函数的调整以及训练策略的创新,极大地提高了在低光照条件下的行人检测性能。同时,随着数据集的不断更新和扩充,模型的训练和验证变得更加全面,能够更好地适应不同的夜间环境。
随着YOLO(You Only Look Once)系列目标检测算法的出现和发展,已经提出了更高效、更精准的目标检测工具。从最早的YOLO[1],到YOLO9000[2],再到YOLOv4[3],YOLOv5等,这一系列的发展都在推动着目标检测技术的进步。在去年美团发布了YOLOv6[4],然后紧接着YOLOv7[5],到现在的YOLOv8[6],这个最新版本在许多方面都进行了优化与改进,如使用了更复杂的网络架构,更精细的预测机制,以及加入了对小目标的更好处理。
作为YOLO系列的最新作品,YOLOv8在性能上有了进一步的提升。研究表明,YOLOv8在保持高检测速度的同时,通过改进的损失函数和更深的网络结构,提高了对夜间行人的检测准确性。特别是在处理远距离或部分遮挡行人时,表现出了更好的鲁棒性。为了进一步提高夜视行人检测的性能,研究者们探索了将红外图像与可见光图像结合的多模态方法。通过融合不同模态的数据,可以更全面地捕捉行人的特征,提高检测的鲁棒性和准确性。
随着研究的深入,一些针对夜视行人检测的专用数据集被构建,如KAIST Multispectral Pedestrian Dataset等,这些数据集促进了算法的开发和评估。同时,研究者也提出了多种评估指标来准确衡量检测算法在夜间条件下的性能。在实际应用中,尤其是在移动端或嵌入式系统中,资源限制和实时性要求使得夜视行人检测面临额外挑战。因此,研究者致力于优化算法,减少计算资源消耗,同时保证检测速度和准确率。
一些研究尝试将深度学习方法与传统的机器学习技术结合起来,以提高夜视环境下行人检测的准确率。例如,通过先用深度学习模型进行粗略检测,然后用传统算法进行细节优化,这种混合方法在提高检测精度的同时,还能保持较快的处理速度。
本博客所做的工作是基于YOLOv8和YOLOv5算法构建一个夜视行人目标检测系统,展示系统的界面效果,详细阐述其算法原理,提供代码实现,以及分享该系统的实现过程。希望本博客的分享能给予读者一定的启示,推动更多的相关研究。本文的主要贡献如下:
-
采用最先进的YOLOv8算法:本文首次将YOLOv8算法应用于夜视行人检测,与之前的研究相比,YOLOv8在检测速度和准确性上都有显著提升。通过详细介绍YOLOv8算法的应用流程和优化策略,本文不仅展示了如何有效地利用最新的深度学习模型进行高效的行人检测,还通过与YOLOv7、YOLOv6、YOLOv5等算法的对比分析,直观展示了YOLOv8在夜视行人检测领域的优势。
-
实现用户友好的系统界面:通过使用Python的PySide6库,本文开发了一个既美观又易于操作的夜视行人检测系统界面。这一创新不仅使得夜视行人检测变得更加直观和便捷,而且为YOLOv8算法及其他相关技术的推广和应用提供了有力支持。
-
设计登录管理功能,提升系统安全性:本文设计的登录管理功能,不仅增强了系统的安全性,也为实现更加个性化的用户体验奠定了基础。这一功能的添加,使得系统能够在保障用户数据安全的同时,为未来引入更多高级功能提供可能。
-
深入研究YOLOv8模型性能:本文对YOLOv8模型进行了全面深入的性能评估,包括精确度、召回率等关键指标的测试,以及在不同环境和条件下的性能分析。这些研究成果不仅丰富了行人检测领域的理论基础,也为算法的进一步优化提供了重要参考。
-
提供完整的数据集和代码资源包:为了促进YOLOv8在夜视行人检测领域的应用和研究,本文提供了一套完整的数据集和代码资源包。这些资源的公开,使得读者可以轻松复现文中的实验结果,并在此基础上开展更深入的研究或者进行定制化的系统开发。
1. 数据集介绍
在本博客章节中,我们将深入探讨构成夜视行人检测系统的关键组成部分之一:数据集。在任何机器学习项目中,数据集都是至关重要的,因为它直接决定了模型训练的质量和最终系统的性能。为此,我们精心准备了一个专为夜间行人检测量身打造的数据集,以确保在实际应用中能够达到最佳的检测效果。我们的数据集共包括5725张图像,这些图像细致划分为4032张训练图像、1104张验证图像以及589张测试图像。这种划分策略旨在为模型训练提供充足的数据,同时保留独立的样本集来评估模型对于新数据的适应能力和泛化性。通过这种精心设计的分割,我们确保了模型能够在广泛的数据上学习,并能够在未知数据上进行有效的性能评估。
在数据预处理阶段,我们采取了若干关键步骤来提升模型的训练效率和检测精度。首先,所有图像都进行了自动方向校正,并移除了EXIF信息中的方向属性,这一步骤是为了消除由于不同摄影设备和拍摄条件引入的差异,从而让模型更加聚焦于行人检测任务本身。其次,考虑到不同图像的分辨率可能会影响模型的学习效果,我们将所有图像统一调整到810x1080像素的分辨率,采用拉伸方式以保持输入数据的一致性,尽管这可能引入一定的形状失真,但它对于保持算法处理速度和简化网络结构至关重要。
此外,我们的数据集展示了行人在夜间环境中的典型分布特征。从行人位置的分布图中可以看出,行人通常位于图像的中心区域,这反映了现实世界中行人通常在道路中间行走的情况。而行人目标的宽高比分布图进一步告诉我们大多数行人目标呈现出较窄的宽度和较高的高度,这与人类的体型特征相符。这些分布特性不仅帮助模型学习到行人在图像中的位置和尺寸,同时也指导我们在后续的数据增强和模型训练中,更好地模拟和适应不同的检测场景。博主使用的类别代码如下:
Chinese_name = {'person': "行人"}
总而言之,我们的数据集不仅在数量上充足,而且在质量上精良,为夜视行人检测系统提供了坚实的基础。通过对这些数据进行深入的分析和合理的预处理,我们为模型的训练奠定了基础,并期待它在实际环境中表现出色。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行夜视行人检测的图片或视频,或者启动摄像头进行实时检测。在进行夜视行人目标检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8或YOLOv5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8是目前YOLO系列中最新的一阶段目标检测算法,相较于其他主流目标检测算法,速度更快,精度更高,性能更好,在众多任务上取得了SOTA的成绩。YOLOv8目前一共有5个版本,包括:YOLOv8n、YOLOv8s、YOLOv8m、YOLOv8l、YOLOv8x,考虑到计算速度、实时性、精度,本文选择了YOLOv8s作为Baseline,在此基础上改进和创新满足小目标检测的任务。相较于YOLOv5,YOLOv8主要有两大改进,首先检测头部分换成了当前主流的解耦头,同时从Anchor-Based变为Anchor-Free。其次抛弃了以往IOU匹配或者单边比例的匹配方式,而是使用了Task-AlignedAssigner正负样本匹配方式,并引入了DFLloss。在数据增强部分借鉴了YOLOX的思想,在最后10个epoch关闭Mosiac数据增强,有效提升精度。
YOLOv8在目标检测技术领域的主要特点和改进主要集中在以下几个方面:
- 骨干网络和Neck部分跨阶段局部网络(Cross Stage Partial Network, CSP)模块的预处理从三次卷积换成了两次卷积,借鉴了YOLOv7 ELAN模块多堆叠的设计思想,将YOLOv5的C3结构换成了梯度流更丰富的C2f结构,并对不同尺度模型调整了不同的通道数,使网络能够学习到更多的特征,并且具有更强的鲁棒性。CSP模块的预处理从三次卷积换成了两次卷积,并且借鉴了YOLOv7的多堆叠结构。具体的实现方式是第一次卷积的通道数扩充为原来的两倍,然后将卷积结果在通道上对半分割,这样可以减少一次卷积的次数,加快网络的速度。[7]
- 检测头部分,YOLOv8采用无锚分体式检测头,与基于锚框的方法相比,有助于提高准确性和更高效的检测过程。Head部分较YOLOv5而言有两大改进。首先,换成了目前主流的解耦头结构,将分类和检测头分离,用于缓解分类和定位任务之间存在的冲突;其次,参考YOLOX,从Anchor-Based换成了Anchor Free,面对长宽不规则的目标比较有优势。[7:1]
- 损失函数计算部分,YOLOv8的Loss计算包括两个部分:分类分支和回归分支。分类分支依然采用BCE Loss,回归分支需要和分布式聚焦损失函数(Distribution Focal Loss, DFL)中提出的积分形式表示法绑定,因此使用了DFL,同时还使用了(Complete Inter section over Union, CIoU)Loss。[7:2]
4. 代码简介
在本节中,我们将详细介绍如何使用YOLOv8进行目标检测的代码实现。代码主要分为两部分:模型预测和模型训练。
4.1 模型预测
在模型预测部分,首先导入导入OpenCV库:OpenCV(Open Source Computer Vision Library)是一个广泛使用的开源计算机视觉和机器学习软件库。它提供了大量的视觉处理函数,非常适合用于读取和处理图像。在本场景中,OpenCV用于加载和预处理待检测的图像文件。接下来的代码是YOLO模型的加载和应用,首先从自定义的YOLOv8Model模块中导入YOLOv8Detector类,这个类封装了YOLOv8模型的加载和目标检测功能。
import cv2
from QtFusion.path import abs_path
from ultralytics import YOLO
from YOLOv8Model import YOLOv8Detector
加载预训练的YOLO模型:代码中创建了YOLOv8Detector的实例,并使用预训练的模型权重进行加载。这些权重文件通常是在大量图像上训练得到的,可以有效地提升模型在特定任务(如夜视行人检测)上的表现。
model = YOLOv8Detector()
model.load_model(abs_path("weights/night-yolov8n.pt", path_type="current"))
读取图像文件:使用OpenCV的imread函数读取待检测的图像文件。该函数将图像作为一个数组加载进内存,便于后续的处理和分析。
im2 = cv2.imread("test_media/NightVision_SIXU_A_00484.jpg")
使用模型进行预测:最后,代码调用YOLOv8Detector实例的predict方法对加载的图像进行目标检测,此方法返回检测结果和图像。
pred, superimposed_img = model.predict(pre_img)
4.2 模型训练
在模型训练部分,首先导入YOLO模型,并加载了预训练的YOLOv8模型。
from ultralytics import YOLO
model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect')
接着开始训练模型。其中指定了训练数据的配置文件路径,使用CPU进行训练,使用2个工作进程加载数据,输入图像的大小为640x640,训练100个epoch,每个批次的大小为8。
results = model.train(
data=data_path,
device='cpu',
workers=workers,
imgsz=640,
epochs=100,
batch=batch,
name='train_v8_' + data_name
)
在深度学习中,我们通常通过损失函数下降的曲线来观察模型训练的情况。在训练结束后,我们也可以在logs目录下找到生成对若干训练过程统计图。下图为博主训练夜视行人检测过程中训练情况截图,以及损失函数曲线图,展示了模型在训练和验证过程中的性能指标变化。
首先,训练损失(train/box_loss, train/cls_loss, train/dfI_loss)随着迭代次数增加而持续下降,这表明模型在学习过程中不断优化,对数据集的拟合越来越好。具体来说,边界框损失(box_loss)从初始的较高值迅速下降,然后逐渐趋于平稳,这说明模型在定位行人目标方面的性能逐步提升。分类损失(cls_loss)和方向损失(dfI_loss)也显示出类似的趋势,这两者的下降意味着模型在辨识目标类别和检测目标的方向上同样取得了进步。然而,验证损失(val/box_loss, val/cls_loss, val/dfI_loss)在经过初期下降后,波动变得较为剧烈,特别是在box_loss上。这种波动可能意味着模型在验证集上可能存在过拟合的趋势,或者验证集中的某些图像对模型而言难以拟合。而验证损失的波动也说明模型在不同的验证样本上表现出了不同程度的适应性。
在精度和召回率方面,我们看到训练精度(metrics/precision)和召回率(metrics/recall)随着训练过程呈现出上升趋势,但召回率的波动较精度更为显著。这表明模型在正确分类正样本(即行人)方面逐渐变得更加精确,但在找回所有正样本方面则相对不稳定,可能是由于数据集中行人姿态多变、遮挡情况复杂等因素造成的。
至于模型的平均精度(mAP),[email protected]和[email protected]均随着训练的进行表现出增长趋势,这两个指标通常被用来衡量模型对于目标检测任务的整体表现。[email protected]较高的增长表明模型在较为宽松的IoU阈值下表现良好,而[email protected]的增长则表示模型在更为严格的IoU阈值下同样能够保持较好的性能。
在评估目标检测模型的性能时,通常会关注召回率(Recall)和精确度(Precision)这两个核心指标。召回率和精确度,通常缩写为R和P,都是用来从单一维度评价模型性能的指标,它们的值范围在0到1之间,接近1意味着模型性能更佳,而接近0则表示性能较差。
首先,我们注意到曲线的起始点是(0,1),意味着在最佳阈值设置下,模型能够以几乎完美的精确度检测到所有的正样本,即没有产生任何误检。随着召回率的增加,精确度略有下降,但整体保持在非常高的水平。这表明模型在大多数情况下能够很好地区分行人和非行人目标,只有少量的误检或漏检发生。
PR曲线下的面积(AUC)是评估模型质量的一个标准指标,曲线下的面积越大,模型的性能越好。在这里,我们看到PR曲线覆盖了接近整个图表区域的面积,这指示着模型具有优异的分类性能。结合图中给出的数值结果,即所有类别的平均精确度([email protected])为0.907,我们可以确认这是一个高精度的模型。[email protected]是指在0.5的IoU(Intersection over Union)阈值下的平均精确度,0.5是一个常用的IoU阈值,通常意味着模型对目标位置的预测非常精确。
进一步观察曲线在高召回率区域的表现,精确度始终保持在0.8以上,这是非常难得的,因为通常情况下,当模型试图检测到更多的正样本时(召回率高时),会以牺牲一些精确度为代价。然而,在此模型中,即使在高召回率时,精确度的下降也非常有限,这表明模型对于数据集中的行人检测具有很好的稳定性和可靠性。
综合以上分析,我们的模型在夜视行人检测任务上表现出色,无论是在定位准确性还是在保持低误检率方面都有着优异的表现。这样的性能表明模型不仅适用于实验室环境,更有很强的实际应用潜力。未来的工作可以集中在进一步提高模型的召回率,尤其是在更加复杂或低光照条件下,同时保持或提升现有的精确度水平。此外,继续探索各种数据增强和正则化技术可能有助于提升模型在更广泛条件下的泛化能力。通过不断的迭代和优化,我们期待模型能够在多样化的环境中持续提供准确可靠的行人检测功能。
4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比
(1)实验设计:
本实验旨在评估和比较YOLOv5、YOLOv6、YOLOv7和YOLOv8几种模型在夜视行人目标检测任务上的性能。为了实现这一目标,博主分别使用使用相同的数据集训练和测试了这四个模型,从而可以进行直接的性能比较。该数据集包含夜视行人的图像。本文将比较分析四种模型,旨在揭示每种模型的优缺点,探讨它们在工业环境中实际应用的场景选择。
模型 | 图像大小 (像素) | mAPval 50-95 | CPU ONNX 速度 (毫秒) | A100 TensorRT 速度 (毫秒) | 参数数量 (百万) | FLOPs (十亿) |
---|---|---|---|---|---|---|
YOLOv5nu | 640 | 34.3 | 73.6 | 1.06 | 2.6 | 7.7 |
YOLOv8n | 640 | 37.3 | 80.4 | 0.99 | 3.2 | 8.7 |
YOLOv6N | 640 | 37.5 | - | - | 4.7 | 11.4 |
YOLOv7-tiny | 640 | 37.4 | - | - | 6.01 | 13.1 |
(2)度量指标:
- F1-Score:F1-Score是精确率(Precision)和召回率(Recall)的调和平均值。精确率是指模型正确识别的正例与所有识别为正例的案例之比,而召回率是指模型正确识别的正例与所有实际正例之比。F1-Score对于不平衡的数据集或者需要同时考虑精确率和召回率的任务特别重要。
- mAP(Mean Average Precision):mAP是衡量模型在多个类别上平均检测准确度的指标。它计算了模型在所有类别上的平均精度,是目标检测领域中常用的性能度量。
名称 | YOLOv5nu | YOLOv6n | YOLOv7-tiny | YOLOv8n |
---|---|---|---|---|
mAP | 0.899 | 0.910 | 0.885 | 0.907 |
F1-Score | 0.86 | 0.86 | 0.86 | 0.87 |
(3)实验结果分析:
在深度学习领域,持续的算法迭代和更新是提升模型性能的关键途径。我们通过在相同的数据集上实施一系列实验,旨在比较和评估不同版本的YOLO模型——包括YOLOv5nu、YOLOv6n、YOLOv7-tiny以及YOLOv8n——在夜视行人检测任务上的性能。实验的设计和目的是为了明确各版本模型在准确性和检测效率上的差异,以便为实际应用提供更具指导性的见解。
我们可以看出,YOLOv6n在平均精确度(mAP)上取得了0.910的成绩,这是四种算法中最高的,显示了其在目标检测任务上的优越性能。mAP是评价目标检测算法性能的关键指标,它考虑了检测精确度和召回率,在不同的置信度阈值下综合评估模型性能。YOLOv6n能在这个指标上领先,表明它能够平衡检测的准确性和完整性,即在尽可能少错过目标的同时保持较低的误检率。YOLOv5nu虽然在mAP上略低于YOLOv6n,达到了0.899,但它与YOLOv6n在F1-Score上持平,都是0.86。F1-Score是精确度和召回率的调和平均,它在模型表现均衡时达到高值。这说明在精确度与召回率之间,YOLOv5nu能够实现较好的平衡,这对于实际应用来说非常重要。
YOLOv7-tiny作为一个更轻量化的模型,其mAP达到了0.885,略低于YOLOv5nu和YOLOv6n,但与此同时它在F1-Score上与这两者持平。这可能意味着在面对一个更加紧凑的模型时,YOLOv7-tiny能够保持一个不错的性能水平,这在资源受限的应用场景中是一个显著的优点。
至于YOLOv8n,其mAP为0.907,仅次于YOLOv6n,而在F1-Score上则以0.87领先于其他三种算法。这表明YOLOv8n在保持高召回率的同时,也提高了精确度,达到了最佳的性能平衡。F1-Score的领先表明在实际应用中,它可能会带来最佳的综合检测效果。
总体来看,每一版本的YOLO算法都在不同程度上提高了目标检测的性能。从YOLOv5nu到YOLOv8n,我们可以看到一步步的进步,尤其是在精确度和召回率的综合考量上。虽然每个算法版本之间的性能提升可能看起来不是非常巨大,但在高标准的目标检测任务中,这些小的进步往往对实际应用有着决定性的影响。此外,每个版本的算法都有其独特的设计优点,根据不同的应用场景和资源限制,选择最合适的算法变得尤为重要。通过这样的对比实验,我们能够更深入地理解每个算法版本的性能特点,为实际应用中的算法选择提供数据支持。
4.4 代码实现
在这一节中,我们将详细介绍如何使用YOLOv8实现摄像头画面中夜视行人检测的代码实现。这个实现主要包括创建主窗口、处理每一帧图像、加载模型、开始处理媒体流等步骤。
在实时夜视行人检测系统中,结合YOLOv8模型和一系列开源库,如OpenCV、QtFusion和PySide6等,来实现主窗口的展示、摄像头帧的处理以及夜视行人的检测和标注等功能。
(1)引入必要的库
首先,需要引入一些必要的库,包括图像处理库OpenCV、图形界面库QtFusion和PySide6,以及物体检测模型库YOLOv8Model等。
import sys # 导入sys模块,用于访问与Python解释器相关的变量和函数
import time # 导入time模块,用于获取当前时间
import cv2 # 导入OpenCV库,用于图像处理
from QtFusion.widgets import QMainWindow # 从QtFusion库导入FBaseWindow类,用于创建主窗口
from QtFusion.handlers import MediaHandler # 从QtFusion库导入MediaHandler类,用于处理媒体流
from QtFusion.utils import drawRectBox, get_cls_color # 从QtFusion库导入drawRectBox函数,用于在图像上绘制矩形框
from PySide6 import QtWidgets, QtCore # 导入PySide6库的QtWidgets和QtCore模块,用于创建GUI
from QtFusion.path import abs_path
from QtFusion.config import QF_Config
from YOLOv8Model import YOLOv8Detector # 从YOLOv8Model模块导入YOLOv8Detector类,用于物体检测
QF_Config.set_verbose(False)
(2)设置主窗口
在设置主窗口的过程中,定义了一个名为MainWindow的类。在MainWindow类中,设置了窗口的大小,并创建了一个用于显示图像的标签。此外,我们还设置了一个按键事件,使得用户可以通过按Q键来关闭窗口。
class MainWindow(QMainWindow): # 定义MainWindow类,继承自FBaseWindow类
def __init__(self): # 定义构造函数
super().__init__() # 调用父类的构造函数
self.resize(850, 500) # 设置窗口的大小
self.label = QtWidgets.QLabel(self) # 创建一个QLabel对象,用于显示图像
self.label.setGeometry(0, 0, 850, 500) # 设置QLabel对象的几何形状
def keyPressEvent(self, event): # 定义keyPressEvent函数,用于处理键盘事件
if event.key() == QtCore.Qt.Key.Key_Q: # 如果按下的键是Q键
self.close() # 关闭窗口
(3)图像帧处理与夜视行人目标检测
在进行图像帧处理和夜视行人检测的过程中,定义了一个名为frame_process的函数。首先,将图像的大小调整为850x500,然后使用YOLOv8模型进行预处理。使用该模型对图像进行预测,将预测结果后处理,并将检测到的夜视行人目标用对应类别颜色的矩形框在图像中标注出来。
def frame_process(image): # 定义frame_process函数,用于处理每一帧图像
image = cv2.resize(image, (850, 500)) # 调整图像的大小
pre_img = model.preprocess(image) # 对图像进行预处理
t1 = time.time() # 获取当前时间
pred, superimposed_img = model.predict(pre_img) # 使用模型进行预测
t2 = time.time() # 获取当前时间
use_time = t2 - t1 # 计算预测所用的时间
print("推理时间: %.2f" % use_time) # 打印预测所用的时间
det = pred[0] # 获取预测结果
# 如果有检测信息则进入
if det is not None and len(det):
det_info = model.postprocess(pred) # 对预测结果进行后处理
for info in det_info: # 遍历检测信息
name, bbox, conf, cls_id = info['class_name'], info['bbox'], info['score'], info[
'class_id'] # 获取类名、边界框、置信度和类别ID
label = '%s %.0f%%' % (name, conf * 100) # 创建标签,包含类名和置信度
# 画出检测到的目标物
image = drawRectBox(image, bbox, alpha=0.2, addText=label, color=colors[cls_id]) # 在图像上绘制矩形框,并添加标签和颜色
window.dispImage(window.label, image) # 在窗口的label控件上显示图像
(4)初始化检测模型和设备
在主函数部分,我们首先实例化YOLOv8Detector类,并加载预先训练好的模型权重。根据模型预设的类别标签获取了每个类别对应的颜色,这些颜色将在后续的检测结果可视化中使用。创建一个MainWindow对象,以便在屏幕上显示图像。再创建了一个MediaHandler对象,用于从摄像头设备中读取视频流并处理每一帧图像。
cls_name = ["行人"] # 定义类名列表
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/night-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names) # 获取类别颜色
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象
videoHandler = MediaHandler(fps=30) # 创建MediaHandler对象,设置帧率为30
videoHandler.frameReady.connect(frame_process) # 当有新的帧准备好时,调用frame_process函数
videoHandler.setDevice(device=0) # 设置设备为0,即默认的摄像头
videoHandler.startMedia() # 开始处理媒体流
# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
在此,"night-yolov8n.pt"是经过大量夜视行人目标图像训练得到的模型权重文件,而cls_name则包含了模型可以识别的所有夜视行人类别的名称。这就是实现实时夜视行人检测系统的完整代码,整个过程包括了数据预处理、YOLOv8模型预测、结果后处理和可视化等步骤,结构清晰,逻辑简洁。通过这样的方式,可以实现对摄像头捕获的画面进行实时的夜视行人目标识别和标注。
5. 夜视行人检测系统实现
在实现一款实时夜视行人目标检测与识别系统时,采用面向对象的设计思路,依赖Python语言和多种开源库如Pyside6、QtFusion、Pytorch等。其中,重要的MainWindow类是系统的主体,负责提供用户界面来控制输入源、进行夜视行人目标检测与识别,并展示检测结果。以下将详细介绍其设计思路、架构设计以及整个流程。
5.1 系统设计思路
我们的系统设计思路旨在打造一个高效、直观且用户友好的应用程序。整个系统是围绕着MainWindow类构建的,这个类不仅作为应用程序的核心,同时也是用户交互、媒体处理以及模型集成的集合点。
架构设计:
在MainWindow类的架构设计中,采用了处理层、界面层、控制层的设计模式。在整个设计过程中,我们遵循了模块化和低耦合的原则,这意味着每个类和模块都被设计为相对独立的组件。这种设计不仅有利于代码的维护和扩展,还使得未来在引入新的算法或进行功能更新时更加灵活。此外,系统的这种架构设计还为多线程处理提供了可能,从而可以在不影响用户界面响应性的情况下进行复杂的后台计算。
- 处理层(Processing Layer):在这一层,我们重点关注的是检测的准确性和速度。YOLOv8Detector类充当了模型执行的中枢,它集成了预训练的YOLOv8模型,负责高效地处理图像数据,识别并定位图像中的行人。为了提高系统的响应速度和处理能力,我们在设计时注重了算法的优化,确保了系统即使在处理大量数据时也能保持稳定。
- 界面层(UI Layer):用户界面的设计采用直观的布局,使用户能够轻松地访问所有功能。通过Ui_MainWindow类创建的图形界面,不仅美观现代,而且用户交互性强。界面中嵌入了实时显示检测结果的视频或图像流组件,用户可以通过简单的按钮点击来启动或停止检测过程,查看历史检测记录,以及访问系统设置等。
- 控制层(Control Layer):MainWindow类在这里扮演着指挥官的角色,它协调用户界面和处理层的交互。通过槽函数的实现,当用户在UI层进行操作时(如点击按钮),MainWindow类能够响应这些操作,并指挥YOLOv8Detector类开始处理任务。此外,MainWindow类还负责处理来自YOLOv8Detector类的信号,比如检测结果的更新,将这些信息反馈到UI层,让用户得到即时的检测反馈。
总之,我们的交互式夜视行人检测系统是一个综合了最新深度学习技术、具有高度模块化设计、并且注重用户体验的系统。它不仅能够提供准确的行人检测功能,同时也提供了易于使用的界面和强大的后台支持,满足了专业性和便捷性的双重需求。
系统流程:
在本博客中,我们将详细介绍为夜视行人检测系统设计的软件流程,该流程以用户友好性和高效性能为核心目标。该系统通过MainWindow类的实例启动,这是用户与系统交互的入口。该实例不仅加载和初始化应用程序的界面,还设置了应用程序运行所需的各种参数,确保用户能够无障碍地进行操作。
- 用户进入应用程序后,将面对一个清晰直观的操作界面,可选择实时视频流、视频文件或图像作为输入源。这种灵活性允许用户根据自己的需求和场景选择最合适的输入方式。例如,他们可以选择实时监控摄像头,以观察和分析特定区域的行人动态;或者加载已有的视频和图片,进行后期的检测和分析。
- 一旦输入源被选定,系统便激活媒体处理器,开始对输入数据进行必要的配置和加载。这包括对实时视频流的捕捉设置、视频文件的逐帧读取处理以及静态图像的加载。在数据准备阶段,系统将确保所有媒体内容均按照模型要求的格式和标准进行优化处理。
- 随后,系统进入连续的帧处理循环,该循环包含几个关键阶段。在预处理阶段,每一帧图像都会经过调整尺寸、色彩空间转换和归一化等一系列操作,以确保其符合YOLO模型的输入标准。之后,在检测与识别阶段,预处理好的图像数据会被送入训练有素的YOLOv8模型中,进行精准的行人定位与识别。
- 在界面更新阶段,检测结果实时展现于用户界面中,用户可以直观地看到每个检测到的行人被框选出来,并伴有识别信息。同时,系统会同步更新界面上的统计数据展示,如条形图或表格,为用户提供直观的数据分析。
- 此外,用户交互操作的设计使得用户能够轻松地保存检测结果,查看软件的作者信息和版本更新,甚至通过下拉菜单筛选特定的检测结果进行深入分析。媒体控制的功能则允许用户自主控制视频的播放,或启停图像分析,以适应不同的检测需求。
这样的系统设计思路不仅提高了操作的便捷性,也确保了软件能够高效执行行人检测任务,无论是在实时监控还是事后分析方面都能满足用户的需求。
5.2 登录与账户管理
在开发高性能的夜视行人检测系统时,用户体验是我们考虑的重中之重。为了增强用户体验和提供个性化服务,我们在系统中集成了一个全功能的用户账户管理系统。这一系统的构建基于PySide6——一个强大的Qt库的Python封装,以及SQLite数据库——一个轻量级的数据库解决方案,以确保我们的应用程序在处理大量用户数据时既高效又稳定。
当用户首次使用我们的系统时,他们会被引导到一个直观的登录界面,在这里,用户可以进行账户注册,创建属于自己的私人账户。注册过程中,我们提供了多项个性化选项,包括密码设置和头像上传,以便用户能够个性化自己的使用体验。为了保障用户的数据安全,我们还实现了密码修改功能,用户可以随时更新自己的登录凭证。此外,如果用户希望注销账户,系统也提供了简便的操作步骤来完成这一过程。
登录成功后,用户将进入主界面,这是夜视行人检测的操作平台。在这里,系统展示了其强大的多物体识别和检测能力,不仅能够实时显示检测框、类别和置信度等信息,还能处理来自图片、视频、实时摄像头的输入,同时支持批量文件处理。用户的所有检测结果和个性化设置都将存储在其账户下,这样不仅保证了数据的私密性,也使得用户在后续的使用中能够方便地查阅和管理自己的检测记录。
此外,我们的系统还考虑了用户可能需要在不同设备上使用系统的情况。因此,账户系统支持用户在任意设备上重新登录并访问他们的个人数据和配置,无论他们身处何地。这种灵活性和便利性使得我们的夜视行人检测系统不仅是一个强大的技术工具,更是一个用户友好的个人助手。
通过上述的账户管理设计和系统功能实现,我们的夜视行人检测系统提供了一个安全、私密且高度个性化的用户体验。我们相信,随着深度学习技术的不断进步,结合我们对用户需求的深刻理解,这个系统将在实时目标检测的场景下得到广泛的应用,并不断满足用户的新需求。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1iH4y1j7L9/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZubk5xw
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuZlZpt
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuYmJps
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuYmJpv
在文件夹下的资源显示如下,下面的链接中也给出了Python的离线依赖包,读者可在正确安装Anaconda和Pycharm软件后,复制离线依赖包至项目目录下进行安装,另外有详细安装教程:(1)Pycharm软件安装教程;(2)Anaconda软件安装教程;(3)Python环境配置教程;
离线依赖安装教程:https://www.bilibili.com/video/BV1hv421C7g8/
离线依赖库下载链接:https://pan.baidu.com/s/1y6vqa9CtRmC72SQYPh1ZCg?pwd=33z5 (提取码:33z5)
6. 总结与展望
在本博客中,我们详细介绍了一个基于YOLOv8/v5模型的夜视行人检测系统。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的夜视行人目标检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Redmon J, Divvala S, Girshick R, et al. You only look once: Unified, real-time object detection[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 779-788. ↩︎
Redmon J, Farhadi A. YOLO9000: better, faster, stronger[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 7263-7271. ↩︎
Bochkovskiy A, Wang C Y, Liao H Y M. Yolov4: Optimal speed and accuracy of object detection[J]. arXiv preprint arXiv:2004.10934, 2020. ↩︎
Li C, Li L, Jiang H, et al. YOLOv6: A single-stage object detection framework for industrial applications[J]. arXiv preprint arXiv:2209.02976, 2022. ↩︎
Wang C Y, Bochkovskiy A, Liao H Y M. YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2023: 7464-7475. ↩︎
Terven J, Cordova-Esparza D. A comprehensive review of YOLO: From YOLOv1 to YOLOv8 and beyond[J]. arXiv preprint arXiv:2304.00501, 2023. ↩︎
周飞,郭杜杜,王洋,王庆庆,秦音,杨卓敏,贺海军.基于改进YOLOv8的交通监控车辆检测算法[J/OL].计算机工程与应用. ↩︎ ↩︎ ↩︎