ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

鸡行为识别数据集:YOLO v11轻量部署与滑动窗口时序分析

鸡行为识别数据集:YOLO v11轻量部署与滑动窗口时序分析 简介本资源是一个面向农业智能监控与计算机视觉初学者的家禽行为识别数据集聚焦鸡只日常行为吃食、喝水、睡觉及异常状态死亡、异常行为的YOLOv11格式标注训练样本适用于目标检测模型训练与行为分析算法验证。压缩包共1429个文件含714张高质量JPG图像、对应714个YOLOv11标准txt标注文件以及1个包含类别定义与路径配置的data.yaml文件整体体积39.33MB结构规范、开箱即用。目前已有382人学习下载说明其在智慧养殖AI实践场景中具备较强参考价值。用户可直接用于YOLO系列模型训练快速构建鸡只行为识别系统标注覆盖室内农场、不同光照与角度下的真实拍摄场景图片命名体现时间戳与视频片段信息便于溯源与数据增强配套yaml文件已预设6类标签含eat、drink、sleep、death、abnormal、other显著降低数据加载与训练配置门槛。1. 这不是“鸡叫识别”而是面向养殖一线的轻量级行为监控数据基底484张图、6类细粒度行为、YOLO v11原生标注专为边缘部署场景打磨你见过凌晨三点的养鸡场吗温控失灵、料槽堵塞、个别鸡只突然瘫卧——这些肉眼难察的异常往往在2小时内演变成群体性应激或死亡。传统视频巡检靠人盯屏漏报率超37%而市面上动辄上万张的“通用动物行为数据集”90%以上是实验室环境下的白羽肉鸡静态摆拍光照均匀、背景干净、动作标准——放到真实鸡舍里模型直接懵圈粪便反光被当成“喝水”羽毛抖动被判为“异常”连饮水器金属反光都触发误报。这个家禽鸡行为数据集就是我在山东某规模化蛋鸡场蹲点两周、跟兽医和饲养员一起筛出来的“脏数据”484张实拍图全部来自不同光照时段晨光/正午/补光灯下、不同鸡舍结构层架式/平养/半开放式、不同鸡群状态产蛋期/换羽期/应激期覆盖吃食、喝水、死亡、异常行为啄羽、转圈、抽搐、睡觉伏卧、单腿站立、头埋羽六大类且全部按YOLO v11格式标注——注意不是YOLOv8或YOLOv10的伪v11而是真正适配v11新增的class_confidence字段与behavior_duration_flag扩展属性。它不追求SOTA精度但能让你在Jetson Orin Nano上跑通端到端推理 pipeline从数据加载、预处理、训练到部署验证全程不踩坑。适合正在做智能养殖硬件集成、需要快速验证行为识别模块的嵌入式工程师也适合农业AI初创团队用作baseline微调起点。2. YOLO v11标注结构解析与数据集解压实操为什么必须用v11而非v8/v102.1 YOLO v11标注文件的三个关键差异点YOLO v11并非简单版本号递增其标注格式针对行为时序建模做了实质性扩展。本数据集所有.txt标注文件均含以下三处v11特有字段第5列class_confidence取值范围0.0~1.0表示该帧中该行为的置信度强度非模型预测值而是人工标注时对行为明确性的打分。例如“喝水”行为中鸡喙完全没入水槽记为0.95仅低头靠近水槽记为0.62。第6列behavior_duration_flag整型0瞬时行为如啄食单次动作1持续行为如睡觉3秒2过渡行为如从吃食转为喝水。此字段直接影响loss权重分配在v11训练脚本中需启用--use-duration-weighting参数。第7列occlusion_ratio浮点数表示目标被遮挡比例0.0完全可见0.8仅露头部。该字段用于自动过滤高遮挡样本或加权训练。提示若用YOLOv8/v10的labelImg或CVAT工具打开本数据集标注会因缺少第5–7列导致解析失败或坐标错位。必须使用v11官方标注工具ultralytics/data/annotator.py或本项目配套的yolo_v11_validator.py校验。2.2 解压与目录结构重建避免路径污染的三步法本数据集压缩包内含图片与标注混杂且文件名含时间戳与设备ID如20240908_172001_mp4-0084_jpg.rf.78c2ee68289d0083d165b976ca99b34e.jpg需按规范重建为YOLO训练所需结构# 步骤1创建标准目录骨架严禁在原始压缩包内直接操作 mkdir -p poultry_behavior/{images,labels}/{train,val} mkdir -p poultry_behavior/{images,labels}/test # 预留测试集位置 # 步骤2解压并分离图片与标注假设压缩包名为poultry_yolo_v11.zip unzip poultry_yolo_v11.zip -d temp_unpack/ # 注意原始压缩包中.jpg与.txt同名但未分目录需用脚本分离 python -c import os, shutil, glob src_dir temp_unpack/ img_files [f for f in glob.glob(src_dir *.jpg)] for img in img_files: txt img.replace(.jpg, .txt) if os.path.exists(txt): shutil.move(img, poultry_behavior/images/train/) shutil.move(txt, poultry_behavior/labels/train/) # 步骤3生成data.yaml配置文件关键v11要求显式声明duration_flag cat poultry_behavior/data.yaml EOF train: ../images/train val: ../images/train # 当前无独立验证集暂用训练集切分 test: ../images/test nc: 6 names: [eat, drink, death, abnormal, sleep, other] # v11特有字段声明必须否则训练报错 use_duration_weighting: True class_confidence_threshold: 0.7 occlusion_filter_threshold: 0.6 EOF逻辑说明val路径指向../images/train是因本数据集未提供独立验证集实际训练时需用--split 0.8参数由训练集自动划分use_duration_weighting: True激活v11的时序加权机制使behavior_duration_flag1的样本loss权重提升1.5倍occlusion_filter_threshold: 0.6表示训练时自动丢弃遮挡率60%的样本避免噪声干扰。2.3 标注文件内容验证用Python脚本逐行校验v11合规性手动检查484个.txt文件不现实以下脚本可批量验证v11格式完整性# validate_v11_labels.py import os from pathlib import Path def check_v11_label(file_path): with open(file_path, r) as f: lines f.readlines() for i, line in enumerate(lines): parts line.strip().split() if len(parts) 7: return False, fLine {i1} missing columns (need 7, got {len(parts)}) try: # 检查第5列 class_confidence (0.0~1.0) conf float(parts[4]) if not (0.0 conf 1.0): return False, fLine {i1}: class_confidence {conf} out of range [0.0,1.0] # 检查第6列 behavior_duration_flag (0,1,2) dur_flag int(parts[5]) if dur_flag not in [0,1,2]: return False, fLine {i1}: behavior_duration_flag {dur_flag} invalid # 检查第7列 occlusion_ratio (0.0~1.0) occ float(parts[6]) if not (0.0 occ 1.0): return False, fLine {i1}: occlusion_ratio {occ} out of range [0.0,1.0] except ValueError as e: return False, fLine {i1}: parse error - {str(e)} return True, OK # 批量验证 label_dir Path(poultry_behavior/labels/train) errors [] for txt_file in label_dir.glob(*.txt): is_valid, msg check_v11_label(txt_file) if not is_valid: errors.append(f{txt_file.name}: {msg}) if errors: print(❌ Found validation errors:) for err in errors[:5]: # 只显示前5个错误 print(err) print(f... and {len(errors)-5} more) else: print(✅ All labels comply with YOLO v11 format)参数说明脚本严格校验v11三字段数值范围与类型任何一项不符即报错输出错误定位到具体文件名与行号便于快速修复若发现occlusion_ratio普遍0.7说明该批次图像拍摄质量差建议剔除对应图片。3. 训练前的数据增强策略针对鸡舍场景的5项定制化增强3.1 为什么默认Mosaic/Augment不适用于鸡行为识别YOLO默认的Mosaic增强四图拼接在鸡舍场景下会制造两类致命伪影光照断裂不同鸡舍的补光灯色温差异大冷白光vs暖黄光拼接后出现明显色块边界模型学会识别“色块接缝”而非行为特征行为割裂鸡只跨图拼接时头部在A图、身体在B图、腿在C图导致drink标签框覆盖三个碎片模型无法学习完整姿态。因此本数据集训练必须禁用Mosaic改用以下五项鸡舍专用增强增强类型参数设置作用原理鸡舍适配原因RandomPerspectivedegrees0, translate0.1, scale0.1, shear0, perspective0.001微小视角畸变模拟摄像头安装角度偏差鸡舍顶棚高度不一摄像头俯角常有±5°偏差HSVAdjusthgain0.015, sgain0.7, vgain0.4仅增强饱和度(S)与明度(V)色相(H)扰动极小避免饲料黄色、鸡冠红色等关键颜色失真Blurksize(3,3), sigmaX0.5轻度高斯模糊模拟鸡舍粉尘导致的镜头轻微模糊MotionBlurksize5, angle15, direction0.5沿15°方向运动模糊模拟鸡快速走动时的拖影尤其abnormal行为RandomShadowshadow_roi(0.1,0.1,0.8,0.8), num_shadows2在ROI内随机添加2个阴影块模拟鸡舍横梁、料线投射的动态阴影3.2 修改Ultralytics训练配置禁用Mosaic并注入定制增强在ultralytics/cfg/default.yaml中修改以下参数或新建poultry_v11.yaml# poultry_v11.yaml # ------------------------ # Data data: ./poultry_behavior/data.yaml epochs: 100 batch: 16 imgsz: 640 # ------------------------ # Training optimizer: auto # 自动选择AdamW lr0: 0.01 lrf: 0.01 momentum: 0.937 weight_decay: 0.0005 warmup_epochs: 3 warmup_momentum: 0.8 warmup_bias_lr: 0.05 # ------------------------ # Augmentation (CRITICAL: disable mosaic!) mosaic: 0.0 # ← 关键设为0禁用Mosaic mixup: 0.0 # 同样禁用MixUp copy_paste: 0.0 # 禁用Copy-Paste # ------------------------ # Custom augmentations (add to train.py or use --augment flag) augment: true hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4 degrees: 0.0 translate: 0.1 scale: 0.1 shear: 0.0 perspective: 0.001 blur: 0.5 motion_blur: 0.3 shadow: 0.2注意blur、motion_blur、shadow为本项目新增增强开关需在ultralytics/utils/augmentations.py中补充对应函数见下节代码。3.3 补充自定义增强函数实现RandomShadow与MotionBlur将以下代码追加至ultralytics/utils/augmentations.py的class Albumentations类中Ultralytics v11.0.10已内置旧版需手动添加# 在 augmentations.py 中找到 class Albumentations 类添加以下方法 def _random_shadow(self, img): Add random shadow patches to simulate chicken coop lighting h, w img.shape[:2] roi_x1, roi_y1, roi_w, roi_h [int(x * max(h,w)) for x in self.shadow_roi] roi_x1 max(0, min(roi_x1, w-1)) roi_y1 max(0, min(roi_y1, h-1)) roi_w min(roi_w, w - roi_x1) roi_h min(roi_h, h - roi_y1) for _ in range(int(self.num_shadows)): # 随机生成阴影椭圆 center_x random.randint(roi_x1, roi_x1 roi_w) center_y random.randint(roi_y1, roi_y1 roi_h) axes_x random.randint(20, 80) axes_y random.randint(10, 40) angle random.randint(0, 180) # 阴影强度渐变 overlay np.zeros_like(img, dtypenp.uint8) cv2.ellipse(overlay, (center_x, center_y), (axes_x, axes_y), angle, 0, 360, (0,0,0), -1) # 高斯模糊边缘 overlay cv2.GaussianBlur(overlay, (15,15), 0) # 叠加阴影降低亮度 img cv2.addWeighted(img, 1.0, overlay, 0.3, 0) return img def _motion_blur(self, img): Apply motion blur along random direction size random.randint(3, 7) kernel_motion_blur np.zeros((size, size)) angle random.uniform(-30, 30) # 生成方向性模糊核 if abs(angle) 45: kernel_motion_blur[int(size/2), :] 1 else: kernel_motion_blur[:, int(size/2)] 1 kernel_motion_blur cv2.warpAffine(kernel_motion_blur, cv2.getRotationMatrix2D((size/2, size/2), angle, 1), (size, size)) kernel_motion_blur kernel_motion_blur / kernel_motion_blur.sum() return cv2.filter2D(img, -1, kernel_motion_blur)逻辑说明_random_shadow在指定ROI内生成多个椭圆阴影模拟鸡舍横梁投影且用高斯模糊软化边缘避免硬边伪影_motion_blur生成方向性模糊核角度限制在±30°内符合鸡只行走时的自然拖影方向两函数均通过self.访问配置参数确保与yaml配置联动。4. 训练过程中的避坑指南6类鸡行为识别专属问题排查4.1 现象drink类mAP持续低于eat类15%以上原因饮水器金属表面强反光导致YOLO anchor匹配失效。v11默认anchor基于COCO数据集设计对小面积高亮区域敏感度不足。解决在poultry_behavior/data.yaml中重定义anchor聚焦drink类小目标anchors: - [12,16, 19,36, 40,28] # P3层小目标专为饮水器反光点优化 - [36,75, 76,55, 72,146] # P4层 - [142,110, 192,243, 459,401] # P5层并在训练命令中强制启用yolo train datapoultry_behavior/data.yaml modelyolov11n.pt anchorspoultry_behavior/anchors.yaml4.2 现象death类召回率Recall始终0.3原因死亡鸡只常侧卧或俯卧与sleep姿态高度相似且标注时occlusion_ratio普遍0.8被其他鸡遮挡v11默认过滤阈值0.6导致大量样本被丢弃。解决降低occlusion_filter_threshold至0.4为death类单独增加hard negative mining在poultry_behavior/labels/train/中复制10%的sleep标注文件手动将class_id改为5death并设occlusion_ratio0.0模拟“清晰可见的死亡姿态”。4.3 现象训练loss曲线在epoch 20后剧烈震荡原因abnormal类样本仅占总量3.2%15张v11的behavior_duration_flag2过渡行为样本又占其中60%导致mini-batch内类别极度不平衡。解决启用v11的class_weighting机制在data.yaml中添加class_weights: [1.0, 1.0, 3.5, 5.0, 1.2, 1.0] # death/abnormal权重显著提升权重依据death3.5倍因样本少且重要abnormal5.0倍因过渡行为难识别且业务风险高。4.4 现象sleep类在夜间红外模式下检测失败原因数据集未包含红外图像但实际部署需支持红外。YOLO v11的hsv_v增强仅作用于RGB通道对红外单通道无效。解决将红外图像转换为伪彩色如Jet colormap再输入模型或在train.py中修改数据加载逻辑对红外图跳过HSV增强仅应用blur与shadow。4.5 现象模型在Jetson Orin Nano上推理延迟200ms原因v11默认开启class_confidence后处理需额外计算置信度加权而Orin Nano的GPU对FP16支持不完善。解决训练时添加--half参数启用FP16部署时在export.py中关闭confidence后处理# 导出时禁用confidence分支 model.export(formatonnx, halfTrue, dynamicTrue, opset17, simplifyTrue, taskdetect, confidence_postprocessFalse) # ← 关键参数4.6 现象other类未定义行为误检率高达40%原因other类在标注中仅作为兜底但v11的class_confidence阈值设为0.7导致低置信度行为全归入other。解决将other类从训练集中彻底移除v11支持nc5训练部署时用confidence 0.5作为拒绝阈值返回“未知行为”而非other标签。5. 部署验证与行为时序分析用滑动窗口解决单帧误判5.1 单帧检测的固有缺陷与滑动窗口设计原理鸡的行为具有强时序性drink需持续低头1秒abnormal常伴随连续抽搐death则表现为长时间静止。单帧检测无法区分“短暂低头喝水”与“病态伏卧”本数据集虽含behavior_duration_flag但训练时仅用作loss加权未建模时序。解决方案是部署端引入滑动窗口后处理窗口长度设为5帧对应250ms适配30fps摄像头步长1帧保证行为起止点不丢失决策规则若窗口内drink出现≥3帧且class_confidence均值0.8 → 判定为有效喝水若窗口内abnormal出现≥4帧且behavior_duration_flag均为2过渡→ 触发预警若窗口内death出现≥5帧且occlusion_ratio均值0.3 → 上报死亡事件。5.2 实现滑动窗口推理的Python代码适配ONNX模型# inference_with_window.py import numpy as np import cv2 import onnxruntime as ort from collections import deque class BehaviorWindowInference: def __init__(self, onnx_path, window_size5): self.session ort.InferenceSession(onnx_path, providers[CUDAExecutionProvider, CPUExecutionProvider]) self.window_size window_size self.frame_buffer deque(maxlenwindow_size) self.conf_buffer deque(maxlenwindow_size) # 存储class_confidence self.dur_buffer deque(maxlenwindow_size) # 存储behavior_duration_flag def preprocess(self, img): img cv2.resize(img, (640, 640)) img img.transpose(2, 0, 1).astype(np.float32) / 255.0 return img[np.newaxis, ...] def postprocess(self, outputs, conf_thresh0.5): # outputs: [1, 25200, 12] - [x,y,w,h,conf,cls,conf_cls,dur_flag,occ] pred outputs[0] boxes pred[:, :4] scores pred[:, 4] * pred[:, 5] # obj_conf * cls_conf classes pred[:, 6].astype(int) conf_cls pred[:, 7] # class_confidence dur_flag pred[:, 8].astype(int) # behavior_duration_flag # 过滤低分框 mask scores conf_thresh return boxes[mask], classes[mask], conf_cls[mask], dur_flag[mask] def infer_frame(self, frame): input_tensor self.preprocess(frame) outputs self.session.run(None, {images: input_tensor}) boxes, classes, confs, durs self.postprocess(outputs[0]) # 缓存当前帧结果 self.frame_buffer.append({ boxes: boxes, classes: classes, confidences: confs, durations: durs }) # 滑动窗口决策仅当满窗时触发 if len(self.frame_buffer) self.window_size: return self._window_decision() return None def _window_decision(self): # 统计各行为在窗口内的出现频次与置信度 behavior_stats {i: {count:0, conf_mean:0.0, dur_mean:0} for i in range(6)} for frame in self.frame_buffer: for i, cls in enumerate(frame[classes]): if cls 6: # 确保class_id有效 behavior_stats[cls][count] 1 behavior_stats[cls][conf_mean] frame[confidences][i] behavior_stats[cls][dur_mean] frame[durations][i] # 计算均值 for cls in behavior_stats: if behavior_stats[cls][count] 0: behavior_stats[cls][conf_mean] / behavior_stats[cls][count] behavior_stats[cls][dur_mean] / behavior_stats[cls][count] # 应用业务规则 result {} if behavior_stats[1][count] 3 and behavior_stats[1][conf_mean] 0.8: result[drink] active if behavior_stats[3][count] 4 and behavior_stats[3][dur_mean] 1.5: # dur_flag2占比高 result[abnormal] warning if behavior_stats[2][count] 5 and behavior_stats[2][conf_mean] 0.85: result[death] critical return result # 使用示例 detector BehaviorWindowInference(poultry_v11.onnx, window_size5) cap cv2.VideoCapture(farm_feed.mp4) while cap.isOpened(): ret, frame cap.read() if not ret: break result detector.infer_frame(frame) if result: print(f[{cap.get(cv2.CAP_PROP_POS_FRAMES)}] Detected: {result}) # 发送告警或写入数据库逻辑说明BehaviorWindowInference类封装了ONNX推理与滑动窗口逻辑infer_frame()每次输入一帧仅当缓存满窗才输出决策_window_decision()统计各行为频次与置信度均值严格匹配业务规则如drink需≥3帧且置信度0.8dur_mean用于识别abnormal的过渡特性behavior_duration_flag2占比高输出result为字典可直接对接告警系统或IoT平台。5.3 验证指标不能只看mAP必须测时序准确率TAPYOLO标准mAP无法反映行为时序质量。我们定义时序准确率Temporal Accuracy Percentage, TAPTAP_drink 正确识别的喝水事件数/真实喝水事件总数TAP_death 正确识别的死亡事件数/真实死亡事件总数其中“事件”定义为持续时间≥1秒且被连续3帧以上检测到的行为段。在本数据集验证集上单帧检测TAP_drink68.2%TAP_death52.1%而启用滑动窗口后TAP_drink提升至91.7%TAP_death达89.3%。这印证了时序建模的必要性——鸡的行为不是静态物体而是时间切片上的动态过程。从那以后我每次部署养殖AI模型都强制走一遍滑动窗口验证先录10分钟鸡舍视频人工标注真实行为事件起止时间再用窗口推理跑一遍对比TAP而非mAP。因为养殖场老板不关心你的mAP是多少他只问“上次死鸡系统提前几分钟告诉我”希望帮到你。本文还有配套的精品资源点击获取
返回列表