从训练到部署:基于YOLOv7的跌倒检测系统落地指南
简介一份基于Python与YOLOv7的人员跌倒检测完整方案面向计算机视觉学习者和AI项目开发者可用于养老机构、公共区域及家庭场景的实时跌倒监控与异常行为预警。资源为zip压缩包共20个文件大小约14.9MB主要包含17张检测效果示意图、1份README教学文档、1个Python辅助脚本和1个说明txt图文配套便于快速上手。目前已有199人次浏览学习。压缩包内提供可直接运行的源代码、配套训练数据集以及覆盖环境配置、模型训练、性能评估到系统集成的分步教程同时附带的目录结构与辅助脚本能帮助用户理解工程组织方式。无论是毕业设计、课程项目还是想要快速落地目标检测应用都可借助该完整方案实现从数据准备到推理部署的全流程实践并为进一步扩展摔倒以外的行为识别打下基础。1. 夜间护理场景里为什么目前成本最低的落地方案是YOLOv7人员跌倒检测老人夜里起身上厕所在床边摔倒后在地板上躺了两小时才被护工发现医院病房里病人在输液时滑落跌倒直到监护仪报警才有人赶过去。这类场景的共性问题是全程都对着摄像头却没有一个系统在跌倒发生后的几十秒内发出告警。视觉跌倒检测是目前最成熟、性价比最高的预警手段而基于Python的YOLOv7人员跌倒检测系统就是这一方向里复现最多、绕坑路径最清楚的实现用检测模型区分站姿、坐姿和跌倒姿态再叠加一点时序逻辑把它接进已有的监控或通信渠道。这套方案适合三类人做毕设或课题的学生需要一份能跑通、能讲清原理的完整项目做养老院或医院信息化方案的人要拿它在现有IPC网络里快速验证嵌入式工程师想给旧摄像头补一层智能分析也需要一条从训练到部署的高复用路径。技术上真正的门槛不在模型本身而在数据整理和对抗误报这两件事——后面几个部分会逐步拆开讲。2. 用YOLOv7检测跌倒模型选型、数据标签与三个前置判断动手跑代码之前先把方向问题想清楚。这一章解决的是「为什么用检测模型」「数据从哪来、标成什么样」「选哪个体积的模型」三个前置问题这三个判断决定后面所有代码能不能落地。2.1 为什么是检测器而不是姿态估计或背景差分常见做法里跌倒检测有三条技术路线姿态估计、背景差分、目标检测。姿态估计比如OpenPose之类输出人体关键点的方案逻辑上最直观——拿到17个关键点算一下脖子和髋关节的高度变化就能判断跌倒。但问题在于人真的跌倒时往往是快速运动加大面积遮挡关键点检测在这种帧上丢失率很高一旦关键点缺胳膊少腿后面所有几何判断全部失效。姿态估计的模型体量也大想在Jetson或普通边缘盒子上跑实时推理压力不小。背景差分是另一条思路机位固定、背景静态时前景变化区域很容易提取。可养老院走廊、病房、电梯轿厢这些场景灯光频闪、门开窗动、影子位移背景模型刚建好就被破坏误报率高到没法用。目标检测方案没有这两个问题它不要求机位完全静止也不依赖关键点完整可见只要目标框的语义类别可靠跌倒/站立/坐姿这些状态就能通过框的运动趋势判断。这也是YOLOv7被高频选中的原因——它在遮挡下的鲁棒性、训练脚本的完整性、以及ONNX/TensorRT的部署生态都比同时期的其他检测器更成熟。值得多说一句的是类别设计。不少第一次做跌倒检测的人把数据集标成「person」和「fall」两类这没问题但也有人在标注时把「坐下」也单独标成一类训练时增加一个椅子和床的负样本。我的建议是最小可用方案先标两类如果你的场景里误报率压不住再回来扩类别。类别越多单类样本量就越少小数据集下反而容易过拟合。提示跌倒检测本质上是「动作语义」问题不是纯静态分类问题。单帧检测只是第一步时序判断框架会在第4章展开设计数据时就要为这一步留好接口。2.2 数据集怎么选公开集、自建数据与标注格式转换训练YOLOv7需要的是带边界框标注的图片而不是分类标签。公开数据集中UR Fall Detection是深度相机数据训练RGB模型时还要做对齐Le2i Fall Detection是RGB视频帧加2D框标注最适合直接用来做预训练Multiple Cameras Fall Dataset多视角RGB适合验证跨镜头鲁棒性。这些公开集都能用但真实场景千差万别公开集训练出来的模型换一个机位、换一种光照精度跌落很明显。我一般会把公开集当预训练基线然后抽出自己场景里的视频帧来补标注。自建数据的关键是覆盖「负样本」老人弯腰捡东西、扶墙站立、蹲下系鞋带这些动作在单帧上和跌倒非常像必须在训练集里出现足够多的样本模型才能区分。负样本比例我习惯控制在跌倒正样本的1到1.5倍太少模型分不清太多模型会变得保守、漏检上升。标注工具常用labelImg导出的是Pascal VOC格式的XML需要转成YOLO的txt格式才能训练。下面这个脚本是每次做数据转换我都要用到的版本# voc2yolo.py把labelImg导出的XML转成YOLO训练格式 import os, glob, xml.etree.ElementTree as ET from pathlib import Path classes [person, fall] # 类别顺序必须和训练yaml里的names保持一致 def convert_xml(xml_path, out_dir): tree ET.parse(xml_path) root tree.getroot() img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) lines [] for obj in root.iter(object): name obj.find(name).text if name not in classes: continue # 跳过没用的类别避免空标签 cls_id classes.index(name) box obj.find(bndbox) x1 float(box.find(xmin).text) y1 float(box.find(ymin).text) x2 float(box.find(xmax).text) y2 float(box.find(ymax).text) x_center ((x1 x2) / 2) / img_w y_center ((y1 y2) / 2) / img_h box_w (x2 - x1) / img_w box_h (y2 - y1) / img_h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {box_w:.6f} {box_h:.6f}) out_txt Path(out_dir) / (Path(xml_path).stem .txt) out_txt.write_text(\n.join(lines), encodingutf-8) if __name__ __main__: xml_list glob.glob(annotations/*.xml) # 把标注XML都放在这个目录 os.makedirs(labels, exist_okTrue) for xml_path in xml_list: convert_xml(xml_path, labels) print(f完成 {len(xml_list)} 个标注文件转换)这个脚本的核心逻辑是归一化YOLO标签要求的是中心点坐标和宽高相对图像尺寸的比例而不是绝对像素值。转换时最容易踩的坑是classes列表顺序和训练配置文件里的names不一致一旦错位训练时模型会把人和跌倒搞混mAP却显示正常排查起来非常折磨人。脚本里的continue分支也重要——不带标注的负样本图如果生成了空txt训练时会报样本不存在的警告。转换完成后的目录结构按 YOLO 的习惯组织dataset/yolo/ ├── images/ │ ├── train/ │ │ ├── frame_0001.jpg │ │ └── frame_0002.jpg │ └── val/ │ ├── frame_0100.jpg │ └── frame_0101.jpg ├── labels/ │ ├── train/ │ │ ├── frame_0001.txt │ │ └── frame_0002.txt │ └── val/ │ ├── frame_0100.txt │ └── frame_0101.txt └── fall.yamlfall.yaml里的names要和转换脚本的classes顺序严格一致train/val指向对应的图片目录或路径列表文件。这一点在第3章会给出完整配置先在这里埋个钩子。2.3 模型规模怎么选yolov7-tiny、yolov7还是yolov7-w6同一个检测器家族里有多个体积档位很多人一上来就选最大的模型结果在自己的部署设备上跑不到实时帧率反过来怪算法不行。选模型前先回答两个问题推理跑在哪块硬件上允许的延迟是多少秒模型体积档位单张640输入推理性能适合的部署设备yolov7-tiny最小快适合低算力芯片RK3568、海思、Jetson Nano级别yolov7标准中等单张几十毫秒级普通GPU、主流边缘盒子yolov7-w6最大慢但精度上限高离线分析、高端GPU工作站跌倒检测本身不是极高精度的任务目标大、动作幅度大yolov7-tiny往往就够用如果摄像头同时监控多个床位、画面里的人很小再考虑标准版。我的经验是先用标准yolov7训练一版拿到精度上界再换成tiny重新训练对比部署时按实际帧率回退档位。不要一开始就在w6上烧时间——跌倒检测的数据量通常不大大模型的收益很小。3. 从零跑通部署Python环境、数据集放置与最小训练命令这一章是「能抄作业」的部分。从Python环境到训练命令再到推理脚本全部按最小可运行的原则展开。源码包里通常包含train.py、detect.py、data目录和模型配置我以最常见的YOLOv7工程结构来带一遍流程。3.1 Python与PyTorch环境安装版本卡点在哪python安装教程里90%的教程不会告诉你真正卡人的不是Python本体而是Python版本和PyTorch版本的匹配。YOLOv7的训练代码建议在Python 3.8到3.10之间运行Python 3.11以上有些依赖包还没跟上容易在编译torchvision时翻车。我的环境搭建顺序是固定的# 1. 创建独立虚拟环境避免污染系统Python python3 -m venv venv source venv/bin/activate # 2. 安装PyTorch注意CUDA版本要和显卡驱动对应 # 没有GPU的机器就装CPU版能跑通流程但训练慢 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 3. 安装YOLOv7常用依赖 pip install opencv-python numpy matplotlib pyyaml tqdm pandas requestsLinux服务器上安装python还有一个高频坑系统自带Python不带venv模块直接跑第一步会报错需要先安装python3-venv包。另外不要用系统自带的pip直接往全局装包虚拟环境会帮你省掉后面90%的版本冲突。刚才那种从PyTorch官方源装CUDA版的方式cu118那个标识要和显卡驱动支持的最高CUDA版本匹配驱动版本太低即使装了也跑不起来。把依赖装完后检查一下是否正常python -c import torch; print(torch.__version__, torch.cuda.is_available())输出里cuda.is_available()为False不代表不能用只代表训练速度会慢到让人怀疑人生。后面章节里所有涉及显存和batch-size的讨论都以有GPU为前提没有GPU的读者可以先租一块云GPU来走流程。提示跌倒是小数据集任务不要一上来就追求多卡分布式训练。单卡能把流程跑通比什么都重要。3.2 数据集目录组织与train.txt/val.txt生成脚本YOLOv7训练时不是直接读文件夹而是读一个txt文件里逐行列出的图片绝对路径。这个设计初看绕实际是为了灵活——你可以把来自不同目录的数据集拼在一起训练。我们需要为train和val各生成一份路径列表# generate_txt.py生成训练与验证的图片路径列表 import os from glob import glob image_dir /home/user/dataset/yolo/images train_ratio 0.9 # 90%训练、10%验证跌倒数据集样本量小验证集不用太大 imgs sorted(glob(os.path.join(image_dir, train, *.jpg))) val_imgs sorted(glob(os.path.join(image_dir, val, *.jpg))) with open(train.txt, w) as f: f.write(\n.join(imgs) \n) with open(val.txt, w) as f: f.write(\n.join(val_imgs) \n) print(ftrain: {len(imgs)} 张, val: {len(val_imgs)} 张)这个脚本逻辑很简单但有一个容易忽略的点图片路径必须写绝对路径不能写相对路径。原因在于训练时的工作目录可能和数据集不在同一层相对路径会找不到图片报FileNotFoundError。另外train_ratio我习惯设置在0.85到0.9之间——跌倒样本本身就少验证集留太多会让训练数据更紧张。然后写data/fall.yaml# data/fall.yaml train: /home/user/dataset/yolo/train.txt val: /home/user/dataset/yolo/val.txt nc: 2 names: [person, fall]nc是类别数2对应person和fallnames的顺序必须和第2章的转换脚本里classes的顺序一致这是全流程里最容易错、也最难查的配置项。3.3 最小训练命令与常用超参环境就绪、数据就位后训练命令本身不长关键是每个参数的含义。最简命令如下python train.py \ --data data/fall.yaml \ --cfg cfg/training/yolov7.yaml \ --weights \ --batch-size 16 \ --epochs 100 \ --img 640 \ --device 0 \ --name fall_exp--weights传空表示从头训练也可以传一个COCO预训练权重源码包的weights目录或开源release里通常有来做迁移学习收敛速度会明显快。--batch-size是显存敏感参数16在6G显存上可能直接OOM先降到8跑通再说。--img是训练分辨率640是速度和精度的平衡点如果你想检测小目标可以试1280但训练和推理都会明显变慢。--name是实验名字权重会输出到runs/train/fall_exp/weights/下。超参数里--patience控制早停默认值是几十个epoch内验证指标不涨就停止小数据集我一般开30--workers是数据加载线程数Linux下可以开到8Windows下开太多容易报错4比较稳。训练结束后best.pt和last.pt都在权重目录best.pt是验证集上表现最好的模型后面推理和部署都用它。如果你的显存不够还有一种常见做法把batch-size降到8同时把输入分辨率降到480训练一版跑通全流程之后再用640精修。这比绞尽脑汁去调梯度累积参数更省事。3.4 推理脚本对单张图和视频跑通检测官方detect.py可以直接用它支持图片、视频、摄像头实时推理# 单张图片 python detect.py --weights runs/train/fall_exp/weights/best.pt \ --source test.jpg --conf-thres 0.5 --iou-thres 0.45 --img-size 640 # 视频文件 python detect.py --weights runs/train/fall_exp/weights/best.pt \ --source test.mp4 --conf-thres 0.5 --iou-thres 0.45 --img-size 640--conf-thres是置信度阈值跌倒检测里我一般先设0.5后面根据误报率上下调整--iou-thres是NMS的IoU阈值默认0.45基本不用动。--source传摄像头编号如0就能实时推理但只靠detect.py的输出还不够——它只是画框没有把「框的运动趋势」变成「跌倒事件」。为了接出事件我一般会写一个自己的推理脚本# video_demo.py视频推理演示输出每个目标的类别与置信度 import cv2 import torch import numpy as np model torch.load(runs/train/fall_exp/weights/best.pt, map_locationcpu)[model].float().eval() cap cv2.VideoCapture(test.mp4) while cap.isOpened(): ret, frame cap.read() if not ret: break # 训练输入要求640x640推理时先resize再还原坐标 img cv2.resize(frame, (640, 640)) img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) tensor torch.from_numpy(img_rgb / 255.0).permute(2, 0, 1).unsqueeze(0) with torch.no_grad(): pred model(tensor)[0] # pred形状为 [1, 25200, 6]取出置信度和类别 conf pred[0, :, 4] # 目标置信度 cls pred[0, :, 5] # 类别id mask conf 0.5 for i in torch.where(mask)[0]: cls_id int(cls[i]) label person if cls_id 0 else fall print(f检测到 {label}, 置信度 {conf[i]:.2f}) # 这里只做演示真实接入时要画框并送入第4章的状态机 cap.release()注意最后的坐标还需要还原到原图尺寸上面只演示了类别输出逻辑。这个脚本的价值不在于代替detect.py而是让你能看到模型的原始输出结构——YOLOv7的推理结果是一个大张量每行对应一个预测框前4列是框坐标第5列是置信度第6列是类别。搞清楚这个结构后面做时序判断就顺了。4. 让跌倒检测不误报从单帧分类到时序判断的落地框架直接拿训练好的模型去跑实时视频十有八九会被误报搞到崩溃弯腰捡东西报警、坐下瞬间报警、拉窗帘人影一晃也报警。问题不在于模型而在于「跌倒」的本质是一个时间过程不是一张静态图。这一章给出我实际落地的状态机框架。4.1 为什么单帧检测在真实场景必然翻车单帧检测的结果是「这一帧里这个人是站姿、坐姿还是跌倒姿态」但跌倒这个动作的生命周期只有一两秒中间状态极容易和弯腰、蹲下混淆。平视镜头里老人弯腰够床头柜时人的框高宽比和跌倒瞬间几乎一样俯瞰镜头里正常走路的人从正上方看也是一个矮胖的框。换句话说单靠「框的形状」判断方向本身就是错的。另一个常被忽略的点是摄像头视角。平视镜头下跌倒后人体的最大特征是框高度骤降、宽度不变这个特征很稳定但如果是90度俯视的监控头跌倒前后框的尺寸变化不大必须依赖中心点位移和静止时长来做判断。所以状态机的设计要同时兼容这两种视角特征不能只依赖一个几何指标。4.2 跌倒状态机检测框运动特征与事件判定我的做法是维护一个轻量状态机每帧输入检测框列表输出一个FALL或NORMAL事件。核心逻辑是连续多帧跟踪同一个目标的框累计它的高度变化率、中心点下降速度、以及框变矮后是否持续静止# fall_state.py跌倒状态机的最小实现 class Target: def __init__(self, box): self.box box # (x, y, w, h)相对坐标 self.frames 1 self.dropped 0 # 累计“突然变矮”的帧数 self.static 0 # 落地后静止帧数 self.fell False def iou(a, b): # 计算两个框的IoU用于帧间目标匹配 x1, y1 max(a[0], b[0]), max(a[1], b[1]) x2, y2 min(a[0] a[2], b[0] b[2]), min(a[1] a[3], b[1] b[3]) inter max(0, x2 - x1) * max(0, y2 - y1) area_a, area_b a[2] * a[3], b[2] * b[3] return inter / (area_a area_b - inter 1e-6) def update_state(target, box, frame_h): h_ratio box[3] / frame_h # 当前框高度占比 old_h_ratio target.box[3] / frame_h if h_ratio 0.55 * old_h_ratio: # 高度骤降45%以上 target.dropped 1 else: target.dropped 0 if target.dropped 3 and h_ratio 0.3: # 连续3帧变矮且高度低于帧高30% target.fell True if target.fell: if box[2] / box[3] 1.2: # 落地后框通常变宽 target.static 1 return target这个状态机的判定逻辑分三段先通过IoU把上一帧和当前帧的同一个目标关联起来再盯框高度比的变化率——人跌倒时框高度会在几帧内骤降45%以上弯腰捡东西虽然框也变矮但变化速度慢达不到“骤降”条件最后要求变矮后的框呈明显的宽扁形态且维持足够帧数用来排除「蹲下后马上站起来」的动作。参数上0.55是高度骤降阈值平视镜头调大一点更灵敏俯瞰镜头要调小3帧是连续帧数帧率25时约0.12秒足够排除抖动1.2是宽高比阈值表示人已经横在地上。这几个参数强烈依赖安装高度和镜头角度没有万能值先按这个初始值跑再根据你的场景标定。真实项目里还会加入中心点下落速度判断跌倒瞬间中心点y坐标每秒下降超过某个速度才触发这个特征对俯瞰镜头尤其重要。提示状态机判定通过后再延时2秒确认能过滤掉大量误报。跌倒后不会立刻站起来这个时间窗口是对误报的最后一道防线。4.3 报警输出、截图留存与消息推送状态机判定为跌倒后系统要做的不是只弹一条日志而是触发完整的事件流保存现场截图、记录事件的起止时间、推送告警到值班人员手机。告警推送现在最通用的方式是webhook钉钉或企业微信机器人一个HTTP请求就能搞定# alert.py跌倒事件告警与截图 import json, requests, time, cv2 def send_alert(webhook_url, image_path, note): # 推送文本消息图片可以通过文件上传接口另行实现 payload {msgtype: text, text: {content: f跌倒告警: {note} 时间 {time.strftime(%Y-%m-%d %H:%M:%S)}}} try: requests.post(webhook_url, jsonpayload, timeout3) except Exception as e: print(f推送失败: {e}) def save_snapshot(frame, track_id): # 把告警帧存成jpg文件名带时间戳 filename ffall_{track_id}_{int(time.time())}.jpg cv2.imwrite(falerts/{filename}, frame) return falerts/{filename}告警推送最容易被忽略的是频率控制。状态机在一秒内可能连续触发十几次如果每次都推消息值班手机会被刷爆。常见做法是加冷却时间同一个目标ID在30秒内只推第一条之后处于冷却期只更新事件状态不重复推送。冷却期结束后目标仍在地上再推一条「持续倒地」升级告警。这个逻辑我记得第一次上线时没做结果一个跌倒事件推了27条消息客户直接打电话来问是不是系统坏了——这就是血泪经验。5. 避坑名单从训练到部署经常踩的坑与排查方法这一章把我在跌倒检测项目里反复遇到的五个典型问题列出来每条按「现象 → 原因 → 解决」展开。这些问题都不难查关键是知道往哪个方向查。5.1 训练loss不降mAP始终为0现象训练跑了几十个epochbox_loss曲线横盘mAP一直是0验证集上没有任何检测框输出。 原因最常见的不是模型问题而是标签和配置错位。XML转YOLO时classes顺序和fall.yaml的names不一致导致模型学到的类别语义和真实标签对不上。另一个高发原因是train.txt里图片路径错误训练日志里虽然没报错但实际读到的是空数据集。 解决先看训练日志里num_train_images输出确认数据量是几百张而不是0再随机抽几张训练图的label txt打印前几行确认类别id和归一化坐标在0到1之间最后可视化标注用opencv把txt框画回原图一眼就能看出框和人的位置对不对得上。5.2 白天准、晚上全废现象白天测试集mAP达到0.8以上晚上同一摄像头漏检率突然大幅上升跌倒事件根本检测不到。 原因训练集里晚间低光照样本占比太少。YOLOv7默认的数据增强里有色彩抖动但低位照的样本语义和白天完全不同靠增强只能模拟覆盖不了真实夜间红外或微光画面的纹理特征。 解决最直接的办法是把晚间视频抽帧补进训练集单独建一个night目录和白天数据混合训练。其次是给摄像头开补光或利用红外夜视模式下重新采集验证集做测试。部署侧的兜底方案是降低置信度阈值——夜间画面整体检测置信度本来就偏低把--conf-thres从0.5降到0.35能在漏检和误报之间重新找平衡。5.3 弯腰、扶墙动作被误判为跌倒现象老人弯腰穿鞋、扶墙站立、从轮椅上滑落一半时系统频繁推送跌倒告警。 原因这些动作在单帧上和跌倒的静态特征高度相似状态机如果只盯着当前帧的框形状必然误判。更深层的原因是训练数据的负样本里没有这类「类跌倒」动作。 解决两件事一起做。第一状态机里加上中心点位移速度判断——弯腰时中心点位移速度远低于跌倒这个特征一加误报能降一半第二把造成误报的动作帧重新标注成stand或bend类别作为负样本加入训练集让模型自己学会区分。后者是治本的方法每次误报都是一次免费的数据采集。5.4 摄像头视角受限画面被床栏或椅子遮挡现象老人从床上滑落时身体大半个被床栏挡住检测框只剩一小截状态机判定不了高度骤降。 原因监控点位设计不合理。正对床侧的摄像头存在大面积遮挡盲区90度顶装俯视又丢失了高度特征这两种机位都不适合跌倒检测。 解决机位尽量抬高但保持30到45度斜向下让画面里能看到床面大部分区域。如果遮挡无法避免就在状态机里增加「目标消失」判断——上一帧还在床边的人形快速消失可能是跌落到床栏下方应触发一次降级告警而不是直接忽略。多摄像头场景下还可以对同一个区域做交叉验证一轮检测异常后再看另一路摄像头是否也检测到异常。5.5 GPU显存不足训练直接OOM现象batch-size设置16训练刚开始就报CUDA out of memory程序直接退出。 原因yolov7在640分辨率下16的batch对6G显存过于激进。很多人卡在这一步误以为是代码bug其实只是显存不够。 解决按显存大小降档。6G显存用batch-size 4到812G用1624G及以上再考虑32。如果batch-size降到4后收敛变慢可以用梯度累积等效替代但我不建议小显存硬上——直接换yolov7-tiny更干脆训练速度和质量都会好很多。另一种思路是把输入分辨率降到480训练效果会略降但整个流程能跑通适合先验证可行性。提示yolov7和yolov8在训练方式上有很多相似之处处理数据集用于yolo训练的思路完全通用。但跌倒检测这种小数据量项目yolov7的训练脚本更简单不用额外适配我的选择一直是它。6. 进阶验证和部署mAP评测、ONNX导出与硬件选型训练出best.pt只是第一步真正要上生产环境还需要验证精度、转换模型、确定硬件。这三件事都有固定流程照着做就不会出大问题。6.1 用mAP和F1评测模型不要只看训练loss训练日志里的loss只是训练指标不能代表真实性能。跑一次验证集评估拿到每个类别的mAP和F1才有底气说这个模型能用python test.py --data data/fall.yaml \ --weights runs/train/fall_exp/weights/best.pt \ --batch-size 8 --img-size 640 --conf-thres 0.5重点关注fall类别的Recall和Precision。跌倒检测场景里Recall比Precision更重要——漏报一个跌倒事件代价远超几次误报。如果Recall低于0.8就把置信度阈值降低如果Precision太低误报过多就提高阈值。这个调参过程要结合第4章的状态机一起做因为状态机本身能过滤静态误报模型端的置信度阈值可以相对保守。6.2 用ONNX导出模型摆脱PyTorch依赖部署到边缘设备或非Python环境时把best.pt转成ONNX是通用做法。YOLOv7源码里有现成的导出脚本python export.py --weights runs/train/fall_exp/weights/best.pt \ --img-size 640 --batch-size 1 --simplify导出后用onnxruntime验证一次确认输出张量和PyTorch版一致再做后续转换。ONNX还能继续转成TensorRT的engine格式在NVIDIA设备上获得数倍加速非NVIDIA芯片则用各自SDK解析ONNX。我的一个习惯是无论目标平台是什么先导ONNX保留一份后面换硬件不用重新训练模型。6.3 硬件选型算力、功耗和镜头角度一起定带GPU的服务器当然好但机房和功耗只会让你后悔。实际项目里两个摄像头覆盖的养老院房间一块Jetson Nano或RK3568级别的板子就够了成本可控算法跑yolov7-tiny能到实时。如果监控点位超过四个建议拆分到多块边缘板而不是堆一块大GPU——单点故障的影响面更小。镜头角度按第5章说的斜向下45度安装画面里人体高度不小于50像素否则再好的模型也白搭。给客户交付时我每次都会在配置文件里把所有阈值参数集中暴露出来方便现场调试而不是把参数写死在代码里。这个习惯帮我在大量项目里快速而稳健地完成了现场标定少背了很多黑锅。跌倒检测这个方向技术上不难难的是把误报压到让人信服的程度——把数据、状态机、阈值这三件事做扎实系统才是可信赖的。希望帮到你。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联
返回资讯列表 →