尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

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

实战分享:基于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.mdimages/: 存放所有的图像文件。我们进一步划分为train训练集、val验证集和test测试集。这种划分是为了防止模型在训练时“偷看”测试数据导致过拟合是机器学习项目的基本操作。labels/: 存放与图像一一对应的标注文件。目录结构与images/完全一致。标注文件是纯文本格式.txt这是为了兼容YOLO格式。每个标注文件对应一张图片里面记录了该图片中所有猪只的边界框位置信息。classes.txt: 一个简单的文本文件里面只有一行pig。这定义了数据集中唯一的类别。虽然现在只有“猪”一类但保留这个文件是为了格式的规范性和未来的可扩展性比如增加“病猪”、“母猪”等细分类别。README.md: 数据集的说明文档包含了数据统计信息、采集环境、标注规范、许可证等元数据。2.2 图像数据多样性与挑战并存我们的图像数据全部来源于真实猪舍的固定监控摄像头分辨率统一为1920x1080。我们刻意追求场景的多样性以增强模型的鲁棒性时间跨度涵盖了清晨、正午、傍晚、夜间补光等多个时间段以覆盖不同的光照条件。夜间红外或补光图像对于模型理解低照度下的目标特征至关重要。密集程度包含了从稀疏十几头到极度密集上百头挤在一个角落的各种猪群密度。高密度下的严重遮挡是计数任务最大的难点。猪只状态包括站立、卧躺、行走、进食、饮水等多种姿态。躺卧的猪只轮廓与站立时差异巨大模型必须学会识别。拍摄角度均为俯视或斜俯视角度这是监控摄像头最常见的视角能最大范围覆盖猪栏但也带来了透视变形和尺度变化的问题远处的猪看起来小。注意我们没有使用任何网络爬虫获取的图片所有数据均来自合作农场并签署了数据使用协议确保了数据的合法性和隐私性。这是做工业级项目必须要注意的合规底线。2.3 标注格式详解YOLO格式的奥秘标注文件.txt是数据集的核心。我们采用YOLO格式因为它简洁高效被广泛支持。每个.txt文件可能包含多行每一行代表图像中的一个目标一头猪。每一行的格式为class_id center_x center_y width heightclass_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 taskdetect modetrain modelyolov8n.pt datapig_counting.yaml epochs100 imgsz640 batch16让我解释一下这几个关键参数modelyolov8n.pt: 指定使用YOLOv8的纳米nano模型它体积小、速度快适合在算力有限的边缘设备如猪舍的工控机上部署。如果你有强大的GPU可以换成yolov8s.pt小、yolov8m.pt中等更大模型以获得更高精度。epochs100: 训练轮数。对于我们的数据集100轮通常是一个不错的起点可以观察损失曲线是否收敛。imgsz640: 训练时图像被统一缩放到640x640像素。这是YOLO系列的经典输入尺寸在速度和精度间取得了良好平衡。batch16: 批处理大小。取决于你的GPU显存。如果出现CUDA out of memory错误需要降低batch值如8或4。训练开始后Ultralytics会在后台启动一个本地Web服务器你可以通过在浏览器中打开命令行输出的URL通常是http://localhost:XXXX来实时查看训练过程。这个可视化工具极其重要你需要重点关注以下几个指标损失曲线losstrain/box_loss,train/cls_loss,val/box_loss等。理想情况是训练损失和验证损失都平稳下降且两者差距不大。如果验证损失先降后升而训练损失持续下降说明模型过拟合了它在死记硬背训练集而无法泛化到新数据。性能指标metricsmetrics/mAP50-95(平均精度) 和metrics/precision,metrics/recall。mAP是衡量检测精度的核心指标值越高越好。 Precision精确率高意味着“找到的猪基本都是真猪”Recall召回率高意味着“真猪基本都被找到了”。在猪只计数场景我们更追求高Recall因为漏数假阴性比错数假阳性的成本更高。验证集预测样本可视化工具会展示模型在验证集上的预测结果。你可以直观地看到哪些猪被漏检了哪些背景被误检成了猪。3.3 模型评估与导出训练完成后模型权重会保存在runs/detect/train/weights/目录下其中best.pt是验证集上表现最好的模型。使用以下命令在独立的测试集上评估模型性能yolo taskdetect modeval modelruns/detect/train/weights/best.pt datapig_counting.yaml评估报告会给出模型在从未见过的测试图片上的最终mAP、Precision、Recall等指标这是衡量模型泛化能力的黄金标准。最后为了部署到不同的平台你可能需要导出模型。例如导出为ONNX格式一种开放的模型交换格式yolo taskdetect modeexport modelruns/detect/train/weights/best.pt formatonnx导出的ONNX模型可以被OpenCV、TensorRT、ONNX Runtime等多种推理引擎加载非常灵活。4. 实战中的挑战与解决方案直接套用上述流程你大概率能训练出一个“能用”的模型。但要达到“好用”、“稳定”的工业级水平我们遇到了并解决了一系列棘手问题。4.1 挑战一密集遮挡下的漏检与误检这是猪只计数尤其是育肥猪舍场景下的头号难题。猪只喜欢扎堆休息身体相互重叠导致特征模糊边界框难以界定。我们的解决方案是“分而治之”与“后处理优化”数据增强策略调整我们放弃了简单的旋转、裁剪转而采用专门针对密集小目标的增强策略。Mosaic增强将四张训练图片拼接成一张。这能强迫模型学习在不同位置、不同上下文环境中识别猪只有效提升了对遮挡和尺度的鲁棒性。YOLOv8默认就开启了Mosaic增强。Copy-Paste增强随机将一些猪只的标注框复制粘贴到其他图片上。这人工创造了更复杂的遮挡场景让模型“见多识广”。但使用时需谨慎要保证粘贴的猪只与背景光照、颜色协调否则会引入噪声。模型结构微调YOLOv8的锚框Anchor默认是针对COCO等通用数据集设计的。我们利用数据集聚类分析重新生成了更适合猪只尺度的锚框。使用k-means算法在训练集的所有标注框上进行聚类得到9组先验的宽高比例替换掉模型默认的锚框让模型在训练初期就有更好的起点。后处理逻辑优化模型输出的原始检测框往往很多需要经过非极大值抑制NMS来去除重叠框。在密集场景下标准NMS容易把正确但挨得很近的框抑制掉。我们尝试了软化NMSSoft-NMS不直接删除高分框的重叠框而是降低它们的置信度分数。这给了紧密相邻的猪只框共存的机会。加权框融合WBF不抑制而是将重叠框根据它们的置信度进行加权平均融合成一个更准确的位置。这在猪只部分重叠时效果显著。 经过对比在我们的数据集上调整IoU阈值的标准NMS从0.45调至0.3结合提高分类置信度阈值从0.25提至0.5取得了最佳平衡既保证了召回又控制了误检。4.2 挑战二光照剧烈变化与图像质量猪舍环境的光照条件复杂特别是夜间依靠红外灯或白色补光灯图像可能呈现单色、低对比度、高噪声等特点。我们的应对措施是“预处理增强”与“模型鲁棒性训练”预处理管道升级在将图像送入模型前我们增加了一个自适应的预处理步骤。自适应直方图均衡化CLAHE用于增强夜间低对比度图像的局部细节让猪只的轮廓更清晰。高斯滤波去噪针对红外图像中的椒盐噪声使用轻微的高斯模糊进行平滑避免噪声被模型误认为是纹理特征。 这些预处理操作可以集成到数据加载器中作为在线增强的一部分对训练和推理都生效。利用数据本身我们数据集中已经包含了大量不同光照条件的图片这是最宝贵的财富。确保训练时每个批次batch中都包含不同光照的图片防止模型偏向某一种光照条件。YOLO的数据加载器会随机打乱数据通常能满足这一点。4.3 挑战三卧躺猪只与背景混淆躺卧的猪只尤其是颜色与地面接近时如水泥地其轮廓特征与背景相似度很高极易漏检。我们通过“特征工程”和“损失函数引导”来解决关注纹理而非颜色在数据标注时我们要求标注员必须框出猪只的整个身体轮廓即使部分身体颜色与地面融为一体。这迫使模型去学习猪只的纹理特征如皮肤褶皱、毛发、形状特征椭圆形和空间关系特征通常成群出现而不是单纯依赖颜色差异。调整损失函数权重YOLO的损失函数由定位损失box loss、分类损失cls loss和置信度损失obj loss组成。我们发现对于易漏检的卧躺猪只适当提高分类损失的权重可以让模型更“努力”地去区分“猪”和“非猪”即使它们的边界框定位不那么完美也没关系计数任务可以容忍轻微的位置偏差。5. 超越计数数据集的进阶应用与迭代一个高质量的猪只计数数据集其价值远不止于训练一个计数器。它还可以作为基石支撑起更丰富的智慧养殖应用。5.1 应用延伸从计数到行为分析基于相同的检测模型我们可以很容易地扩展出以下功能猪只体重估测这是一个非常实用的需求。我们与畜牧专家合作在数据集中挑选了一批不同日龄、已知体重的猪只图片并标注了它们的“肩宽”通过边界框宽度近似和“体长”需要关键点标注。然后建立了一个简单的线性回归模型将图像中检测框的像素宽度与实际体重关联。虽然精度不如地磅但作为无接触、大范围的体重趋势监测工具已经非常有价值。异常行为识别通过分析连续帧中同一头猪需要目标跟踪算法如ByteTrack的运动轨迹、姿态站/卧变化频率可以识别打架、剧烈奔跑、长时间不活动等异常行为。例如短时间内运动轨迹剧烈变化可能意味着打架而长时间位置不变且姿态为“卧”可能意味着生病。这需要我们在数据集中增加视频序列和相应的行为标签。区域密度热力图将猪舍平面图划分为网格统计每个网格内在一定时间内的平均猪只数量生成热力图。这可以帮助养殖员直观了解猪只的活动偏好区域如饮水点、休息区从而优化栏舍布局。5.2 数据集的持续迭代一个永无止境的过程我们最初的数据集版本只有5000张图片。随着模型在更多猪舍部署我们建立了一个主动学习的闭环模型部署与推理将训练好的模型部署到新猪舍的摄像头系统中进行实时计数。困难样本收集系统会自动记录下模型“犹豫不决”预测置信度在阈值附近如0.4-0.6或“明显错误”人工复核发现漏检/误检严重的图片片段。人工复核与标注定期将这些困难样本导出由标注团队进行精标。这里有个关键技巧不是全部重标而是只修正模型出错的区域这大大提升了标注效率。增量训练将新标注的困难样本加入原有训练集用较小的学习率对模型进行微调fine-tuning让模型专门学习这些它之前没搞定的“难题”。通过这个闭环我们的数据集像滚雪球一样越滚越大、质量越来越高模型的性能也在实战中持续进化。目前我们的数据集已迭代到V3版本包含了超过2万张图片覆盖了南北不同地域、不同品种大白、长白、杜洛克、不同生长阶段的猪只模型的平均计数误差率在真实复杂场景下已稳定控制在3%以内。制作和使用“猪只计数数据集.zip”的过程远不止是整理一些图片和标签。它涉及对业务场景的深刻理解、对计算机视觉技术的灵活运用、对数据闭环的精心设计以及无数次试错和调优。希望这份详细的拆解能为你开启自己的AI农业项目提供一块坚实的垫脚石。记住好的数据是智能模型的基石而处理数据的思路和过程中积累的经验往往比数据本身更有价值。本文还有配套的精品资源点击获取
返回列表