资讯动态

PaddleDetection 基于人体ID的检测式行为识别开发指南:以烟头检测(Smoking)为例

发布时间:2026/9/23 8:21:40 来源:尧图企业网站定制
人工智能深度学习计算机视觉【免费下载链接】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点击查看免费下载导读本文面向希望在 PaddleDetection 中落地基于人体ID的检测式行为识别ID-Based Detection Action Recognition方案的开发者。该方案的核心思路是不直接训练时序行为分类网络而是把行为识别问题转化为在单人图像中检测目标特征对象如烟头再由上游行人检测与多目标跟踪MOT为每个行人分配稳定 ID最后把检测结果与行人 ID 关联输出某 ID 的行人正在发生某行为的结论。读完本文你将掌握从环境准备、数据标注、模型优化到新增自定义行为类别、训练评估、模型导出再到自定义行为输出与可视化修改的完整二次开发链路并理解其背后的源码实现原理。一、方案总览为什么用检测来做行为识别在 PaddleDetection 的 PP-Human 体系中行为识别Action Recognition分为多种技术路线参见 action_recognotion 目录基于人体ID的检测式识别ID_BASED_DETACTION在裁剪出的单人图像上检测目标特征物检测到即视为行为发生基于人体ID的分类式识别ID_BASED_CLSACTION对单人图像做图像分类如打电话基于骨架的识别SKELETON_ACTION利用关键点序列做时序分类如摔倒基于视频的识别VIDEO_ACTION对视频片段做时序识别如打架。本文聚焦第一条路线即 idbased_det.md 所讲述的基于人体id的检测模型开发。它的流水线在 pipeline.py 中由ID_BASED_DETACTION配置项驱动先运行行人检测 跟踪得到mot_res再按跟踪框裁剪出单人图像crop_input送入DetActionRecognizer检测特征物最后将结果按tracker_id与行人绑定。从源码结构看DetActionRecognizer类定义于 deploy/pipeline/pphuman/action_infer.py其内部组合了一个通用的Detectordeploy/python/infer.py负责模型推理因此烟头检测模型的训练与导出与普通目标检测任务完全一致可以直接复用 PaddleDetection 的检测训练框架。二、环境准备基于人体ID的检测方案直接使用 PaddleDetection 的功能进行模型训练因此无需额外的环境组件。请按照仓库内的 安装说明 完成环境安装包括安装 PaddlePaddleCPU 或 GPU 版本安装 PaddleDetection 及其依赖见 requirements.txt验证python tools/train.py可正常运行。环境就绪后即可进行后续的模型训练及使用流程。三、数据准备按通用检测数据格式组织单人图像基于检测的行为识别方案中数据准备的流程与一般的检测模型一致详情可参考 目标检测数据准备。将图像和标注数据组织成 PaddleDetection 支持的格式之一如 COCO、VOC 等即可。注意在实际使用的预测过程中使用的是单人图像进行预测由 PP-Human 的 MOT 模块裁剪得到因此在训练过程中建议将图像裁剪为单人图像再进行烟头检测框的标注以提升准确率。也就是说训练数据与推理输入的分布应当保持一致避免训练时看到整张监控画面、推理时却输入单人裁剪图带来的域差异。四、模型优化三个关键方向4.1 检测-跟踪模型优化基于检测的行为识别模型效果依赖于前序的检测和跟踪效果。如果实际场景中不能准确检测到行人位置或是难以正确在不同帧之间分配人物 ID都会使行为识别部分表现受限检测漏检 → 行人根本没被裁剪出来后续烟头检测无从谈起跟踪 ID 跳变 → 行为结果无法稳定归属到同一行人输出抖动。如果在实际使用中遇到上述问题请参考 目标检测任务二次开发 以及 多目标跟踪任务二次开发 对检测/跟踪模型进行优化。4.2 使用更大的分辨率烟头的检测在监控视角下是一个典型的小目标检测问题——烟头往往只占几十个像素使用更大的输入分辨率有助于提升模型整体的识别率。配置中的输入尺寸由_BASE_引用的 reader 配置决定可在训练配置中覆盖TrainReader的相关字段进行调整。4.3 使用小目标场景预训练模型加入小目标场景数据集 VisDrone 下的预训练模型进行训练模型 mAP 由 38.1 提升到 39.7。这正是仓库提供的 ppyoloe_crn_s_80e_smoking_visdrone.yml 的做法pretrain_weights: https://paddledet.bj.bcebos.com/models/ppyoloe_crn_s_80e_visdrone.pdparams即先在 VisDrone小目标密集场景上预训练再在烟头数据集上微调通过迁移学习显著提升小目标识别能力。五、新增自定义行为完整实操5.1 数据准备参考 目标检测数据准备 完成训练数据准备。准备完成后数据路径组织为dataset/smoking ├── smoking # 存放所有的图片 │ ├── 1.jpg │ ├── 2.jpg ├── smoking_test_cocoformat.json # 测试标注文件 ├── smoking_train_cocoformat.json # 训练标注文件以COCO格式为例完成后的 json 标注文件内容如下# images字段下包含了图像的路径id及对应宽高信息 images: [ { file_name: smoking/1.jpg, id: 0, # 此处id为图片id序号不要重复 height: 437, width: 212 }, { file_name: smoking/2.jpg, id: 1, height: 655, width: 365 }, ... # categories 字段下包含所有类别信息如果希望新增更多的检测类别请在这里增加, 示例如下。 categories: [ { supercategory: cigarette, id: 1, name: cigarette }, { supercategory: Class_Defined_by_Yourself, id: 2, name: Class_Defined_by_Yourself }, ... # annotations 字段下包含了所有目标实例的信息包括类别检测框坐标, id, 所属图像id等信息 annotations: [ { category_id: 1, # 对应定义的类别在这里1代表cigarette bbox: [ 97.0181345931, 332.7033243081, 7.5943999555, 16.4545332369 ], id: 0, # 此处id为实例的id序号不要重复 image_id: 0, # 此处为实例所在图片的id序号可能重复即一张图片上有多个实例对象 iscrowd: 0, area: 124.96230648208665 }, { category_id: 2, # 对应定义的类别在这里2代表Class_Defined_by_Yourself bbox: [ 114.3895698372, 221.9131122343, 25.9530363697, 50.5401234568 ], id: 1, image_id: 1, iscrowd: 0, area: 1311.6696622034585 } ]字段要点总结字段含义注意点images[].file_name图片相对路径需与dataset_dir image_dir拼接后能定位到真实图片images[].id图片 ID 序号全局唯一不要重复categories[].id类别 ID从 1 开始计数COCO 惯例新增类别继续递增categories[].name类别名称会用于后处理与可视化名称关联annotations[].category_id实例所属类别对应categories[].idannotations[].bbox检测框坐标COCO 格式为[x, y, w, h]左上角坐标 宽高annotations[].image_id实例所在图片 ID同一图片多个实例时可重复annotations[].iscrowd是否密集人群通常为 05.2 配置文件设置参考 ppyoloe_crn_s_80e_smoking_visdrone.yml其中需要关注的重点如下metric: COCO num_classes: 1 # 如果新增了更多的类别请对应修改此处 # 正确设置image_diranno_pathdataset_dir # 保证dataset_dir anno_path 能正确对应标注文件的路径 # 保证dataset_dir image_dir 标注文件中的图片路径可以正确对应到图片路径 TrainDataset: !COCODataSet image_dir: anno_path: smoking_train_cocoformat.json dataset_dir: dataset/smoking data_fields: [image, gt_bbox, gt_class, is_crowd] EvalDataset: !COCODataSet image_dir: anno_path: smoking_test_cocoformat.json dataset_dir: dataset/smoking TestDataset: !ImageFolder anno_path: smoking_test_cocoformat.json dataset_dir: dataset/smoking关键配置说明metric: COCO评估指标采用 COCO mAP对应 metrics 模块 中的 COCO 评估器num_classes: 1烟头检测只有 1 个正类别如果新增了更多类别必须对应修改此处TrainDataset/EvalDataset均使用!COCODataSet读取标注data_fields声明训练所需的数据字段图像、GT 框、GT 类别、是否 crowdTestDataset使用!ImageFolder支持无标注的纯图片目录推理路径规则dataset_dir anno_path必须能定位到标注文件dataset_dir image_dir 标注文件中的 file_name必须能定位到真实图片。该配置还通过_BASE_继承了 runtime.yml、optimizer_300e.yml、ppyoloe_crn.yml 与 ppyoloe_reader.yml并覆盖为 80 epoch、base_lr: 0.01、CosineDecay 调度、batch_size 16、depth_mult: 0.33、width_mult: 0.50PP-YOLOE-S 尺度等训练超参可直接作为自定义行为训练的模板。5.3 模型训练及评估模型训练参考 PP-YOLOE 使用文档执行下列步骤实现多卡分布式训练# At Root of PaddleDetection python -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/pphuman/ppyoloe_crn_s_80e_smoking_visdrone.yml --eval-c指定训练配置文件--gpus 0,1,2,3指定使用的 GPU 列表单卡可省略paddle.distributed.launch--eval表示训练过程中周期性地在验证集上评估便于监控收敛。训练入口为 tools/train.py训练引擎与回调日志、评估、模型保存由 ppdet/engine/trainer.py 实现配置文件解析逻辑位于 ppdet/core/config。模型评估训练好模型之后可以通过以下命令实现对模型指标的评估# At Root of PaddleDetection python tools/eval.py -c configs/pphuman/ppyoloe_crn_s_80e_smoking_visdrone.yml评估结果会输出 COCO 指标mAP、mAP0.5、mAP0.75 等评估逻辑见 tools/eval.py。5.4 模型导出注意如果在 Tensor-RT 环境下预测请开启-o trtTrue以获得更好的性能# At Root of PaddleDetection python tools/export_model.py -c configs/pphuman/ppyoloe_crn_s_80e_smoking_visdrone.yml -o weightsoutput/ppyoloe_crn_s_80e_smoking_visdrone/best_model trtTrue-o weights...指定要导出的权重路径此处为训练产物中的best_model-o trtTrue在导出阶段即按 TensorRT 推理要求配置动态 shape 等信息。导出模型后可以得到ppyoloe_crn_s_80e_smoking_visdrone/ ├── infer_cfg.yml ├── model.pdiparams ├── model.pdiparams.info └── model.pdmodel至此即可使用 PP-Human 进行实际预测了。在 PP-Human 的管道配置中将 infer_cfg_pphuman.yml 中ID_BASED_DETACTION的model_dir指向该导出目录并开启enable: True即可接入流水线仓库还提供了可直接运行的示例配置 infer_cfg_smoking.yml。该模块的典型参数包括ID_BASED_DETACTION: model_dir: https://bj.bcebos.com/v1/paddledet/models/pipeline/ppyoloe_crn_s_80e_smoking_visdrone.zip batch_size: 8 threshold: 0.6 # 检测置信度阈值高于此值才判定行为发生 display_frames: 80 # 行为结果保持帧数即结果复用窗口 skip_frame_num: 2 # 跳帧推理数跳过的帧直接复用上一帧结果 enable: False六、自定义行为输出把检测结果翻译为行为结论基于人体ID的检测行为识别方案中将任务转化为在对应人物的图像中检测目标特征对象。当目标特征对象被检测到时则视为行为正在发生。因此在完成自定义模型的训练及部署的基础上还需要将检测模型结果转化为最终的行为识别结果作为输出并修改可视化的显示结果。6.1 转换为行为识别结果请对应修改 action_infer.py 中DetActionRecognizer.postprocess方法对应源码 postprocess 实现。核心代码为# 解析检测模型输出并筛选出置信度高于阈值的有效检测框。 # Current now, class 0 is positive, class 1 is negative. action_ret {class: 1.0, score: -1.0} box_num np_boxes_num[idx] boxes det_result[boxes][cur_box_idx:cur_box_idx box_num] cur_box_idx box_num isvalid (boxes[:, 1] self.threshold) (boxes[:, 0] 0) valid_boxes boxes[isvalid, :] if valid_boxes.shape[0] 1: # 存在有效检测框时行为识别结果的类别和分数对应修改 action_ret[class] valid_boxes[0, 0] action_ret[score] valid_boxes[0, 1] # 由于动作的持续性有效检测结果可复用一定帧数 self.result_history[ tracker_id] [0, self.frame_life, valid_boxes[0, 1]] else: # 不存在有效检测框则根据历史检测数据确定当前帧的结果 history_det, life_remain, history_score self.result_history.get( tracker_id, [1, self.frame_life, -1.0]) action_ret[class] history_det action_ret[score] -1.0 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] [ history_det, life_remain, history_score ]这段后处理逻辑体现了两个关键设计类别语义约定class 0表示正类行为发生中即检测到烟头class 1表示负类行为未发生。因此判定条件是boxes[:, 1] self.threshold置信度超阈值且boxes[:, 0] 0类别为正类结果复用机制由于动作具有持续性检测命中后将结果写入self.result_history[tracker_id]并设置生命周期self.frame_life对应配置中的display_frames。后续帧即使暂时检测不到特征物也会在生命周期内沿用历史结果避免行为结果闪烁生命周期耗尽后自动删除历史记录。此外DetActionRecognizer还支持skip_frame_num跳帧推理在 predict 中当处于跳帧阶段且当前帧的 MOT ID 集合与上一帧一致时check_id_is_same直接通过 reuse_result 复用上一帧结果跳过检测模型推理显著降低计算开销。6.2 修改可视化输出目前基于 ID 的行为识别是根据行为识别的结果及预定义的类别名称进行展示的。详细逻辑见 pipeline.py 的可视化部分det_action_res result.get(det_action) if det_action_res is not None: visual_helper_for_display.append(self.det_action_visual_helper) action_to_display.append(Smoking)即det_action的展示名称被硬编码为Smoking。如果自定义的行为需要修改为其他的展示名称请对应修改此处以正确输出对应结果。可视化辅助逻辑由 action_utils.py 中的ActionVisualHelper承担它维护每个mot_id的action_history在update时记录行为类别并重置生命周期在check_detected时对生命周期做倒计时、剔除过期记录并返回当前处于正类class 0的 ID 集合最终的画框与文字绘制由 visualize_action 完成。因此若需要为不同自定义行为显示不同名称只需在action_to_display列表中按det_action/cls_action/skeleton_action的对应关系替换展示文案即可。七、总结与二次开发检查清单基于人体 ID 的检测式行为识别本质上是检测 跟踪 目标特征物检测的流水线组合。完成一次自定义行为开发可按以下清单自检数据单人图像 COCO 格式标注file_name/id/category_id/bbox字段正确图片与标注路径可被dataset_dir image_dir file_name解析到配置num_classes与categories数量一致TrainDataset/EvalDataset/TestDataset三处路径正确训练与评估tools/train.py --eval训练、tools/eval.py评估确认 mAP 达到预期导出tools/export_model.py -o weightsoutput/.../best_model trtTrue得到model.pdmodel等 4 个文件接入将导出目录配置到 infer_cfg_pphuman.yml 的ID_BASED_DETACTION.model_dir并enable: True输出按需修改 action_infer.py 后处理中的类别判定与结果复用逻辑可视化在 pipeline.py 中修改行为展示名称使输出与业务语义一致。按此流程即可在 PP-Human 框架内快速扩展任意可检测特征物即行为的自定义行为识别能力。赞分享人工智能深度学习计算机视觉【免费下载链接】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点击查看免费下载相关推荐PaddleDetection 基于人体 ID 的检测式行为识别开发指南从吸烟检测数据集构建到 PP-Human 自定义行为落地PaddleDetection 基于人体 ID 的检测式行为识别开发指南从吸烟检测数据集构建到 PP Human 自定义行为落地 本文面向希望在 Paddle人工智能深度学习计算机视觉PaddleDetection PP-Human 垂类模型全解析行人检测、吸烟/打电话行为识别与属性识别实战指南PaddleDetection PP Human 垂类模型全解析行人检测、吸烟/打电话行为识别与属性识别实战指南 PP Human 是 PaddleDetec人工智能深度学习计算机视觉PP-Human 快速上手指南基于 PaddleDetection Pipeline 的人体检测、跟踪、属性与行为识别部署实战PP Human 快速上手指南基于 PaddleDetection Pipeline 的人体检测、跟踪、属性与行为识别部署实战 PP Human 是 Padd人工智能深度学习计算机视觉创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价