资讯动态

YOLOv5生猪检测数据集:格式解析与训练避坑指南

发布时间:2026/10/27 8:59:27 来源:尧图企业网站定制
简介这份资源提供了一套猪圈摄像头场景下的生猪检测数据集专为目标检测算法训练与验证设计面向计算机视觉学习者、算法工程师以及智慧养殖项目开发者。数据严格按YOLOV5目录格式组织训练集含929张图片及929个标签txt验证集含136张图片及136个标签txt类别为单一的pig下载解压后即可直接接入YOLO系列模型省去格式转换和重新标注的麻烦。图像为640-1080分辨率的RGB监控画面每张包含多个目标适合研究密集目标检测、遮挡与尺度变化等实际问题。整个压缩包共2000个文件以txt标注文件、jpg图像为主并附带一个可视化py脚本无需修改即可运行随机传入一张图片就能绘制边界框并保存结果方便用户快速检查标注是否正确。资源包大小约97.43MB已有609人学习下载。总体来看这份数据标注规范、目录清晰既能用于目标检测入门练习也可支撑猪只检测、计数和行为分析等实际项目。1. 生猪检测数据集这不是随手标注的图片包是能直接开训的 YOLO 工程做目标检测的人最怕两件事一是标注格式不统一好不容易找到一份数据集结果发现是 COCO 格式还得自己写转换脚本二是样本质量差图片里目标小、遮挡多、光照乱模型训完根本没法用。这份猪圈摄像头场景下的生猪检测数据集恰好避开了这两个坑——数据已经按 YOLOV5 的目录格式组织好训练集和验证集分开存放标签是纯文本的 txt 文件RGB 图像分辨率在 640 到 1080 之间每张图有多个目标适合拿来练密集目标检测的活儿。对正在跑 YOLOv5、YOLOv8 或者想快速验证检测算法的人来说这份资源能省掉最烦人的数据预处理环节拿到就能开训。2. 目录格式拆解YOLOV5 的 images/labels 约定与 txt 标签结构2.1 数据集的目录组织方式这份数据集严格按 YOLOV5 官方推荐的目录结构存放训练集和验证集分开图片和标签一一对应。拿到压缩包解压后你会看到类似下面的目录结构datasets/ ├── images/ │ ├── train/ │ │ ├── vlcsnap-2022-01-09-19h41m40s412_png.rf.5888b784a5b4f702503b2ad1620f25fd.jpg │ │ └── ... │ └── val/ │ └── ... ├── labels/ │ ├── train/ │ │ ├── vlcsnap-2022-01-09-19h41m40s412_png.rf.5888b784a5b4f702503b2ad1620f25fd.txt │ │ └── ... │ └── val/ │ └── ... └── classes.txt训练集里 929 张图片对应 929 个标签文件验证集 136 张图片对应 136 个标签文件。这里有个实操要注意的点图片文件名和标签文件名完全一致只是后缀不同一个是 .jpg 一个是 .txt。YOLO 系列的训练代码在读取数据时就是靠这种「同名不同后缀」的对应关系去匹配图片和标签的所以你在做自己的数据集时务必保持这个命名约定。classes.txt 里只有一行内容就是pig。这代表整个数据集只有 1 个类别类别 ID 从 0 开始计数所以所有标签文件中的类别编号都是 0。2.2 txt 标签文件的格式与含义YOLO 格式的标签文件是纯文本每一行代表一个目标共 5 个数用空格分隔0 0.502302 0.268403 0.159906 0.037537这 5 个数的含义依次是类别 ID、目标中心点的 x 坐标归一化、目标中心点的 y 坐标归一化、目标框宽度归一化、目标框高度归一化。所有坐标值都在 0 到 1 之间是相对于整张图片的尺寸归一化后的结果。我一般会建议拿到数据后先抽几个标签文件人工核对一下。拿第一行数据举例如果一个框的中心点 x 是 0.502302乘上图片宽度 640得到 321 像素左右这就是框中心在图片上的绝对像素位置。这个换算逻辑在做数据验证或者调试时经常用到。2.3 为什么这种格式适合直接开训YOLOV5 官方仓库的 dataset 加载逻辑里默认就是找 images 目录下的图片和 labels 目录下的同名 txt。你只需要把这份数据的路径配置到 data.yaml 里改一下训练集和验证集路径就能跑起来不需要额外写转换脚本。相比之下如果你拿到的是 COCO 格式的 JSON 标注文件还得先转成 YOLO 格式才能开训这中间会涉及到坐标换算、类别映射、过滤无目标图片等一堆琐碎工作。另外这个数据集每个图片文件大小适中总数据量 98MB训练集 929 张图。这个体量对小团队或者个人开发者来说比较友好——既不至于因为数据太少导致模型欠拟合也不至于因为数据太大导致显存不够、训练时间过长。如果你想快速验证 YOLOv5s 这类轻量级模型在这个场景下的效果这个数据量是合适的起点。3. 可视化脚本验证开训前先确认标注质量3.1 为什么要先跑可视化这是我觉得这份数据集做得比较贴心的地方——它附带了一个可视化 py 文件随机传入一张图片就能绘制边界框并保存在当前目录。在我看来这一步不是可选项而是训练前的必做项。因为标注数据的质量直接影响模型的上限如果标签框偏移严重、或者漏标了大量目标你后面花再多时间调参也救不回来。之前带过一个实习生上来就直接用一份没验证过的数据集开训模型训了十几个小时后才发现标签有偏移白白浪费了两天时间。从那以后我养成了一个铁习惯不管是谁给的数据集先用脚本把所有标注画出来看一轮确认没问题再进训练流程。3.2 可视化脚本的用法与改法这个脚本设计得很简单不需要改参数就能直接运行。核心逻辑是读入一张图片读取对应 txt 文件的每一行标注把归一化坐标换算回绝对像素坐标然后用 OpenCV 绘制矩形框和类别名。默认逻辑大概是这样的import cv2 import os def draw_boxes(image_path, label_path, class_names): img cv2.imread(image_path) height, width img.shape[:2] with open(label_path, r) as f: lines f.readlines() for line in lines: parts line.strip().split() cls_id int(parts[0]) x_center float(parts[1]) * width y_center float(parts[2]) * height box_width float(parts[3]) * width box_height float(parts[4]) * height x1 int(x_center - box_width / 2) y1 int(y_center - box_height / 2) x2 int(x_center box_width / 2) y2 int(y_center box_height / 2) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, class_names[cls_id], (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) output_path os.path.join(os.getcwd(), visualized_ os.path.basename(image_path)) cv2.imwrite(output_path, img) print(f可视化结果已保存: {output_path}) # 使用示例 draw_boxes( datasets/images/train/vlcsnap-2022-01-09-19h41m40s412_png.rf.5888b784a5b4f702503b2ad1620f25fd.jpg, datasets/labels/train/vlcsnap-2022-01-09-19h41m40s412_png.rf.5888b784a5b4f702503b2ad1620f25fd.txt, [pig] )这段代码的原理是把归一化坐标还原成像素坐标中心点坐标乘上图片宽高得到绝对位置框宽高也乘上图片宽高得到绝对尺寸然后换算成左上角和右下角的像素坐标OpenCV 的 rectangle 函数需要的就是这两个点。需要注意的是OpenCV 读入的图片默认是 BGR 通道如果你后续要用 matplotlib 显示需要做一次通道转换否则颜色会偏。3.3 一批图像批量可视化的改法如果一张一张传太麻烦可以自己改成一个批量可视化的版本把整个训练集的图片都跑一遍然后挑几张有代表性的看。我一般会写一个小循环import glob import random image_files glob.glob(datasets/images/train/*.jpg) sample_files random.sample(image_files, 20) for image_file in sample_files: label_file image_file.replace(images, labels).replace(.jpg, .txt) draw_boxes(image_file, label_file, [pig])这里有一个要注意的坑如果图片路径里包含中文cv2.imread 在部分 Linux 环境上会读取失败返回 None导致后面img.shape报错。在 Windows 上这个概率更高。如果遇到这个问题可以用cv2.imdecode配合 numpy 读取中文路径图片import numpy as np def cv_imread(file_path): with open(file_path, rb) as f: data np.frombuffer(f.read(), dtypenp.uint8) return cv2.imdecode(data, cv2.IMREAD_COLOR)4. 直接开训 YOLOv5数据配置、超参数调整与训练命令4.1 准备 YOLO 格式的数据配置文件数据验证没问题之后就是配置训练环境。以 YOLOv5 为例你需要先写一个 data.yaml 文件把训练集和验证集的路径、类别数、类别名告诉训练脚本。这个文件一般放在 yolo 仓库的 data 目录下内容如下# data.yaml train: /home/user/datasets/images/train val: /home/user/datasets/images/val nc: 1 names: [pig]train 和 val 后面可以是绝对路径也可以是相对路径。需要特别注意的是这里指向的是 images 目录而不是上一级的 datasets 目录。YOLOv5 会默认在相同层级去找 labels 目录所以你的目录结构必须是 images 和 labels 平级这一点很容易被忽略。如果你用的是 YOLOv8配置文件的写法也差不多只是有时候会写成train: /path/to/images/train和val: /path/to/images/val其他字段完全通用。这个数据集既然是按 YOLOV5 目录格式组织的那你在 YOLOv8、YOLOv9 这些后续版本里也能直接复用因为它们都沿用了 images/labels 双目录的约定。4.2 选择模型大小与训练命令YOLOv5 提供了几个不同规模的模型参数从小到大依次是n、s、m、l、x。其中 n 是 nano 版本s 是 small 版本。对于猪圈这种相对固定的场景我建议先用 YOLOv5s 起步。n 模型虽然更轻但精度下降得比较明显m 及以上模型在这个数据量下容易过拟合。训练命令是标准的写法python train.py \ --data data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --device 0各参数的说明如下--weights预训练权重路径。用 COCO 上预训练过的 yolov5s.pt有迁移学习的效果比从头训练收敛快很多。--img训练时缩放到的输入尺寸。这份数据集的原始分辨率在 640 到 1080 之间我建议设成 640。如果你发现猪在画面中较小可以尝试 768 或者 960输入分辨率变大之后小目标跑丢的概率会下降。--batch显存能吃下就尽量设大一点。16 这个数值在 8GB 显存的显卡上配合 640 分辨率基本能跑如果显存不够降到 8。--epochs100 轮对这个数据量来说不算多。不过如果训练到一半发现验证集的 mAP 已经不再提升了可以提前停。4.3 训练过程中的关键监控指标训练过程中要盯几个关键输出。每隔一段时间终端会打印一组指标重点关注 mAP0.5 和 mAP0.5:0.95。其中 mAP0.5 是 IoU 阈值取 0.5 时的平均精度mAP0.5:0.95 是取多个阈值后的平均值后者更严格。在单类别检测任务里这两个指标越接近越好如果差距过大说明模型框的定位精度不够——也就是说虽然能大致框住目标但位置和大小不够准。每轮训练结束后会保存一批权重文件在 runs/train/exp 目录下。last.pt 是最后一轮的权重best.pt 是验证集上表现最好的权重后面推理和部署默认都加载 best.pt。4.4 数据加载的路径配置误区训练过程中如果报错说找不到图片一般是路径配置的问题。YOLOv5 对路径的处理方式是data.yaml 里填的路径如果不存在它不会自动去上一级目录找。所以你在配置 train 和 val 路径的时候可以在终端先跑一下ls确认路径真实存在不要想当然地写相对路径。特别要注意的是yaml 文件里的路径如果用的是反斜杠\在 Windows 上要改成/或者用转义字符否则解析的时候会出错。另外一个常见的坑是图片和标签数量对不上。比如 training set 有 929 张图但是图片文件里某些 jpg 文件没有对应的 txt 标签这种样本会被跳过实际参与训练的数量少于预期。YOLOv5 训练时会在终端提示adding image...的数量你可以对比一下实际数量和总数量是否一致。5. 密集目标场景避坑小目标漏检、边界框偏移与标签清洗5.1 猪圈场景的典型识别难点猪圈摄像头拍出来的图像和常规的公开数据集不太一样。第一是视角通常是从上往下斜拍猪与猪之间的遮挡非常严重经常出现 A 猪的身体遮住 B 猪的头部第二是光照变化大白天可能有过曝的区域晚上摄像头补光之后颜色会失真第三是画面里的猪非常密集每张图几十个目标的情况不少见这正好是这份数据集强调的「每张图像均有很多个目标」的特点。这些因素叠加在一起导致模型在密集场景下经常出现一种现象漏检率上升或者把靠近的两头猪合并识别成一个目标。这本质上是 NMS 后处理的问题——两个高度重叠的框在非极大值抑制阶段被当成同一个目标去掉了。如果遇到这个情况可以用一个更小的 NMS 阈值来缓解在推理时把 IoU 阈值降低让两个框的重叠程度更高才被合并。5.2 标签格式检查与错误排查数据里带的标签质量整体是不错的但我在处理类似数据集时养成了一个习惯开训前用脚本检查所有标签的坐标值是否合法。所谓「合法」包含三层要求归一化坐标在 0 到 1 之间框的宽高都大于 0如果宽或高趋近于 0说明这个标注要么是无效的要么是误标了。import glob label_files glob.glob(datasets/labels/train/*.txt) invalid_count 0 for label_file in label_files: with open(label_file, r) as f: lines f.readlines() for i, line in enumerate(lines): parts line.strip().split() if len(parts) ! 5: print(f格式错误: {label_file} 第{i1}行) invalid_count 1 continue cls_id int(parts[0]) x, y, w, h map(float, parts[1:]) if cls_id ! 0: print(f类别ID错误: {label_file} 第{i1}行, cls{cls_id}) invalid_count 1 if not (0 x 1 and 0 y 1): print(f坐标越界: {label_file} 第{i1}行) invalid_count 1 if w 0 or h 0: print(f框尺寸异常: {label_file} 第{i1}行) invalid_count 1 if invalid_count 0: print(标签检查通过可以进入训练流程) else: print(f发现 {invalid_count} 处异常请处理后再训练)这段代码的作用是过滤出所有明显不合法的标注。坐标越界这种情况经常出现在数据增强或者裁剪预处理阶段一旦某个框的坐标被算到 1 以外模型训练时就会出问题。检查脚本虽然简单但在数据量大的时候能帮你省下很多排查时间。5.3 类别不平衡与单类别的特殊性这份数据集只有 pig 一个类别所以在训练时不需要担心类别不平衡问题。但单类别也有单类别的坑背景复杂度的变化会严重影响模型精度。如果训练集里的画面都是同一个猪圈的角度但验证集里有一些新的摄像头角度模型的表现可能会明显滑坡。处理办法是尽量利用数据增强来模拟变化。YOLOv5 默认开启 Mosaic 增强、随机平移、缩放、翻转等操作。其中 Mosaic 是 YOLOv5 在训练前 70% 轮次里默认开启的它把 4 张图拼接成一张训练对小目标检测有明显提升。如果你发现模型在某个角度下一直漏检可以适当调大--hsv_h、--hsv_s这些颜色增强参数因为猪圈的光照变化很大增加颜色扰动能让模型对光照变化更鲁棒。5.4 过拟合的识别与应对929 张训练图不算多尤其是用 YOLOv5m 以上的模型时过拟合是大概率事件。过拟合的典型表征是训练集的 loss 持续下降但验证集的 mAP 在某个 epoch 之后不再上升甚至缓慢下降。应对措施我从优先级排序换更小的模型比如从 m 降到 s增加数据增强强度比如把 mosaic 概率调高在 train.py 后面追加--weight_decay 0.0005正则化约束模型复杂度用更早的快照权重做推理不要执念于最后一轮。其中 weight_decay 这个参数很多人会忽略。YOLOv5 默认的 weight_decay 是 0.0005如果你觉得模型过拟合严重可以试着把它调到 0.001看验证集指标是否回升。6. 训练后的验证技巧把「模型能用」变成「模型可靠」训练结束后先在测试图像上做一次可视化推理是基本功。用 best.pt 跑一张验证集图片把置信度阈值调到 0.25看看预测框和真实框的差距。YOLOv5 的 detect.py 命令大致是这样的python detect.py \ --weights runs/train/exp/best.pt \ --source datasets/images/val/ \ --conf 0.25 \ --iou 0.5 \ --save-txt跑完之后在 runs/detect/exp 目录里能看到每张图的预测结果和对应的 txt 文件。这里我要分享一个习惯把预测结果里置信度低于 0.6 的样本单独筛出来看这类样本通常就是模型勉强检测出的目标最能暴露问题。我经历过一个项目模型整体 mAP 是 94%看起来不错但把低置信度样本拉出来一看全是猪身体大面积重叠的画面——这种情况在实际应用里根本不罕见。推理验证时还有一个值得做的小技巧把每张图的预测框数量和真实标注框数量做个对比。密集场景下如果模型预测框数量明显偏少说明 NMS 阶段合并太激进或者模型漏检严重。这时候可以尝试调低 detect.py 的--iou参数把 NMS 的合并阈值从 0.5 降到 0.35通常漏检会减少代价是出现少量重复框。最后说一个部署阶段的血泪教训。我曾经把模型直接丢到边缘设备上跑结果推理速度比预期慢了一倍。查了半天发现是输入分辨率的问题——训练时用 640部署时为了追求精度改成了 960没想到设备的 NPU 对 960 分辨率支持不够好导致推理耗时暴增。从那以后我每次训练前都会先确认部署时的输入分辨率训练和部署保持一致不再让模型在不知道目标设备规格的情况下盲跑。希望这次的生猪检测数据集能帮你把数据预处理的时间省下来把精力花在真正的调优上早日跑通自己的检测流程。提示下载数据集后先跑一遍可视化脚本看标注质量再进训练流程这个顺序不要颠倒。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑