简介:这份家禽鸡行为数据集面向智慧养殖、动物行为识别方向的算法开发者与高校研究者,可用于训练吃食、喝水、死亡、异常行为、睡觉五类行为的检测模型,适合作为YOLO系列目标检测的入门到进阶实战素材。资源包共1429个文件,包含714张jpg图像与714个同名txt标注文件,另附1个yaml配置文件,整体约39.33MB,标注采用YOLO v11格式,可直接接入训练流程,无需额外转换。图像覆盖室内养殖场与特殊场景,兼顾正常与异常状态样本,便于构建多类别行为识别任务。目前已有382人学习下载,具备一定参考热度。读者可获得完整的数据组织方式、类别定义与标注规范,用于快速复现基线模型、验证数据增强策略或迁移至自有养殖场景,节省从零采集与标注的时间成本。
1. 家禽鸡行为数据集:484 张图、5 类行为,为什么值得先跑通再谈落地
养鸡场里最怕的不是鸡不吃食,而是你根本不知道哪只鸡出了问题。一个 5000 只规模的鸡舍,饲养员巡一遍至少 20 分钟,等发现死鸡或者病鸡趴着不动,往往已经过了最佳处理窗口。家禽鸡行为数据集要解决的就是这件事:用摄像头 + 视觉模型,把吃食、喝水、死亡、异常行为、睡觉这五类状态自动识别出来,让异常在发生后几分钟内被标记,而不是几小时后被偶然发现。
这个数据集给的是 484 张训练集图片,标注格式是 YOLO v11。484 张不算多,但对于行为识别这个细分场景,它足够让你跑通一条完整的链路:从标注检查、格式转换、模型训练到推理验证。适合两类人:一是做智慧养殖、农业物联网的工程师,想快速验证视觉方案能不能落地;二是刚接触 YOLO 目标检测、想拿一个真实场景练手的开发者。下面按“数据长什么样 → 怎么训 → 坑在哪 → 怎么调”的顺序拆开讲。
2. 先看清数据:484 张图里到底标了什么
2.1 五类行为的视觉特征与标注边界
吃食、喝水、死亡、异常行为、睡觉,这五类在图像上的区分度并不均匀。吃食和喝水通常发生在料槽、水线附近,鸡的头部朝向和身体姿态有规律;睡觉是蹲伏、闭眼、集群分布;死亡是侧躺、僵硬、位置固定;异常行为最麻烦,它可能包含跛行、扎堆、张口呼吸、翅膀下垂等多种表现,标注时容易被归成“其他”。
拿到数据集后第一件事不是直接训练,而是抽样看标注框。YOLO 格式的标注是每张图对应一个.txt文件,每行class_id x_center y_center width height,坐标是归一化后的值。你需要确认三件事:类别编号和名称的映射是否一致、有没有漏标、异常行为这一类是否被过度合并。
# 统计每个类别的标注框数量,快速判断类别是否均衡 import os from collections import Counter label_dir = "labels/train" counter = Counter() for f in os.listdir(label_dir): if f.endswith(".txt"): with open(os.path.join(label_dir, f)) as fp: for line in fp: cls = line.strip().split()[0] counter[cls] += 1 print(counter)这段脚本遍历所有标注文件,统计每个class_id出现的次数。如果某一类数量明显偏少(比如死亡行为只有十几框),训练时模型会偏向多数类,需要做重采样或加权。参数上,label_dir换成你的实际路径,类别编号从 0 开始,顺序要和data.yaml里的names完全对应。
2.2 YOLO v11 标注格式与目录结构
YOLO v11 的标注格式和 v5、v8 一致,都是归一化中心点加宽高。目录结构常见做法是:
dataset/ images/ train/ val/ labels/ train/ val/ data.yamldata.yaml内容如下:
path: ./dataset train: images/train val: images/val nc: 5 names: ['eating', 'drinking', 'dead', 'abnormal', 'sleeping']这里nc是类别数,names的顺序必须和标注文件里的class_id一一对应。很多人翻车就翻在这里:标注时把dead编成 2,data.yaml里却写成 3,训练出来的模型会把死亡识别成异常行为,而且 loss 曲线看起来还挺正常,属于典型的“玄学”问题。
提示:改完
data.yaml后,用python -c "import yaml; print(yaml.safe_load(open('data.yaml')))"确认没有语法错误,YAML 对缩进和冒号空格很敏感。
2.3 训练集与验证集怎么切:484 张的分配策略
484 张图如果按 8:2 切,验证集只有 96 张左右。行为识别场景下,同一只鸡在不同帧里可能重复出现,如果随机切分,训练集和验证集可能包含同一只鸡的相邻帧,导致验证指标虚高。更稳妥的做法是按“时间段”或“鸡舍区域”切:比如前 70% 时间段的图做训练,后 30% 做验证;或者按摄像头编号切。
import os, random, shutil random.seed(42) src_img = "raw/images" src_lbl = "raw/labels" train_ratio = 0.8 files = [f for f in os.listdir(src_img) if f.endswith(".jpg")] random.shuffle(files) split = int(len(files) * train_ratio) for i, f in enumerate(files): subset = "train" if i < split else "val" shutil.copy(os.path.join(src_img, f), f"dataset/images/{subset}/{f}") lbl = f.replace(".jpg", ".txt") shutil.copy(os.path.join(src_lbl, lbl), f"dataset/labels/{subset}/{lbl}")这段脚本用固定随机种子做可复现的切分。train_ratio控制训练集比例,random.seed(42)保证每次运行结果一致。如果你的数据来自连续视频抽帧,建议先按视频文件分组再切,避免相邻帧泄漏。
3. 用 YOLO v11 跑通训练:从环境到第一组权重
3.1 环境安装与版本选择
YOLO v11 通过ultralytics包调用,安装命令很直接:
pip install ultralytics如果你有 NVIDIA 显卡,先确认 CUDA 可用:
python -c "import torch; print(torch.cuda.is_available())"输出True再继续。CPU 也能训,但 484 张图在 CPU 上大概要几十分钟一轮,不推荐。显卡显存 6GB 以上基本够用,因为图片尺寸可以压到 640。
注意:不要混装多个版本的
ultralytics和torch,常见翻车是torch版本和 CUDA 驱动不匹配,报错CUDA error: no kernel image is available。先用官方命令装,再按需降级。
3.2 训练命令与关键参数含义
最小训练命令:
yolo detect train \ data=dataset/data.yaml \ model=yolo11n.pt \ epochs=100 \ imgsz=640 \ batch=16 \ device=0 \ project=runs/chicken \ name=exp1逐项说明:data指向你的data.yaml;model=yolo11n.pt用 nano 版预训练权重,参数量小、适合小数据集快速验证;epochs=100是训练轮数,484 张图通常 80~150 轮能看到收敛;imgsz=640是输入分辨率,鸡舍远景图如果鸡只占像素很少,可以提到 960 或 1280,但显存占用会翻倍;batch=16根据显存调整,显存不够就降到 8 或 4;device=0指定第一块 GPU,CPU 训练写device=cpu。
训练开始后重点看三个输出:box_loss、cls_loss、mAP50。box_loss下降说明定位在变准,cls_loss下降说明分类在变好,mAP50是综合指标。如果cls_loss震荡不降,优先检查类别是否混淆。
3.3 训练过程监控与中断恢复
训练日志默认写在runs/chicken/exp1/下,包含results.csv、权重文件best.pt和last.pt。想可视化曲线:
tensorboard --logdir runs/chicken如果训练中断,用resume继续:
yolo detect train resume model=runs/chicken/exp1/weights/last.ptresume会从上次中断的 epoch 继续,优化器状态也会恢复。但注意:如果你改了data.yaml或换了数据集,不要 resume,否则会接着旧配置跑,结果对不上。
3.4 推理验证:用 best.pt 看实际效果
训练结束后,用验证集跑一遍推理:
yolo detect predict \ model=runs/chicken/exp1/weights/best.pt \ source=dataset/images/val \ conf=0.25 \ save=Trueconf=0.25是置信度阈值,低于这个值的框会被过滤。行为识别场景建议先设 0.25 看召回,如果误检多再提到 0.4。输出图片在runs/detect/predict/下,逐张看:吃食和喝水是否被混淆、死亡有没有漏检、异常行为是否被拆成多个框。
from ultralytics import YOLO model = YOLO("runs/chicken/exp1/weights/best.pt") results = model("dataset/images/val", conf=0.25, save=True) for r in results: for box in r.boxes: cls_id = int(box.cls) conf = float(box.conf) print(model.names[cls_id], round(conf, 3))这段代码逐框打印类别和置信度,方便你统计哪一类置信度普遍偏低。model.names是data.yaml里的类别名列表,box.cls是类别索引,box.conf是置信度。
4. 避坑与排查:484 张小数据集最容易翻车的 5 个点
4.1 现象:mAP 很高但实际推理全是错框
原因:验证集和训练集来自同一段视频的相邻帧,模型记住了背景而不是鸡的行为。解决:按时间段或摄像头重新切分,确保验证集里的鸡和训练集不重叠。如果做不到,至少把连续帧打散到不同集合,并在报告里注明这个局限。
4.2 现象:死亡类别几乎检不出来
原因:死亡样本太少,模型被吃食、喝水这些多数类主导。解决:对死亡类别做过采样,或者用copy_paste增强把死亡鸡只粘贴到不同背景;也可以在 loss 里给少数类更高权重,ultralytics支持通过自定义cls_pw调整,但更简单的做法是先保证每类至少 50 个标注框。
4.3 现象:异常行为被拆成多个框或归成睡觉
原因:异常行为的定义太宽,标注时边界不一致。解决:重新审一遍异常行为的标注,把“趴着但睁眼”“跛行”“扎堆”分开看,如果数据集里混在一起,训练前先做一轮清洗,把明显不属于异常行为的框改掉或删掉。类别定义不清,模型再强也学不会。
4.4 现象:训练 loss 不降,mAP 一直 0
原因:data.yaml路径写错,或者images和labels文件名不对应。解决:检查dataset/images/train/下的每张xxx.jpg是否在dataset/labels/train/下有对应的xxx.txt。YOLO 不报错但会跳过找不到标注的图,导致实际训练样本远少于预期。
4.5 现象:显存溢出,batch 降到 1 还是 OOM
原因:imgsz设太大,或者model用了yolo11x.pt这种大模型。解决:先把imgsz降到 640,模型换成yolo11n.pt或yolo11s.pt。484 张图用 nano 或 small 足够,大模型在小数据集上更容易过拟合,而且推理速度慢,边缘设备跑不动。
5. 把 484 张用到极致:增强、微调与边缘部署的取舍
小数据集的瓶颈不在模型结构,而在数据多样性。484 张图如果都来自同一个鸡舍、同一个光照条件,模型换一个场地就会崩。我一般会做三件事:第一,用albumentations做在线增强,重点加随机亮度、对比度、轻微旋转和遮挡,模拟不同时间段的光照和鸡只互相遮挡;第二,用预训练权重做微调时冻结 backbone 前几层,只训 head,减少过拟合;第三,推理时用TTA(测试时增强)提升召回,但速度会下降,边缘设备上要权衡。
from ultralytics import YOLO model = YOLO("yolo11n.pt") model.train( data="dataset/data.yaml", epochs=120, imgsz=640, batch=8, freeze=5, augment=True, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=10, translate=0.1, scale=0.5, fliplr=0.5, )freeze=5冻结前 5 层,hsv_h/s/v控制色调、饱和度、亮度增强幅度,degrees是旋转角度,translate是平移比例,scale是缩放范围,fliplr=0.5表示一半概率水平翻转。这些参数不是越大越好:旋转超过 15 度会让鸡的姿态失真,亮度增强太猛会让死亡和睡觉的区分度下降。
验证方法上,除了看mAP50,我更关注混淆矩阵。在runs/chicken/exp1/下会生成confusion_matrix.png,重点看死亡和睡觉之间有没有互相误判、吃食和喝水是否混在一起。如果这两组混淆严重,说明视觉特征确实接近,需要靠时序信息补:单帧分不清,就取连续 5 帧做投票,或者用轻量时序模型在 YOLO 输出上做二次分类。
边缘部署时,yolo11n.pt导出 ONNX 或 TensorRT 后在 Jetson 这类设备上能跑到实时。但要注意:导出时的imgsz必须和训练一致,否则精度会掉。我习惯在导出前用验证集跑一遍val,记下mAP50,导出后再跑一遍,对比差值超过 2 个点就回去检查预处理。
最后说一个血泪教训:不要等到模型训完才去看数据。484 张图,抽 30 张逐张检查标注,花不了半小时,但能省掉后面几小时的调参。数据质量决定上限,模型只是逼近这个上限。希望帮到你。
本文还有配套的精品资源,点击获取