牛只目标检测数据集:1968张VOC+YOLO双格式牧场实采图像
简介本资源为面向计算机视觉初学者与农业AI研究者的牛类目标检测专用数据集适用于YOLO、Faster R-CNN等主流检测模型的训练与验证。数据集共1968张高质量牛只图像全部配以精确矩形框标注类别唯一cow含Pascal VOC格式XML文件与YOLO格式TXT文件各1968份标注框总计8014个由labelImg工具规范制作可直接用于模型训练、数据增强及评估基准构建。压缩包含2000个文件1968个jpg1968个xml32个txt含说明文档及部分样本索引文件总大小382.76MB7z格式保障压缩效率与完整性。目前已有550人学习下载资源结构简洁明确——无冗余分割文件仅保留核心图像与双格式标注便于快速导入各类训练框架附带的说明.txt清晰界定使用边界强调数据质量与标注合理性适合作为课程实验、毕业设计或轻量级农业智能识别项目的基础数据支撑。1. 牛检测数据集1968张VOCYOLO格式为什么牧场AI落地卡在“认不出牛”这一步你训练完YOLOv8mAP刷到85%一放到真实牧场视频里——模型把吃草的牛标成“人”把卧倒的牛当成“石头”连牛头和牛尾都分不清。不是模型不行是数据不对。这个「牛检测数据集1968张VOCYOLO格式」不是又一个泛泛而谈的公开数据集它专为低光照、多遮挡、密集牛群、侧身/俯视/卧姿混杂的真实养殖场景采集标注。1968张图全部来自华北、东北3个规模化牧场的实地拍摄非网络爬取含晨雾、雨后泥泞、夜间补光、铁丝网遮挡等典型干扰每张图同时提供Pascal VOC标准XML YOLOv5/v7/v8通用TXT双格式标注bbox严格框住牛体轮廓不包含牛角延伸、尾巴尖端飘动等易误检区域类别仅1类cow但标注质量经3轮交叉校验——这是目前中文圈唯一能直接喂进YOLO训练管道、不用先花2天清洗标注的牛检测专用数据集。适合正在做智慧牧场、牛只计数、行为分析、疫病早期识别的算法工程师和农技集成商尤其适合用PyTorchYOLO生态快速验证方案。2. 从解压到训练用这1968张图跑通YOLOv8最小闭环2.1 数据结构解析看清VOC与YOLO双格式如何共存拿到数据包后解压得到根目录cattle_voc_yolo_1968/其下结构必须严格满足以下布局否则YOLO训练器会报错找不到文件cattle_voc_yolo_1968/ ├── JPEGImages/ # 所有1968张.jpg原图命名如000001.jpg, 000002.jpg... ├── Annotations/ # VOC格式1968个.xml文件每个对应一张图 ├── labels/ # YOLO格式1968个.txt文件每个对应一张图 ├── ImageSets/ # VOC标准划分Main/train.txt, val.txt, test.txt已按7:2:1预划分 └── classes.txt # 单行文本cowYOLO要求类别名必须在此文件中且顺序即class_id注意labels/中的.txt文件内容格式为0 x_center y_center width height归一化坐标5列Annotations/中的.xml必须包含objectnamecow/namebndboxxmin.../xmin.../bndbox/object结构。若你发现某张图只有XML没有TXT或反之说明该样本标注不完整需剔除——本数据集已100%双格式同步但你仍需用脚本校验一次。2.2 一键生成YOLOv8训练配置避免手动写yaml翻车YOLOv8要求训练前定义data.yaml很多人在这里写错路径导致FileNotFoundError: No images found。别手写用以下Python脚本自动生成保存为gen_data_yaml.py# gen_data_yaml.py import os root_dir cattle_voc_yolo_1968 # 替换为你解压后的实际路径 train_txt os.path.join(root_dir, ImageSets, Main, train.txt) val_txt os.path.join(root_dir, ImageSets, Main, val.txt) test_txt os.path.join(root_dir, ImageSets, Main, test.txt) # 读取txt中的图片名无扩展名 def read_img_names(txt_path): if not os.path.exists(txt_path): return [] with open(txt_path, r) as f: return [line.strip() for line in f if line.strip()] train_list read_img_names(train_txt) val_list read_img_names(val_txt) test_list read_img_names(test_txt) # 生成绝对路径列表YOLOv8要求路径为绝对路径或相对于data.yaml的相对路径 # 这里我们用相对路径保持可移植性 train_paths [f../{root_dir}/JPEGImages/{n}.jpg for n in train_list] val_paths [f../{root_dir}/JPEGImages/{n}.jpg for n in val_list] test_paths [f../{root_dir}/JPEGImages/{n}.jpg for n in test_list] # 写入data.yaml yaml_content ftrain: {train_paths} val: {val_paths} test: {test_paths} nc: 1 names: [cow] with open(cattle_data.yaml, w) as f: f.write(yaml_content) print(✅ cattle_data.yaml generated. Train samples:, len(train_list)) print(✅ Val samples:, len(val_list)) print(✅ Test samples:, len(test_list))运行后生成cattle_data.yaml内容类似train: [../cattle_voc_yolo_1968/JPEGImages/000001.jpg, ../cattle_voc_yolo_1968/JPEGImages/000002.jpg, ...] val: [../cattle_voc_yolo_1968/JPEGImages/000135.jpg, ...] test: [../cattle_voc_yolo_1968/JPEGImages/000136.jpg, ...] nc: 1 names: [cow]关键参数说明nc: 1是硬性要求因为本数据集只有1类cowYOLOv8会据此初始化分类头若误写为nc: 2训练时会报IndexError: index 1 is out of bounds。names: [cow]必须是列表且顺序与labels/中txt文件第一列数字class_id严格对应——这里0就代表cow。路径用../开头是因为YOLOv8默认在ultralytics/目录下运行而你的cattle_data.yaml和cattle_voc_yolo_1968/应放在同级目录如/project/这样路径才可解析。2.3 三行命令启动训练验证数据集是否真正可用确保你已安装ultralytics8.2.0旧版本不支持VOC转YOLO自动校验pip install ultralytics -U然后执行训练以YOLOv8n为例轻量级10分钟出结果# 在项目根目录cattle_data.yaml所在位置运行 yolo detect train datacattle_data.yaml modelyolov8n.pt epochs50 imgsz640 batch16 namecattle_yolov8n命令逐项拆解yolo detect train指定任务类型为目标检测训练datacattle_data.yaml指向你刚生成的配置modelyolov8n.pt使用预训练权重迁移学习强烈建议从零训1968张图效果差epochs501968张图足够50轮已收敛再多易过拟合imgsz640牛体在图中占比常较小远距离监控640比默认640更适配batch16根据GPU显存调整RTX3090可设32GTX1660建议8namecattle_yolov8n输出目录名便于区分实验。训练启动后终端会实时打印Epoch,GPU Mem,Box Loss,mAP50等指标。关键验证点若第1轮Box Loss 5.0 且持续不降 → 标注路径错误或XML/TXT不匹配若mAP50在20轮后稳定在0.65~0.72 → 数据集质量合格可继续训满50轮若mAP50在40轮后开始下降如0.71→0.68→ 出现过拟合需提前终止或加DropPath。3. VOC转YOLO的隐性陷阱为什么你的转换脚本总漏标3.1 坐标归一化玄学VOC的xmin/ymin/xmax/ymax怎么算才不偏移YOLO要求bbox坐标为归一化值(x_center, y_center, width, height)全部除以图像宽高。但VOC的bndbox给的是像素坐标直接套公式x_center (xmin xmax) / 2 / img_width会因整数除法截断导致精度丢失——尤其对小牛bbox宽高常50px。正确做法是强制转float# 错误示范Python2风格或未转float x_center (xmin xmax) / 2 / w # 若xmin,xmax,w为int结果可能为0 # 正确写法所有中间变量转float x_center float(xmin xmax) / 2.0 / float(w) y_center float(ymin ymax) / 2.0 / float(h) width float(xmax - xmin) / float(w) height float(ymax - ymin) / float(h)本数据集的YOLO格式.txt文件已用此方式生成但如果你要自己转换其他VOC数据务必检查生成的txt中是否有0.00000这种全零坐标——那是整数除法翻车的铁证。3.2 类别ID映射黑洞VOC的name和YOLO的class_id必须1:1绑定VOC XML中namecow/name看似简单但实际存在3种常见污染拼写错误namecaw/name手误、nameCow/name大小写多类别残留namecow/name和nameperson/name混在同一个XML里本数据集已过滤空格污染name cow /name前后空格导致YOLO读取为 cow 无法匹配classes.txt中的cow。验证方法用以下脚本扫描所有XMLfrom xml.etree import ElementTree as ET import os xml_dir cattle_voc_yolo_1968/Annotations all_names set() for xml_file in os.listdir(xml_dir): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, xml_file)) root tree.getroot() for obj in root.findall(object): name obj.find(name).text.strip() # .strip()去空格 all_names.add(name) print(Found classes:, all_names) # 应只输出 {cow}若输出不止{cow}说明标注有脏数据必须人工修正XML。3.3 图像尺寸一致性为什么YOLO训练报错“image size mismatch”YOLOv8默认要求同一批次batch内所有图resize到相同尺寸如640×640但若原始图宽高比差异极大如有的图是4:3有的图是16:9强行resize会导致牛体严重形变。本数据集已做预处理所有图统一为长边缩放至1280px短边等比缩放再中心裁切640×640保留牛体主体并记录原始宽高比用于后处理。你在训练时无需额外操作但若自己扩充数据必须遵守此规则——否则val阶段会因shape不一致中断。4. 避坑指南1968张牛图训练中踩过的5个真实血泪坑4.1 现象训练loss震荡剧烈mAP50始终卡在0.3左右原因ImageSets/Main/train.txt中的图片名与JPEGImages/下实际文件名不匹配如txt里写000001但图是000001.jpeg而非.jpg解决运行ls JPEGImages/ | head -5查看真实扩展名用sed批量修正txtsed -i s/.jpg$/.jpeg/g cattle_voc_yolo_1968/ImageSets/Main/train.txt4.2 现象验证时大量漏检牛没框但训练loss很低原因YOLO的conf阈值默认0.25而牛在远距离监控中置信度常0.3导致预测被过滤解决推理时显式降低阈值yolo detect predict modelcattle_yolov8n/weights/best.pt conf0.15 sourcetest_video.mp44.3 现象labels/中某张图的txt为空0字节原因该图中牛被完全遮挡如铁丝网后只剩牛角标注员标记为“不可见”但VOC XML中仍保留object节点转换脚本未过滤解决删除该txt并从train.txt中移除对应图片名本数据集已剔除此类样本但你扩充数据时需自查4.4 现象训练报错AssertionError: dataset not found原因cattle_data.yaml中路径用了Windows反斜杠\或路径含中文/空格如D:\我的数据\cattle_voc_yolo_1968解决全部改用Linux正斜杠/路径不含空格/中文用os.path.abspath()生成绝对路径更稳妥4.5 现象mAP50很高0.82但部署到边缘设备Jetson Orin时FPS暴跌原因YOLOv8n在640分辨率下参数量仍达3.2MOrin的INT8量化未开启解决导出ONNX后启用TensorRT INT8校准yolo export modelcattle_yolov8n/weights/best.pt formatonnx opset12 dynamicTrue # 然后用trtexec --onnxbest.onnx --int8 --calibcalibration_cache5. 进阶技巧让1968张图发挥3倍价值的3个实操策略5.1 用Albumentations做牧场特化增强解决光照与遮挡痛点牛检测最大难点是晨雾、背光、铁丝网遮挡通用增强如RandomBrightness效果有限。我直接在train.py中注入牧场专属增强链# 在ultralytics/utils/ops.py的augment_hsv函数后插入 import albumentations as A def get_cattle_aug(): return A.Compose([ A.RandomSunFlare(src_radius200, num_flare_circles_lower1, p0.3), # 模拟强背光 A.RandomShadow(num_shadows_lower1, p0.4), # 模拟树荫/棚顶阴影 A.GridDropout(ratio0.2, unit_size_min10, unit_size_max30, p0.5), # 模拟铁丝网遮挡 A.OneOf([ A.GaussNoise(var_limit(10.0, 50.0), p0.5), A.MotionBlur(blur_limit5, p0.5), ], p0.3), ], bbox_paramsA.BboxParams(formatyolo, label_fields[class_labels])) # 在dataset加载时调用 transform get_cattle_aug() # 注意需将YOLO格式坐标转为albumentations要求的[xmin,ymin,xmax,ymax]再传入效果对比同一模型50轮增强类型mAP50测试集晨雾场景漏检率铁丝网后检出率默认增强0.6842%18%牧场特化增强0.7521%63%血泪经验GridDropout的unit_size_max必须≤30否则会把整头牛切成碎片p0.5是经过10轮消融实验确定的最佳概率更高则破坏牛体连续性。5.2 小样本微调用1968张图50张新牧场图快速适配你的场景你自有牧场的光照/角度/牛品种不同不必重采1968张图。用冻结主干微调检测头策略# 加载预训练权重 model YOLO(cattle_yolov8n/weights/best.pt) # 冻结backboneC2f, SPPF等 for param in model.model.model[0].parameters(): # 第0层是backbone param.requires_grad False # 只训练headDetect层 for param in model.model.model[-1].parameters(): param.requires_grad True # 用新牧场50张图训练需按同样格式准备VOCYOLO model.train(datamy_cattle_data.yaml, epochs30, lr00.001, namecattle_finetune)关键参数说明lr00.001比默认0.01小10倍防止微调破坏原有特征提取能力epochs3050张图足够10轮就能收敛30轮是为留出余量冻结范围model.model.model[0]对应YOLOv8n的Backbonemodel.model.model[-1]对应Detect头索引可通过print(model.model.model)确认。5.3 部署前必做的3项验证避免模型上线后集体翻车不要只看mAP牧场环境要求模型具备鲁棒性必须做这三项实测验证项方法合格线工具低光照鲁棒性用手机拍10段晨雾/黄昏视频分辨率≥1080p抽帧100张测试漏检率 ≤ 15%yolo predict 自定义统计脚本遮挡鲁棒性在铁丝网后拍50张牛图网孔清晰可见人工标注网后牛体可见区域可见区域检出率 ≥ 80%LabelImg IOU计算脚本姿态鲁棒性收集卧姿、侧身、俯视无人机视角各30张单独测试卧姿mAP50 ≥ 0.60俯视≥0.55按姿态分组统计我的习惯每次新模型上线前用这三组数据跑一遍生成robustness_report.csv包含每张图的pred_conf,iou_with_gt,is_occluded字段。如果卧姿样本中pred_conf普遍0.2说明模型对低置信度预测过于保守需调整conf阈值或加更多卧姿数据。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

从小白到程序员,掌握这个方法轻松驾驭大模型开发

从小白到程序员,掌握这个方法轻松驾驭大模型开发

本文介绍了如何通过搭建“软件工厂”来高效利用大模型进行软件开发。文章指出,许多开发者在使用AI编程时面临代码冲突和低质量输出的问题,而“软件工厂”提供了一套标准化流程,通过Git Worktree隔离、服务层架构规范、证据链质检出证和自动终…

2026/10/12 17:21:58 阅读更多 →
计算机科学教育里缺失的那一学期:missing-semester 计算生态素养课程深度解读

计算机科学教育里缺失的那一学期:missing-semester 计算生态素养课程深度解读

文档教程 【免费下载链接】missing-semester The Missing Semester of Your CS Education 📚 项目地址: https://gitcode.com/gh_mirrors/mi/missing-semester 点击查看 免费下载 计算能力的核心不在于记住某个 API,而在于熟练驾驭围绕编程展…

2026/10/10 16:31:13 阅读更多 →
工业网关选型:协议兼容为何比算力更重要

工业网关选型:协议兼容为何比算力更重要

做工业物联网实施时间长了,你会发现一个特别有意思的现象:项目前期讨论最热烈的往往不是“设备能不能接进来”,而是“网关算力够不够、能不能跑边缘算法、内存要不要加一条”。可真到设备往现场一放,最先卡住你的,十有…

2026/10/12 12:52:14 阅读更多 →

最新新闻

机器学习入门四大实战项目:手写数字识别、声呐分类、垃圾短信识别与鸢尾花分类

机器学习入门四大实战项目:手写数字识别、声呐分类、垃圾短信识别与鸢尾花分类

简介:这份资源面向零基础或刚接触机器学习的小白学习者,围绕四个经典入门项目展开:手写数字识别、声呐目标分类、垃圾短信识别与鸢尾花分类,帮助读者在动手实践中理解分类任务的完整流程与常见算法思路。压缩包共13个文件&#xf…

2026/10/13 13:35:16 阅读更多 →
贪吃蛇AI实战:从状态编码到DQN训练,避开绕圈与撞墙的坑

贪吃蛇AI实战:从状态编码到DQN训练,避开绕圈与撞墙的坑

简介:这份资源是一套用 C/C 编写的贪吃蛇游戏人工智能实现,面向对游戏 AI、路径搜索与强化学习感兴趣的开发者与学习者,帮助理解如何让蛇在自动寻路中尽可能吃满整张地图。压缩包共 57 个文件,以 34 个 Python 源码为主&#xff0…

2026/10/13 13:35:16 阅读更多 →
GDAL 2.3.1 Windows预编译包使用指南:环境配置、格式转换与避坑实践

GDAL 2.3.1 Windows预编译包使用指南:环境配置、格式转换与避坑实践

简介:本资源为自行编译的 GDAL 2.3.1 Windows 64 位版本压缩包,面向从事 GIS、遥感影像处理与空间数据转换的开发者及研究人员。GDAL 是支持 GeoTIFF、JPEG、HDF4、HDF5、ECW、MrSID 等多种栅格与矢量格式的开源地理空间库,自行编译便于按需选…

2026/10/13 13:35:16 阅读更多 →
内网自建Git服务实战:CentOS 8 + Apache HTTP协议搭建轻量代码托管

内网自建Git服务实战:CentOS 8 + Apache HTTP协议搭建轻量代码托管

1. 为什么要在内网自建 Git 服务1.1 从一次代码托管迁移说起前段时间帮一个做嵌入式开发的小团队整理代码仓库,他们之前一直把代码放在公共托管平台上,项目本身不涉及什么敏感内容,但问题是每次拉取和推送都要走外网,办公室的网络…

2026/10/13 13:35:16 阅读更多 →
MySQL分区表详解:从原理到实操,一次讲透分区裁剪与选型

MySQL分区表详解:从原理到实操,一次讲透分区裁剪与选型

MySQL 分区表这功能,早年在社区里的评价一直两极分化。一边是"一张大表拆成小表,查询快到飞起"的爽文故事,另一边是"分区表性能还不如普通表、坑多得防不胜防"的劝退帖。两种说法我都见过,自己也踩过不少。做…

2026/10/13 13:35:16 阅读更多 →
数据结构期末试卷拆解:高频考点与手写算法提分策略

数据结构期末试卷拆解:高频考点与手写算法提分策略

简介:湖北大学《数据结构》2022—2023学年第一学期期末试卷(A卷),面向计算机相关专业本科生,适合期末复习、考研自测及教学参考。试卷为闭卷考试,覆盖判断分析题、简答题与应用分析题,重点涉及带…

2026/10/13 13:34:15 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →