基于深度学习的动物姿态检测数据集构建与算法实践
2026/9/4 4:02:07 网站建设 项目流程

简介:PigBehaviorRecognitionDataset是一个面向农业AI、计算机视觉研究者及智能养殖系统开发者的猪姿态检测专用数据集,致力于解决猪只行为识别与健康状态评估中的标注数据匮乏问题。资源包含2000个JSON格式标注文件,对应9744张训练图像与2518张验证图像,完整覆盖Lying、Sleeping、Investigating、Eating、Walking、Moutend六类关键姿态,所有标注均采用精细化框选与类别映射,可直接用于YOLO、RT-DETR等主流目标检测与行为分类模型训练。压缩包大小为809.17MB(7z格式),结构规范,含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 主要支持两大计算机视觉任务:

  1. 目标检测(Object Detection):标注出图像中每一头猪的边界框(Bounding Box)。
  2. 姿态估计(Pose Estimation):在边界框的基础上,进一步标注猪只的关键点(Keypoints)。我们定义了一套包含14个关键点的模型:鼻尖、左眼、右眼、左耳根、右耳根、颈部、肩部(左前、右前)、臀部(左后、右后)、四个蹄部(左前蹄、右前蹄、左后蹄、右后蹄)。这些关键点足以勾勒出猪的基本骨架,用于分析站立、卧倒、行走等姿态。

3.2 标注工具与流程

我们选用的是CVAT(Computer Vision Annotation Tool)。它开源、支持分布式协作,并且完美支持我们需要的两种标注类型(检测框和关键点)。标注流程如下:

  1. 任务创建与分配:在CVAT服务器上创建项目,定义标签(如“pig”)和关键点模板。将清洗后的图像集导入,创建标注任务,并分配给经过培训的标注员。
  2. 标注细则
    • 边界框:要求紧密贴合猪的身体轮廓,特别是站立时四肢展开的情况,框体需包含整个身体,但不必过大。
    • 关键点:标注员需要根据定义的解剖位置精确点击。对于遮挡或不可见的点,标记为“不可见”(occluded),而不是猜测位置。这是保证姿态估计模型训练质量的关键。
  3. 质检与复审:标注完成后,由资深标注员或算法工程师进行抽检和全检。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_idarea以及keypoints(一个长度为14*3=42的列表,格式为[x1, y1, v1, x2, y2, v2, ...],其中v为可见性标志:2可见,1遮挡,0不可见)。

注意:我们强烈建议将数据集划分为训练集(70%)、验证集(20%)和测试集(10%)。划分时采用了分层抽样,确保每个子集在养殖场、时间段、姿态类别上的分布与整体数据集近似,避免因数据划分引入偏差。

4. 基于数据集的核心算法实践

有了高质量的数据集,下一步就是用它来“喂养”模型。这里我以目前最流行的YOLOv8RTMPose为例,分别展示如何用这个数据集进行目标检测和姿态估计任务的训练与评估。

4.1 环境准备与数据转换

首先搭建一个Python深度学习环境,推荐使用Conda管理。

# 创建环境 conda create -n pig_behavior python=3.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 "mmcv>=2.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_ok=True) 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 data=dataset.yaml model=yolov8n.pt epochs=100 imgsz=640 batch=16 # 在验证集上评估 yolo detect val data=dataset.yaml model=runs/detect/train/weights/best.pt # 使用模型进行推理 yolo detect predict model=runs/detect/train/weights/best.pt source='path/to/test/image.jpg'

关键参数解析与调优经验:

  • imgsz: 输入图像尺寸。养殖场摄像头画面中猪通常占比较大,640x640通常足够,增大到896或1024可能带来精度微小提升,但计算量剧增,需权衡。
  • batch: 批次大小。取决于GPU显存,在16GB显存的卡上,640尺寸下batch=16是安全的起点。
  • epochs: 迭代轮数。对于我们的数据集,100个epoch通常能让模型充分收敛。可以通过观察训练损失和验证集mAP曲线来判断。
  • data: 指向我们刚创建的dataset.yaml
  • 数据增强:YOLOv8默认开启了Mosaic、MixUp等强增强。对于猪只检测,这些增强大多有效。但需要注意,如果图像中猪只非常密集,Mosaic增强可能会产生不现实的拼接,可以尝试在args中调整或关闭(mosaic=0.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模型为例:

  1. 准备配置文件:复制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_name='pig', paper_info=dict(), keypoint_info={ 0: dict(name='nose', ...), 1: dict(name='left_eye', ...), # ... 定义所有14个点 }, skeleton_info={ # 定义关键点之间的连接,用于可视化 }, joint_weights=[1.] * 14, # 每个关键点的损失权重 sigmas=[], # 用于OKS计算,可参考COCO人体设定一个初始值再调整 )
  2. 启动训练

    mim train mmpose configs/your_rtmpose_config.py --work-dir work_dirs/pig_pose
  3. 评估与可视化

    mim test mmpose configs/your_rtmpose_config.py work_dirs/pig_pose/best_coco_AP_epoch_xxx.pth

姿态估计训练难点与技巧:

  • 关键点可见性:处理遮挡导致的“不可见”关键点是难点。在损失计算时,需要根据标注中的可见性标志v来忽略对不可见点的回归。MMPose的KeypointMSELossKeypointOHKMMSELoss都支持use_target_weight参数,可以通过一个权重矩阵来实现。
  • 数据增强:对于姿态估计,除了常规的颜色、裁剪增强外,姿态特定增强如随机旋转、缩放、平移非常重要,这能模拟猪只在圈舍中各种角度的活动。但要注意,翻转增强(flip)需要正确配置flip_pairs(左右对称的关键点对),否则会导致模型学习到错误的左右关系。
  • 评价指标:主要看OKS-based mAP(Object Keypoint Similarity)。OKS类似于目标检测中的IoU,它考虑了关键点位置误差和该点本身的尺度(通常用猪的边界框面积或躯干尺寸来近似)。需要根据猪的解剖结构,为每个关键点设定一个合理的sigma值(表示该点的标注不确定性),这需要一些实验来调整。

5. 应用场景延伸与模型部署考量

训练好的模型最终要落地。在养殖场环境下,部署面临几个现实约束:算力有限(边缘设备)、网络不稳定(可能无法实时回传云端)、需要低延迟(实时预警)。

5.1 模型轻量化与优化

对于检测模型(YOLOv8),可以选择更小的变体如YOLOv8nYOLOv8s,并使用**模型剪枝(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}, dtype=torch.qint8) torch.save(quantized_model.state_dict(), 'best_quantized.pt')

对于姿态估计模型(RTMPose),其本身设计就较为轻量。可以进一步考虑使用知识蒸馏,用一个更大的教师模型来指导一个小学生模型,在保持精度的同时减少参数量。

5.2 端到端行为识别流水线

单一的检测或姿态估计只是第一步。一个完整的行为识别系统通常是一个流水线:

  1. 目标检测:从画面中定位所有猪只。
  2. 多目标跟踪:为每一头猪分配一个唯一ID,并在视频序列中持续跟踪。可以使用ByteTrackDeepSORT等算法,结合检测框和表观特征(Re-ID模型)来实现。这对于分析个体猪的连续行为至关重要。
  3. 姿态估计:对跟踪到的每个目标框,裁剪出来送入姿态估计模型,获取关键点。
  4. 行为分类:基于关键点序列(时空信息)进行分类。例如:
    • 静态行为(站、卧):可以通过躯干与地面的夹角、关键点高度等简单规则判断。
    • 动态行为(走、跑、咬斗):需要分析关键点在时间上的运动轨迹。可以使用时序模型(如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小目标检测层(通过修改模型配置文件)。在训练时,可以适当提高lossboxobj的权重。
  • 问题:姿态估计模型的关键点“漂移”,特别是被遮挡的点。
    • 排查:可视化预测结果,看漂移是否有规律(如总是预测到某个固定位置)。
    • 解决:确保标注中遮挡点被正确标记为“occluded”且坐标设为0。检查数据增强中的翻转配置flip_pairs是否正确。可以尝试使用更鲁棒的损失函数,如WingLossAdaptiveWingLoss,它们对 outliers(异常点)不那么敏感。考虑引入热图(Heatmap)回归方法代替直接坐标回归,热图方法对位置模糊有一定的容忍度。
  • 问题:模型在边缘设备上推理速度慢。
    • 解决:如前所述,进行模型量化(INT8)。使用更高效的推理引擎,如TensorRT(针对Nvidia设备)或ONNX Runtime(跨平台)。对于视频流,可以降低处理帧率(如从30fps降到5fps),或者采用运动检测触发式分析,只在有物体移动时才启动完整模型推理。

6.3 工程部署问题

  • 问题:跟踪ID频繁跳变(ID Switch)。
    • 解决:提高检测器的召回率(Recall),避免漏检导致跟踪断裂。为跟踪器(如DeepSORT)使用更强的Re-ID特征提取模型,可以专门用数据集中裁剪出的猪只图像(多角度)训练一个简单的Re-ID网络。调整跟踪器的匹配阈值(IoU阈值和外观特征余弦距离阈值),在准确性和稳定性之间取得平衡。
  • 问题:系统延迟高,无法实时。
    • 解决:对整个流水线进行性能剖析(Profiling),找出瓶颈。通常是姿态估计模型最耗时。可以考虑异步处理:检测和跟踪以较高帧率运行,姿态估计则以较低帧率运行,或者只对行为可疑的个体进行全姿态估计。使用流水线并行,将不同阶段的任务分配到不同的处理线程或核心上。

构建和用好一个专用数据集,是解决行业实际问题的坚实第一步。PigBehaviorRecognitionDataset 只是一个起点,围绕它进行的模型训练、优化和部署,才是一整套技术落地的闭环。希望这份详细的拆解,能为你进入这个有趣且实用的领域提供一块可靠的垫脚石。在实际操作中,最宝贵的经验往往来自于对失败案例的反复分析和调试,保持耐心,持续迭代,你会得到意想不到的收获。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询