ARTICLE DETAIL

资讯详情

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

家禽鸡行为数据集实战:YOLO v11 五类行为识别从训练到部署

家禽鸡行为数据集实战:YOLO v11 五类行为识别从训练到部署 简介这份家禽鸡行为数据集面向智慧养殖、动物行为识别方向的算法开发者与高校研究者可用于训练吃食、喝水、死亡、异常行为、睡觉五类行为的检测模型适合作为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编成 2data.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), fdataset/images/{subset}/{f}) lbl f.replace(.jpg, .txt) shutil.copy(os.path.join(src_lbl, lbl), fdataset/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 \ datadataset/data.yaml \ modelyolo11n.pt \ epochs100 \ imgsz640 \ batch16 \ device0 \ projectruns/chicken \ nameexp1逐项说明data指向你的data.yamlmodelyolo11n.pt用 nano 版预训练权重参数量小、适合小数据集快速验证epochs100是训练轮数484 张图通常 80150 轮能看到收敛imgsz640是输入分辨率鸡舍远景图如果鸡只占像素很少可以提到 960 或 1280但显存占用会翻倍batch16根据显存调整显存不够就降到 8 或 4device0指定第一块 GPUCPU 训练写devicecpu。训练开始后重点看三个输出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 modelruns/chicken/exp1/weights/last.ptresume会从上次中断的 epoch 继续优化器状态也会恢复。但注意如果你改了data.yaml或换了数据集不要 resume否则会接着旧配置跑结果对不上。3.4 推理验证用 best.pt 看实际效果训练结束后用验证集跑一遍推理yolo detect predict \ modelruns/chicken/exp1/weights/best.pt \ sourcedataset/images/val \ conf0.25 \ saveTrueconf0.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, conf0.25, saveTrue) 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( datadataset/data.yaml, epochs120, imgsz640, batch8, freeze5, augmentTrue, hsv_h0.015, hsv_s0.7, hsv_v0.4, degrees10, translate0.1, scale0.5, fliplr0.5, )freeze5冻结前 5 层hsv_h/s/v控制色调、饱和度、亮度增强幅度degrees是旋转角度translate是平移比例scale是缩放范围fliplr0.5表示一半概率水平翻转。这些参数不是越大越好旋转超过 15 度会让鸡的姿态失真亮度增强太猛会让死亡和睡觉的区分度下降。验证方法上除了看mAP50我更关注混淆矩阵。在runs/chicken/exp1/下会生成confusion_matrix.png重点看死亡和睡觉之间有没有互相误判、吃食和喝水是否混在一起。如果这两组混淆严重说明视觉特征确实接近需要靠时序信息补单帧分不清就取连续 5 帧做投票或者用轻量时序模型在 YOLO 输出上做二次分类。边缘部署时yolo11n.pt导出 ONNX 或 TensorRT 后在 Jetson 这类设备上能跑到实时。但要注意导出时的imgsz必须和训练一致否则精度会掉。我习惯在导出前用验证集跑一遍val记下mAP50导出后再跑一遍对比差值超过 2 个点就回去检查预处理。最后说一个血泪教训不要等到模型训完才去看数据。484 张图抽 30 张逐张检查标注花不了半小时但能省掉后面几小时的调参。数据质量决定上限模型只是逼近这个上限。希望帮到你。本文还有配套的精品资源点击获取
返回列表