基于YOLO v11的小样本家禽行为识别:484张图训练与避坑指南
2026/9/23 11:58:28 网站建设 项目流程

简介:这份家禽鸡行为数据集面向智慧养殖、动物行为识别方向的算法工程师与高校研究者,可用于训练吃食、喝水、死亡、异常行为、睡觉五类行为的检测模型,适合作为目标检测课程设计、科研实验或养殖场智能监控原型的数据基础。资源包共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.yamlnc的值改。如果问题超过 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: sleeping

path是数据集根目录,trainvaltest是相对路径。注意names的键必须从 0 连续编号,不能跳号。如果死亡类样本太少,可以先把test指向val,等模型稳定后再单独跑测试集。常见翻车点:Windows 下路径用了反斜杠,YOLO v11 在 Linux 环境读不到;或者path写了绝对路径但train又写了绝对路径,导致路径拼接错误。统一用相对路径最稳。

3.2 从预训练权重启动训练的最小命令

假设你已经装好ultralytics包,权重文件yolo11n.pt放在当前目录。最小训练命令:

yolo detect train \ data=data.yaml \ model=yolo11n.pt \ epochs=150 \ imgsz=640 \ batch=16 \ device=0 \ project=runs/chicken \ name=exp1 \ patience=30 \ lr0=0.01 \ lrf=0.01 \ mosaic=1.0 \ close_mosaic=20

逐参数说明:epochs=150对 484 张图偏多,但配合patience=30会在验证指标不升时提前停。imgsz=640是 YOLO v11 的默认输入尺寸,如果鸡只目标在图中占比小于 5%,可以提到 960,但显存翻倍。batch=16在 8GB 显存上跑 640 尺寸刚好,显存不够就降到 8。lr0=0.01是初始学习率,小数据集容易过拟合,可以降到 0.005。mosaic=1.0开启马赛克增强,close_mosaic=20表示最后 20 个 epoch 关闭增强,让模型在真实分布上收敛。device=0指定第一块 GPU,CPU 训练把device改成cpu,但 484 张图用 CPU 大概要跑几个小时。

3.3 训练日志里必须盯住的三个指标

训练开始后,控制台每轮输出一行。重点看box_losscls_lossmAP50box_loss下降说明框的位置在变准,cls_loss下降说明分类在变对。如果box_loss降但cls_loss不降,大概率是类别标注有歧义,比如吃食和喝水标混了。mAP50在验证集上算,前 20 轮通常低于 0.3,50 轮后如果还低于 0.4,说明数据量或标注质量有问题。另一个隐藏指标是val/box_losstrain/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_epochs=5让学习率从 0 慢慢升上去。如果还出 NaN,在命令里加amp=False关闭混合精度训练,虽然慢一点但稳定。血泪经验:小数据集上lr0=0.01经常翻车,我后来固定用 0.005 起步。

4.4 吃食和喝水在傍晚图像里互换

现象:白天预测正常,傍晚光线偏暖时,吃食和喝水类别互换。原因:傍晚料槽和水线的颜色对比度下降,模型依赖的颜色特征失效。解决:在训练时加hsv_h=0.015hsv_s=0.7hsv_v=0.4做色调、饱和度、亮度增强,让模型对光照变化鲁棒。另外,标注时确保吃食框包含料槽边缘,喝水框包含水线反光区域,给模型更多形状线索。如果部署现场有红外补光,训练集里最好也加入红外图像,否则傍晚照样翻车。

4.5 模型把异常行为全判成吃食

现象:异常行为(如扎堆、瘫痪)被大量误判为吃食。原因:异常行为的定义太模糊,标注时把“鸡只聚集”标成异常,但聚集时鸡头也可能朝下,和吃食重叠。解决:重新定义异常行为,只标“单只鸡身体扭曲、无法站立”的样本,扎堆不标异常。然后在训练命令里加mixup=0.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:(i+1)*h//2, j*w//2:(j+1)*w//2] tiles.append(tile) results = model(tiles, imgsz=640, conf=0.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 四块,每块单独推理。conf=0.4是置信度阈值,低于 0.4 的框直接丢弃。参数imgsz=640要和训练时一致。合并结果时需要把每块的坐标映射回原图,这里只打印类别和置信度,实际部署要加坐标偏移。切片推理的代价是推理时间变成 4 倍,如果边缘设备算力不够,可以只切鸡只密集的区域。

验证方法上,别只看 mAP。我习惯用三个指标交叉验证:一是每类召回率,死亡类低于 0.7 就不上线;二是连续 100 帧的预测稳定性,同一只鸡的行为类别跳变超过 3 次,说明模型没学到时序信息,需要加 LSTM 或 Transformer 后处理;三是现场误报率,拿 24 小时监控视频跑一遍,统计误报次数,超过 5 次/天就得回去补数据。最后说个习惯:我每次训完模型,都会把验证集里预测错的图单独存一个文件夹,看一遍错在哪。十次有八次是标注问题,不是模型问题。希望帮到你。

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

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

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

立即咨询