ARTICLE DETAIL

资讯详情

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

基于深度学习的动物姿态检测数据集构建与算法实践

基于深度学习的动物姿态检测数据集构建与算法实践 简介PigBehaviorRecognitionDataset是一个面向农业AI、计算机视觉研究者及智能养殖系统开发者的猪姿态检测专用数据集致力于解决猪只行为识别与健康状态评估中的标注数据匮乏问题。资源包含2000个JSON格式标注文件对应9744张训练图像与2518张验证图像完整覆盖Lying、Sleeping、Investigating、Eating、Walking、Moutend六类关键姿态所有标注均采用精细化框选与类别映射可直接用于YOLO、RT-DETR等主流目标检测与行为分类模型训练。压缩包大小为809.17MB7z格式结构规范含labels_count.json等统计与元信息文件便于快速校验数据分布与加载逻辑。目前已有259人学习下载适用于构建端到端的猪只行为分析Pipeline支持智能巡检、应激预警、饲喂优化等落地场景是开展动物行为识别科研与产业应用的重要基准数据支撑。1. 项目概述从“猪姿态检测”说起最近在农业智能化、动物福利监测这些领域数据成了最核心的“燃料”。我手头刚整理完一个叫PigBehaviorRecognitionDataset的数据集顾名思义它是专门用来做猪的姿态行为识别与检测的。这玩意儿听起来可能有点偏门但背后的需求其实非常实在。无论是大型现代化养殖场还是高校的农业工程、动物科学研究都需要一种非接触、自动化的方式来监测猪只的健康状况和行为模式。传统的靠人工巡检不仅效率低、主观性强而且很难做到7x24小时不间断。这时候计算机视觉技术特别是基于深度学习的目标检测与姿态估计就派上了大用场。这个数据集就是为了训练和验证这类算法而生的。它不是一个简单的图片集合而是包含了经过精细标注的、能够反映猪只多种典型姿态如站立、卧倒、行走、采食、饮水等的图像或视频序列。对于想进入“智慧养殖”或者“动物行为分析”这个交叉领域的研究者、工程师甚至学生来说一个高质量、标注规范的数据集是迈出第一步的关键。它能帮你快速验证模型思路避免在数据清洗和标注上耗费大量不必要的时间。接下来我就把这个数据集的构建思路、核心内容、使用方法和一些踩过的“坑”详细拆解一下。2. 数据集核心设计思路与场景解析2.1 为什么要做“猪姿态”数据集在深入细节之前我们得先搞清楚需求从哪来。猪的姿态和行为是反映其健康状况、福利水平乃至生产性能的关键指标。比如长时间卧倒不动可能意味着生病采食频率下降可能是应激或疾病的早期信号猪只间的攻击性行为如咬耳、咬尾则需要及时干预。人工监测几乎无法做到实时和量化。因此自动化视觉监测系统的核心任务就是从视频流中持续地、准确地识别出每一头猪并判断它在干什么。这就对数据集提出了几个明确要求多样性、精确性和场景真实性。多样性要求覆盖不同品种、日龄、体型的猪以及在圈舍内各种光照白天、夜晚补光、遮挡猪只相互重叠、栏杆遮挡情况下的图像。精确性则要求标注不仅要框出猪还要能定位其关键身体部位如头、耳、躯干、四肢以便进行更细粒度的姿态分析。场景真实性意味着数据最好直接来源于真实的养殖场环境而不是实验室摆拍这样训练出的模型才有实际部署价值。2.2 数据采集与处理管道构建这样一个数据集第一步是获取原始数据。我们的数据主要来自与几家规模化养殖场合作在保育舍、育肥舍等关键区域部署了多个固定角度的网络摄像头进行长期、不间断的视频采集。这里有几个关键点摄像头选型与部署我们选择了支持RTSP流的主流安防摄像头分辨率至少1080P具备一定的低照度性能以适应夜间红外模式。部署位置要避开直射光并尽可能覆盖猪只活动的主要区域如采食区、饮水区、休息区同时要避免严重的透视畸变。数据清洗与采样原始视频数据量巨大且包含大量无猪的空场景或重复画面。我们开发了一套自动化的预处理脚本首先使用一个轻量级的预训练检测模型如YOLOv5s对视频进行抽帧例如每秒1帧并做初步检测过滤掉完全没有检测框的帧然后对剩下的帧进行去重使用感知哈希或特征相似度最后人工进行二次筛选确保保留下来的帧覆盖了各种姿态、光照条件和遮挡情况。数据隐私与合规这是一个必须严肃对待的问题。所有采集的数据均在与养殖场签订的协议框架下进行确保不侵犯任何商业隐私。数据集公开发布前我们会对所有图像进行匿名化处理确保无法追溯到具体养殖场并采用适合的开放许可证如Apache License 2.0来明确使用权利和免责条款。3. 数据集标注规范与质量体系3.1 标注任务定义PigBehaviorRecognitionDataset 主要支持两大计算机视觉任务目标检测Object Detection标注出图像中每一头猪的边界框Bounding Box。姿态估计Pose Estimation在边界框的基础上进一步标注猪只的关键点Keypoints。我们定义了一套包含14个关键点的模型鼻尖、左眼、右眼、左耳根、右耳根、颈部、肩部左前、右前、臀部左后、右后、四个蹄部左前蹄、右前蹄、左后蹄、右后蹄。这些关键点足以勾勒出猪的基本骨架用于分析站立、卧倒、行走等姿态。3.2 标注工具与流程我们选用的是CVATComputer Vision Annotation Tool。它开源、支持分布式协作并且完美支持我们需要的两种标注类型检测框和关键点。标注流程如下任务创建与分配在CVAT服务器上创建项目定义标签如“pig”和关键点模板。将清洗后的图像集导入创建标注任务并分配给经过培训的标注员。标注细则边界框要求紧密贴合猪的身体轮廓特别是站立时四肢展开的情况框体需包含整个身体但不必过大。关键点标注员需要根据定义的解剖位置精确点击。对于遮挡或不可见的点标记为“不可见”occluded而不是猜测位置。这是保证姿态估计模型训练质量的关键。质检与复审标注完成后由资深标注员或算法工程师进行抽检和全检。CVAT提供了并排比较、统计报告等功能方便质检。对于不合格的标注任务打回重标。我们设定了两轮质检流程确保标注一致性IoU阈值、关键点位置偏差达到95%以上。3.3 数据集版本与结构最终发布的数据集采用类似COCO的标准格式这能最大程度兼容主流框架如MMDetection, Detectron2, YOLO系列。目录结构如下PigBehaviorRecognitionDataset/ ├── images/ │ ├── train2017/ # 训练集图片 │ ├── val2017/ # 验证集图片 │ └── test2017/ # 测试集图片可提供或不提供标签 ├── annotations/ │ ├── instances_train2017.json # COCO格式训练集标注 │ ├── instances_val2017.json # COCO格式验证集标注 │ └── keypoints_train2017.json # COCO格式关键点训练标注可选 └── README.md # 数据集说明文档标注的JSON文件严格遵循COCO数据格式包含了images,annotations,categories三个主要部分。在categories中我们定义了“pig”类别并在其keypoints字段中列出了所有14个关键点的名称和连接顺序用于可视化骨架。annotations中的每个对象都包含了bbox[x, y, width, height]、category_id、area以及keypoints一个长度为14*342的列表格式为[x1, y1, v1, x2, y2, v2, ...]其中v为可见性标志2可见1遮挡0不可见。注意我们强烈建议将数据集划分为训练集70%、验证集20%和测试集10%。划分时采用了分层抽样确保每个子集在养殖场、时间段、姿态类别上的分布与整体数据集近似避免因数据划分引入偏差。4. 基于数据集的核心算法实践有了高质量的数据集下一步就是用它来“喂养”模型。这里我以目前最流行的YOLOv8和RTMPose为例分别展示如何用这个数据集进行目标检测和姿态估计任务的训练与评估。4.1 环境准备与数据转换首先搭建一个Python深度学习环境推荐使用Conda管理。# 创建环境 conda create -n pig_behavior python3.8 conda activate pig_behavior # 安装PyTorch (请根据你的CUDA版本选择) pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装Ultralytics YOLOv8 pip install ultralytics # 安装MMPose (用于RTMPose) pip install openmim mim install mmengine mim install mmcv2.0.0 mim install mmpose我们的数据集已经是COCO格式对于YOLOv8来说需要转换成YOLO格式每个图像一个txt文件每行是class_id x_center y_center width height坐标是归一化的。Ultralytics提供了方便的转换工具但我们需要写个小脚本因为关键点信息也需要转换YOLO格式也支持关键点格式为class_id x_center y_center width height kp1_x kp1_y kp1_v ... kpn_x kpn_y kpn_v。import json import os from pathlib import Path def coco2yolo_keypoints(coco_json_path, images_dir, output_labels_dir): with open(coco_json_path, r) as f: data json.load(f) # 创建图片id到文件名的映射 img_id_to_info {img[id]: img for img in data[images]} # 类别映射我们只有一类‘pig’id为0 cat_id_to_yolo_id {1: 0} # 假设COCO中‘pig’的category_id是1 os.makedirs(output_labels_dir, exist_okTrue) for ann in data[annotations]: image_id ann[image_id] img_info img_id_to_info[image_id] img_w, img_h img_info[width], img_info[height] # 获取边界框 COCO格式是 [x_top_left, y_top_left, width, height] bbox ann[bbox] x_tl, y_tl, w, h bbox # 转换为YOLO中心点坐标并归一化 x_center (x_tl w / 2) / img_w y_center (y_tl h / 2) / img_h w_norm w / img_w h_norm h / img_h # 获取关键点 keypoints ann[keypoints] # 假设是 [x1,y1,v1, x2,y2,v2, ...] num_kpts len(keypoints) // 3 kpts_yolo [] for i in range(num_kpts): x keypoints[i*3] / img_w y keypoints[i*3 1] / img_h v keypoints[i*3 2] kpts_yolo.extend([x, y, v]) # 准备YOLO格式的一行 yolo_line [str(cat_id_to_yolo_id[ann[category_id]]), str(x_center), str(y_center), str(w_norm), str(h_norm)] yolo_line.extend([str(k) for k in kpts_yolo]) line_str .join(yolo_line) # 写入文件文件名与图片名相同扩展名为.txt img_name Path(img_info[file_name]).stem label_file_path os.path.join(output_labels_dir, f{img_name}.txt) with open(label_file_path, a) as lf: lf.write(line_str \n) # 调用函数转换训练集和验证集 coco2yolo_keypoints(annotations/instances_train2017.json, images/train2017, labels/train2017) coco2yolo_keypoints(annotations/instances_val2017.json, images/val2017, labels/val2017)转换后目录结构应调整为YOLO标准格式dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/然后创建一个dataset.yaml配置文件# dataset.yaml path: /path/to/your/dataset # 数据集根目录 train: images/train val: images/val # 类别 names: 0: pig # 关键点配置 (如果做姿态估计) kpt_shape: [14, 3] # 14个关键点每个点3个值 (x, y, visibility) flip_idx: [2,1, 4,3, 6,5, 8,7, 10,9, 12,11, 13,13] # 左右对称关键点索引用于数据增强需根据你的关键点定义顺序调整4.2 使用YOLOv8进行猪只检测训练YOLOv8的命令行接口非常简洁。我们首先进行目标检测训练不包含关键点。# 训练检测模型 yolo detect train datadataset.yaml modelyolov8n.pt epochs100 imgsz640 batch16 # 在验证集上评估 yolo detect val datadataset.yaml modelruns/detect/train/weights/best.pt # 使用模型进行推理 yolo detect predict modelruns/detect/train/weights/best.pt sourcepath/to/test/image.jpg关键参数解析与调优经验imgsz: 输入图像尺寸。养殖场摄像头画面中猪通常占比较大640x640通常足够增大到896或1024可能带来精度微小提升但计算量剧增需权衡。batch: 批次大小。取决于GPU显存在16GB显存的卡上640尺寸下batch16是安全的起点。epochs: 迭代轮数。对于我们的数据集100个epoch通常能让模型充分收敛。可以通过观察训练损失和验证集mAP曲线来判断。data: 指向我们刚创建的dataset.yaml。数据增强YOLOv8默认开启了Mosaic、MixUp等强增强。对于猪只检测这些增强大多有效。但需要注意如果图像中猪只非常密集Mosaic增强可能会产生不现实的拼接可以尝试在args中调整或关闭(mosaic0.5降低概率)。学习率与优化器默认的SGD优化器配合余弦退火学习率调度器效果不错。如果发现训练不稳定损失NaN可以尝试降低初始学习率(lr0)例如从0.01降到0.001。实操心得在养殖场场景下最大的挑战是遮挡和光照变化。夜晚红外模式下图像失去色彩信息且对比度低。我们通过在数据集中包含充足的红外图像并利用灰度图通道复制将单通道红外图复制三份作为RGB的方式喂给模型有效提升了模型在夜间的检测鲁棒性。此外对于卧倒时猪只紧贴地面、边界模糊的情况可以适当增加box损失函数的权重让模型更关注边界框的回归精度。4.3 使用RTMPose进行猪只姿态估计训练姿态估计是更精细的任务。我们使用MMPose框架下的RTMPose模型它是一个轻量级且高效的姿态估计架构。首先需要将COCO格式的关键点标注转换为MMPose支持的格式。MMPose通常使用一个单独的JSON文件其标注结构与COCO关键点数据集类似。假设我们已经有了keypoints_train2017.json其格式与COCO一致。我们需要创建一个MMPose格式的配置文件。这里以RTMPose-tiny模型为例准备配置文件复制MMPose提供的RTMPose配置文件例如configs/body_2d_keypoint/rtmpose/animal/rtmpose-tiny-8xb64-210e_pig-14keypoints-256x256.py并修改数据路径和类别信息。# 在配置文件中主要修改数据源部分 data_root /path/to/PigBehaviorRecognitionDataset/ train_ann_file annotations/keypoints_train2017.json val_ann_file annotations/keypoints_val2017.json # 修改数据集元信息 meta_info指向你的14个关键点定义 dataset_info dict( dataset_namepig, paper_infodict(), keypoint_info{ 0: dict(namenose, ...), 1: dict(nameleft_eye, ...), # ... 定义所有14个点 }, skeleton_info{ # 定义关键点之间的连接用于可视化 }, joint_weights[1.] * 14, # 每个关键点的损失权重 sigmas[], # 用于OKS计算可参考COCO人体设定一个初始值再调整 )启动训练mim train mmpose configs/your_rtmpose_config.py --work-dir work_dirs/pig_pose评估与可视化mim test mmpose configs/your_rtmpose_config.py work_dirs/pig_pose/best_coco_AP_epoch_xxx.pth姿态估计训练难点与技巧关键点可见性处理遮挡导致的“不可见”关键点是难点。在损失计算时需要根据标注中的可见性标志v来忽略对不可见点的回归。MMPose的KeypointMSELoss或KeypointOHKMMSELoss都支持use_target_weight参数可以通过一个权重矩阵来实现。数据增强对于姿态估计除了常规的颜色、裁剪增强外姿态特定增强如随机旋转、缩放、平移非常重要这能模拟猪只在圈舍中各种角度的活动。但要注意翻转增强(flip)需要正确配置flip_pairs左右对称的关键点对否则会导致模型学习到错误的左右关系。评价指标主要看OKS-based mAPObject Keypoint Similarity。OKS类似于目标检测中的IoU它考虑了关键点位置误差和该点本身的尺度通常用猪的边界框面积或躯干尺寸来近似。需要根据猪的解剖结构为每个关键点设定一个合理的sigma值表示该点的标注不确定性这需要一些实验来调整。5. 应用场景延伸与模型部署考量训练好的模型最终要落地。在养殖场环境下部署面临几个现实约束算力有限边缘设备、网络不稳定可能无法实时回传云端、需要低延迟实时预警。5.1 模型轻量化与优化对于检测模型YOLOv8可以选择更小的变体如YOLOv8n或YOLOv8s并使用**模型剪枝Pruning和量化Quantization**技术进一步压缩。剪枝移除网络中冗余的通道或权重。可以使用一些开源工具如Torch-Pruning在微调Fine-tune的同时进行剪枝。量化将模型权重和激活从FP32转换为INT8。这能显著减少模型大小和推理时间对边缘设备如Jetson Nano, Nvidia Jetson Orin, 瑞芯微RK3588等非常友好。可以使用PyTorch的量化工具或TensorRT进行后量化。# 一个简单的PyTorch静态量化示例针对训练好的检测模型 import torch from torch.quantization import quantize_dynamic # 加载训练好的模型 model torch.load(best.pt)[model].float() # 动态量化对全连接层和卷积层效果较好 quantized_model quantize_dynamic(model, {torch.nn.Linear, torch.nn.Conv2d}, dtypetorch.qint8) torch.save(quantized_model.state_dict(), best_quantized.pt)对于姿态估计模型RTMPose其本身设计就较为轻量。可以进一步考虑使用知识蒸馏用一个更大的教师模型来指导一个小学生模型在保持精度的同时减少参数量。5.2 端到端行为识别流水线单一的检测或姿态估计只是第一步。一个完整的行为识别系统通常是一个流水线目标检测从画面中定位所有猪只。多目标跟踪为每一头猪分配一个唯一ID并在视频序列中持续跟踪。可以使用ByteTrack或DeepSORT等算法结合检测框和表观特征Re-ID模型来实现。这对于分析个体猪的连续行为至关重要。姿态估计对跟踪到的每个目标框裁剪出来送入姿态估计模型获取关键点。行为分类基于关键点序列时空信息进行分类。例如静态行为站、卧可以通过躯干与地面的夹角、关键点高度等简单规则判断。动态行为走、跑、咬斗需要分析关键点在时间上的运动轨迹。可以使用时序模型如LSTM, Transformer或提取光流特征结合CNN进行分类。交互行为聚集、隔离需要结合多目标的位置和姿态关系进行分析。这个流水线可以部署在边缘服务器上接收多个摄像头的RTSP流进行实时分析并将行为统计结果如“3号栏舍卧倒率超过80%持续2小时”和预警信息推送到管理人员的手机或电脑端。5.3 持续学习与数据闭环模型部署后性能可能会因为环境变化如季节导致光照变化、猪只日龄增长体型变化而下降。因此建立一个**持续学习Continual Learning**的闭环系统很重要。系统可以设置一个置信度阈值自动筛选出模型预测置信度低或与历史行为模式差异大的样本经过人工或半自动审核后加入训练集定期对模型进行增量更新。这能保证系统在长期运行中保持最佳状态。6. 常见问题与避坑指南在实际构建和使用这个数据集的过程中我们遇到了不少问题这里总结一下希望能帮你少走弯路。6.1 数据层面问题问题标注一致性差。不同标注员对“紧密贴合”的边界框和“精确”的关键点位置理解不同。解决方案制作详细的标注手册包含大量正例和反例图片。在CVAT中设置标注任务时使用“插值”功能标注视频关键帧可以减少工作量并提高序列一致性。定期组织标注员进行交叉评审。问题类别不平衡。某些罕见行为如攻击行为、跳跃的样本很少。解决方案主动采集在数据采集阶段可以针对这些行为进行触发式录制。数据增强对少数类样本使用更强的增强如旋转、裁剪、颜色抖动。算法层面在损失函数中使用类别权重Focal Loss或采用过采样技术。问题夜间红外图像质量差。图像模糊、噪声大、关键点难以辨认。解决方案在标注阶段对于红外图像中确实无法辨认的关键点坚决标记为“不可见”occluded不要猜测。训练时可以尝试对红外图像进行预处理如直方图均衡化、CLAHE对比度受限的自适应直方图均衡来增强对比度或者使用专门在红外图像上预训练的骨干网络如果存在进行微调。6.2 模型训练问题问题检测模型在密集场景下漏检或误检严重。排查检查验证集上小目标远处的小猪的AP值是否特别低。查看混淆矩阵是否容易将猪只与食槽、栏杆等背景混淆。解决增加数据集中密集和小目标样本的比例。调整模型锚框Anchor的尺寸使其更匹配数据集中猪只的宽高比。可以尝试使用YOLOv8的P2或P3小目标检测层通过修改模型配置文件。在训练时可以适当提高loss中box和obj的权重。问题姿态估计模型的关键点“漂移”特别是被遮挡的点。排查可视化预测结果看漂移是否有规律如总是预测到某个固定位置。解决确保标注中遮挡点被正确标记为“occluded”且坐标设为0。检查数据增强中的翻转配置flip_pairs是否正确。可以尝试使用更鲁棒的损失函数如WingLoss或AdaptiveWingLoss它们对 outliers异常点不那么敏感。考虑引入热图Heatmap回归方法代替直接坐标回归热图方法对位置模糊有一定的容忍度。问题模型在边缘设备上推理速度慢。解决如前所述进行模型量化INT8。使用更高效的推理引擎如TensorRT针对Nvidia设备或ONNX Runtime跨平台。对于视频流可以降低处理帧率如从30fps降到5fps或者采用运动检测触发式分析只在有物体移动时才启动完整模型推理。6.3 工程部署问题问题跟踪ID频繁跳变ID Switch。解决提高检测器的召回率Recall避免漏检导致跟踪断裂。为跟踪器如DeepSORT使用更强的Re-ID特征提取模型可以专门用数据集中裁剪出的猪只图像多角度训练一个简单的Re-ID网络。调整跟踪器的匹配阈值IoU阈值和外观特征余弦距离阈值在准确性和稳定性之间取得平衡。问题系统延迟高无法实时。解决对整个流水线进行性能剖析Profiling找出瓶颈。通常是姿态估计模型最耗时。可以考虑异步处理检测和跟踪以较高帧率运行姿态估计则以较低帧率运行或者只对行为可疑的个体进行全姿态估计。使用流水线并行将不同阶段的任务分配到不同的处理线程或核心上。构建和用好一个专用数据集是解决行业实际问题的坚实第一步。PigBehaviorRecognitionDataset 只是一个起点围绕它进行的模型训练、优化和部署才是一整套技术落地的闭环。希望这份详细的拆解能为你进入这个有趣且实用的领域提供一块可靠的垫脚石。在实际操作中最宝贵的经验往往来自于对失败案例的反复分析和调试保持耐心持续迭代你会得到意想不到的收获。本文还有配套的精品资源点击获取
返回列表