牛只目标检测数据集:1968张VOC+YOLO双格式牧场实采图像
发布时间:2026/10/10 16:32:54 锦皓数字建站

简介本资源为面向计算机视觉初学者与农业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阈值或加更多卧姿数据。希望帮到你。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。