基于深度学习的跌倒检测系统(UI + YOLOv5 + 训练数据集)
前言
基于深度学习的跌倒检测系统是指利用深度学习算法对监控视频中的人体动作进行实时分析和处理,以便实现对跌倒事件的检测和预警。该系统主要通过使用深度学习模型对监控视频中的人体姿态、动作等特征进行学习和识别,以实现对跌倒事件的自动检测和识别。
跌倒检测系统的主要功能包括实时监测人体姿态和动作,识别跌倒事件,及时预警,并提供相关的信息和数据支持,以便进行后续的处理和分析。该系统可以广泛应用于医疗、养老、安防等领域,有助于提高老年人、残障人士等弱势群体的生活质量和安全保障。同时,基于深度学习的跌倒检测系统还可以结合其他技术手段,如无线传感器网络、机器人等,实现更加智能化的监测和预警,促进智慧医疗、智慧养老等领域的发展。
这里给出博主设计的跌倒监测系统界面,UI界面已做了一定美化,功能也可以满足图片、视频和摄像头的识别检测,初始界面如下图:
检测跌倒时的界面截图如下,可识别画面中存在的多个可能目标,也可开启摄像头或视频检测:
详细的功能演示效果参见博主的B站视频或下一节的动图演示,觉得不错的朋友敬请点赞、关注加收藏!系统UI界面的设计工作量较大,界面美化更需仔细雕琢,大家有任何建议或意见和可在下方评论交流。
1. 效果演示
首先我们还是通过动图看一下监测跌倒的效果,系统主要实现的功能是对图片、视频和摄像头画面中的人进行识别,识别的结果可视化显示在界面和图像中,另外提供多个目标的显示选择功能,演示效果如下。
(一)用户注册登录界面
这里设计了一个登录界面,可以注册账号和密码,然后进行登录。界面还是参考了当前流行的UI设计,左侧是一个动图,右侧输入账号、密码、验证码等等。
(二)选择跌倒图片识别
系统中可选择图片文件进行识别,点击图片选择按钮图标选择图片后,显示所有跌倒识别的结果,可通过下拉选框查看单个的结果。本功能的界面展示如下图所示:
(三)跌倒视频识别效果展示
对于一段视频中的跌倒情况,这里设点击视频按钮选择待检测的视频文件,系统会自动解析视频逐帧识别跌倒行为,并将结果记录在下方表格中,效果如下图所示:
2. 跌倒检测模型训练
我们选取YoloV5作为网络模型,一方面是因为从最终效果来看YOLOv5已经相当优秀,是发展的比较完备、使用比较广泛的一个版本;而更重要的是YOLOv5的调用、训练和预测都十分方便,为初学者提供了良好的练手工具。YOLOv5的另一个特点就是它为不同的设备需求和不同的应用场景提供了大小和参数数量不同的网络。
如下图所示,大一点的模型比如YOLOv5l和YOLOv5x参数更多,在大规模的COCO数据集上有更高的预测准确率;而小模型比如YOLOv5n或YOLOv5s占空间更小,适合部署在移动设备上,且推理速度更快,适合于高帧 率视频的实时检测。
这里我们使用的跌倒数据集,取自网络上收集的各类跌倒图像并使用LabelImg工具进行标注,共计包含1440个图像数据。每张图片除包括类别标签外,还有一个标注的物体边框(Bounding Box),其中训练数据集包含1110张图片,验证集330张图片,部分图像及标注如下图所示。
在训练模型之前,为了让我们的数据能够被YOLO找到,我们需要写一个pedfal.yaml文件存储在案例目录下,在其中记录下数据的路径和模型要识别的标记类别,文件内容如下所示。YOLO通过读取目录下的pedfall.yaml文件,进而找到我们数据集存储的位置才能读取数据进行训练验证。
python # 数据集存储位置 train: ./PedFall/images/train val: ./PedFall/images/val nc: 1 names: ['fall']
训练模型通过调用模型文件夹下的train.py进行,可以通过--batch参数和--epochs参数调整训练批次大小和训练轮数。YOLOv5提供了在COCO数据集上预训练后的参数,我们可以通过参数--weights yolov5s.pt加载预训练参数进行迁移学习,或在训练大数据集(比如COCO)时用一个空的--weights ''参数从零开始训练。
python python train.py --batch 32 --epochs 300
部分训练过程如图所示:
在深度学习中,我们通常通过损失函数下降的曲线来观察模型训练的情况。而YOLOv5训练时主要包含三个方面的损失:矩形框损失(box_loss)、置信度损失(obj_loss)和分类损失(cls_loss),在训练结束后,我们也可以在logs/目录下找到生成对若干训练过程统计图。
我们通过设定不同的置信度的阈值,可以得到在模型在不同的阈值下所计算出的p值和r值,一般情况下,p值和r值是负相关的,绘制出来可以得到如下图所示的曲线,其中曲线的面积我们称AP,目标检测模型中每种目标可计算出一个AP值,对所有的AP值求平均则可以得到模型的mAP值。以下是模型的P-R曲线
3. 跌倒检测识别
在训练完成后得到最佳模型,接下来我们将帧图像输入到这个网络进行预测,从而得到预测结果,预测方法(predict.py)部分的代码如下所示:
python def predict(img): img = torch.from_numpy(img).to(device) img = img.half() if half else img.float() img /= 255.0 if img.ndimension() == 3: img = img.unsqueeze(0) t1 = time_synchronized() pred = model(img, augment=False)[0] pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes, agnostic=opt.agnostic_nms) t2 = time_synchronized() InferNms = round((t2 - t1), 2) return pred, InferNms
得到预测结果我们便可以将帧图像中的跌倒行人框出,然后在图片上用opencv绘图操作,输出类别和置信度值。以下是读取一个跌倒视频进行检测的脚本,首先将图片数据进行预处理后送predict进行检测,然后计算标记框的位置并在图中标注出来。
python if __name__ == '__main__': # video_path = 0 video_path = "./UI_rec/test_/跌倒测试视频.mp4" # 初始化视频流 vs = cv2.VideoCapture(video_path) (W, H) = (None, None) frameIndex = 0 # 视频帧数 try: prop = cv2.CAP_PROP_FRAME_COUNT total = int(vs.get(prop)) # print("[INFO] 视频总帧数:{}".format(total)) # 若读取失败,报错退出 except: print("[INFO] could not determine # of frames in video") print("[INFO] no approx. completion time can be provided") total = -1 fourcc = cv2.VideoWriter_fourcc(*'XVID') ret, frame = vs.read() vw = frame.shape[1] vh = frame.shape[0] print("[INFO] 视频尺寸:{} * {}".format(vw, vh)) output_video = cv2.VideoWriter("./results.avi", fourcc, 20.0, (vw, vh)) # 处理后的视频对象 # 遍历视频帧进行检测 while True: # 从视频文件中逐帧读取画面 (grabbed, image) = vs.read() # 若grabbed为空,表示视频到达最后一帧,退出 if not grabbed: print("[INFO] 运行结束...") output_video.release() vs.release() exit() # 获取画面长宽 if W is None or H is None: (H, W) = image.shape[:2] image = cv2.resize(image, (850, 500)) img0 = image.copy() img = letterbox(img0, new_shape=imgsz)[0] img = np.stack(img, 0) img = img[:, :, ::-1].transpose(2, 0, 1) # BGR to RGB, to 3x416x416 img = np.ascontiguousarray(img) pred, useTime = predict(img) det = pred[0] p, s, im0 = None, '', img0 if det is not None and len(det): # 如果有检测信息则进入 det[:, :4] = scale_coords(img.shape[1:], det[:, :4], im0.shape).round() # 把图像缩放至im0的尺寸 number_i = 0 # 类别预编号 detInfo = [] for *xyxy, conf, cls in reversed(det): # 遍历检测信息 c1, c2 = (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3])) # 将检测信息添加到字典中 detInfo.append([names[int(cls)], [c1[0], c1[1], c2[0], c2[1]], '%.2f' % conf]) number_i += 1 # 编号数+1 label = '%s %.2f' % (names[int(cls)], conf) # 画出检测到的目标物 plot_one_box(image, xyxy, label=label, color=colors[int(cls)]) # 实时显示检测画面 cv2.imshow('Stream', image) image = cv2.resize(image, (vw, vh)) output_video.write(image) # 保存标记后的视频 if cv2.waitKey(1) & 0xFF == ord('q'): break # print("FPS:{}".format(int(0.6/(end-start)))) frameIndex += 1
执行得到的结果如下图所示,图中跌倒和置信度值都标注出来了,预测速度较快。基于此模型我们可以将其设计成一个带有界面的系统,在界面上选择图片、视频或摄像头然后调用模型进行检测。
博主对整个系统进行了详细测试,最终开发出一版流畅得到清新界面,就是博文演示部分的展示,完整的UI界面、测试图片视频、代码文件,以及Python离线依赖包(方便安装运行,也可自行配置环境),均已打包上传,感兴趣的朋友可以通过下载链接获取。
下载链接
若您想获得博文中涉及的实现完整全部程序文件(包括测试图片、视频,py, UI文件等,如下图),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
在文件夹下的资源显示如下,下面的链接中也给出了Python的离线依赖包,读者可在正确安装Anaconda和Pycharm软件后,复制离线依赖包至项目目录下进行安装,离线依赖的使用详细演示也可见本人B站视频:win11从头安装软件和配置环境运行深度学习项目、Win10中使用pycharm和anaconda进行python环境配置教程。
注意:该代码采用Pycharm+Python3.8开发,经过测试能成功运行,运行界面的主程序为runMain.py和LoginUI.py,测试图片脚本可运行testPicture.py,测试视频脚本可运行testVideo.py。为确保程序顺利运行,请按照requirements.txt配置Python依赖包的版本。Python版本:3.8,请勿使用其他版本,详见requirements.txt文件;
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,
推荐阅读
【摩尔线程+Colossal-AI强强联手】MusaBert登上CLUE榜单TOP10:技术细节揭秘
- 技术实力:摩尔线程凭借"软硬兼备"的技术底蕴,让MusaBert得以从底层优化到顶层。其内置多功能GPU配备AI加速和并行计算模块,提供了全面的AI与科学计算支持,为AI推理和低资源条件下的大模型训练等场景带来了高效、经济且环保的算力。
- 算法层面亮点:依托Colossal-AI AI大模型开发系统,MusaBert在训练过程中展现出了卓越的并行性能与易用性,特别在预处理阶段对DataLoader进行了优化,适应低资源环境高效处理海量数据。同时,通过精细的建模优化、领域内数据增强以及Adan优化器等手段,挖掘和展示了预训练语言模型出色的语义理解潜力。基于MusaBert,摩尔线程自主研发的MusaSim通过对比学习方法微调,结合百万对标注数据,MusaSim在多个任务如语义相似度、意图识别和情绪分析中均表现出色。
- 数据资源丰富:MusaBert除了自家高质量语义相似数据外,还融合了悟道开源200GB数据、CLUE社区80GB数据,以及浪潮公司提供的1TB高质量数据,保证模型即便在较小规模下仍具备良好性能。
当前,MusaBert已成功应用于摩尔线程的智能客服与数字人项目,并广泛服务于语义相似度、情绪识别、阅读理解与声韵识别等领域。为了降低大模型开发和应用难度,MusaBert及其相关高质量模型代码已在Colossal-AI仓库开源,可快速训练优质中文BERT模型。同时,通过摩尔线程与潞晨科技的深度合作,仅需一张多功能GPU单卡便能高效训练MusaBert或更大规模的GPT2模型,显著降低预训练成本,进一步推动双方在低资源大模型训练领域的共享目标。
MusaBert荣登CLUE榜单TOP10,象征着摩尔线程与潞晨科技联合研发团队在中文预训练研究领域的领先地位。展望未来,双方将携手探索更大规模的自然语言模型研究,充分运用上游数据资源,产出更为强大的模型并开源。持续强化在摩尔线程多功能GPU上的大模型训练能力,特别是在消费级显卡等低资源环境下,致力于降低使用大模型训练的门槛与成本,推动人工智能更加普惠。而潞晨科技作为重要合作伙伴,将继续发挥关键作用。
基于 YOLOv8/YOLOv7/YOLOv6/YOLOv5 的日常场景人脸检测系统(含完整资源+PySide6 接口+训练代码)-1.数据集介绍
基于 YOLOv8/YOLOv7/YOLOv6/YOLOv5 的条形码 QR 码检测系统(深度学习+用户界面+训练数据集+Python 代码)-3。YOLOv8 算法原理
基于深度学习的作物叶病检测系统(UI 界面 + YOLOv5 + 训练数据集)
基于深度学习的作物叶病检测系统(UI 界面 + YOLOv5 + 训练数据集)
基于深度学习的跌倒检测系统(UI + YOLOv5 + 训练数据集)
基于深度学习的手写数字和符号识别系统(网络版 + YOLOv8/v7/v6/v5 代码 + 训练数据集)
基于深度学习的吸烟行为检测系统(网络版 + YOLOv8/v7/v6/v5 代码 + 训练数据集)
基于深度学习的作物叶病检测系统(UI 界面 + YOLOv5 + 训练数据集)
[姿势估计] 实践记录:使用 Dlib 和 mediapipe 进行人脸姿势估计 - 本文重点介绍方法 2):方法 1:基于深度学习的方法:。
基于深度学习的方法:基于深度学习的方法利用深度学习模型,如卷积神经网络(CNN)或递归神经网络(RNN),直接从人脸图像中学习姿势估计。这些方法能够学习更复杂的特征表征,并在大规模数据集上取得优异的性能。方法二:基于二维校准信息估计三维姿态信息(计算机视觉 PnP 问题)。
特征点定位:人脸姿态估计的第一步是通过特征点定位来检测和定位人脸的关键点,如眼睛、鼻子和嘴巴。这些关键点提供了人脸的局部结构信息,可用于后续的姿势估计。
旋转表示:常见的旋转表示方法包括欧拉角和旋转矩阵。欧拉角通过三个旋转角度(通常是俯仰、偏航和滚动)描述头部的旋转姿态。旋转矩阵是一个 3x3 矩阵,表示头部从一个坐标系到另一个坐标系的变换。
三维模型重建:根据特征点的定位结果,三维人脸模型可用于姿势估计。通过将人脸的二维图像映射到三维模型上,可以估算出人脸的旋转和平移信息。这就需要建立人脸的三维模型,然后通过优化方法将模型与特征点对齐,从而获得姿势估计结果。
特征点定位
特征点定位是用于检测人脸关键部位的五官基础部分,还有其他更多的特征点表示方法,大家可以参考我上一篇文章中介绍的特征点检测方案实践:人脸校正二次定位操作来解决人脸校正的问题,客户在检测关键点的代码上略有修改,坐标转换部分客户见上图
def get_face_info(image).
img_copy = image.copy
image.flags.writeable = False
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = face_detection.process(image)
# 在图像上绘制人脸检测注释。
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
box_info, facial = None, None
if results.detections: for detection in results.
for detection in results.detections: mp_drawing.Drawing.detection = 无
mp_drawing.draw_detection(image, detection)
面部 = detection.location_data.relative_keypoints
返回面部
在上述代码中,返回的数据是五官(6 个关键点的坐标),这是用 mediapipe 库实现的,下面我们可以尝试用另一个库:dlib 来实现。
使用 dlib
使用 Dlib 库在 Python 中实现人脸关键点检测的步骤如下:
确保已安装 Dlib 库,可使用以下命令: pip install dlib
导入必要的库:
加载 Dlib 的人脸检测器和关键点检测器模型:
读取图像并将其灰度化:
使用人脸检测器检测图像中的人脸:
对检测到的人脸进行遍历,并使用关键点检测器检测人脸关键点:
显示绘制了关键点的图像:
以下代码将参数 landmarks_part 添加到要返回的关键点坐标中。