资讯动态

PP-Human 基于人体 ID 图像分类的行为识别二次开发实战:以“打电话”为例

发布时间:2026/9/23 7:57:07 来源:尧图企业网站定制
PP-Human 基于人体 ID 图像分类的行为识别二次开发实战以“打电话”为例【免费下载链接】PaddleDetectionObject Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleDetection本文以 PP-Human 的“打电话”行为识别为例系统讲解在 PaddleDetection 中如何基于“人体 ID 图像分类”方案完成行为识别模型的二次开发从数据集准备、标注文件组织、模型训练与评估、模型导出到接入 PP-Human 推理管线并自定义行为输出的完整闭环。读完本文你将掌握这套方案的选型逻辑、数据工程要点以及如何复用到抽烟、摔倒、闯入等自定义行为的开发中。一、方案概述为什么“打电话”选择基于人体 ID 的图像分类PP-Human 在行为识别场景中内置了五种技术方案基于视频分类、基于图像分类、基于检测、基于跟踪以及基于骨骼点覆盖 90% 以上的常见动作类型方案总览见 action_recognotion/README.md。二次开发的第一步是根据目标行为的时空特征选择最合适的方案基于人体 id 检测如吸烟目标具有明显的特征物体香烟图片级检测即可判定基于人体 id 分类如打电话动作主要由上半身即可区分且目标物手机常被手、头遮挡检测方案难以稳定命中基于骨骼点如摔倒时序性强的单人动作场景无关、泛化性好基于人体 id 跟踪如闯入只关心行人的轨迹与区域关系与人体动作无关基于视频分类如打架多人交互、目标互相遮挡严重需整体视频片段判断。“打电话”属于典型的帧级图像分类任务打电话持续时间长、人物肢体变化小且手机常被遮挡因此 PP-Human 采用基于人体 ID 的分类方案——先用检测 跟踪锁定行人并分配稳定 ID再对每个 ID 对应人物的图像做图片分类将分类结果作为当前时刻的行为。更重要的是该动作仅凭上半身即可区分因此训练与推理都使用半身图来剔除冗余信息、降低训练难度。该方案在仓库中的工程实现为 deploy/pipeline/pphuman/action_infer.py 中的ClsActionRecognizer类继承自属性识别器AttrDetector与 PP-Human 管线通过ID_BASED_CLSACTION配置节挂载对应的完整配置示例见 deploy/pipeline/config/examples/infer_cfg_calling.yml。二、环境准备基于人体 ID 的分类方案模型训练环节复用 PaddleClas 的能力因此需要先按 PaddleClas 官方安装说明完成环境安装包括 PaddlePaddle 框架与 PaddleClas 代码库安装完成后即可进行后续的模型训练与评估流程。说明PaddleClas 是独立的图像分类工具库不在本仓库内本文涉及的训练、评估、导出命令均在 PaddleClas 环境中执行而推理部署环节模型重命名、接入 infer_cfg.yml、后处理与可视化则在当前 PaddleDetection 仓库的 deploy/pipeline 目录下完成。三、数据准备基于图像分类的行为识别方案直接对视频中的图像帧结果进行识别因此模型训练流程与普通图像分类模型完全一致不涉及时序信息。3.1 数据集下载以“打电话”为例训练数据基于公开数据集 UAV-Human。请通过数据集官方渠道填写申请材料后获取下载链接。下载后在UAVHuman/ActionRecognition/RGBVideos路径下包含该数据集的 RGB 视频数据每个视频的文件名即为其标注信息。3.2 训练及测试图像处理根据视频文件名中与行为相关的字段即 action可以筛选出期望识别的动作类型数据正样本视频以打电话为例只需找到文件名中包含A024的视频文件负样本视频除目标动作以外的所有视频。由于视频转图像会产生大量冗余帧需要对数据进行如下处理间隔采样对正样本视频每隔 8 帧采样一帧行人检测裁剪使用行人检测模型将采样帧处理为半身图像取检测框的上半部分即img img[:H/2, :, :]正负样本划分正样本视频采样得到的图像视为正样本负样本视频采样得到的图像视为负样本。注意正样本视频中并非每一帧都完全符合“打电话”这一动作在视频开头和结尾部分会出现冗余动作例如拿起/放下手机的过程需要手工移除这些帧避免引入噪声标签。半身图处理在推理侧同样存在源码 deploy/pipeline/pphuman/action_infer.py 中的crop_half_body方法在送入分类模型前对每个行人图像执行image[:h // 2 1, :, :]裁剪实际实现比文档描述多保留 1 行像素避免边界信息丢失。训练与推理保持一致的“半身图”策略是保证该方案效果的关键细节。3.3 标注文件准备训练数据的标注文件格式遵循 PaddleClas 图像分类数据集格式标注文件样例如下其中0、1分别是图片对应的类别序号每一行采用“空格”分隔图像路径与标注# 每一行采用空格分隔图像路径与标注 train/000001.jpg 0 train/000002.jpg 0 train/000003.jpg 1 ...此外还需要标签文件phone_label_list.txt用于将分类序号映射到具体的类型名称0 make_a_phone_call # 类型0 1 normal # 类型1完成上述内容后将其放置于dataset目录下文件结构如下data/ ├── images # 放置所有图片 ├── phone_label_list.txt # 标签文件 ├── phone_train_list.txt # 训练列表包含图片及其对应类型 └── phone_val_list.txt # 测试列表包含图片及其对应类型四、模型优化4.1 检测-跟踪模型优化基于分类的行为识别模型效果强依赖前序的检测与跟踪效果若实际场景中不能准确检测到行人位置分类模型将无法获得正确的输入图像若难以在不同帧之间正确分配人物 ID则基于 ID 的行为结果会发生错乱使行为识别部分表现受限。如果在实际使用中遇到上述问题请参考 目标检测任务二次开发 以及 多目标跟踪任务二次开发 对检测/跟踪模型进行针对性优化。4.2 半身图预测在“打电话”这一动作中实际通过上半身即可实现动作区分因此在训练和预测过程中将图像由行人全身图换为半身图。这一策略的价值在于剔除腿部、背景等与动作无关的冗余信息让分类模型聚焦于手部-头部区域的判别特征从而降低训练难度、提升精度与收敛速度。五、新增行为完整开发流程当需要新增一个自定义行为例如识别其他上半身动作时核心工作是复用前述数据流程、修改分类配置并重新训练一个分类模型。整个流程与“打电话”示例完全一致步骤如下。5.1 数据准备参考前述内容完成数据准备放置于{root of PaddleClas}/dataset下data/ ├── images # 放置所有图片 ├── label_list.txt # 标签文件 ├── train_list.txt # 训练列表包含图片及其对应类型 └── val_list.txt # 测试列表包含图片及其对应类型其中训练及测试列表如下新增的类别直接填写对应类别号即可# 每一行采用空格分隔图像路径与标注 train/000001.jpg 0 train/000002.jpg 0 train/000003.jpg 1 train/000004.jpg 2 # 新增的类别直接填写对应类别号即可 ...label_list.txt中需要同样对应扩展类型的名称0 make_a_phone_call # 类型0 1 Your New Action # 类型1 ... n normal # 类型n5.2 配置文件设置PaddleClas 中已集成“打电话半身图”分类的训练配置文件PPHGNet_tiny_calling_halfbody.yaml位于 PaddleClas 仓库ppcls/configs/practical_models/下需要重点关注的设置项如下# model architecture Arch: name: PPHGNet_tiny class_num: 2 # 对应新增后的数量 ... # 正确设置image_root与cls_label_path保证image_root cls_label_path中的图片路径能够正确访问图片路径 DataLoader: Train: dataset: name: ImageNetDataset image_root: ./dataset/ cls_label_path: ./dataset/phone_train_list_halfbody.txt ... Infer: infer_imgs: docs/images/inference_deployment/whl_demo.jpg batch_size: 1 transforms: - DecodeImage: to_rgb: True channel_first: False - ResizeImage: size: 224 - NormalizeImage: scale: 1.0/255.0 mean: [0.485, 0.456, 0.406] std: [0.229, 0.224, 0.225] order: - ToCHWImage: PostProcess: name: Topk topk: 2 # 显示topk的数量不要超过类别总数 class_id_map_file: dataset/phone_label_list.txt # 修改后的label_list.txt路径关键配置项说明Arch.class_num必须与新增后的类别总数一致例如原 2 类新增 1 类后改为 3DataLoader.Train.dataset.image_root与cls_label_path二者拼接后应能正确访问图片即image_root为数据集根目录cls_label_path指向训练列表文件Infer.PostProcess.class_id_map_file指向修改后的label_list.txt用于推理时将类别序号映射为名称Infer.PostProcess.topk显示 Top-k 的类别数不要超过类别总数。5.3 模型训练及评估模型训练通过如下命令启动分布式训练export CUDA_VISIBLE_DEVICES0,1,2,3 python3 -m paddle.distributed.launch \ --gpus0,1,2,3 \ tools/train.py \ -c ./ppcls/configs/practical_models/PPHGNet_tiny_calling_halfbody.yaml \ -o Arch.pretrainedTrue其中Arch.pretrained为True表示使用预训练权重帮助训练可以显著提升收敛速度与最终精度。模型评估训练好模型之后通过以下命令评估模型指标python3 tools/eval.py \ -c ./ppcls/configs/practical_models/PPHGNet_tiny_calling_halfbody.yaml \ -o Global.pretrained_modeloutput/PPHGNet_tiny/best_model其中-o Global.pretrained_modeloutput/PPHGNet_tiny/best_model指定了当前最佳权重所在的路径如果指定其他权重只需替换对应的路径即可。5.4 模型导出参考 PaddleClas 的分类模型导出文档可以通过以下命令导出推理模型python tools/export_model.py -c ./PPHGNet_tiny_calling_halfbody.yaml \ -o Global.pretrained_model./output/PPHGNet_tiny/best_model \ -o Global.save_inference_dir./output_inference/PPHGNet_tiny_calling_halfbody然后将导出的模型重命名并加入配置文件以适配 PP-Human 的使用。PP-Human 推理时约定模型文件名为model.pdmodel/model.pdiparams因此需要将 PaddleClas 导出的inference.*系列文件重命名cd ./output_inference/PPHGNet_tiny_calling_halfbody mv inference.pdiparams model.pdiparams mv inference.pdiparams.info model.pdiparams.info mv inference.pdmodel model.pdmodel # 下载预测配置文件 wget PP-Human 模型库中提供的 infer_cfg.yml 下载地址即从 PaddleDetection 的 PP-Human 模型库中下载与PPHGNet_tiny_calling_halfbody对应的预测配置文件infer_cfg.yml放置于模型目录下。至此模型即可被 PP-Human 的ClsActionRecognizer加载并进行实际预测。值得一提的是当前仓库中已内置一份该方案的推理管线配置样例 deploy/pipeline/config/examples/infer_cfg_calling.yml其中ID_BASED_CLSACTION节给出了开箱即用的参数组合ID_BASED_CLSACTION: model_dir: PPHGNet_tiny_calling_halfbody 模型下载地址 batch_size: 8 threshold: 0.8 display_frames: 80 skip_frame_num: 2 enable: True这些参数与 deploy/pipeline/pphuman/action_infer.py 中ClsActionRecognizer.__init__的形参一一对应threshold正类目标行为的置信度阈值低于该值的分类结果按负类处理display_frames即源码中的frame_life单帧分类结果在历史记录中的存活帧数用于时序平滑skip_frame_num跳帧推理间隔非推理帧直接复用上一帧结果用于加速batch_size分类推理的批大小。5.5 自定义行为输出基于人体 ID 分类的行为识别方案将任务转化为对“人物图像”进行图片级别的分类分类结果即视为当前阶段的行为。因此在完成自定义模型的训练与部署后还需要将分类模型结果转化为最终的行为识别结果作为输出并修改可视化的显示结果。转换为行为识别结果转换逻辑的核心实现在 deploy/pipeline/pphuman/action_infer.py 的match_action_with_id方法中该方法将分类结果与跟踪 ID 对齐。核心代码为# 确定分类模型的最高分数输出结果 cls_id_res 1 cls_score_res -1.0 for cls_id in range(len(cls_result[idx])): score cls_result[idx][cls_id] if score cls_score_res: cls_id_res cls_id cls_score_res score # Current now, class 0 is positive, class 1 is negative. if cls_id_res 1 or (cls_id_res 0 and cls_score_res self.threshold): # 如果分类结果不是目标行为或是置信度未达到阈值则根据历史结果确定当前帧的行为 history_cls, life_remain, history_score self.result_history.get( tracker_id, [1, self.frame_life, -1.0]) cls_id_res history_cls cls_score_res 1 - cls_score_res life_remain - 1 if life_remain 0 and tracker_id in self.result_history: del (self.result_history[tracker_id]) elif tracker_id in self.result_history: self.result_history[tracker_id][1] life_remain else: self.result_history[ tracker_id] [cls_id_res, life_remain, cls_score_res] else: # 分类结果属于目标行为则使用将该结果并记录到历史结果中 self.result_history[ tracker_id] [cls_id_res, self.frame_life, cls_score_res] ...这段代码背后是一套基于 ID 的时序平滑机制理解它对于自定义行为非常关键逐 ID 对齐tracker_id来自多目标跟踪结果mot_result分类结果按行人框顺序与 ID 一一匹配置信度门控当前约定类别 0 为正类目标行为、类别 1 为负类。当最高分落在负类或落在正类但置信度低于self.threshold时认为当前帧分类不可信历史兜底不可信时从self.result_history中取出该 ID 的历史分类结果与剩余存活帧数life_remain用历史结果覆盖当前帧并将存活帧数减 1存活帧数耗尽则删除该 ID 的历史记录正向刷新分类结果可信时将[cls_id_res, self.frame_life, cls_score_res]写入历史重新开始计生命周期。self.frame_life由配置中的display_frames决定默认 80它决定了“单次可信分类结果能连续覆盖多少帧的不可信结果”本质上是行为状态的保持时长可有效消除单帧误判引起的识别抖动。此外deploy/pipeline/pphuman/action_infer.py 的predict_with_mot还实现了跳帧复用当skip_frame_cnt未到达skip_frame_num且当前帧的 ID 集合与上一帧完全一致时直接调用reuse_result复用历史结果跳过分类推理从而在长时监控场景下显著降低计算开销。修改可视化输出目前基于 ID 的行为识别是根据行为识别结果及预定义的类别名称进行展示的。相关逻辑位于 deploy/pipeline/pipeline.py 的visualize_video方法中cls_action_res result.get(cls_action) if cls_action_res is not None: visual_helper_for_display.append(self.cls_action_visual_helper) action_to_display.append(Calling)其中Calling即当前行为的展示名称随后调用visualize_action在画面中叠加绘制行为标签。如果自定义的行为需要修改为其他的展示名称请对应修改此处action_to_display.append(...)中的字符串以正确输出对应结果。同样若修改了类别定义例如多类别行为还需同步检查 deploy/pipeline/pphuman/action_utils.py 中可视化的辅助逻辑是否与类别数量匹配。六、总结基于人体 ID 图像分类的行为识别方案将“视频级行为识别”降维为“帧级图像分类”具有数据易采集图片级标注、预训练资源丰富、训练成本低等优势特别适合打电话这类“单目标、长持续、上半身可判别”的动作。本文完整覆盖了从方案选型、数据准备、标注组织、模型优化到 PaddleClas 训练/评估/导出、接入 PP-Human 推理管线再到后处理与可视化自定义的全链路开发流程。结合 deploy/pipeline/pphuman/action_infer.py 的ClsActionRecognizer实现与 deploy/pipeline/config/examples/infer_cfg_calling.yml 配置样例你可以快速将其迁移到自定义行为的开发中同系列的其他方案基于检测、基于骨骼点、基于视频分类可参考 action_recognotion 目录 下的对应文档。【免费下载链接】PaddleDetectionObject Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleDetection创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价