简介:目标检测是计算机视觉领域的核心任务之一,其落地效果高度依赖数据质量与训练流程的完整性。在道路养护场景中,裂缝、坑槽、龟裂等路面病害的自动识别,通常需要借助YOLO系列算法完成。一个结构清晰、标注规范的图像数据集,能显著降低模型训练的门槛。本文以一份包含962张带标签图像的道路破损检测数据集为例,系统讲解从解压ZIP文件、理解YOLO标签格式、校验数据合法性,到划分训练集、配置YAML、选择模型与调优训练参数的全过程。同时针对解压报错、坐标归一化错误、类别错位、显存不足等工程实践中的高频问题给出排查思路。无论是课程设计、技术验证还是小型巡检项目,都能从这套方法中获得可复用的基线流程。道路破损检测作为典型的目标检测应用,其数据准备与训练策略同样适用于其他细粒度视觉识别任务。 我拿到这个项目的第一个感觉是:这不是一个普通的“压缩包”,它几乎是一个完整的“道路病害识别”入门套件。文件名里信息量已经很大——YOLO算法、道路破损检测、962张图像、带标签,再加一个zip压缩格式。也就是说,你拿到手的是一个已经标注好的、可以直接用来训练目标检测模型的数据集,目标是把路面上的裂缝、坑槽、龟裂、修补等破损区域从图片里框出来。这篇文章我就从数据集本身出发,把整个“拿到压缩包 → 解压 → 理解标注 → 跑通训练 → 踩坑修复”的完整链路讲清楚,适合刚接触目标检测、手里没有现成数据、又想做道路巡检相关项目的朋友参考。
这套数据集最划算的地方在于“带标签”。做目标检测的人都知道,标注才是真正耗时间耗精力的环节,一个几百张图的数据集,人工标注可能就得花掉好几天。现在962张图全部带好标签,省下的时间足够你反复折腾模型结构和训练参数了。而且道路破损检测是一个非常典型的落地场景,无论是市政道路巡检、高速公路养护、还是园区内部道路监测,都能直接套用这套流程。
1. 数据集本身到底是怎么回事
1.1 先解压,看看目录结构和文件构成
zip文件到手,第一步当然是解压。Linux环境用unzip,Windows用右键解压或者Bandizip这类工具,这些基础操作我就不展开了。这里我想重点强调的是解压之后你要看什么——很多新手一解压就开始找训练脚本,其实最该先看的是目录结构。
常见的数据集压缩包解压后大概是这样的:
road_damage_dataset/ ├── images/ │ ├── train/ │ │ ├── img_0001.jpg │ │ ├── img_0002.jpg │ │ └── ... │ └── val/ │ ├── img_0100.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── img_0001.txt │ │ ├── img_0002.txt │ │ └── ... │ └── val/ │ ├── img_0100.txt │ └── ... ├── data.yaml ├── README.md └── classes.txt虽然我没办法隔着压缩包确认里面的具体文件布局,但根据我对这类数据集打包习惯的了解,大概率是”images + labels“双目录结构,再加一个yaml配置文件。这种结构为什么好?因为YOLO系列(包括YOLOv5、YOLOv8、YOLOv9、YOLOv11)官方仓库对数据集的默认预期就是这种组织方式,你几乎不需要改配置就能直接开训。
如果你解压后发现里面只有images目录、没有labels目录,那也别慌。可能的情况是标签以XML格式存了,或者统一放在某个叫Annotations的文件夹里,这时候需要做一个格式转换,我在后面会专门讲。
1.2 962张图,这个量级够不够用
很多人拿到数据集第一句话就问:962张图够吗?我的回答是:看你拿它干什么。
如果目标是训练一个生产级、能在任意城市道路上跑的模型,那962张图确实偏少。道路破损的种类多、形态复杂,光照、视角、路面纹理差异也大,要覆盖全部情况起码得几千张甚至上万张图。但如果你是以下这几种情况,962张完全够用:
- 做课程设计、毕业设计,要跑通一个完整的检测流程;
- 公司内部验证“YOLO能不能检测出路面上这些病害”,做技术可行性评估;
- 学习目标检测训练流程,理解数据格式、训练参数、评估指标;
- 作为baseline,先跑出一个可用的效果,后续再慢慢扩充数据。
实际上,YOLO系列模型在小数据集上的表现一直不错,因为它本身有较强的数据增强机制。用962张图训练,配合Mosaic增强、随机翻转、HSV扰动,效果远比你想象中好。这里有个很关键的认知:目标检测模型对数据量的需求,不是线性的——从100张到1000张是质变,从1000张到5000张是量变。962张恰好卡在质变的节点上。
另外还要看这962张图覆盖的破损类型。根据常见的道路破损数据集标注习惯,路面的病害大致可以分为几类:
| 类别 | 常见叫法 | 典型特征 |
|---|---|---|
| 裂缝 | crack | 线性、条状,有横向、纵向、网状之分 |
| 坑槽 | pothole | 碗状凹陷,边缘不规则 |
| 龟裂 | alligator crack | 网状密集裂缝,类似鳄鱼皮纹路 |
| 修补 | patch / repair | 路面修补痕迹,颜色与周围不同 |
| 车辙 | rutting | 轮迹带处的凹陷变形 |
| 松散 | raveling | 表面骨料脱落,粗糙不平 |
你拿到数据后,先打开labels目录里的txt文件,看看一共标注了几个类别,每个类别的实例数量大概多少。如果类别分布严重不均衡(比如裂缝占了90%,坑槽只有几十个),训练时就要考虑对少数类的处理策略。这个我在第三节会展开讲。
1.3 标签文件里到底写的什么
YOLO格式的标签文件是纯文本,每行代表一个标注框,格式是:
class_id x_center y_center width height注意,这里的x_center、y_center、width、height全都是归一化后的值,范围在0到1之间,除以了图像自身的宽和高。比如一张宽1280、高720的图像,某个坑槽的中心点位于像素坐标(640, 360),宽300像素,高200像素,那对应的标签就是:
0 0.5 0.5 0.234375 0.277778这串数字看着简单,但有一个极其容易踩的坑:坐标归一化基准。如果标注工具输出的是像素坐标,而你直接除以了图像的短边而不是宽、高各除各的,那框的位置就全歪了。所以拿到数据集后,我建议你第一件事就是随机挑几张图,把标签还原成像素坐标,画个框看看对不对。这个操作我后面会给代码。
还有一个细节要看:class_id从0开始还是从1开始。YOLO系列基本都是从0开始,class_id为0对应classes.txt里的第一类。如果你的标签文件里出现了和classes.txt行数相同数字的id(比如共3类但标签里有id=3),那说明这个数据集在制作时类别索引是1-based,需要全体减1。
2. 训练之前,这些准备工作别跳过
2.1 数据校验:先确认标签和图像对得上
我见过太多人拿到数据集直接开训,训练到一半报错说某个jpg没有对应的txt,或者某个txt里坐标值超过1。这些都是数据校验没做好的典型问题。训练前花十分钟做一遍校验,能帮你省下好几个小时排错的时间。
校验的核心就三件事:一是确认每张图片都有对应的标签文件(除非是纯背景图);二是确认每个标签文件里的坐标值都在0~1之间,width和height不为负数;三是确认每个标签对应的图像文件没有损坏,能正常读取。
我一般用一段脚本批量处理,核心逻辑大致是:
import os from PIL import Image img_dir = "images/train" label_dir = "labels/train" for img_name in os.listdir(img_dir): base = os.path.splitext(img_name)[0] label_path = os.path.join(label_dir, base + ".txt") img_path = os.path.join(img_dir, img_name) # 检查图片能否打开 try: img = Image.open(img_path) img.verify() W, H = img.size except Exception as e: print(f"图片损坏: {img_path}, 错误: {e}") continue # 检查标签是否存在 if not os.path.exists(label_path): print(f"缺少标签: {img_path}") continue # 检查标签坐标合法性 with open(label_path, "r") as f: lines = f.readlines() for line in lines: parts = line.strip().split() if len(parts) != 5: print(f"标签格式错误: {label_path}, 内容: {line}") continue cls, x_c, y_c, w, h = parts x_c, y_c, w, h = float(x_c), float(y_c), float(w), float(h) if not (0 <= x_c <= 1 and 0 <= y_c <= 1 and 0 <= w <= 1 and 0 <= h <= 1): print(f"坐标越界: {label_path}, 内容: {line}")还有一个更直观的校验方式:把标签画到图上,肉眼检查。随机挑几十张图,用OpenCV把bbox画出来,输出到一个新目录里,然后快速翻一遍。这一步真的非常值,因为数据集的质量直接决定模型的天花板——如果标签本身画得歪七扭八,你后面再怎么调参都是白费。
2.2 数据划分:train / val / test怎么分
数据集里一般会直接分好train和val,如果压缩包解压出来没有划分也没关系,用脚本自己分。这里有一个很常见的疑问:为什么还要单独分test集?
我的习惯是这样的:train集用来训练模型参数,val集用来验证训练过程中的效果、做早停和学习率调整,test集则是最后评测用的、训练过程中模型完全没见过的数据。但如果数据集总量只有962张,强行再切一个test集出来,每份的数据都变少了,反而对训练不利。此时更合理的做法是只分train和val,依赖训练时的数据增强来缓解过拟合,最后可以用val集的结果作为效果参考。
划分比例方面,962张图我通常会按8:2或者8.5:1.5来分,val留150~190张左右,确保验证集里有足够多的正样本(也就是不同类型标注的实例)。另外要注意一点:划分时按图像划分,而不是按标注框划分。看起简单,但有些人操作时会把同一张图像的多个标注框拆到两个集合里,这会造成严重的数据泄露——模型在训练时已经“见过”了同一场景中的一部分框,验证指标会虚高。
如果你的数据集解压后已经带了train/val子目录,那就直接沿用,省事;如果不带,我建议用一个带随机种子的脚本划分,比如:
import os import random import shutil random.seed(42) img_files = os.listdir("images") random.shuffle(img_files) train_ratio = 0.8 split = int(len(img_files) * train_ratio) train_files = img_files[:split] val_files = img_files[split:] os.makedirs("images/train", exist_ok=True) os.makedirs("images/val", exist_ok=True) os.makedirs("labels/train", exist_ok=True) os.makedirs("labels/val", exist_ok=True) for f in train_files: shutil.move(os.path.join("images", f), "images/train/") shutil.move(os.path.join("labels", f.replace(".jpg", ".txt")), "labels/train/") # val同理2.3 data.yaml配置文件的坑
YOLO训练必须要有一个yaml文件,告诉模型数据在哪里、类别有几种、每类叫什么名字。这个文件看上去很简单,但有个特别容易出错的细节:路径是绝对路径还是相对路径。
如果你用的是YOLOv8的ultralytics框架,在data.yaml里写的是相对路径,而相对路径的参照物是“当前执行训练命令的工作目录”。这意味着你在项目根目录下执行python train.py是一回事,你cd到train.py所在的子目录再执行又是另一回事,很容易出现“明明数据集路径是对的,但报错说找不到图片”的诡异情况。我的建议是不要在data.yaml里写死绝对路径,而是用项目入口文件去动态拼接。比如在训练脚本里加一句:
import os ROOT = os.path.dirname(os.path.abspath(__file__)) data_yaml = os.path.join(ROOT, "data.yaml")这样不管你在哪个目录下运行,路径都能正确解析。
data.yaml里还有个容易忽略的字段是nc(number of classes),它必须和标签文件里的类别数量、classes.txt里的行数三者完全一致。很多人改了类别数量却忘了更新nc,直接导致训练崩溃或者评估时报维度不匹配的错误。
3. 从零到一跑通YOLO训练
3.1 模型选择:YOLOv5还是YOLOv8,还是其他
既然标题里直接写了YOLO算法,那就要面对选哪个版本的问题。我的看法是,现阶段最省心的是YOLOv8,因为ultralytics把训练、验证、导出封装得非常简洁,代码抽象度高,对新手友好程度拉满。YOLOv5虽然社区生态成熟、教程多,但已经进入维护期,新项目我一般不推荐从零开始学它。
还有一点,如果你是在跑那个叫“冒险岛”或者类似游戏相关的数据集项目,其实也是同一套流程——YOLO算法跟游戏地图元素识别之间只有一个数据适配的距离,但文章里还是以道路破损检测为主来展开。
模型大小方面,我建议先从YOLOv8n或YOLOv8s入手。nano模型参数量最小,跑得快,迭代试错成本低,先用它跑通整个流程,确认数据集没问题、loss能降、mAP基本合理,再切换到s或m模型追求更高精度。千万避免上来直接训练YOLOv8x,962张图喂给这么大的模型,大概率严重过拟合,训练时间还特别长,得不偿失。
我踩过这个坑,最开始做路面积水检测时,直接上了YOLOv8m,跑了十几个epoch就发现val loss在涨,train loss还在降,典型的过拟合信号。后来换成YOLOv8s,加了一些数据增强,效果反而好了很多。
3.2 训练参数:几个真正影响结果的旋钮
训练参数网上已经有很多文章在讲,但我觉得大部分没有讲清楚“为什么”。这里我挑几个在道路破损场景下尤其关键的说。
第一是imgsz(输入图片尺寸)。YOLO默认是640x640。如果你的原始图像分辨率比较高(比如1280x720或1920x1080),输入尺寸设成640意味着大幅缩放,一些细小的裂缝在缩放后可能就只剩下几个像素宽,这对检测非常不利。道路破损,尤其是裂缝,属于小目标或细小目标,更容易被缩放“抹掉”。所以在显存允许的情况下,我建议把imgsz设成960或1280。代价是训练速度和显存占用会上升,但这个代价换来的裂缝召回率提升一般很可观。
第二是batch size。这个参数和显存直接相关,但很多人不知道它和质量的关系。更大的batch size通常让梯度估计更稳定、训练更稳,但也会降低训练速度。如果显存只有8G,YOLOv8s在640x640下,batch size取8比较稳妥;如果用到1280输入,batch size可能要降到4甚至2。这里有个实用技巧:batch size设小没问题,但训练轮数要适当增加,因为每个epoch看到的有效样本量变少了。
第三是epochs。962张图的情况,我习惯先跑100个epoch看看趋势。如果val loss在30个epoch左右就开始回升,那说明模型已经学不动了,应该靠早停或调小学习率来解决,而不是硬着头皮跑完。ultralytics框架自带早停参数patience,默认是100,但要记得打开这个机制,省电省时间。
第四是学习率。YOLOv8默认lr0是0.01,配合自动的lr_scheduler。如果是数据集量小、样本多样性低,可以稍微降低到0.005或者0.008,防止前期震荡太厉害。
3.3 开始训练:完整命令与输出解析
环境准备工作我不细展开了,大致就是装好ultralytics库、PyTorch、CUDA环境,用conda建一个干净的虚拟环境。然后执行训练命令:
yolo detect train \ model=yolov8s.pt \ data=data.yaml \ epochs=100 \ imgsz=960 \ batch=8 \ patience=20 \ cache=True \ project=road_damage \ name=exp01几个参数解释一下:
- model=yolov8s.pt:加载预训练权重,这是迁移学习的标准做法。虽然你的任务是道路破损检测,但COCO预训练权重里的通用特征提取能力非常有用,可以大幅加快收敛速度,并提升小样本下的泛化效果。
- cache=True:把图像加载到内存里缓存,962张图完全放得下,能大幅减少每一轮的数据读取时间。
- project和name:指定输出目录,模型权重、训练曲线、验证结果全放在这个目录下。
训练过程中你会看到两个关键指标:box_loss和cls_loss。这两个loss在训练初期会快速下降,中后期趋于平稳。如果box_loss下降之后又上升,说明过拟合了;如果从头到尾都不下降,多半是数据集或超参数配置有问题。
训练结束,程序会自动跑一遍val集,输出mAP50、mAP50-95这些指标。mAP50表示IoU阈值0.5下的平均精度均值,mAP50-95则是对多个IoU阈值(从0.5到0.95,步长0.05)取平均,后者更严格、更能反映定位质量。道路破损检测这类场景,如果mAP50能到0.7以上,基本说明模型已经能用了;mAP50-95能到0.4以上就算不错的成绩。
3.4 评估可视化:别只盯着一堆数字
除了量化的mAP指标,我还强烈建议你多看几样可视化输出。ultralytics在训练结束后会生成confusion_matrix.png、results.png和val_batch*.jpg这几类图。results.png包含loss曲线和mAP曲线,可以快速判断训练是否正常收敛。confusion_matrix.png则能看到每个类别之间的互相误判情况。比如“裂缝”和“龟裂”之间经常出现混淆,因为龟裂本质上就是密集的裂缝网状结构,从局部细节看很难区分。如果你发现这种混淆特别严重,可以考虑把这两个类别合并成一个“裂缝类”,反而能让模型学得更好。val_batch.jpg是验证集上的可视化结果,标注框会画在图上,直接翻一翻,最直观地感受模型检测效果。
如果你是那种不满足于官方训练脚本、想自己写训练循环的人,也可以用ultralytics的Python API,本质上是一样的。但我不建议在起步阶段自己写训练代码,因为处理数据加载、混合精度、损失计算、EMA更新这些细节很容易出错,而且出了错还不容易察觉。先用官方封装跑通,是你唯一正确的第一步。
4. 从解压到部署,一路上的坑我都替你踩过了
4.1 “不是zip文件”和数据损坏类问题
在线上下载数据集时,最常碰到的一个报错是“file is not a zip file”或者“End-of-central-directory signature not found”(也就是热词里提到的could not find eocd)。这通常不代表你拿到的文件真的不是zip,而是文件下载不完整,或者文件在传输过程中损坏了。zip格式在文件末尾有一个EOCD(End of Central Directory)记录,相当于整份zip的索引表,如果下载过程中断导致文件末尾缺失,解压工具就找不到这条记录,从而报错。
处理办法也很简单:重新下载,并且优先用支持断点续传的下载工具,比如IDM、curl -C -、wget -c这类。下载完成后,先检查文件大小是否和源站标注的字节数一致,再尝试解压。如果文件大小一致但依然报错,可以尝试用zip -F或者zip -FF命令修复:
zip -F damaged.zip -O repaired.zip这个命令会尝试从损坏的zip中恢复可用的文件结构,有时候能救回大部分文件。但这种修复有风险,修复出来的文件在某些系统上解压后可能缺几个文件,所以修完之后一定要用“验证文件数量”的方式检查一遍。
4.2 中文路径和目录结构混乱问题
国内下载的数据集,解压后很有可能出现中文目录名或者文件名。这在Windows下一般没事,但到了Linux服务器上训练,尤其是YOLO相关框架,一旦路径里出现中文字符或者空格,经常触发奇怪的编码错误。最典型的是Python在处理中文路径时可能报UnicodeDecodeError,或者是读取图片时路径拼接出错。
遇到这种问题,我建议不要尝试去修改代码适配中文路径,而是直接把数据集目录改成全英文、无空格的命名。比如把“道路破损数据集”改成“road_damage_dataset”,把“图片”改成“images”。这种一劳永逸的做法,能帮你避开一个巨大的麻烦源。
4.3 标签坐标系混乱和类别错位问题
这是我最常帮朋友排查的问题,症状是训练能跑、loss能降,但验证集上画出来的框全都不对——有的贴在图像边框上,有的宽高比完全失真,有的干脆框到完全不相干的区域。这通常是标注坐标的归一化基准不一致导致的。
具体来说,有些数据集在制作时,坐标是用“宽或高中的最大值”做归一化,而不是分别除以宽和高。用YOLO标准格式(分别除以宽、高)去读,自然全错。这种问题的修复有固定公式:拿到了像素坐标(x_min, y_min, x_max, y_max),直接除以图像宽高,得到的就是YOLO能用的格式。反过来说,如果已经拿到YOLO格式,想转成像素坐标画框,就乘回对应的宽高。
我用一个简单的代码片段来完成这种转换和可视化:
import cv2 def draw_yolo_boxes(image_path, label_path, class_names): img = cv2.imread(image_path) h, w = img.shape[:2] with open(label_path, 'r') as f: for line in f.readlines(): cls, x_c, y_c, bw, bh = line.strip().split() cls = int(cls) x_c, y_c, bw, bh = map(float, (x_c, y_c, bw, bh)) x_min = int((x_c - bw / 2) * w) y_min = int((y_c - bh / 2) * h) x_max = int((x_c + bw / 2) * w) y_max = int((y_c + bh / 2) * h) cv2.rectangle(img, (x_min, y_min), (x_max, y_max), (0, 0, 255), 2) cv2.putText(img, class_names[cls], (x_min, y_min - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) return img还有一个细节:如果你下载的是VOC格式的XML标注,想转成YOLO格式,本质上就是解析XML里的bndbox节点,计算中心点和宽高,然后归一化。网上有很多现成脚本,但务必自己跑一遍验证转换结果,别全信别人写的代码。
4.4 训练速度慢和显存不足的应对策略
962张图的数据集,单张图可能分辨率很高(有的道路巡检图是1920x1080甚至更高),这对显存和训练速度都是考验。如果你发现batch size设成4都爆显存,我的建议是:不要试图在一个大模型上硬扛,也不要盲目降低图像尺寸(那会牺牲小目标检测能力),而是尝试梯度累积技术,让梯度累积步数等于一个虚拟batch size。
举个例子:你想用batch size 16,但显存只够跑4张图,那就设batch=4、accumulate=4,效果等同于batch约等于16。ultralytics框架里有个项目配置nbs参数(nominal batch size),默认是64。当你实际的batch size小于nbs时,框架会自动做梯度累积,把梯度累积到等效batch size接近nbs的效果,所以许多情况下你甚至不用手动处理。
如果你的GPU实在太老,内存也不够,还可以考虑用CPU训练,把batch和imgsz降到最小,但训练时间会非常感人。我的态度是:如果只是做推理测试,CPU完全够;如果要正经训练模型,还是想办法搞一个有NVIDIA GPU的环境,云服务器按小时租也行。
4.5 越练越差?先排查数据,再排查参数
很多人训练完发现val mAP一直很低,甚至低于0.1,第一反应就是“换更大更强的模型”。但我见过太多这种情况,换了更大的模型不仅没提升,反而更差。真正的根因往往在数据侧。我建议按下面的顺序排查:
- 第一,可视化你的标签,看看框是不是“夹带私货”。标签里如果混入了一些靠图像边缘的无效小框,或者类别标错的大量样本,模型就会学到错误信息。
- 第二,查看class分布。如果某个类只有十几二十个样本,那么它的AP天然就会被拉低,模型也可能为了优先学其他大类而完全忽略它。
- 第三,检查图像本身的质量。有些图像可能压缩过度、模糊、过曝,或者本身是无人机俯拍图跟你能见到的路面角度差异很大。
如果数据侧确实没问题,再回头调整模型大小、学习率、epochs。从我的经验来看,数据集本身的小毛病带来的问题,远远多于超参调优带来的问题。所以每次训练不如意,我都劝自己先冷静下来看看数据。
另外关于训练参数,我个人还有一个心法:每次只改一个变量。比如这轮训练只改imgsz,下轮训练只改模型大小,这样一来,你知道效果的变化来自哪个改动,不会陷入“东改西改最后不知道哪个起了作用”的深渊。
5. 从训练到落地的最后一公里
训练完了,模型拿到了,这只是项目的一半。你大概率还需要把这套模型实际用起来。首先要把训练得到的best.pt导出成更适合推理的格式。用YOLOv8的导出功能,一条命令就能得到ONNX或者TensorRT格式。ONNX的好处是跨平台通用,TensorRT则能在NVIDIA显卡上获得最优的推理速度:
yolo export model=best.pt format=onnx opset=12 yolo export model=best.pt format=engine device=0 half=True我个人的习惯是:先导出ONNX验证一下推理结果和PyTorch原模型是否一致,确认无误后再根据需要转成engine格式。road damage检测如果部署在边缘设备上,还要考虑量化到FP16甚至INT8,但这部分对新手来说稍微复杂,可以后续再研究。
推理的时候,还可以通过conf阈值和iou阈值来控制输出框的数量和质量,这是很多人忽略的地方。默认conf=0.25,如果路面病害检测场景中你希望尽量少漏报,可以把conf调低到0.1;如果希望输出更精准、少误报,就调高到0.4甚至0.5。这个调参没有绝对正确,完全取决于使用场景对“漏报”和“误报”的容忍度。道路巡检的场景里,我更倾向于把conf调低一些,宁可多检测出几个可疑区域,也不能漏掉一个真正的大坑洞——毕竟漏掉一个坑槽直接爆胎的风险,远比误报几次养护工单严重。
还有一个容易被忽略的问题:图像分辨率变化后,检测效果可能明显下降。如果你训练时的imgsz是960,实际现场采集的图像是1920x1080,送到模型前一定要先做resize到接近训练的尺寸,而不是直接把原图塞进去。虽然YOLO内部也会做letterbox,但缩小的比例太夸张会直接影响小目标的特征表达。
这些内容讲完了,最后分享一点个人体会。这套数据集的价值不只是在“962张图带标签”这几个字上,它是一个传感器,能帮你把YOLO从“听过、看过”变成“跑过、调过、部署过”。我这两年帮别人看的项目里,很多是卡在“不知道去哪里找数据”这一步,而现在拿着这套数据集的你,已经站在一个有底气起跑的位置上了。好好珍惜这份标注过的数据,把它物尽其用。万一后面遇到什么奇怪的问题,不妨回头再读一遍这篇文章,大概率能找到答案。
本文还有配套的精品资源,点击获取