Advertisement

基于YOLOv8深度学习的病房环境病人跌倒检测与语音提醒系统

阅读量:

随着老龄化社会的到来,在病房中发生的病人跌倒事故数量逐年上升。每一次的跌倒是对患者的健康状况构成严重威胁,并会给医疗机构带来巨大的管理压力。因此,在这一背景下如何开发一套能够实时监测病患状态并适时发出语音提示的系统方案成为一个亟需解决的关键问题。

本研究成功开发了一种基于YOLOv8深度学习模型的 fall detection and voice alert system for patients. The system integrates video surveillance with real-time monitoring capabilities to assess the patient's state in hospital rooms, encompassing fall, stance, and ambulation. After undergoing specialized training with a dataset tailored to this application, the YOLOv8 model can accurately recognize and classify patients' activity states. When a fall is detected, the system immediately triggers an audible warning through a voice alert mechanism to inform healthcare staff of immediate intervention requirements. Additionally, the system combines PyQt5 technology to create an intuitive user interface, enabling healthcare professionals to monitor patients' real-time status and conduct remote care effectively.

算法流程

Tipps:建议深入解析项目的算法流程,并系统地探讨其核心技术机制。从数据加载与预处理入手,在每一阶段都将采用清晰有序的结构进行详细阐述,并通过简洁明了的语言进行描述。涵盖核心算法的设计优化过程一直到结果展示环节

项目数据

Tipps:通过收集涵盖不同病房病人行为的图像数据集,并借助Labelimg标注工具对每张图片进行详细标注。分为四类检测:倒地状态、站立与坐起状态。

目标检测标注工具
(1)labelimg: 该开源图像标注工具适用于分类与目标检测任务,在Python环境下开发并采用Qt图形界面设计;该软件因其直观易用而广受好评(虽为英文界面)。其注释文件采用PASCAL VOC格式存储为XML文件形式;这一格式同样适用于ImageNet数据集的使用;此外该工具还支持COCO数据集格式的操作。
(2)安装labelimg 在cmd窗口输入以下命令:pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple

结束后,在cmd中输入labelimg

初识labelimg

打开后,我们自己设置一下

在View中勾选Auto Save mode

接下来我们打开需要标注的图片文件夹

请设置标注文件存储路径(如上图所示为Change Save Dir)。
开始进行标注工作。
在屏幕上划出目标区域。
对目标进行标签化处理。
切换到下一张图片继续操作。

Labelimg的快捷键

(3)数据准备 为了实现高效的数据管理流程 这里建议新建一个名为data的文件夹 这是一个约定俗成的做法 但这不是硬性规定) 在该文件夹内创建一个名为images的位置用于存储所需标注图片 另外还需建立一个称为labels的位置用于存储标注信息 最后 建立一份命名为classes.txt的文本文件 用于记录要分类识别的对象名称 这些步骤将有助于后续的数据处理流程顺利开展 并确保分类标注工作的准确无误

data目录下的文件组织如下:

首先在images这个文件夹放置待标注的图片。
生成文件如下:

“classes.txt”定义了你的 YOLO 标签所引用的类名列表。

(4)YOLO模式创建标签的样式

该文件用于存储与图片具有相同名称的标签信息。其文件名与图片名一致,并由N行5列的数据构成。每个条目代表一个待标注的目标。具体由N行5列的数据构成:

  1. 第一列为类别id;
  2. 第二和第三列为标注框的相对中心坐标;
  3. 第四和第五列分别为标注框的相对宽度和高度。

注意:这里的中心点坐标、宽和高都是相对数据!!!

存储在标签类别的文件中名为classes.txt(固定不变),用于存储创建的标签类别。

完成后可进行后续的yolo训练方面的操作。

硬件环境

我们采用了两种硬件平台配置用于系统调试与训练:例如外星人Alienware M16笔记本电脑。

(2)惠普 HP暗影精灵10 台式机:

上面的硬件环境具备充足的计算能力以支持大规模图像数据集的训练以及高效的运算过程. GPU 的引入明显降低了模型训练所需的时间. 通过两种不同的硬件平台进行调试与训练能够更加全面地验证系统的性能适应性及稳定性. 这种方法不仅增强了系统的鲁棒性与泛化能力还降低了开发成本并提升了效率从而为实际应用中的部署奠定了坚实的基础.

模型训练

Tipps:模型的训练、评估与推理

1.YOLOv8的基本原理

YOLOv8属于SOTA级别的模型,在Yolo系列历史版本的基础上进行了优化与改进,并在此基础上增加了新型主干网络与全新Ancher-Free检测头部设计等关键组件以进一步提升性能与灵活性。该系统通过引入新型损失函数实现了对目标检测、图像分割以及人体姿态估计等多种任务的高度高效处理能力,并能在CPU至GPU等多种计算设备上良好运行

YOLOv8可被视为Yolo系列中的终极版本,在各项评估指标上均优于现有对象检测与实例分割模型。它整合了这些模型的优点,并在优化Yolov5的基础上实现了对其结构的全面升级。同时继承了其工程化简洁易用的特点。

Yolov8模型网络结构图如下图所示:

2.数据集准备与训练

本研究采用了包含病房病人跌倒情况的数据集作为基础,并利用Labelimg标注工具对每张图像的目标边界框(Bounding Box)及其类别进行了标注。在此数据集上运用YOLOv8n模型进行了训练工作。完成训练后,我们对模型在验证集上的性能表现进行了全面评估和对比分析,整个流程包括数据准备、模型训练以及性能评估三个阶段。其中,本次标注的主要目标类别集中在病房病人跌倒这一场景上,整个数据集共计包含了8328张图片,具体分布如下:

训练数据集包含5829组图像样本参与模型的训练与调优。
验证数据集由1666组图像组成, 用于检验模型对新数据的适应能力, 同时可有效避免过拟合问题。
测试数据集包含833组图像, 旨在全面评估模型在未知环境下的通用性水平。

数据分布的直方图

部分数据集图像如下图所示:

部分标注如下图所示:

该数据分布策略确保了数据在模型的训练、验证以及测试过程中的均衡性,并为YOLOv8n模型的开发与性能评估提供了可靠的技术支撑。

图片数据的存储格式为:在项目根目录中创建一个datasets子目录,并将所有检测到的图像按照训练集和验证集分类,并将其放置于该datasets子目录内。

随后

该文件明确了用于模型训练与验证的数据集路径,并指定了模型需要检测的目标类别。

数据预处理完毕后, 我们将执行train.py脚本以对模型进行训练. epochs参数将被用来配置模型的训练周期数, batch参数则将被用来设定每次批量处理的数据量(根据内存容量设定最低值为1).

CPU/GPU训练代码如下:

导入名为 yolov8n.pt 的预训练YOLOv8模型文件;该模型文件已预先完成参数微调

3.YOLOv8模型训练结果与性能评估

在深度学习的学习过程中,我们常见通过分析损失函数下降曲线来评估模型的学习效果。对于YOLOv8模型的训练而言,则主要包括三种关键指标:定位精度(box_loss)、分类准确性(cls_loss)以及动态特征质量(dfl_loss)。优化这些关键指标对提升目标检测性能至关重要。

损失函数作用说明:
(1)定位误差 (box_loss):该误差项(box_loss)衡量了预测边界框与真实边界框之间的差异程度。
(2)分类误差 (cls_loss):该误差项(cls_loss)则评估了锚框与其对应的真实类别标签的一致性。
(3)动态特征损失 (dfl_loss):该动态特征损失项(dfl_loss)通过DFLLoss计算预测边界框与真实边界框之间的距离,并结合多尺度特征图进行优化调整。经过这一过程后,在目标检测任务中显著提升了模型的定位精度。

训练和验证结果文件存储:

训练完成后,相关的训练过程和结果文件会保存在 runs/ 目录下,包括:

(1)损失变化趋势图(mAP、Precision、Recall)
(2)性能变化趋势图(mAP, Precision, Recall)
(3)混淆矩阵(Confusion Matrix)
(4)Precision-Recall (P-R) 曲线

损失曲线(Loss Curve)和性能指标分析:

训练指标:在训练过程中,在优化目标函数的过程中,在每一次迭代中都会计算并跟踪指标的变化情况。

train/cls_loss:
定义:分类损失是用来衡量预测结果与实际标签之间差异的一种指标。
变化趋势:随着训练过程的推进,在每一阶段的训练中该指标持续减少,并且呈现出稳定的收敛特性。

该代码块中包含训练过程中的关键指标参数 train/dfl_loss:
其作用是衡量基于分布聚合机制的目标检测中边界框预测的质量。
具体而言:
该指标旨在优化边界框的位置和尺寸预测效果。
随着训练步骤的推进:
该指标持续下降的趋势表明模型在提升其在目标检测任务中的性能。

评估指标:
val/box_loss: 意义: 在验证集上计算得到的边界框回归损失,在使用过程中与训练集中类似的 val/box_loss 指标不同的是它被用来评估模型在未知数据上的表现(即泛化能力)。
趋势表明边界框损失持续下降,在这种情况下可以推断模型在处理未知数据时的表现会逐步提升。

val/cls_loss:
作用:验证集上的分类损失表现与训练阶段的 cls_loss 相仿。
趋势:该损失值持续下降,在验证集上模型对目标类别的识别能力持续提升。

val/dfl_loss:
含义:该损失衡量了验证集上预测目标位置的分布一致性。
趋势:该损失持续下降(从1.5降到1.2),表明模型在验证集上对目标位置的预测更加精准。

性能指标:
metrics/precision(B):
定义为训练阶段中针对特定类别的识别精度,在该指标下表示被预测为某类样本中实际确实属于该类别的比例。
观察其趋势显示,在初始阶段识别精度存在较大的波动性,在后期趋于平稳状态,并且表明模型在正样本识别上的准确性不断提升。

metrics/recall(B):
含义:该模型在训练阶段的表现特征之一是召回率,在该指标下衡量的是系统能够识别出所有实际存在的目标数量与实际存在的目标总数之间的比例关系。
趋势:通过逐步增加训练迭代次数可以观察到该指标值呈现上升态势,在后续优化过程中表明系统在识别正样本方面的性能持续增强。

metrics/mAP50(B):
含义:验证集上的 mAP@50,表示 IoU 阈值为 50 时的平均精度。
趋势:mAP@50 不断提升,最终趋于稳定,说明模型在验证集上的总体性能非常好。

metrics/mAP50-95(B):
含义:验证数据集上的 mAP@50-95 具体体现多个不同IoU阈值下的平均精度指标。
趋势:随着模型训练的深入进行,在不同IoU阈值下的检测效果也随之提高。

模型训练和验证过程平稳运行且高效执行,在经过测试与评估后发现其表现优异,并完全适用于实际场景中的应用

Precision-Recall(P-R)曲线分析:

曲线说明:
淡蓝色线条标识跌倒事件
该曲线反映了模型在"fall"类别上的性能表现。
性能方面:
(1)平均精度(mAP)达到0.995,在这一指标上表现卓越。
精确度与召回率几乎均接近完美值(1),表明该模型在识别"fall"类别时具有极高的准确性。

橙色线条标识为 "sit" (坐下),具体用于评估模型在 "sit" 类别上的性能表现。其含义在于衡量模型在该类别上的执行效果。具体而言,在性能指标方面:其中计算得出的mAP值为0.953,在各类别中略低于平均水准。观察曲线图形可知,在召回率维持较高水平时,精确度却随之显著下降。这表明,在面对更高标准的检测要求时(即召回率达到较高水平),该模型往往更容易产生误报

绿色线条 – stand (站立)
含义表明该模型在 'stand' 类别的性能表现。
其mAP值达到0.995,在'fall'类别中表现出同样水平。
其精确率和召回率曲线均接近顶端水平,并表明该模型在 'stand' 类别的预测既稳定又准确。

该图表以深蓝色粗线表示所有类别。
含义:此图表展示了各类别间的整体性能对比。
性能:
(1)模型在mAP@0.5指标上的表现达到最高水平。
(2)曲线几乎与坐标系左上方重合,在精确率和召回率方面均表现出极佳状态。

总结:
模型整体表现非常优异,总体 mAP@0.5 达到 0.981,能够在实际场景中应用。

通过混淆矩阵 (Confusion Matrix) 的分析可以看出,在分类任务中准确区分不同类别具有重要意义

结论:
(1)fall 类别检测表现非常出色,适合实际应用场景。
(2)模型对 sit 和 stand 的分类也较为准确,但需要优化少数类样本的检测。
(3)background 类别表现稍弱,建议优化样本特征或数据集标注。整体来说,模型性能已经非常优秀,可进一步调整以提升细分类别的表现。

4.检测结果识别

模型训练完成后, 我们可以获取一个最佳的训练结果模型best.pt文件, 位于runs/train/weights目录中。此文件可用于后续的推理检测。

加载所需库:
(1)from ultralytics import YOLO:用来执行目标识别任务的YOLO模型类别。
(2)import cv2:用于图像处理以及窗口展示功能的OpenCV库。

(1)配置变量path设置为‘models/best.pt’:该变量用于配置预训练目标检测模型。
(2)配置变量img_path设置为‘TestFiles/imagetest.jpg’:该变量被用作检测任务中待处理图片文件的位置。

加载预训练模型:
(1) model = YOLO(path, task=’detect’):通过指定路径配置YOLO模型加载功能,并将目标检测的任务设定为目标检测 (detect)。(2) 配置目标检测的置信度阈值并通过 conf 参数进行设置;同时利用 iou 参数配置非极大值抑制(NMS)机制中的交并比 (IoU) 阈值。

图像检测:
(1)results = model(img_path):实现目标识别并获取结果。
其中包含目标识别结果。

(1)res = results[0].plot():用于将检测结果展示至图像中。
(2)cv2.imshow("YOLOv8 Detection", res):借助OpenCV库展示检测结果,并设置窗口标题为"YOLOv8 Detection"。
(3)cv2.waitKey(0):程序暂停运行直至用户按下任意键方能关闭当前显示的图像窗口。

执行imgTest.py代码后,会将执行的结果直接标注在图片上,结果如下:

该段输出基于YOLOv8模型对该图片imagetest.jpg进行了检测的结果,具体信息如下

图像信息:
(1)处理的图像路径为:TestFiles/imagetest.jpg。
(2)图像尺寸为640×640像素。

检测结果:
(1)1 个 “fall”(跌倒)
(2)1 个 “stand”(站立)

处理速度:
(1)预处理时间: 3.1 毫秒
(2)推理时间: 5.4 毫秒
(3)后处理时间: 53.3 毫秒

总结:
检测性能优越,在推理速度上极快且完全适用于实时处理。该系统在不同类型的测试中均表现出色,并且能够直接部署于诸如跌倒检测系统和安防监控等现实应用场景中。

运行效果

– 运行 MainProgram.py

主要功能:
(1)该系统能够实现对病房内病人跌倒行为的实时监控;
(2)该系统能够处理图片、视频以及摄像头捕捉到的画面,并且具备批量处理图片的能力;
(3)系统界面能实时呈现目标位置坐标、总人数统计、检测信心值以及所需时间等关键数据;
(4)该系统能够将单次或批量处理所得的结果保存下来。

2.检测结果说明:

(1)置信度阈值:当前设置为0.25,表示检测系统只会考虑置信度高于25%的目标进行输出,置信度越高表示模型对检测结果的确信度越高。
(2)交并比阈值:当前设置为0.70,表示系统只会认为交并比(IoU)超过70%的检测框为有效结果。交并比是检测框与真实框重叠区域的比值,用于衡量两个框的相似程度,值越高表明重叠程度越高。

这两个关键参数普遍应用于目标检测系统中,在调节之后能够显著影响模型的准确性和误检率。

该图表呈现基于YOLOv8模型的目标检测系统的检测结果界面。其中各字段的具体意义如下:

(1)这表明模型完成检测所需的时间是0.089秒。
(2)这揭示了模型具有良好的实时性和快速的检测速度。

Number of objects detected:
(1)被检测的目标数量为1,即这是当前被检测到的第一个目标。

请在这里选择一个目标类型。(1) 这里有一个下拉菜单, 用户可以选择要查看的目标类型。(2) 如果此时选项为"全部", 则表示将显示所有检测到的目标信息。

语音提醒(Voice Reminder):
(1)异常语音提醒:(警告:病房病人跌倒,请注意!)

目标检测类型:

当前所选中的结果为"患者摔倒"(Patient fell),表明该系统正在突出显示检测到的"fall"(事件)。

(1)这一指标表明模型识别出的目标属于"病人跌倒"类别的置信度是95.71%。
(2)置信度体现着模型的信任程度,在该检测结果中随着置信度的提升而增强。

目标位置(Object location):
(1)xmin: 312, ymin: 244:具体说明了目标区域在图像中的起始位置的坐标值(xmin, ymin),即该目标区域的左顶点坐标为(312, 244)。
(2)xmax: 429, ymax: 370:具体说明了目标区域在图像中的结束位置的坐标值(xmax, ymax),即该目标区域的右顶点坐标为(429, 370),表明了该区域的空间范围界限。

这些位置信息记录了图像中检测到的'倒地姿态'所在的检测区域。

这张图详细记录了病人跌倒一次的检测结果信息,并涵盖检测时间、种类、行为置信度以及目标位置数据等。通过操作界面观察和解析这些结果数据,能够有效提高病人跌倒事件的检测效率水平.

3.图片检测说明

(1)病人坐立

(2)病人站立

(3)病人跌倒

单击图片按钮以打开并选择待检测的图像;或单击文件夹按钮以打开并选择包含多个待批量检测图像的文件夹。
操作步骤如下:

  1. 单击目标下拉框以切换内容。
  2. 单击保存按钮以将检测结果存储。
    存储路径位于save_data目录中。

检测结果:系统解析出图片中的病房内病患数据,并输出检测结果信息,具体包括总目标数量、耗时统计、目标类别判断、检测置信度评估以及病患位置坐标记录。

4.视频检测说明

单击视频按钮后会启动程序,在此过程中请挑选需要检测的视频文件;随后会立即显示检测结果。若需关闭程序,则可再次单击该按钮。对于保存操作,请单击保存按钮以将检测结果进行存储;其存储位置是...目录下的一个特定文件夹。

测试结果显示:该系统能够实时对视频内容进行分析,并能准确识别出病人在病房内跌倒的情况记录。详细记录了视频中各项检测的结果及其发生位置的信息的表格提供了完整的数据信息

此界面展示了系统在视频帧中的多目标检测能力,并具有较高的识别水平,在病房内能够精准地识别病人的跌倒行为,并提供了详细的检测结果及相应的置信度评分

5.摄像头检测说明

按下启动摄像头按钮;实现摄像头的开启;支持持续监控;再次按下按钮即可关闭摄像头

检测结果:系统通过摄像头执行实时监控任务,在病区中识别病人摔倒行为并输出检测报告。实时呈现摄像头画面,并对识别行为位置进行标记。记录每帧图像处理后的数据细节。

6.保存图片与视频检测说明

点击完成后按钮,完成后将会将当前所选中的图片(包括批量图片)以及视频的检测结果进行存储操作; 检测所得的结果会被存储在指定的save_data文件夹中; 以下列出的是已完成存储的所有检测结果文件信息:

(1)图片保存

(2)视频保存

– 运行 train.py
1.训练参数设置

(1)基于数据.yaml文件中的数据集配置。
(2)将训练周期设定为150个周期。
(3)每批处理4张图像(batch size)。
(4)存储在命名为train_v8的目标目录下。
(5)采用随机梯度下降算法(SGD)作为优化器。

尽管常见于深度学习任务中,GPU通常能够显著加快模型训练的速度。然而,在一些特定场景中(如受到硬件限制以及其他因素的影响),必须依赖CPU来进行模型训练。

请注意,在CPU上训练深度学习模型通常会耗时更长,尤其是像YOLOv8这样计算密集型的任务。除非特殊情况要求,请尽量在GPU上进行训练以节省时间

2.训练日志结果

这张图展示了使用YOLOv8进行模型训练的详细过程和结果。

(1)该模型经历了150轮的训练后,在总耗时上达4.995小时。
(2)此次训练主要采用了NVIDIA GeForce RTX 3070 Ti这一高性能GPU设备。
(3)该模型展现出卓越的训练效能,在设计上进行了YOLOv8算法的深度优化,并依托于高端硬件的强大支持。

验证结果:
(1)mAP@50:97.9% 表明模型在验证集上的目标检测性能表现出色。
(2)mAP@50-95:95.2% 表明模型在目标检测任务中展现出良好的精细预测能力。

速度方面:
(1)前处理时间为0.2ms
(2)推理耗时为1.8ms
(3)后处理耗时为1.4ms
(4)研究表明该模型具有较高的推理效率,并且适用于实时检测任务

结果保存:
(1)Validation results are stored within the runs\detect\train_v8 directory.

该程序运行成功退出(exit code 0),表明整个验证流程得以成功完成无错误发生。

模型检测表现出色,在"Fall"和"Sit"类别中表现尤为突出(精确度与召回率均接近1)。

全部评论 (0)

还没有任何评论哟~