ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

YOLO鸟类数据集ZIP包:从解压检查到训练实战全流程避坑指南

YOLO鸟类数据集ZIP包:从解压检查到训练实战全流程避坑指南 简介面向需要完成课程设计或期末大作业的深度学习初学者这份YOLO鸟类目标检测项目提供了从已标注数据集到模型训练脚本的完整闭环。包内共约2000个文件以jpg格式的鸟类图像和xml标注文件构成标准VOC格式数据集png格式图片可辅助查看标注效果txt文本文件保存训练与测试列表及标签类别py脚本与ipynb笔记覆盖数据划分、标签生成、测试集整理和调试流程并配有VOC数据集制作说明整体目录结构清晰方便从数据准备到模型训练逐步对照。压缩包整体仅78.97MB经导师指导后获97分高分下载后无需修改即可运行适合作为计算机视觉课程设计、毕业论文或期末综合作业的参考项目。目前已有895人学习下载尤其适合希望快速搭建YOLO检测实验并撰写完整报告的本科与高职学生项目结构简洁有助于理解数据准备与模型训练的衔接。1. 拿到这个 ZIP先别急着解压它到底是什么能解决什么问题做一个 YOLO 目标检测项目最耗时间的往往不是训练本身而是数据。很多人在网上找了半天鸟类图片下载下来发现要么没标注要么标注格式不对还得自己用 LabelImg 一张一张框框一个一万张的数据集几天就没了。所以当你在某个地方找到一个“已经标注可以直接使用”的鸟类数据集 ZIP 包时第一反应应该是好东西但也别高兴太早。这个包里装的是一整套 YOLO 目标检测的起跑线——图片和对应的标签文件已经配对好了理论上你只需要解压、改一下配置文件、跑一条训练命令就能看到模型开始收敛。这套包解决的核心问题就是把“从零开始攒数据”变成“从有数据的中间点开始”。你不需要再花几天时间去找图、清洗、标注拿到手的工作量大概只剩三件事检查标注质量、划分训练验证集、调参数开训。适合的人群很明确在校生做课程设计或毕设、刚接触 YOLO 想跑通完整流程的入门者、以及需要快速验证某个检测思路的工程师。但要注意网上流传的这类 ZIP 包质量参差不齐有的标注格式其实不是 YOLO 格式有的图片尺寸不统一有的类别编号和类别名对不上。所以这篇笔记的核心思路是把 ZIP 里的东西当原料不直接信任花二十分钟做一次系统检查确认它真的能直接喂给 YOLO 训练。2. 解压与文件结构核对别双击打开就以为完事了2.1 ZIP 解压的几个细节Windows 和 Linux 不一样拿到这个 ZIP 包第一步当然是解压。但如果你在 Windows 上直接右键“全部解压缩”可能会遇到两个问题一是中文文件名乱码尤其当压缩包是用 Linux 上的 zip 命令打的二是解压出来的目录层级很深比如data/birds/images/train/xxx.jpg和data/birds/labels/train/xxx.txt目录结构乱到你看不懂。常见做法是先解压到一个临时目录然后用 tree 命令看结构。Windows 上你可以用 PowerShell 的tree /F或者干脆用 7-Zip 先打开看一下压缩包内部结构确认顶层目录是什么再决定怎么解。如果你在 Linux 上操作解压命令有几个参数值得注意mkdir -p ~/datasets/birds cd ~/datasets/birds unzip ~/下载/bird_detection_dataset.zip -d ./unzip的参数里-d指定了解压目标目录我一般会单独建一个目录再解避免把文件直接散到当前目录。解压完成后立刻检查目录结构find . -type f | head -50 find . -type f | wc -l注意看两个东西一是文件总数和压缩包简介里声称的数量对一下差太多说明压缩包可能不完整二是图片和标注文件的扩展名和命名规则。常见做法是图片为.jpg或.png标注文件为.txt。如果发现标注文件是.xml那说明这个标注是 Pascal VOC 格式不是 YOLO 格式后面要转换。2.2 图片和标注文件怎么对应命名规则内的三个坑YOLO 格式的标注文件原则上是“一张图片对应一个同名 txt 文件”图片bird_001.jpg对应bird_001.txt。但网上流传的数据集有几种常见的命名坑第一种是标注文件比图片多多出来的 txt 对应的图片可能是损坏的、被删掉的但 txt 还在。第二种是图片比标注文件多这个更严重——多的图片没有标注训练时如果目录里有没标注的图片训练脚本会直接报错或者跳过。第三种是文件名大小写不一致比如图片是Bird_001.jpg标注是bird_001.txt在 Windows 上看起来差不多但 YOLO 训练脚本在 Linux 上是严格区分大小写的会导致配对失败。所以解压后第一步不是急着训练而是写个小脚本做一次配对检查。下面这个 Python 脚本能快速找出“有图无标”和“有标无图”的文件import os from pathlib import Path img_dir Path(datasets/birds/images/train) label_dir Path(datasets/birds/labels/train) imgs {p.stem for p in img_dir.glob(*.jpg)} labels {p.stem for p in label_dir.glob(*.txt)} only_img imgs - labels only_label labels - imgs print(f图片总数: {len(imgs)}, 标注总数: {len(labels)}) print(f有图无标: {len(only_img)}, 有标无图: {len(only_label)}) if only_img: print(示例:, list(only_img)[:5]) if only_label: print(示例:, list(only_label)[:5])这个脚本的做法是分别用集合存储图片和标注的文件名主干去掉扩展名然后做差集。差集为空说明配对完整可以直接用如果有差集就要决定是删除多余文件还是为缺失的图片补标注。注意glob(*.jpg)只匹配了 jpg如果你的数据集里有 png、jpeg 格式的图片脚本要改成img_dir.glob(*.*)再过滤扩展名否则会把 png 图片全当成“有图无标”。2.3 看一眼标注文件内容三秒钟判断格式对不对配对检查没问题后随便打开几个 txt 文件看一眼。一个合法的 YOLO 格式标注文件长这样0 0.4875 0.4312 0.2145 0.1876 1 0.6132 0.5278 0.1654 0.1432每行五个数字含义依次是类别 id从 0 开始、归一化后的中心点 x、中心点 y、目标宽度 w、目标高度 h。这四个坐标值都除以了图片宽高范围在 0 到 1 之间。如果打开 txt 发现第一列的数字大于你预想的类别数说明类别 id 超过范围如果发现某一行是0.5 0.5 0.5 0.5这种明显占满整图的框大概率是标注质量有问题。还有一个常见情况是txt 文件里全是空行或者里面存的是 XML 格式的内容这属于“标注格式挂羊头卖狗肉”。几分钟的检查能省下后面几小时的排错时间。检查完格式再看一下有没有负坐标或者大于 1 的坐标值这些不合法值会导致训练时 loss 直接变成 NaN。如果发现少量越界可以在 2.4 节里用脚本做一次清洗。2.4 标注清洗脚本把不合法坐标和错误行一次性过滤手工检查完别急着开训网上下载的数据集坐标越界很常见。原因可能是做数据增强时没做裁剪、标注完后又缩放了图片但没有同步更新标注或者标注工具导出时出了问题。YOLO 训练对越界的容忍度很低虽然ultralytics库会自动纠正一些错误但自己心里要有数。写个脚本批量检查一遍import os label_dir datasets/birds/labels/train bad_files [] for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue path os.path.join(label_dir, fname) with open(path, r) as f: lines f.readlines() for line in lines: parts line.strip().split() if len(parts) ! 5: bad_files.append((fname, 列数不对)) break try: nums [float(p) for p in parts] except ValueError: bad_files.append((fname, 非数字)) break if not (nums[0]).is_integer(): bad_files.append((fname, 类别不是整数)) break if any(v 0 or v 1 for v in nums[1:]): bad_files.append((fname, 坐标越界)) break print(f异常文件数: {len(bad_files)}) for f, reason in bad_files[:10]: print(f{f}: {reason})清洗逻辑很简单每行必须是 5 列第一列是整数后四列在 0 到 1 之间。坐标越界那个条件要注意YOLO 格式里中心点坐标在 0 到 1 之间没问题但框的宽度和高度理论上也能大于 1 吗不能你不可能一个目标比整张图还宽所以检查范围统一设成 0 到 1 都是合理。如果发现异常对坐标做裁剪比直接删掉标注更稳妥把小于 0 的置 0大于 1 的置 1至少训练时不会因为坐标非法中断。3. YOLO 格式标注深入理解 txt 里的五个数才能判断标注是否可用3.1 归一化坐标的两个意义分辨率无关、训练加速很多人拿到标注文件只知道“一行表示一个目标”但不知道为什么 YOLO 格式要用归一化坐标。背后的原因有两个第一目标检测要适配不同分辨率的输入图片每张图片的宽高不同直接用像素坐标的话训练时要做一次缩放换算归一化后模型不关心输入尺寸大小统一在 0 到 1 的空间里做预测省了这一步。第二归一化坐标让不同分辨率的图片在计算 loss 时处于同一个量级避免大图上的误差数值压过小图。当你打开bird_001.txt看到0.4875 0.4312 0.2145 0.1876时可以反算回像素坐标假设图片宽度是 1920高度是 1080那这个框的真实中心点像素坐标是 (1920 × 0.4875, 1080 × 0.4312)约等于 (936, 466)框宽约 412 像素高约 203 像素。这个反算是检查标注是否准确的一个常用手段尤其是当你怀疑某个标注框位置不对可以把它缩放回原图尺寸用 OpenCV 画出来看。3.2 类别 id 和类别名的映射最容易翻车的环节假设 ZIP 包里带了一个classes.txt或data.yaml文件里面写着鸟类类别的名称列表。你不需要懂鸟类学但你得知道一件事YOLO 标注文件里的第一列数字对应的是类别名列表的下标从 0 开始。比如classes.txt内容为sparrow crow eagle owl那么标注文件里0是麻雀1是乌鸦2是老鹰3是猫头鹰。如果你自己重新整理了类别顺序没有同步修改标注文件那训练出来的模型就会把所有类别都识别错——图像内容是麻雀模型预测是乌鸦。我一般会做一个类别分布检查统计每个类别 id 在训练集中出现的次数和classes.txt里的类别数量对一下。出现次数为 0 的类别意味着模型从未见过这类鸟的样本如果某个类别的 id 大于等于类别总数说明标注文件和类别列表没有对上。检查脚本from collections import Counter import os label_dir datasets/birds/labels/train counter Counter() total_boxes 0 for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue with open(os.path.join(label_dir, fname), r) as f: for line in f: parts line.strip().split() if len(parts) ! 5: continue counter[int(float(parts[0]))] 1 total_boxes 1 print(f总标注目标数: {total_boxes}) for cls_id in sorted(counter): print(f类别 {cls_id}: {counter[cls_id]} 个目标)打印结果后把类别 id 和data.yaml里的names列表逐行对照。如果发现某个类别数量为 0比如老鹰一张都没有那训练出来的模型大概率对老鹰完全不识别。这时候你有两个选择一是去网上找老鹰的公开图片补数据二是不补接受模型在老鹰这个类别上的低召回率。考虑到鸟类数据集的任务边界多数人选择后者但你要清楚这个短板在哪不要等训练跑完了才发现。3.3 图片尺寸不统一对 YOLO 训练的实际影响鸟类数据集的来源很杂不同图片的尺寸可能从 320×240 到 4000×3000 不等。YOLO 训练时有个imgsz参数默认是 640模型会把所有图片缩放到 640×640 再送进去训练。这个缩放是等比缩放然后 padding 灰色边标注的归一化坐标不会因为缩放而失效——这正是归一化的好处。但问题出在极端情况一张 4000×3000 的大图缩到 640 后一只原本 200×200 像素的鸟可能只剩 32×32 像素小目标特征几乎丢失了反过来一张 320×240 的小图被放大到 640图像变模糊边缘出现轻微马赛克对检测精度也有影响。所以如果你打算直接开训有一个参数必须检查所有图片的尺寸分布。如果大多数图片在 480×480 以下建议把训练尺寸改成 416 或 512而不是默认的 640如果大多数图片在 1280×1280 以上可以试试imgsz1280但对显存要求会明显提高。检查图片尺寸的脚本from PIL import Image from pathlib import Path img_dir Path(datasets/birds/images/train) sizes {} for p in img_dir.glob(*.*): if p.suffix.lower() not in (.jpg, .png, .jpeg): continue w, h Image.open(p).size key (w, h) sizes[key] sizes.get(key, 0) 1 print(f不同尺寸种类数: {len(sizes)}) for (w, h), cnt in sorted(sizes.items(), keylambda x: x[1], reverseTrue)[:10]: print(f{w}x{h}: {cnt} 张)这个脚本用 PIL 逐个读取图片尺寸统计所有不同分辨率及其数量。如果结果只有几种固定尺寸说明数据集经过了批量压缩质量相对稳定如果尺寸种类有几十种说明图片来源复杂建议做一次统一的尺寸约束比如用脚本把所有图片缩放到同一短边长度再训练能有效减少训练时间波动。4. 用这个数据集直接训练 YOLOv8最小命令与必调参数4.1 数据配置文件 data.yaml 的正确写法Ultralytics YOLO 的训练入口是yolo train命令它需要读取一个 YAML 数据配置文件告诉训练器图片和标注在哪、有几类、类别名是什么。这个文件写错了后面全白搭。一个标准的data.yaml长这样path: C:/datasets/birds train: images/train val: images/val nc: 4 names: 0: sparrow 1: crow 2: eagle 3: owl字段含义要搞清楚path是数据集根目录的绝对路径train和val是相对于path的训练集、验证集图片目录路径。这里有个高频错误把train写成了images/train/带斜杠或者写成了完整路径C:/datasets/birds/images/train两种写法都有可能报路径错误。nc是类别总数names列表的长度必须等于nc。再强调一次这个names列表的下标就是标注文件 txt 里第一列的数字。如果你从 ZIP 包里的classes.txt复制类别名顺序必须保持原样不要觉得“我按字母序排一下更整齐”那会让所有标注的类别 id 整体错位。4.2 一条命令跑通训练从 yolo predict 到 yolo train如果你的 ZIP 包解压后目录结构就是images/train、images/val、labels/train、labels/val那么现在就可以直接开训。我一般会先跑 30 个 epoch 看 loss 曲线趋势确认数据和代码链路没问题再决定要不要加长时间。训练命令yolo train datadata.yaml modelyolov8n.pt epochs30 imgsz640 batch16 device0 projectruns/birds namebaseline参数逐个解释modelyolov8n.pt表示使用 YOLOv8n 的预训练权重作为起点。n 是 nano 版体量最小速度和显存占用最友好。首次尝试不知道效果如何用 nano 版跑通流程的成本最低等后面确认数据集没问题再换 s 或 m 版提升精度。epochs30是针对小数据集的快速轮数主要看 loss 能不能降下来batch16是按你的 GPU 显存定的显存不够就降到 8 或 4。训练时注意观察控制台输出正常情况是 loss 在第一个 epoch 结束后明显下降之后逐步收敛。batch 的大小很关键。一个常见的翻车场景是显存 6GB 的用户直接用了默认 batch16在 640×640 的输入尺寸下直接 OOM显存溢出进程被杀。遇到这种情况别急着换卡先用小 batch 起步或者换一版更小的模型。4.3 验证集的三个必看指标mAP50、mAP50-95、PR 曲线训练结束后验证集的输出指标要看三个东西mAP50、mAP50-95和每类别的 AP。mAP50 是 IoU 阈值为 0.5 时的平均精度数值越高说明“大致框对”的检测越多mAP50-95 是在 0.5 到 0.95 多个 IoU 阈值下的平均值这个指标更严苛对框的精确位置要求更高。如果你的鸟类检测任务只是判断“有没有鸟、大概在哪”mAP50 为主如果要精确定位到鸟的身体轮廓mAP50-95 更重要。如果验证集 mAP50 在 0.7 以上说明这个数据集的质量至少在及格线上如果只有 0.3 左右先别急着调模型回去检查标注——大概率是标注坐标错了或者类别分布严重不均衡。当某个类别的 AP 明显低于其他类别时比如麻雀 mAP50 有 0.85老鹰只有 0.2原因只有两个老鹰的样本数太少或者老鹰的图片场景复杂度远高于其他类别。验证完模型精度后用测试图片跑一次可视化推理把预测框画出来看一眼比自己盲目调参数管用。推理命令yolo predict modelruns/birds/baseline/weights/best.pt sourcetest_images/ saveTrue conf0.35conf0.35是置信度阈值低于这个值的预测框会被过滤掉。如果你发现预测结果漏了很多鸟说明置信度阈值太高调到 0.15 再试反过来如果画面里到处都是错检框说明阈值太低上调到 0.5。这个参数是最直观的调优手段不需要看任何曲线就能知道方向对不对。5. 避坑这类“下载即用”数据集最常见的 5 个坑5.1 标注文件和图片的对应关系断裂现象训练时提示AssertionError: Label class X exceeds nc4 in ...或直接跳过某些图片训练完发现 mAP 一直不涨。原因这是数据集在打包或传输过程中部分图片和标注文件丢失配对。常见于用网盘打包下载下载过程中部分小文件被网盘客户端跳过或者原始数据集在压缩时就没包含完整文件。解决回到第 2 章提到的配对检查脚本对有图无标的文件做统计。数量少就直接删除对应图片数量多超过总图片数的 5%说明压缩包本身不完整建议联系数据提供方确认。不要在断链的数据集上强行训练浪费的时间比重新找数据还多。5.2 标注框整体偏移鸟在左边框在右边现象训练跑完后实测图片检测框的位置整体往某个方向偏移比如鸟在画面左侧预测框却在右边。mAP 数值不太低但画出来的框就是不对。原因标注工具导出 YOLO 格式时图片坐标系选择出了问题。YOLO 坐标原点在图片左上角x 轴向右、y 轴向下如果标注工具用了以左下角为原点的坐标系笛卡尔坐标系导出的 y 坐标就会变成 1 - 真实值导致框整体上下偏移。解决打开一张图把标注坐标反算成像素坐标用 OpenCV 画框和原图对比import cv2 img_path datasets/birds/images/train/bird_001.jpg label_path datasets/birds/labels/train/bird_001.txt img cv2.imread(img_path) h, w img.shape[:2] with open(label_path, r) as f: for line in f: parts line.strip().split() cls_id, cx, cy, bw, bh int(float(parts[0])), float(parts[1]), float(parts[2]), float(parts[3]), float(parts[4]) x1 int((cx - bw / 2) * w) y1 int((cy - bh / 2) * h) x2 int((cx bw / 2) * w) y2 int((cy bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, str(cls_id), (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1) cv2.imwrite(check_annotations.png, img)脚本本身不复杂但作用很大把标注框画到图上一眼就能看出框和鸟的位置是否匹配。别小看这步很多数据集的问题用肉眼 5 秒钟就能发现用指标排查要绕一大圈。5.3 类别 id 与 names 列表错位现象训练正常收敛验证集 mAP 也不低但推理时发现模型预测输出的类别名永远对不上。比如图里明明是一只乌鸦模型预测成“background”或者其它不认识的名字。原因数据集的classes.txt是英文名你的data.yaml里 names 列表按字母序重新排了一遍或者把类别名做了中文化导致注解 id 和原本标注文件里的数字对不上。YOLO 不会检查names列表的正确性它只认 id 数字。解决如果压缩包提供了classes.txt就直接用它的顺序不要动。如果要自定义类别名必须写一个映射脚本把标注文件里的所有类别 id 全部替换成新 id替换完再跑一遍检验脚本确认每个 id 的框数和替换前一致。我一般会在训练前打印data.yaml的 names 和验证集预测结果画在同一张图上确认类别名对应正确再批量训练。5.4 训练时 loss 是 NaN现象训练刚跑几个 iterationloss 显示nan然后训练继续或直接中断。原因标注里有非法值。常见的是坐标值不是数字比如 txt 里出现了分隔符导致解析失败或者有个别标注框宽度为 0即bw0.0000模型在计算 IoU 时除数为 0还有归一化坐标越界严重超出 0 到 1 的范围几千倍导致 loss 计算溢出。解决用 2.4 节的清洗脚本做全量覆盖逐行检查是否有 NaN、非数字、负坐标、宽度为 0 的行。发现异常行直接删掉删掉后如果某张图一个标注都不剩了把这张图也移出数据集否则训练时读到空标注文件可能报错或跳过该图片。5.5 验证集缺失val 路径指向不存在现象训练命令能启动但开始验证时提示Dataset not found或val: No labels found然后训练中断或直接跳过验证。原因有些压缩包只提供了images/train和labels/train没有单独的验证集。或者压缩包里有验证集但目录名是test或valid而你的 data.yaml 里写的是images/val路径对不上。解决没有验证集就自己划分。从训练集里按比例抽一部分作为验证集注意要同时移动图片和对应的 txt 标注文件。下面这个脚本按 0.8/0.2 划分训练和验证并自动创建对应目录import os import shutil import random random.seed(42) base datasets/birds img_train_src os.path.join(base, images, train) label_train_src os.path.join(base, labels, train) img_val_dst os.path.join(base, images, val) label_val_dst os.path.join(base, labels, val) os.makedirs(img_val_dst, exist_okTrue) os.makedirs(label_val_dst, exist_okTrue) all_imgs [f for f in os.listdir(img_train_src) if f.endswith(.jpg)] random.shuffle(all_imgs) val_count int(len(all_imgs) * 0.2) for fname in all_imgs[:val_count]: stem os.path.splitext(fname)[0] shutil.move(os.path.join(img_train_src, fname), os.path.join(img_val_dst, fname)) label_file stem .txt if os.path.exists(os.path.join(label_train_src, label_file)): shutil.move(os.path.join(label_train_src, label_file), os.path.join(label_val_dst, label_file)) else: print(f警告: {fname} 没有对应的标注文件) print(f划分完成: 训练 {len(all_imgs) - val_count} 张, 验证 {val_count} 张)脚本里random.seed(42)是为了每次运行划分结果一致别小看这一点——如果你多次运行脚本且不固定随机种子每次划分的验证集会不一样那后续做模型对比时mAP 数据就没有可比性了。shutil.move负责同步移动图片和标注避免出现图片在验证集但标注还在训练集的错位情况。划分完后data.yaml 里的val: images/val这个路径对于 YOLO 来说必须存在否则直接报错。有些版本的 ultralytics 在验证集不存在时会自动用训练集当验证集但这会掩盖模型过拟合的程度不建议依赖这个行为。6. 把“能训练”变成“能复用”备份、版本管理和置信度调优的最后一公里跑通一波训练只是拿到一张入门券真正值钱的是让这套数据在你本地形成可复用的资产。我一般会做三件事。第一件事给数据集和最佳权重做一次静态备份。训练完的best.pt只有几十 MB用一句话把它复制到独立目录别让它混在训练输出的临时文件里cp runs/birds/baseline/weights/best.pt ~/models/birds_yolov8n_baseline.pt同时把训练时的data.yaml复制到备份目录后续推理时要保持类别顺序一致稍有不匹配预测出的类别名就会错乱。数据集本身如果是从网上下载的把解压后的目录打一个干净的压缩包放起来里面只保留图片、标注和类别说明不要把训练日志也塞进去。第二件事把参数记录成一页纸。包括训练尺寸、batch、epoch、优化器默认设置以及最终验证集的 mAP50 和 mAP50-95这些记录会让后续换模型、换数据集时的对比有依据。工具上没那么多讲究一个文本文件足够重点是养成记录习惯。第三件事用训练好的模型跑一批真实照片注意不是数据集里的验证图而是网上找的或自己拍的鸟类照片验证模型在“没见过的拍摄条件”下表现怎么样。如果预测框的置信度普遍偏低比如都在 0.2 到 0.4可以通过调低conf阈值来保留更多检测结果如果错检很多就调高阈值。这里没有标准答案只能按场景试我习惯保存一个置信度参数的速查笔记场景conf 推荐值说明科学考察求不漏检0.15 ~ 0.2宁可多框不可漏掉目标一般相册自动分类0.3 ~ 0.4平衡精确率与召回率野外自动计数0.5减少误报求精确最后一件事是关于训练本身如果数据集只有几百张图别急着上 YOLOv8x 或 YOLOv10 这种大模型过拟合的速度比你想象中快得多。先把大模型放一边用 nano 版跑通基线再根据验证集指标决定要不要换大模型。很多人一开始就追求高精度结果模型在训练集上 mAP 接近 1验证集上一塌糊涂这就是过拟合的典型信号。遇到这种情况可以降低模型复杂度、加大增强强度或补数据而不是加训练轮数。另外如果你拿到的数据集没有 val 目录最好只在模型训练时用 8:2 划分最终交付时再把两份合并回一起——因为本身就是小数据集再切一块出去做验证集训练数据更不够了。更合理的做法是训练阶段用 80% 数据训练、20% 验证最后算法效果确认没问题后用全部数据重新训一次得到一个生产力版本。这套鸟类目标检测真正难的从来不是 YOLO 的训练命令而是数据的可信度和标注格式的正确性。数据和标注没问题训练只是时间问题数据和标注有问题训练跑得再快都是白算。我的习惯是任何数据集无论来源多“标准”都先跑一遍配对检查、一遍坐标合法性检查、一次可视化抽样检查三关过了才动手训练。这套流程陪我躲过了无数个“训练一晚上、第二天发现数据是坏的”的夜晚。希望帮到你。本文还有配套的精品资源点击获取
返回列表