ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

轮椅识别数据集构建与YOLOv8训练全流程实战

轮椅识别数据集构建与YOLOv8训练全流程实战 简介目标检测是计算机视觉领域的基础任务广泛应用于安防监控、智慧医疗与无障碍设施管理。在真实工程落地中通用检测模型如COCO预训练权重对特殊移动辅具的识别能力存在明显短板容易将轮椅漏检或与行人混淆。为解决这一问题需要从数据集构建入手覆盖手动、电动、儿童轮椅等细分类别并通过规范标注、数据增强与双人复核保障质量。基于YOLOv8框架进行模型训练与调优可显著提升检测精度与召回率结合模型轻量化技术实现边缘端部署。该方法适用于医院走廊、养老院、无障碍通道等场景的通行监测与业务分析为垂直领域目标检测提供了可复用的工程实践路径最终自然收敛到轮椅识别这一具体主题。 轮椅识别这个方向老实说一开始挺小众的。我做目标检测也有几年了常规的行人、车辆、口罩检测都跑过不少但真正决定把轮椅识别数据集这个项目系统做起来是因为在实际场景里碰了好几次钉子——想在医院走廊、养老院、无障碍通道这类地方做通行监测通用检测模型根本搞不定轮椅这个目标。行人检测模型大概率把轮椅漏掉或者把坐轮椅的人一起框进去更别提电动轮椅和手动轮椅的区分了。这个项目说白了就是一套针对轮椅目标的检测数据集配合目标检测算法做训练和评估解决的是轮椅上的人和普通行人在视觉感知层被混淆、被漏检的问题。适合做智慧医疗、无障碍设施监测、室内安防的朋友参考尤其适合那些被公开数据集里几乎没有轮椅类别折磨过的人。这篇文章我会把整个项目从数据集设计、标注规范、训练流程到模型部署的完整链路都拆开讲不光是给结论还会把踩过的坑和排查思路一并列出来。1. 项目整体设计与数据集的定位1.1 轮椅识别到底要解决什么问题轮椅识别不是单纯的目标检测 demo它背后对应着一批真实的业务诉求。医院里要对轮椅使用者进行流量统计和路径规划养老院要监测老人是否长时间停留在某个区域无障碍卫生间需要判断是否有轮椅进入停车场要区分无障碍车位是否被普通车辆占用——这些场景的共同点在于目标不是人而是人移动辅具这个组合体。普通行人检测模型比如 COCO 预训练的 YOLO遇到轮椅时表现非常不稳定。我实测过一个坐轮椅的人出现在画面中模型有时会框住上半身有时会框住整个轮椅区域有时干脆完全不识别。因为 COCO 的 80 个类别里根本没有 wheelchair模型只能把轮椅推测成 chair 或者 person置信度低且框的位置飘忽。这就是这个数据集存在的核心价值——补充通用检测模型在特殊移动设备上的类别空白。从技术角度看轮椅识别属于单阶段目标检测的典型应用。需要考虑的维度包括轮椅的外观形态手动轮椅、电动轮椅、儿童轮椅、康复轮椅拍摄视角平视、俯视、斜视环境光照室内日光灯、户外自然光、逆光以及遮挡情况部分遮挡、人群穿插。数据集在设计时必须覆盖这些维度否则训练出来的模型只能在特定场景下有效换一个环境就崩。1.2 为什么选择目标检测而不是分类或分割这个问题我经常被问到尤其是刚入门的同学。做轮椅识别为什么不直接用图像分类或者用语义分割答案取决于你要做什么。如果只是判断画面里有没有轮椅图像分类其实就够了二分类模型跑起来又快又轻。但实际项目里几乎没有这种需求——你总得知道轮椅在画面中的什么位置数量是多少才能做后续的轨迹跟踪、区域计数、异常停留判断。目标检测天然输出边界框直接对接后面的跟踪算法和业务逻辑。语义分割也有它的价值能精确到像素级对于判断轮椅是否越线、是否停在某个特定区域内非常有用。但分割标注成本太高了一个轮椅实例的像素级标注工作量是检测框标注的 5~8 倍而且对训练数据量和模型算力的要求也更高。在项目初期、数据积累不够的情况下检测框是最务实的方案。所以我最终把数据集定位为检测框级别的标注数据集同时保留了一套 JSON 格式的原始标注文件后续如果要做分割任务可以基于原始标注再做扩展标注不会浪费之前的采集工作。这样做的好处是项目起步快模型迭代效率高后期也能平滑升级。1.3 数据集的整体架构规划这个轮椅识别数据集在设计时遵循了目标检测数据集的标准组织方式。根目录下分为 images 和 labels 两个大目录images 存放原始图像labels 存放标注文件。两个目录内部再按照 train、val、test 三个子集拆分。数据集的类别体系我设置了 4 个类别manual_wheelchair手动轮椅electric_wheelchair电动轮椅child_wheelchair儿童轮椅person_with_wheelchair坐轮椅的人整体框前三个类别是纯载具目标第四个是人轮椅整体这个类别的存在是为了解决实际场景中的一个问题当轮椅使用者被遮挡、只能看到上半身时检测器依然能够通过上下文识别出这是一个轮椅使用者而不是普通行人。整个数据集最终收录了 12680 张图像其中训练集 10144 张验证集 1522 张测试集 1014 张。包含标注目标实例共计 21873 个。这个规模在目标检测数据集里不算大但对轮椅这种类别单一的目标来说已经足够训练出一个可用的模型。2. 数据集构建与标注规范细节2.1 数据采集的渠道与策略数据采集是整个项目里最费时间的环节。轮椅目标不像行人那样随处可见想要拿到高质量、多样性的图像不能指望单靠一个渠道。我主要用了三条路。第一条是公共场所实地拍摄去医院门诊楼、康复中心、养老院、地铁站这类轮椅出现频率高的地方拍。这一部分的图像质量最高因为真实场景中的光照、遮挡、背景杂音都是模型最终要面对的但拍摄前一定要获得场地管理方许可并且注意个人隐私保护不能拍到人脸特写。第二条是网络公开图片抓取。通过搜索引擎和开源图库按关键词批量抓取包括不同国家、不同场景、不同环境下的轮椅图像。这里要注意版权问题只使用明确标注可商用或 CC0 协议的图片。第三条是视频抽帧。找一些公开的、授权可用的无障碍设施宣传视频、康复训练视频按固定间隔抽帧能快速扩充数据量而且视频连续帧之间背景变化小能保证同一场景下有多个轻微差异的样本对模型泛化有帮助。我用的抽帧间隔是每秒 2 帧避免连续帧过于相似导致的数据冗余。2.2 标注工具与格式转换标注工具我用的是 LabelImg虽然是老牌工具但对于矩形框标注来说依然是最稳定、最顺手的选项。界面上可以加载图片目录按 W 键画框选择类别按 D 键切换下一张一天标注 500 张图没什么压力。标注的时候要特别注意一个细节LabelImg 默认保存的是 PASCAL VOC 格式的 XML 文件但 YOLO 系列训练需要的是 txt 格式。转换规则是XML 中每个 object 的 name 映射到类别 ID比如 manual_wheelchair 对应 0边界框坐标从 xmin、ymin、xmax、ymax 转换成归一化的中心点坐标和宽高转换公式很固定x_center (xmin xmax) / 2 / img_width y_center (ymin ymax) / 2 / img_height width (xmax - xmin) / img_width height (ymax - ymin) / img_height四个值全部归一化到 0~1 区间保存在 txt 文件里格式是class_id x_center y_center width height。我写了一个批量转换脚本能自动扫描 XML 目录读取图片尺寸完成坐标换算并输出 YOLO 格式的标注文件。这里有一个容易踩的坑有些标注工具保存的坐标是整数有些是浮点数转换时一定要用 float 类型运算否则归一化结果会不准确导致训练时边界框位置偏移。2.3 数据增强策略与类别平衡采集到的原始图像存在明显的类别不均衡。手动轮椅在样本中占比超过 65%电动轮椅占 20% 左右儿童轮椅只有不到 5%。如果不做处理模型会严重偏向手动轮椅对儿童轮椅的召回率会很低。我采用的方案有两层。第一层是离线增强对样本量少的类别单独做拷贝增强包括水平翻转、旋转 ±15 度、亮度调整 ±20%、高斯模糊。第二层是训练时的在线增强依靠 YOLOv8 自带的 Mosaic、MixUp 策略自动完成。离线增强要注意一个原则增强操作不能改变目标的语义信息。比如水平翻转没问题轮椅左右对称语义不变但旋转角度过大就会让轮椅看起来像躺倒的反而干扰训练。我控制在 ±15 度以内这个幅度在真实场景中属于正常的视角变化范围。类别平衡的最终效果是训练集中四个类别的样本比例被拉到了大约 5:2:1:2手动:电动:儿童:人轮椅这是一个相对健康的分布。如果你想让模型的综合 mAP 高重点是让每个类别都有足够多的正样本而不是追求绝对平均。2.4 标注质量的双人复核机制标注质量直接决定模型上限这个道理不用多讲。但实际操作中标注员在连续工作两个小时后注意力会明显下降误标、漏标、框位置偏移这些情况开始出现。为了解决这个问题我引入了双人复核机制每个标注师的产出都由另一个人抽检抽检比例不低于 30%抽检标准是边界框是否紧贴目标IoU 不低于 0.85遮挡严重时是否按照约定策略标注见下文类别是否标注正确尤其是手动轮椅和电动轮椅的区分电动轮椅和手动轮椅从侧面看差别很大有电机、有控制杆、轮子较小从正面看容易混淆需要标注时特别注意细节。我要求标注师在不确定时放大图片检查如果仍无法判断就归为 manual_wheelchair保证类别判断的一致性。人工复核的同时我还写了一个自动化质量检测脚本会检查每一行的坐标值是否在 0~1 之间、类别 ID 是否越界、标注框是否为空。这个脚本能过滤掉 90% 的低级错误剩下的人工复核压力就小很多了。3. 基于YOLOv8的训练实操全流程3.1 环境准备与依赖安装训练环境我建议直接用 GPU 机器。轮椅目标在画面中占比偏小依赖高分辨率特征图训练批次不能太小没有 NVIDIA GPU 的话效率会很低。我的环境配置如下CUDA 11.8 cuDNN 8.9Python 3.9PyTorch 2.0.1ultralytics 8.0.x安装 ultralytics 包可以直接用 pip它会把 YOLOv8 的模型定义、训练脚本、推理脚本都包含进来不需要额外装复杂的依赖。pip install ultralytics整个依赖环境十分钟内就能搭好。如果你用的是 Windows 机器记得在 NVIDIA 官网下载对应版本的 CUDA 和 cuDNN并且注意环境变量 Path 里一定要包含 CUDA 的 bin 目录否则模型代码会找不到 nvcc 编译器。3.2 数据集格式整理与配置YOLOv8 对数据集的组织方式有明确的约定。我在项目根目录下创建了一个 data.yaml 文件内容如下train: /path/to/dataset/images/train val: /path/to/dataset/images/val test: /path/to/dataset/images/test nc: 4 names: [manual_wheelchair, electric_wheelchair, child_wheelchair, person_with_wheelchair]这里要特别注意路径问题。train 和 val 字段必须指向 images 目录而不是 labels 目录ultralytics 框架会自动根据 images 路径寻找同级的 labels 目录。如果路径写错训练时会报错 AssertionError: Label not found。train、val、test 三个子集的划分我用的是随机采样但加了一步约束同一个视频抽帧得到的图像必须放在同一个子集里避免训练集和验证集出现数据泄露导致验证指标虚高。具体做法是按视频片段名分组然后对组做随机划分。3.3 训练参数选择与调优思路模型选择上我优先推荐 YOLOv8s速度和精度的平衡最合适。如果你算力受限可以用 YOLOv8n但 mAP 大概会下降 3~5 个百分点如果追求极致精度可以考虑 YOLOv8m训练时间大约翻倍但收益明显。训练命令如下yolo train modelyolov8s.pt datadata.yaml epochs200 imgsz640 batch16 device0epochs 200 对这个规模的数据集是合理的。batch16 是根据显存定的如果显存只有 8G建议降到 8同时 imgsz 可以调整到 512但检测精度会下降。训练过程中需要重点观察两个指标train/loss 的收敛情况和 val/mAP 的变化趋势。正常情况下前 30 个 epoch loss 快速下降50 个 epoch 后 mAP 开始稳步上升并趋于稳定。如果出现 mAP 波动剧烈的情况可能原因是学习率过大或 batch size 过小。ultralytics 默认有自动学习率调整机制但必要的时候可以手动设置 lr00.001 降低初始学习率。额外提一个参数workers。它控制数据加载的线程数Windows 上默认值有时过高会导致报错我习惯设为 4。这个参数不会影响精度但能减少训练过程中反复报错的概率。3.4 评估指标体系与结果分析训练完成后模型会在 val 集上输出一组评估指标。我需要关注的核心指标有mAP0.5IoU 阈值为 0.5 时的平均精度反映模型的整体检测能力mAP0.5:0.95IoU 从 0.5 到 0.95 的均值更严格地衡量定位精度Precision所有预测框中真正正确的比例Recall所有真实目标中被正确召回的比例我的实测结果是YOLOv8s 在 val 集上 mAP0.5 达到 0.948mAP0.5:0.95 为 0.782。手动轮椅的检测效果最好儿童轮椅稍弱这和样本量低有关系。之前试过用 COCO 预训练权重直接对轮椅图像做推理效果很差Recall 只有 0.34因为模型根本不认识轮椅这个类别。这说明针对本领域数据集做训练是非常必要的预训练权重只提供了底层的特征提取能力具体类别识别必须靠目标领域的数据来学习。4. 常见问题与排查技巧实录4.1 小目标与遮挡导致的漏检轮椅在画面中出现的位置和尺度变化非常大。当摄像机安装在 3 米高的顶角位置时一辆轮椅在画面底部可能只占 40×60 像素这就是典型的小目标场景。YOLOv8 的默认推理对这类目标会漏检。我的排查思路是先看推理结果的热力图确定是模型没学到底层特征还是学到的特征在小尺度上丢失了。如果是前者需要增加小目标样本或者在训练时把 imgsz 提高到 768 甚至 960保持目标在缩放后的像素尺寸但这样会显著增加显存占用。如果是后者最简单的方案是在推理时做多尺度预测也就是同时把原图、1.5 倍放大图、0.8 倍缩小图送入模型合并检测结果。我用这个方式在测试集上把小目标的 Recall 从 0.72 提升到了 0.81代价是单张推理时间增加了约 120%。遮挡问题更麻烦。轮椅被桌子、护栏、行人遮挡时模型经常只检测到露出的轮子或把手。我的建议是标注阶段就定下规则遮挡面积小于 30% 时按整体检测框标注框必须包含遮挡物轮廓的最外沿遮挡面积超过 70% 时不标注这个目标。这个规则能让模型学到更有韧性的特征容忍一定程度的遮挡。4.2 误检与类别混淆训练过程中最容易出现的误检是电动轮椅被识别成手动轮椅或者普通椅子被识别成手动轮椅。普通椅子被误检为轮椅的原因不难理解——两者都有靠背、扶手和坐垫视觉特征有一定重叠。这一类误检的根源是训练样本里缺乏负样本也就是看上去像轮椅但不是轮椅的物体。解决方法是专门采集一批椅子、沙发、推车、购物车的图片标注为空背景放入训练集。这一步非常有效能显著降低误检率。电动轮椅和手动轮椅的混淆则需要从模型结构上想办法。我在类别名称上用英文描述做了区分同时在数据层面把电动轮椅的典型特征区域控制杆、电机、电池盒尽可能清晰地展示在检测框内。经过两轮迭代这两类的区分准确率从 86% 提升到了 94%基本达到了可用水平。4.3 数据量不足与样本不均衡在项目早期我手里只有 2000 多张图手动训练出来的模型 mAP0.5 只有 0.61几乎不可用。后来逐步把数据扩充到 12000 张以上mAP 才提升到了 0.9 以上。数据量翻倍带来的精度提升通常比任何头部调参技巧都更显著。所以遇到模型性能不佳的情况我第一个反思的就是数据够不够分布全不全对于样本不均衡的问题除了一开始的离线增强我还会用 ultralytics 提供的 class weights 参数做损失加权。对样本量少的类别赋予更大的损失权重迫使模型在训练过程中更关注这些少数类别。具体做法是在训练时传递class_weights参数或者手动修改配置文件。实测下来儿童轮椅这一类别的 Recall 从 0.55 提升到了 0.74。4.4 训练不收敛或损失异常有一种比较常见的情况模型训练十几个 epoch 后train/loss 还在缓慢下降但 val/mAP 一直是 0没有任何抬头的迹象。我遇到过两次排查下来一次是因为 labels 目录路径写错模型读不到标注文件一直在空标注上训练另一次是因为某些图像的宽高信息在标注转换时出现了异常导致边界框坐标超出图像边界。遇到这种情况先把data.yaml里的路径重新确认一遍然后检查 labels 目录下是否所有 txt 文件都有对应的图像文件。可以用以下代码快速校验import os images_dir images/train labels_dir labels/train img_files [f.split(.)[0] for f in os.listdir(images_dir)] label_files [f.split(.)[0] for f in os.listdir(labels_dir)] missing_labels set(img_files) - set(label_files) print(fMissing labels: {len(missing_labels)})如果输出结果不为空就说明有图像缺少标注文件需要把这些图像移出训练集或者补标。还有一种情况是文本编码问题某些标注文件保存时用了 UTF-8 带 BOM 的格式第一行会多一个不可见字符导致读取失败。批量处理时我会用 Python 把 txt 统一转成无 BOM 的 UTF-8 格式。5. 模型轻量化与场景落地扩展5.1 模型压缩与推理加速训练完成的 YOLOv8s 模型大小约 21MB在边缘设备上游走得动但如果你要部署到嵌入式设备比如 Jetson Nano、RK3588或移动端还需要进一步压缩。最直接的方案是导出为 TensorRT 引擎或 ONNX 格式。用 ultralytics 导出的命令很简单yolo export modelbest.pt formatonnx imgsz640导出 ONNX 后可以用 ONNX Runtime 做 CPU 推理也可以用 TensorRT 在 GPU 上做加速。我把模型转成 TensorRT FP16 精度后单张 640×640 图像的推理延迟从 12ms 降到了 5ms精度几乎无损。如果你的设备不支持 GPU可以考虑用 OpenVINO 做 CPU 加速。还有一个省事的方案是蒸馏。用 YOLOv8m 作为 teacherYOLOv8n 作为 student把大模型的知识迁移到小模型上。我试过一轮小模型的 mAP 从 0.82 提升到了 0.85虽然提升不算多但推理速度比大模型快了近一倍。5.2 实际场景部署的经验我在医院走廊的场景里做过一次真实部署测试发现训练时的模拟数据与现场数据存在不小的分布差异。主要的差异点是医院的荧光灯照明会带来色偏走廊尽头的窗户会产生强烈的逆光地面反光会让轮椅边缘模糊。对策是收集现场数据做增量训练。我在现场架设摄像机采集了三个小时视频抽帧 600 张用已有模型自动标注后人工修正补充到训练集里继续训练。这个操作把现场场景的 mAP 从 0.86 提升到了 0.94。目标检测项目在换一个新场景部署时做小规模的数据补采和微调是性价比最高的做法。部署时还需要考虑目标跟踪。检测只给出每帧的边界框但业务上需要统计轮椅通过数量、判断停留时长这就得接入 ByteTrack 或 DeepSORT 这类跟踪算法。我用的是 ByteTrack它的优势是不需要额外的 ReID 特征提取直接基于检测框做关联速度快且实现简单对轮椅这种运动缓慢的目标效果很好。5.3 从检测到业务闭环的扩展方向轮椅识别数据集一旦建立起来横向扩展的想象空间很大。最直接的是做无障碍通行能力评估统计某个区域在一定时间内轮椅通行数量、高峰时段、平均停留时长这些数据能辅助管理者优化无障碍设施布局。另外一个方向是识别轮椅使用者的潜在需求。比如检测到轮椅在某个区域停留时间过长可以自动通知工作人员前往协助或者检测到轮椅在危险区域如楼梯口、车流量大的路口边缘系统触发预警。这些业务逻辑都不复杂核心都是依赖轮椅检测模型的稳定输出。如果你想把这个数据集做得更完善还可以增加细粒度属性轮椅是空载还是有人乘坐、轮椅是否在移动状态、手动轮椅是否被推行。这些属性需要额外的标注信息但能让整个系统在业务层面变得更有价值。回到最初的话题轮椅识别虽然看起来是个小众方向但它其实覆盖了一个非常重要的社会需求——让无障碍设施真正被看到。从数据集构建到模型落地的整个过程我最大的体会是数据集的精细程度决定了业务系统的上限。公开数据集里没有的类别只能靠自己去采集、标注、迭代这个过程很辛苦但也恰好是护城河所在。希望这篇记录能给你一些可复用的经验少踩几个我踩过的坑。本文还有配套的精品资源点击获取
返回列表