简介本资源为面向目标检测任务的绵羊检测数据集从COCO2017数据集中提取整理而成适合从事YOLO等检测算法学习与实验的开发者、学生及研究人员使用可用于模型训练、验证与算法对比。压缩包共4783个文件包含1594张jpg图像、1594个xml标注文件与1595个txt标签文件xml与txt双格式并存便于适配不同检测框架的数据读取流程整体约325.17MB。目标类别统一为sheep标注信息完整可直接用于单类别绵羊检测的训练与评估。目前已有237人学习下载数据规模适中适合作为课程设计、毕业设计或算法入门实验的素材。借助该数据集读者可快速搭建训练流程、验证模型在真实场景下的检测效果并对比不同格式标签在YOLO等框架中的使用差异减少自行标注与格式转换的时间成本。1. 绵羊检测数据集与1500张图从零训练一个能用的计数模型牧场主老周上个月找我说他雇了两个人花三天时间数完了一群羊结果两次数字差了四十多只。这不是笑话是养殖场里每天都在发生的事。人工计数在几百只规模下误差能到百分之五以上而绵羊检测数据集配合目标检测模型可以把这件事压缩到几分钟内完成误差控制在个位数。标题里的「1500数据」指的是约1500张标注图像这个量级不算大但足够训练一个在固定场景下可用的检测器。这篇文章面向的是想用现成数据集跑通绵羊检测的工程师和养殖技术员我会把数据检查、格式转换、训练参数、推理部署这条链路完整走一遍包括我在实际项目里翻过的车。如果你手头正好有这批数据或者打算自己标一批下面的内容可以直接抄作业。2. 绵羊检测数据集拿到手先别急着训练数据体检与格式转换2.1 1500张图里藏着什么先做分布统计再谈模型很多人拿到数据集第一反应是直接丢进训练脚本这是最常见的翻车起点。1500张图听起来不少但如果其中1200张是同一只羊的连拍或者80%的图里只有一只羊那这个数据集的泛化能力基本为零。我一般会先跑一遍统计脚本看清楚几个关键指标每张图的绵羊数量分布、图像分辨率分布、标注框的宽高比分布、以及是否存在大量空标注图。import os import json from collections import Counter from PIL import Image # 假设标注是 COCO 格式的 annotations.json with open(annotations.json, r) as f: coco json.load(f) # 每张图的标注数量分布 img_to_anns Counter() for ann in coco[annotations]: img_to_anns[ann[image_id]] 1 count_dist Counter(img_to_anns.values()) print(每图目标数分布:, dict(sorted(count_dist.items()))) # 分辨率分布 resolutions Counter() for img_info in coco[images]: resolutions[(img_info[width], img_info[height])] 1 print(分辨率 Top5:, resolutions.most_common(5)) # 标注框宽高比 ratios [] for ann in coco[annotations]: w, h ann[bbox][2], ann[bbox][3] if h 0: ratios.append(round(w / h, 2)) print(宽高比范围:, min(ratios), -, max(ratios))这段脚本输出三个关键信息。每图目标数分布告诉你数据是否偏向单目标场景——如果绝大多数图只有1到2只羊模型在密集羊群上的表现会断崖式下跌。分辨率分布决定你训练时的输入尺寸如果原图是4000×3000而标注框平均只有80像素宽缩放到640后小目标几乎消失。宽高比范围帮你判断锚框anchor该怎么设绵羊站立时宽高比接近1.5到2.0躺卧时可能接近1.0如果数据里两种姿态都有锚框就不能只设一组。我拿到这批1500张数据时跑出来的结果是每图平均3.7只羊最多一张有23只分辨率集中在1920×1080宽高比集中在1.2到2.2之间。这个分布说明数据质量尚可但存在密集场景训练时输入尺寸不能低于640。2.2 从COCO到YOLO格式转换脚本与四个边界坑确认数据分布没问题后下一步是转成训练框架需要的格式。目前主流选择是YOLO系列的txt格式或者VOC的xml格式我一般用YOLO格式因为读取速度快、解析简单。转换本身不复杂但有几个边界情况必须处理。import json import os from PIL import Image def coco_to_yolo(coco_json, img_dir, out_dir): with open(coco_json, r) as f: coco json.load(f) # 建立 image_id 到文件名的映射 img_id_to_info {img[id]: img for img in coco[images]} # 按 image_id 聚合标注 img_anns {} for ann in coco[annotations]: img_anns.setdefault(ann[image_id], []).append(ann) os.makedirs(out_dir, exist_okTrue) for img_id, anns in img_anns.items(): info img_id_to_info[img_id] w, h info[width], info[height] # 边界坑1图像文件可能不存在 img_path os.path.join(img_dir, info[file_name]) if not os.path.exists(img_path): print(f缺失图像: {info[file_name]}) continue lines [] for ann in anns: # 边界坑2bbox 可能是 [x, y, w, h] 也可能是 [x1, y1, x2, y2] x, y, bw, bh ann[bbox] # 边界坑3坐标可能超出图像边界 x max(0, min(x, w - 1)) y max(0, min(y, h - 1)) bw min(bw, w - x) bh min(bh, h - y) # 转 YOLO 中心点归一化格式 cx (x bw / 2) / w cy (y bh / 2) / h nw bw / w nh bh / h # 边界坑4极小框过滤宽或高小于2像素的标注直接丢弃 if bw 2 or bh 2: continue lines.append(f0 {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}) if lines: txt_name os.path.splitext(info[file_name])[0] .txt with open(os.path.join(out_dir, txt_name), w) as f: f.write(\n.join(lines)) coco_to_yolo(annotations.json, images/, labels/)四个边界坑分别是图像文件缺失导致训练时崩溃、bbox格式歧义导致框位置全错、坐标越界导致归一化后出现负值或大于1、极小框导致损失函数震荡。其中第二个坑最隐蔽因为COCO标准是[x, y, width, height]但有些标注工具导出的是[x1, y1, x2, y2]如果不确认就转换模型学到的全是错位框。我的习惯是转换完后随机抽10张图可视化验证用下面的脚本画框检查。import cv2 import os import random def visualize_yolo(img_path, label_path, save_path): img cv2.imread(img_path) h, w img.shape[:2] if os.path.exists(label_path): with open(label_path) as f: for line in f: cls, cx, cy, nw, nh map(float, line.split()) x1 int((cx - nw/2) * w) y1 int((cy - nh/2) * h) x2 int((cx nw/2) * w) y2 int((cy nh/2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.imwrite(save_path, img) # 随机抽10张 imgs os.listdir(images/) for name in random.sample(imgs, 10): base os.path.splitext(name)[0] visualize_yolo(fimages/{name}, flabels/{base}.txt, fcheck_{name})可视化检查这一步不能省我见过太多人跳过这步训练了三天才发现框全是错的。确认框位置正确后把数据按8:1:1划分训练集、验证集、测试集划分时注意同一场景的连续帧要放在同一个集合里否则验证集精度会虚高。3. 用YOLOv8训练绵羊检测模型参数怎么设、显存怎么省3.1 为什么选YOLOv8而不是Faster R-CNN1500张图的选型逻辑1500张图属于小样本场景选模型时精度和收敛速度要同时考虑。Faster R-CNN在两阶段检测器里精度确实稳但在小数据集上容易过拟合而且推理速度慢牧场边缘设备跑不动。YOLOv8的单阶段结构在1000到5000张图的量级上表现更均衡而且Ultralytics的工程封装做得好从训练到导出ONNX一条命令搞定。我实测过同一批数据YOLOv8s在验证集上的mAP0.5比Faster R-CNN高3个点推理速度快4倍。选YOLOv8s而不是n或m是因为n的容量太小在密集羊群场景下漏检明显m的参数量在1500张图上容易过拟合除非你做大量增强。s版本是精度和速度的平衡点模型大小约22MB导出ONNX后在CPU上单张推理约80毫秒在Jetson Nano上约35毫秒足够牧场实时计数用。3.2 训练命令与六个必调参数Ultralytics的训练入口很简洁但默认参数不是为绵羊检测调的。下面是我在这批数据上实际用的命令和配置文件。# sheep_data.yaml path: ./sheep_dataset train: images/train val: images/val test: images/test names: 0: sheepyolo detect train \ datasheep_data.yaml \ modelyolov8s.pt \ epochs150 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.01 \ patience30 \ augmentTrue \ mosaic1.0 \ mixup0.1 \ copy_paste0.1 \ degrees10 \ translate0.1 \ scale0.5 \ fliplr0.5 \ device0 \ projectsheep_run \ nameexp1六个必调参数逐个说。imgsz640是输入尺寸前面统计过数据里有密集小目标640是下限如果显存够可以上到800但1500张图用640已经能到0.89的mAP0.5。batch16在12GB显存下刚好跑满如果显存小就降到8但batch太小会导致BN层统计不准建议配合梯度累积。lr00.01是初始学习率YOLOv8默认是0.01但小数据集上我一般降到0.005到0.008避免早期震荡。patience30是早停耐心值1500张图通常80到120轮就收敛了设30可以省时间。mosaic1.0是马赛克增强对密集场景帮助很大但如果你的数据里羊的尺度变化不大可以降到0.5。copy_paste0.1是复制粘贴增强小数据集上很有效但比例别超过0.3否则会出现大量不自然的重叠框。训练过程中重点看三个指标metrics/mAP50-95、train/box_loss、val/box_loss。如果train loss持续下降但val loss在20轮后开始上升说明过拟合了要么加增强要么减模型容量。如果box loss震荡剧烈检查学习率是否太大或者标注框是否有问题。3.3 显存不够时的三个降级方案不是每个人都有12GB显存的卡8GB甚至6GB的情况很常见。我试过三种降级方案按优先级排列。第一种是降batch加梯度累积。把batch降到8然后在训练命令里加accumulate2等效batch还是16但显存占用减半。代价是训练速度慢约30%因为前向传播次数没变但反向传播合并了。第二种是降imgsz到512。显存占用和输入尺寸的平方成正比640降到512显存省约36%。但前面说过密集小目标会受影响所以如果数据里每图平均超过10只羊不建议降。可以配合切片推理SAHI在推理阶段弥补。第三种是冻结主干网络。YOLOv8的backbone在COCO上预训练过绵羊检测和通用目标检测的特征有重叠冻结前10层只训练head部分显存省约40%但精度会掉2到3个点。适合快速验证数据质量不适合最终交付。# 方案一梯度累积 yolo detect train datasheep_data.yaml modelyolov8s.pt batch8 accumulate2 imgsz640 epochs150 # 方案二降输入尺寸 yolo detect train datasheep_data.yaml modelyolov8s.pt batch16 imgsz512 epochs150 # 方案三冻结主干 yolo detect train datasheep_data.yaml modelyolov8s.pt batch16 imgsz640 epochs150 freeze10三种方案可以组合使用但别同时上三种否则精度掉太多。我的建议是优先梯度累积其次降尺寸最后才冻结。4. 绵羊检测的避坑与排查从标注到推理的五个血泪教训4.1 坑一验证集精度很高但实际计数差很多现象是训练日志里mAP0.5到了0.92但拿模型去牧场跑计数误差超过15%。原因通常是验证集和训练集来自同一段视频的连续帧模型记住了背景而不是羊。解决方法是按场景划分数据集不同牧场、不同光照、不同角度的图要分开验证集里必须包含训练集没见过的场景。我现在的习惯是至少留一个完整场景做测试集哪怕只有100张。4.2 坑二密集羊群漏检严重现象是单只或三五只羊的图检测很准但20只以上的图漏检三到五只。原因是NMS非极大值抑制的IoU阈值设太高重叠的羊框被合并了。YOLOv8默认IoU阈值是0.7密集场景要降到0.5到0.6。另外可以在推理时加agnostic_nmsTrue避免不同类别间的误抑制。如果还不行就要上SAHI切片推理把大图切成小图分别检测再合并。from ultralytics import YOLO model YOLO(best.pt) results model.predict( sourcedense_sheep.jpg, conf0.25, # 置信度阈值密集场景降到0.2 iou0.5, # NMS IoU阈值默认0.7密集场景降到0.5 agnostic_nmsTrue, imgsz640 )4.3 坑三阴天和逆光场景大量误检现象是模型把石头、草垛、甚至阴影检测成羊。原因是训练数据里阴天和逆光样本太少模型没学到足够的负样本。解决方法是在数据增强里加hsv_v0.4亮度扰动和hsv_s0.7饱和度扰动同时手动收集200张纯背景图作为负样本加入训练集。负样本的标注文件是空的txt但图像要保留这样模型会学会抑制背景响应。4.4 坑四导出ONNX后精度下降现象是PyTorch模型mAP0.5是0.89导出ONNX后掉到0.84。原因通常是导出时的动态轴设置不对或者预处理方式不一致。YOLOv8导出ONNX时要用dynamicTrue支持动态batch同时确认归一化参数一致都是除以255。另外ONNX Runtime的推理默认是FP32如果导出时用了FP16精度会再掉一点。建议导出时保持FP32部署时再用TensorRT做FP16量化。# 导出ONNX yolo export modelbest.pt formatonnx dynamicTrue simplifyTrue # 导出TensorRT需要GPU yolo export modelbest.pt formatengine halfTrue device04.5 坑五计数逻辑把一只羊算成两只现象是检测框基本正确但计数结果比实际多。原因是同一只羊在相邻帧里被重复计数或者一只羊的框分裂成两个。解决方法是在计数逻辑里加跟踪算法用ByteTrack或BoT-SORT给每个检测框分配ID只统计新出现的ID。如果不用跟踪至少要在后处理里做框合并把IoU大于0.6的同类框合并成一个。from ultralytics import YOLO import numpy as np model YOLO(best.pt) results model.track( sourcesheep_video.mp4, trackerbytetrack.yaml, conf0.3, iou0.5, persistTrue ) # 统计唯一ID数量 unique_ids set() for r in results: if r.boxes.id is not None: for tid in r.boxes.id.cpu().numpy(): unique_ids.add(int(tid)) print(f绵羊总数: {len(unique_ids)})5. 把1500张图用到极致半自动标注与主动学习的进阶技巧1500张图训练一个基线模型够用但如果你想覆盖更多场景——不同品种、不同季节、不同牧场——数据永远不够。我的做法是用基线模型做半自动标注把新采集的未标注图像跑一遍推理置信度高于0.7的框直接作为伪标签置信度在0.3到0.7之间的框人工复核低于0.3的丢弃。这样一轮下来1000张新图的标注时间从三天压缩到半天。from ultralytics import YOLO import os model YOLO(best.pt) unlabeled_dir new_images/ pseudo_label_dir pseudo_labels/ os.makedirs(pseudo_label_dir, exist_okTrue) results model.predict( sourceunlabeled_dir, conf0.3, iou0.5, save_txtTrue, save_confTrue, projectpseudo_label_dir, namerun1 ) # 筛选高置信度框作为伪标签 for txt_file in os.listdir(f{pseudo_label_dir}/run1/labels/): lines [] with open(f{pseudo_label_dir}/run1/labels/{txt_file}) as f: for line in f: parts line.strip().split() conf float(parts[5]) if conf 0.7: lines.append( .join(parts[:5])) if lines: with open(f{pseudo_label_dir}/{txt_file}, w) as f: f.write(\n.join(lines))伪标签训练有个关键细节损失函数里要给伪标签降权否则模型会被自己的错误强化。YOLOv8不直接支持伪标签权重我的做法是把伪标签的置信度写进数据集配置文件训练时用label_smoothing0.1来软化标签。另外每轮主动学习后要保留10%的人工标注数据做验证确保模型没有退化。验证模型是否值得继续投入我只看一个指标在完全没见过的牧场场景下计数误差是否低于5%。如果高于5%要么加数据要么检查标注质量别急着调模型结构。1500张图能做的事有限但把数据质量、增强策略、后处理逻辑这三块做扎实绵羊检测的落地效果比盲目堆数据好得多。我在第一个牧场项目里花了两个月调模型结构最后发现把标注框重新检查一遍带来的提升最大。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
AI Short(ChatGPT Shortcut)配置与自定义实战:从站点标题、首页提示词到自建后端 AI 应用提示工程人工智能前端 【免费下载链接】ChatGPT-Shortcut Stop writing prompts from scratch — a searchable prompt library for ChatGPT, Claude, Gemini and Cursor Русский 한국어 العربية हिन्दी ไทย | 别再从头写提示词&… · 2026/9/26 2:59:21
YOLOv8摔倒检测实战:从数据标注到部署的完整代码与避坑指南 简介:这份资源是面向深度学习初学者与安防、体育分析方向开发者的YOLOv8摔倒检测完整代码包,用于快速搭建可识别视频或图像中人物摔倒事件的目标检测系统,可应用于老年人监护、公共场所安全监控及运动员训练反馈等场景。压缩包为zip格式&… · 2026/9/26 2:59:15
Windows 11调试工具全攻略:WinDbg安装、符号服务器配置与实战踩坑 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 3:33:58
SolidWorks打开STP装配体炸窗原因与解决全指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 3:33:58
Model Optimizer 文档化公告中心:基于 Sphinx 源码与 GitHub Pages 的公告发布体系解析 【免费下载链接】Model-Optimizer A unified library of SOTA model optimization techniques like quantization, distillation, pruning, neural architecture search, speculative decoding, etc. It compresses deep learning models for downstream deployment frameworks… · 2026/9/26 3:33:52
字节跳动实习生薪酬上调背后:AI人才争夺与转正逻辑 这两天,好几个校招实习群里都在刷屏同一个消息:字节跳动的实习生薪酬要全面上调了。我不少学员和朋友也跑来问我怎么看,说实话,各家大厂调整实习生待遇并不是新鲜事,但字节在这个时间节点做这件事,背后值得… · 2026/9/26 3:33:46
RPA选型总烂尾?三大根源与泛微千里聆适用边界全解析 先说我这些年在企业里看到的RPA项目,十个里有六七个是“选型那一刻就注定要烂尾”的。不是因为产品不行,而是很多企业把RPA选型当成了一次普通软件采购——看演示、比价格、谈商务,却完全没想清楚自己要解决什么问题、现有系统长什么样、未来… · 2026/9/26 3:33:39
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46