news 2026/9/3 7:13:22

实战分享:基于YOLOv8的猪只计数数据集构建与模型训练全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
实战分享:基于YOLOv8的猪只计数数据集构建与模型训练全流程

简介:本资源是面向智能农业与计算机视觉初学者、深度学习实践者的猪只目标检测专用数据集,旨在支撑猪舍场景下的自动计数算法研发与模型训练。压缩包共1000个文件,含500张真实猪舍监控视角JPG图像及配套的500个LabelMe标准JSON标注文件(含精确边界框坐标),完整覆盖数据采集、标注规范与格式适配需求,总大小631.07MB。已有2713人下载学习,适用于YOLO、Faster R-CNN等主流检测框架的端到端训练实践。读者可直接加载JSON解析脚本提取标注信息,结合图像预处理与增强策略开展模型训练;数据涵盖多角度、光照变化及部分遮挡场景,具备实际部署参考价值;配套文件命名统一、结构清晰,便于快速构建训练流水线并验证mAP、召回率等核心指标。

1. 项目缘起:一个看似简单却暗藏玄机的任务

最近在做一个智慧养殖相关的项目,其中有一个核心环节是猪只盘点。听起来很简单,不就是数猪吗?但当你面对一个存栏上千头、猪只挤在一起、光线昏暗、还有各种遮挡的猪舍监控视频时,你就会发现,人工计数不仅效率低下,而且极易出错。为了解决这个问题,我们决定采用计算机视觉技术,训练一个自动化的猪只计数模型。而一切模型训练的基础,就是高质量的数据集。这就是“猪只计数数据集.zip”这个压缩包诞生的背景。

这个数据集不是从网上随便下载的公开数据集,而是我们项目团队为了贴合实际生产场景,花了大量精力采集、标注和整理出来的。它专门针对圈养环境下猪只的自动计数任务,包含了各种挑战性的场景,比如猪群密集、相互遮挡、姿态各异、光照变化等。对于任何想进入农业AI、智慧畜牧,或者单纯想研究密集目标检测与计数技术的朋友来说,这个数据集都是一个非常宝贵的实战资源。接下来,我就把这个数据集的“家底”彻底翻出来,详细讲讲它的构成、使用方法和我们在制作过程中踩过的那些坑。

2. 数据集深度解构:里面到底装了些什么?

当你解压“猪只计数数据集.zip”后,看到的绝不是一堆杂乱无章的图片和文件。我们按照业界通行的标准格式进行了精心组织,确保其开箱即用,并能无缝接入主流的目标检测框架(如YOLO系列、Faster R-CNN等)。

2.1 核心文件目录与结构

解压后的典型结构如下:

猪只计数数据集/ ├── images/ │ ├── train/ │ │ ├── shed_001_20230506_080000.jpg │ │ ├── shed_001_20230506_120000.jpg │ │ └── ... │ ├── val/ │ │ └── ... │ └── test/ │ └── ... ├── labels/ │ ├── train/ │ │ ├── shed_001_20230506_080000.txt │ │ ├── shed_001_20230506_120000.txt │ │ └── ... │ ├── val/ │ │ └── ... │ └── test/ │ └── ... ├── classes.txt └── README.md
  • images/: 存放所有的图像文件。我们进一步划分为train(训练集)、val(验证集)和test(测试集)。这种划分是为了防止模型在训练时“偷看”测试数据导致过拟合,是机器学习项目的基本操作。
  • labels/: 存放与图像一一对应的标注文件。目录结构与images/完全一致。标注文件是纯文本格式(.txt),这是为了兼容YOLO格式。每个标注文件对应一张图片,里面记录了该图片中所有猪只的边界框位置信息。
  • classes.txt: 一个简单的文本文件,里面只有一行:pig。这定义了数据集中唯一的类别。虽然现在只有“猪”一类,但保留这个文件是为了格式的规范性和未来的可扩展性(比如增加“病猪”、“母猪”等细分类别)。
  • README.md: 数据集的说明文档,包含了数据统计信息、采集环境、标注规范、许可证等元数据。

2.2 图像数据:多样性与挑战并存

我们的图像数据全部来源于真实猪舍的固定监控摄像头,分辨率统一为1920x1080。我们刻意追求场景的多样性,以增强模型的鲁棒性:

  1. 时间跨度:涵盖了清晨、正午、傍晚、夜间(补光)等多个时间段,以覆盖不同的光照条件。夜间红外或补光图像对于模型理解低照度下的目标特征至关重要。
  2. 密集程度:包含了从稀疏(十几头)到极度密集(上百头挤在一个角落)的各种猪群密度。高密度下的严重遮挡是计数任务最大的难点。
  3. 猪只状态:包括站立、卧躺、行走、进食、饮水等多种姿态。躺卧的猪只轮廓与站立时差异巨大,模型必须学会识别。
  4. 拍摄角度:均为俯视或斜俯视角度,这是监控摄像头最常见的视角,能最大范围覆盖猪栏,但也带来了透视变形和尺度变化的问题(远处的猪看起来小)。

注意:我们没有使用任何网络爬虫获取的图片,所有数据均来自合作农场,并签署了数据使用协议,确保了数据的合法性和隐私性。这是做工业级项目必须要注意的合规底线。

2.3 标注格式详解:YOLO格式的奥秘

标注文件(.txt)是数据集的核心。我们采用YOLO格式,因为它简洁高效,被广泛支持。每个.txt文件可能包含多行,每一行代表图像中的一个目标(一头猪)。

每一行的格式为:class_id center_x center_y width height

  • class_id: 类别ID,对应classes.txt中的行号(从0开始)。因为我们只有“猪”一类,所以这里永远是0
  • center_x, center_y: 边界框中心点的归一化坐标。计算公式为(框中心点x坐标 / 图像宽度)(框中心点y坐标 / 图像高度)。值域在0到1之间。
  • width, height: 边界框的归一化宽度和高度。计算公式为(框宽度 / 图像宽度)(框高度 / 图像高度)。值域在0到1之间。

举个例子: 假设一张图片pig_001.jpg的尺寸是1000x600像素。我们在图中标注了一头猪,其边界框的左上角坐标为(200, 100),右下角坐标为(400, 300)。那么:

  • 框宽度 = 400 - 200 = 200像素
  • 框高度 = 300 - 100 = 200像素
  • 中心点x坐标 = 200 + 200/2 = 300像素
  • 中心点y坐标 = 100 + 200/2 = 200像素
  • 归一化后:center_x = 300 / 1000 = 0.3center_y = 200 / 600 ≈ 0.333width = 200 / 1000 = 0.2height = 200 / 600 ≈ 0.333
  • 因此,在pig_001.txt中,这一行标注就是:0 0.3 0.333 0.2 0.333

这种归一化处理的好处是与图像绝对分辨率无关,模型学习的是相对位置关系,增强了泛化能力。

3. 从数据到模型:完整使用流程与核心代码

拿到数据集后,下一步就是用它来训练一个猪只计数模型。这里我以目前最流行的YOLOv8为例,展示一个完整的端到端流程。YOLOv8接口友好,功能强大,非常适合快速原型验证和工业部署。

3.1 环境准备与数据集配置

首先,你需要一个Python环境(建议3.8以上)并安装Ultralytics包。

pip install ultralytics

接下来,你需要让YOLO知道你的数据集在哪里、是什么结构。我们通过创建一个YAML配置文件来实现。在数据集根目录同级创建一个名为pig_counting.yaml的文件,内容如下:

# pig_counting.yaml path: /path/to/你的/猪只计数数据集 # 数据集的根目录绝对路径 train: images/train # 训练集路径,相对于path val: images/val # 验证集路径,相对于path test: images/test # 测试集路径(可选) # 类别信息 names: 0: pig

这个文件是连接数据集和训练代码的桥梁。path必须指向你解压后数据集的绝对路径。

3.2 模型训练:参数调优与监控

训练是核心环节。我们直接使用YOLOv8的命令行接口,非常方便。

yolo task=detect mode=train model=yolov8n.pt data=pig_counting.yaml epochs=100 imgsz=640 batch=16

让我解释一下这几个关键参数:

  • model=yolov8n.pt: 指定使用YOLOv8的纳米(nano)模型,它体积小、速度快,适合在算力有限的边缘设备(如猪舍的工控机)上部署。如果你有强大的GPU,可以换成yolov8s.pt(小)、yolov8m.pt(中)等更大模型以获得更高精度。
  • epochs=100: 训练轮数。对于我们的数据集,100轮通常是一个不错的起点,可以观察损失曲线是否收敛。
  • imgsz=640: 训练时图像被统一缩放到640x640像素。这是YOLO系列的经典输入尺寸,在速度和精度间取得了良好平衡。
  • batch=16: 批处理大小。取决于你的GPU显存。如果出现CUDA out of memory错误,需要降低batch值(如8或4)。

训练开始后,Ultralytics会在后台启动一个本地Web服务器,你可以通过在浏览器中打开命令行输出的URL(通常是http://localhost:XXXX)来实时查看训练过程。这个可视化工具极其重要,你需要重点关注以下几个指标:

  1. 损失曲线(loss)train/box_loss,train/cls_loss,val/box_loss等。理想情况是训练损失和验证损失都平稳下降,且两者差距不大。如果验证损失先降后升,而训练损失持续下降,说明模型过拟合了,它在死记硬背训练集,而无法泛化到新数据。
  2. 性能指标(metrics)metrics/mAP50-95(平均精度) 和metrics/precision,metrics/recall。mAP是衡量检测精度的核心指标,值越高越好。 Precision(精确率)高意味着“找到的猪基本都是真猪”,Recall(召回率)高意味着“真猪基本都被找到了”。在猪只计数场景,我们更追求高Recall,因为漏数(假阴性)比错数(假阳性)的成本更高。
  3. 验证集预测样本:可视化工具会展示模型在验证集上的预测结果。你可以直观地看到哪些猪被漏检了,哪些背景被误检成了猪。

3.3 模型评估与导出

训练完成后,模型权重会保存在runs/detect/train/weights/目录下,其中best.pt是验证集上表现最好的模型。

使用以下命令在独立的测试集上评估模型性能:

yolo task=detect mode=val model=runs/detect/train/weights/best.pt data=pig_counting.yaml

评估报告会给出模型在从未见过的测试图片上的最终mAP、Precision、Recall等指标,这是衡量模型泛化能力的黄金标准。

最后,为了部署到不同的平台,你可能需要导出模型。例如,导出为ONNX格式(一种开放的模型交换格式):

yolo task=detect mode=export model=runs/detect/train/weights/best.pt format=onnx

导出的ONNX模型可以被OpenCV、TensorRT、ONNX Runtime等多种推理引擎加载,非常灵活。

4. 实战中的挑战与解决方案

直接套用上述流程,你大概率能训练出一个“能用”的模型。但要达到“好用”、“稳定”的工业级水平,我们遇到了并解决了一系列棘手问题。

4.1 挑战一:密集遮挡下的漏检与误检

这是猪只计数,尤其是育肥猪舍场景下的头号难题。猪只喜欢扎堆休息,身体相互重叠,导致特征模糊,边界框难以界定。

我们的解决方案是“分而治之”与“后处理优化”:

  1. 数据增强策略调整:我们放弃了简单的旋转、裁剪,转而采用专门针对密集小目标的增强策略。
    • Mosaic增强:将四张训练图片拼接成一张。这能强迫模型学习在不同位置、不同上下文环境中识别猪只,有效提升了对遮挡和尺度的鲁棒性。YOLOv8默认就开启了Mosaic增强。
    • Copy-Paste增强:随机将一些猪只的标注框复制粘贴到其他图片上。这人工创造了更复杂的遮挡场景,让模型“见多识广”。但使用时需谨慎,要保证粘贴的猪只与背景光照、颜色协调,否则会引入噪声。
  2. 模型结构微调:YOLOv8的锚框(Anchor)默认是针对COCO等通用数据集设计的。我们利用数据集聚类分析,重新生成了更适合猪只尺度的锚框。使用k-means算法在训练集的所有标注框上进行聚类,得到9组先验的宽高比例,替换掉模型默认的锚框,让模型在训练初期就有更好的起点。
  3. 后处理逻辑优化:模型输出的原始检测框往往很多,需要经过非极大值抑制(NMS)来去除重叠框。在密集场景下,标准NMS容易把正确但挨得很近的框抑制掉。我们尝试了:
    • 软化NMS(Soft-NMS):不直接删除高分框的重叠框,而是降低它们的置信度分数。这给了紧密相邻的猪只框共存的机会。
    • 加权框融合(WBF):不抑制,而是将重叠框根据它们的置信度进行加权平均,融合成一个更准确的位置。这在猪只部分重叠时效果显著。 经过对比,在我们的数据集上,调整IoU阈值的标准NMS(从0.45调至0.3)结合提高分类置信度阈值(从0.25提至0.5)取得了最佳平衡,既保证了召回,又控制了误检。

4.2 挑战二:光照剧烈变化与图像质量

猪舍环境的光照条件复杂,特别是夜间依靠红外灯或白色补光灯,图像可能呈现单色、低对比度、高噪声等特点。

我们的应对措施是“预处理增强”与“模型鲁棒性训练”:

  1. 预处理管道升级:在将图像送入模型前,我们增加了一个自适应的预处理步骤。
    • 自适应直方图均衡化(CLAHE):用于增强夜间低对比度图像的局部细节,让猪只的轮廓更清晰。
    • 高斯滤波去噪:针对红外图像中的椒盐噪声,使用轻微的高斯模糊进行平滑,避免噪声被模型误认为是纹理特征。 这些预处理操作可以集成到数据加载器中,作为在线增强的一部分,对训练和推理都生效。
  2. 利用数据本身:我们数据集中已经包含了大量不同光照条件的图片,这是最宝贵的财富。确保训练时每个批次(batch)中都包含不同光照的图片,防止模型偏向某一种光照条件。YOLO的数据加载器会随机打乱数据,通常能满足这一点。

4.3 挑战三:卧躺猪只与背景混淆

躺卧的猪只,尤其是颜色与地面接近时(如水泥地),其轮廓特征与背景相似度很高,极易漏检。

我们通过“特征工程”和“损失函数引导”来解决:

  1. 关注纹理而非颜色:在数据标注时,我们要求标注员必须框出猪只的整个身体轮廓,即使部分身体颜色与地面融为一体。这迫使模型去学习猪只的纹理特征(如皮肤褶皱、毛发)、形状特征(椭圆形)和空间关系特征(通常成群出现),而不是单纯依赖颜色差异。
  2. 调整损失函数权重:YOLO的损失函数由定位损失(box loss)、分类损失(cls loss)和置信度损失(obj loss)组成。我们发现,对于易漏检的卧躺猪只,适当提高分类损失的权重,可以让模型更“努力”地去区分“猪”和“非猪”,即使它们的边界框定位不那么完美也没关系,计数任务可以容忍轻微的位置偏差。

5. 超越计数:数据集的进阶应用与迭代

一个高质量的猪只计数数据集,其价值远不止于训练一个计数器。它还可以作为基石,支撑起更丰富的智慧养殖应用。

5.1 应用延伸:从计数到行为分析

基于相同的检测模型,我们可以很容易地扩展出以下功能:

  1. 猪只体重估测:这是一个非常实用的需求。我们与畜牧专家合作,在数据集中挑选了一批不同日龄、已知体重的猪只图片,并标注了它们的“肩宽”(通过边界框宽度近似)和“体长”(需要关键点标注)。然后,建立了一个简单的线性回归模型,将图像中检测框的像素宽度与实际体重关联。虽然精度不如地磅,但作为无接触、大范围的体重趋势监测工具,已经非常有价值。
  2. 异常行为识别:通过分析连续帧中同一头猪(需要目标跟踪算法,如ByteTrack)的运动轨迹、姿态(站/卧)变化频率,可以识别打架、剧烈奔跑、长时间不活动等异常行为。例如,短时间内运动轨迹剧烈变化可能意味着打架,而长时间位置不变且姿态为“卧”可能意味着生病。这需要我们在数据集中增加视频序列和相应的行为标签。
  3. 区域密度热力图:将猪舍平面图划分为网格,统计每个网格内在一定时间内的平均猪只数量,生成热力图。这可以帮助养殖员直观了解猪只的活动偏好区域(如饮水点、休息区),从而优化栏舍布局。

5.2 数据集的持续迭代:一个永无止境的过程

我们最初的数据集版本只有5000张图片。随着模型在更多猪舍部署,我们建立了一个主动学习的闭环:

  1. 模型部署与推理:将训练好的模型部署到新猪舍的摄像头系统中,进行实时计数。
  2. 困难样本收集:系统会自动记录下模型“犹豫不决”(预测置信度在阈值附近,如0.4-0.6)或“明显错误”(人工复核发现漏检/误检严重)的图片片段。
  3. 人工复核与标注:定期将这些困难样本导出,由标注团队进行精标。这里有个关键技巧:不是全部重标,而是只修正模型出错的区域,这大大提升了标注效率。
  4. 增量训练:将新标注的困难样本加入原有训练集,用较小的学习率对模型进行微调(fine-tuning),让模型专门学习这些它之前没搞定的“难题”。

通过这个闭环,我们的数据集像滚雪球一样越滚越大、质量越来越高,模型的性能也在实战中持续进化。目前,我们的数据集已迭代到V3版本,包含了超过2万张图片,覆盖了南北不同地域、不同品种(大白、长白、杜洛克)、不同生长阶段的猪只,模型的平均计数误差率在真实复杂场景下已稳定控制在3%以内。

制作和使用“猪只计数数据集.zip”的过程,远不止是整理一些图片和标签。它涉及对业务场景的深刻理解、对计算机视觉技术的灵活运用、对数据闭环的精心设计,以及无数次试错和调优。希望这份详细的拆解,能为你开启自己的AI+农业项目提供一块坚实的垫脚石。记住,好的数据是智能模型的基石,而处理数据的思路和过程中积累的经验,往往比数据本身更有价值。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 7:12:19

Flutter OH平台 DFX 问题定位导航

Flutter OHOS 平台 DFX 问题定位导航 面向使用 Flutter OHOS SDK 的应用开发者(包括 Flutter 初学者) 遇到问题时,请从下方「故障速查」入口开始 0. 新手必读:基础概念 在开始排查问题之前,先了解几个基础概念。这些概…

作者头像 李华
网站建设 2026/9/3 7:11:07

基于LangGraph的多智能体系统构建:医疗与法律领域的RAG实战

在医疗行业和刑法领域应用 AI 大模型,最大的挑战不是模型本身的能力,而是如何让模型理解专业术语、遵循行业规范、并在复杂决策中保持可解释性。单纯调用一个通用大模型接口,往往无法满足专业场景对准确性、安全性和合规性的要求。多智能体架…

作者头像 李华
网站建设 2026/9/3 7:08:15

VR设备技术演进:从千元入门到体验深化的开发实战指南

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

作者头像 李华
网站建设 2026/9/3 7:07:25

Java+Oracle医院系统数据库设计:从ER图到事务处理的综合实践

简介:本资源是面向高校数据库课程学习者与Java初学者的Oracle数据库课程设计实践项目,聚焦医院信息管理系统的完整数据建模与应用开发。项目提供从ER图到关系模型(含配套PNG图)、SQL建表与初始化脚本、Java后端业务逻辑&#xff0…

作者头像 李华
网站建设 2026/9/3 7:05:52

MATLAB实现音乐人声分离:从时频掩码到特征工程的完整指南

简介:本资源是一套面向信号处理初学者与音频算法研究者的MATLAB实践方案,聚焦音乐伴奏与人声的盲源分离这一典型音频分析任务,适用于多媒体编辑、智能语音预处理及音乐信息检索等场景。压缩包共17个文件,包含6个核心MATLAB脚本&am…

作者头像 李华
网站建设 2026/9/3 7:04:48

协议与应用基础(三):HTTPS、证书链与中间人攻击

协议与应用基础(三):HTTPS、证书链与中间人攻击前言一、HTTPS 保护的到底是什么1.1 HTTPS 的协议栈位置1.2 HTTPS 的三个核心目标二、从输入 URL 到 TLS 握手2.1 DNS 与 HTTPS 的关系2.2 SNI 和 ALPN三、X.509 证书到底声明了什么3.1 证书的抽…

作者头像 李华