简介这份家禽鸡行为数据集面向智慧养殖、动物行为识别方向的算法工程师与高校研究者可用于训练吃食、喝水、死亡、异常行为、睡觉五类行为的检测模型适合作为目标检测课程设计、科研实验或养殖场智能监控原型的数据基础。资源包共1429个文件包含714张jpg图像与714个同名txt标注文件另附1个yaml配置文件整体约39.33MB标注采用YOLO v11格式可直接接入主流检测框架训练。图像覆盖室内养殖场、监控视频抽帧等多种场景兼顾正常行为与死亡、异常等少见类别有助于缓解类别不均衡问题。目前已有382人学习下载读者可据此快速搭建行为识别基线验证数据增强、类别平衡与模型微调策略并在此基础上扩展更多行为类别或迁移到其他家禽场景。1. 家禽鸡行为数据集484 张图能训出可用的行为识别模型吗养殖场里最怕的不是鸡不吃食而是你发现得太晚。一只鸡从精神萎靡到死亡中间可能只有几个小时而一个存栏几万只的鸡舍靠人眼逐笼巡检根本不现实。这个标题指向的正是这类场景用 484 张标注好的鸡只图像训练一个能识别吃食、喝水、死亡、异常行为、睡觉五类状态的 YOLO v11 目标检测模型。数据集规模不大但类别定义贴近真实养殖需求标注格式是 YOLO v11 可直接读取的 txt 格式省去了格式转换的麻烦。它适合两类人一是做智慧养殖、农业物联网的算法工程师想快速验证行为识别在边缘设备上的可行性二是养殖企业技术负责人想评估用视觉方案替代人工巡检的投入产出比。484 张图不算多但足够跑通从数据检查到模型部署的完整链路关键在于你怎么用。2. 拆解五类行为标注逻辑与数据分布先摸清2.1 吃食、喝水、睡觉为什么容易混吃食和喝水的视觉特征高度相似鸡头都朝下身体前倾区别只在于头部是否接触料槽或水线。如果拍摄角度偏高料槽和水线在图像里几乎重叠模型很容易把喝水判成吃食。睡觉行为更隐蔽鸡可能卧地闭眼和死亡姿态接近但死亡通常伴随身体僵直、羽毛蓬乱、周围鸡只回避。标注时如果只框住鸡身不区分头部朝向和接触物五类行为会退化成“站着”和“躺着”两类。常见做法是吃食框包含头部与料槽接触区域喝水框包含头部与水线接触区域睡觉框只框鸡身且标注为卧姿死亡框额外标注身体伸展方向。这样模型学到的不是鸡的形状而是鸡与环境的交互关系。2.2 484 张图的类别平衡与划分策略先统计每类样本数。假设吃食 120、喝水 100、睡觉 90、异常 80、死亡 94总计 484。死亡和异常样本通常偏少但这两类恰恰是业务最关心的。划分训练集、验证集、测试集时不能随机打乱要按“同一只鸡的连续帧不能跨集”的原则切分否则验证集里出现训练集同一只鸡的相邻帧指标会虚高。我一般按 7:2:1 切如果死亡样本少于 60 张就提到 8:1:1把更多死亡样本留给训练。验证集里每类至少保留 8 张否则 mAP 波动太大调参没有参考意义。2.3 用脚本检查 YOLO 标注的四个致命问题拿到数据集先别急着训练跑一遍检查脚本。YOLO 格式每行是class_id x_center y_center width height归一化到 0~1。常见问题类别号越界、坐标超出 0~1、宽高为 0、图片和标签文件名不匹配。下面这段 Python 脚本一次性查完import os from pathlib import Path IMG_DIR Path(images/train) LBL_DIR Path(labels/train) NUM_CLASSES 5 problems [] for lbl_path in LBL_DIR.glob(*.txt): img_path IMG_DIR / (lbl_path.stem .jpg) if not img_path.exists(): problems.append(f缺图片: {lbl_path.name}) continue with open(lbl_path) as f: for i, line in enumerate(f): parts line.strip().split() if len(parts) ! 5: problems.append(f{lbl_path.name} 第{i}行字段数{len(parts)}) continue cid int(parts[0]) x, y, w, h map(float, parts[1:]) if cid 0 or cid NUM_CLASSES: problems.append(f{lbl_path.name} 第{i}行类别越界: {cid}) if not (0 x 1 and 0 y 1 and 0 w 1 and 0 h 1): problems.append(f{lbl_path.name} 第{i}行坐标异常: {x},{y},{w},{h}) print(f共发现 {len(problems)} 个问题) for p in problems[:20]: print(p)逻辑说明遍历标签目录先检查同名图片是否存在再逐行解析五个字段。类别号必须在[0, NUM_CLASSES)内坐标必须在(0,1]区间宽高不能为 0。参数NUM_CLASSES按你的data.yaml里nc的值改。如果问题超过 20 条脚本只打印前 20 条避免刷屏。跑完这个脚本你才知道手里的 484 张图到底能不能直接喂给 YOLO v11。3. 用 YOLO v11 跑通第一轮训练配置、命令与参数3.1 data.yaml 怎么写才不出错YOLO v11 的数据配置文件比 v8 更严格路径写错直接报Dataset not found。标准写法path: /home/user/chicken_dataset train: images/train val: images/val test: images/test names: 0: eating 1: drinking 2: dead 3: abnormal 4: sleepingpath是数据集根目录train、val、test是相对路径。注意names的键必须从 0 连续编号不能跳号。如果死亡类样本太少可以先把test指向val等模型稳定后再单独跑测试集。常见翻车点Windows 下路径用了反斜杠YOLO v11 在 Linux 环境读不到或者path写了绝对路径但train又写了绝对路径导致路径拼接错误。统一用相对路径最稳。3.2 从预训练权重启动训练的最小命令假设你已经装好ultralytics包权重文件yolo11n.pt放在当前目录。最小训练命令yolo detect train \ datadata.yaml \ modelyolo11n.pt \ epochs150 \ imgsz640 \ batch16 \ device0 \ projectruns/chicken \ nameexp1 \ patience30 \ lr00.01 \ lrf0.01 \ mosaic1.0 \ close_mosaic20逐参数说明epochs150对 484 张图偏多但配合patience30会在验证指标不升时提前停。imgsz640是 YOLO v11 的默认输入尺寸如果鸡只目标在图中占比小于 5%可以提到 960但显存翻倍。batch16在 8GB 显存上跑 640 尺寸刚好显存不够就降到 8。lr00.01是初始学习率小数据集容易过拟合可以降到 0.005。mosaic1.0开启马赛克增强close_mosaic20表示最后 20 个 epoch 关闭增强让模型在真实分布上收敛。device0指定第一块 GPUCPU 训练把device改成cpu但 484 张图用 CPU 大概要跑几个小时。3.3 训练日志里必须盯住的三个指标训练开始后控制台每轮输出一行。重点看box_loss、cls_loss、mAP50。box_loss下降说明框的位置在变准cls_loss下降说明分类在变对。如果box_loss降但cls_loss不降大概率是类别标注有歧义比如吃食和喝水标混了。mAP50在验证集上算前 20 轮通常低于 0.350 轮后如果还低于 0.4说明数据量或标注质量有问题。另一个隐藏指标是val/box_loss和train/box_loss的差距差距超过 0.05 就是过拟合信号需要加数据增强或减模型复杂度。我一般会在第 50、100、150 轮各存一次权重最后用验证集挑最好的而不是直接用last.pt。4. 小样本行为识别的避坑与排查4.1 死亡类召回率始终为 0现象训练完看混淆矩阵死亡类全部预测成睡觉或异常召回率 0。原因死亡样本太少且死亡姿态和睡觉在低分辨率下几乎一样。解决先把死亡和睡觉的标注框区分开死亡框额外包含鸡只周围 10~20 像素的地面区域让模型学到“周围空旷”这个上下文特征。然后在data.yaml里给死亡类加权重YOLO v11 不直接支持类别权重但可以通过复制死亡样本图片来过采样复制 3 倍后重新训练。如果还不行把imgsz提到 960让模型看到更多纹理细节。4.2 验证集 mAP 很高但实际部署全错现象验证集 mAP50 到 0.85但拿鸡舍新视频跑吃食喝水全乱。原因验证集和训练集来自同一批视频的相邻帧背景、光照、鸡只位置高度相似模型记住了背景而不是行为。解决重新划分数据集按视频来源切分训练集用 3 个鸡舍的视频验证集用第 4 个鸡舍的。如果只有一批视频至少按时间段切上午的训练下午的验证。另外部署前用yolo detect predict跑一段新视频逐帧看预测框别只看指标。4.3 训练到一半 loss 变成 NaN现象第 60 轮左右box_loss突然变成nan训练中断。原因学习率太高或者某张图的标注框宽高为 0导致梯度爆炸。解决先跑第 2.3 节的检查脚本确认没有零宽高框。然后把lr0降到 0.001加warmup_epochs5让学习率从 0 慢慢升上去。如果还出 NaN在命令里加ampFalse关闭混合精度训练虽然慢一点但稳定。血泪经验小数据集上lr00.01经常翻车我后来固定用 0.005 起步。4.4 吃食和喝水在傍晚图像里互换现象白天预测正常傍晚光线偏暖时吃食和喝水类别互换。原因傍晚料槽和水线的颜色对比度下降模型依赖的颜色特征失效。解决在训练时加hsv_h0.015、hsv_s0.7、hsv_v0.4做色调、饱和度、亮度增强让模型对光照变化鲁棒。另外标注时确保吃食框包含料槽边缘喝水框包含水线反光区域给模型更多形状线索。如果部署现场有红外补光训练集里最好也加入红外图像否则傍晚照样翻车。4.5 模型把异常行为全判成吃食现象异常行为如扎堆、瘫痪被大量误判为吃食。原因异常行为的定义太模糊标注时把“鸡只聚集”标成异常但聚集时鸡头也可能朝下和吃食重叠。解决重新定义异常行为只标“单只鸡身体扭曲、无法站立”的样本扎堆不标异常。然后在训练命令里加mixup0.1让模型看到更多组合场景。如果异常样本少于 50 张建议先合并到死亡类等数据够了再拆开。5. 把 484 张图用出 2000 张的效果进阶技巧与验证方法小样本行为识别的天花板不在模型而在数据。484 张图直接训mAP50 能到 0.6 就算不错。但如果你愿意花半天做增强和伪标签可以把它推到 0.75 以上。我常用的组合拳是先训一个基础模型用它对未标注的鸡舍视频做推理挑置信度高于 0.7 的预测框人工复核后加入训练集。这个过程叫自训练能把有效样本翻 2~3 倍。注意伪标签必须人工过一遍尤其是死亡和异常类模型错标一次下一轮就会强化错误。另一个技巧是切片推理。鸡舍监控画面通常是 1920×1080鸡只目标很小。训练时用 640 输入推理时把大图切成 4 块 640×640 的小图分别预测再合并。这样小目标召回率能提升 15% 左右。代码不复杂from ultralytics import YOLO import cv2 model YOLO(runs/chicken/exp1/weights/best.pt) img cv2.imread(coop_frame.jpg) h, w img.shape[:2] tiles [] for i in range(2): for j in range(2): tile img[i*h//2:(i1)*h//2, j*w//2:(j1)*w//2] tiles.append(tile) results model(tiles, imgsz640, conf0.4) for r in results: for box in r.boxes: cls int(box.cls) conf float(box.conf) print(f类别{model.names[cls]} 置信度{conf:.2f})逻辑说明把原图切成 2×2 四块每块单独推理。conf0.4是置信度阈值低于 0.4 的框直接丢弃。参数imgsz640要和训练时一致。合并结果时需要把每块的坐标映射回原图这里只打印类别和置信度实际部署要加坐标偏移。切片推理的代价是推理时间变成 4 倍如果边缘设备算力不够可以只切鸡只密集的区域。验证方法上别只看 mAP。我习惯用三个指标交叉验证一是每类召回率死亡类低于 0.7 就不上线二是连续 100 帧的预测稳定性同一只鸡的行为类别跳变超过 3 次说明模型没学到时序信息需要加 LSTM 或 Transformer 后处理三是现场误报率拿 24 小时监控视频跑一遍统计误报次数超过 5 次/天就得回去补数据。最后说个习惯我每次训完模型都会把验证集里预测错的图单独存一个文件夹看一遍错在哪。十次有八次是标注问题不是模型问题。希望帮到你。本文还有配套的精品资源点击获取