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

资讯详情

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

YOLO算法实战:3258张马路裂缝数据集训练全流程

YOLO算法实战:3258张马路裂缝数据集训练全流程 简介一套面向道路裂缝检测的YOLO系列目标检测数据集专为计算机视觉与深度学习开发者、算法工程师及在校学生设计可直接用于模型训练、验证与测试解决道路病害识别场景中数据集准备和标签格式不统一的问题。压缩包共2000个文件以XML标注文件为主体同时提供YOLO格式的TXT标签两种格式分别保存在独立文件夹中总大小约104.55MB目前已有187人学习下载。数据集已完成训练、验证、测试划分并附带data.yaml配置文件可无缝适配YOLOv5、YOLOv7、YOLOv8、YOLOv9、YOLOv10、YOLO11等主流算法开箱即用。TXT标签采用 x_center y_center 的归一化坐标格式类别索引从0开始框坐标均按图像宽高做比例归一化XML文件遵循VOC标注规范便于在不同工具链之间转换。整体目录结构清晰既适合快速上手的初学者也适合需要规范数据格式的进阶项目。1. 拿到这个压缩包你离自动筛裂缝只差一个模型做道路巡检的人都有这种体验车跑一圈下来拍了上万张照片晚上回办公室一张张翻颈椎病都快看出来了。裂缝这东西你说简单也简单就是图像里一条深色的不规则线但真正做检测的人都知道它比想象中难缠——光照一变裂缝颜色和沥青底色几乎融为一体阴影一压裂缝和树影根本分不清。而“yolo算法-马路裂缝数据集-3258张图像带标签”这个压缩包解决的正是这条链路里最卡脖子的第一步你有没有一套能直接开训、带好标签的马路裂缝数据。YOLO算法系列到目前为止依然是工业界落地目标检测的第一选择裂缝检测这种单类别、强纹理、背景复杂的任务恰恰是YOLO最擅长的场景。3258张图像这个规模说大不大单卡训练几十分钟就能跑完一轮说小也不小对单类别检测来说如果标签质量靠谱这个量级已经足够让你把模型从“学术demo”推到“现场能用”的门口。这篇笔记我不讲虚的直接带你把压缩包从硬盘上解出来走完数据核查、格式整理、模型训到验证评估的完整闭环每一步都给你能直接抄的命令和参数顺带告诉你哪些地方最容易翻车。2. 把 3258 张图拆开看先搞清楚你手里的货是什么不管压缩包名字写得多么规范拿到任何数据集的第一件事都不是急着训练而是把里面的东西摸清楚。我见过太多人压缩包解压完看都不看就直接扔进训练脚本结果跑到一半报错回头查才发现是标签格式不对、类别 ID 对不上、图片里还有损坏文件——白白浪费几个小时。这个数据集号称 3258 张带标签具体带的是什么标签、什么格式、裂缝种类分没分细类全部以解压后的实际内容为准。2.1 解压与目录结构先花五分钟看清家底解压没什么好说的但解压后第一眼要看的不是images文件夹里的图而是标签文件。最常见的两种标签格式一种是 YOLO 的 txt每行一个目标的class x_center y_center width height坐标是归一化小数另一种是 VOC 的 xml里面包着多边形的顶点坐标或者bndbox矩形坐标。还有的是 COCO 的 json。这三种格式后续处理方式完全不同先确认格式再往下走能少踩很多坑。# 解压到工作目录统一不保留 Windows 下的特殊字符 unzip yolo算法-马路裂缝数据集-3258张图像带标签.zip -d road_crack_data cd road_crack_data # 看一眼顶层结构 find . -maxdepth 2 -type d | head -20 # 统计图片数量和标签数量确认 3258 是否对得上 ls images | wc -l ls labels | wc -l # 抽查三五个标签文件确认格式txt / xml / json head -5 labels/000001.txt 2/dev/null || echo not txt逻辑说明先看目录层级确认图片和标签是分开放还是混在一起再看数量是否配对理想状态下images和labels文件数完全一致最后抽查标签前几行直接决定后面走哪条数据处理路线。参数说明maxdepth 2限制查找深度避免子目录过多刷屏wc -l统计行数也就是文件数这一步能快速发现有没有缺标签或者多标签的孤儿文件。另外要留意文件名前缀是否一致。有些数据集图片是IMG_2024_001.jpg标签却是000001.txt对不上号。遇到这种情况写一段小脚本按照文件名映射关系把标签重命名匹配上或者训练时改配置文件里的路径映射。这种问题不解决训练时会出现一半图片没有对应标签yaml 文件的train路径指向一个目录时YOLO 会静默跳过无标签图片你可能压根发现不了。2.2 标签内容体检裂缝是不是只有一种类这条最容易被忽视。名为“马路裂缝”的数据集有的把裂缝分成了横向裂缝、纵向裂缝、网状裂缝、龟裂好几个类别有的干脆只有一个类别crack还有的会把背景中的伸缩缝、修补块也打上标签。不检查就直接训会出现意想不到的后果如果你把多类别数据当成单类别训loss 能降但检测时全混成一个框反过来把单类别数据硬套多类别配置训练直接报错。# analyze_labels.py import os, collections from pathlib import Path label_dir Path(road_crack_data/labels) # 用一个字典统计每个标注文件里的类别 ID class_counter collections.Counter() sample_boxes {} for label_file in label_dir.glob(*.txt): with open(label_file, r, encodingutf-8, errorsignore) as f: for line in f: parts line.strip().split() if len(parts) 5: continue cls_id parts[0] class_counter[cls_id] 1 if cls_id not in sample_boxes: sample_boxes[cls_id] parts[1:] print(类别分布:, class_counter) # 检查是否有坐标越界或宽高为0的非法标注 bad_count 0 for label_file in label_dir.glob(*.txt): with open(label_file, r, encodingutf-8, errorsignore) as f: for line in f: parts line.strip().split() if len(parts) 5: _, cx, cy, w, h parts if float(w) 0 or float(h) 0 or float(cx) 1.0 or float(cy) 1.0: bad_count 1 print(f非法标注: {label_file.name}: {line.strip()}) print(f非法标注数量: {bad_count})逻辑说明第一个循环统计所有标签文件中的类别 ID理论上一个类别就是全0如果冒出多个 ID说明是细分了裂缝类型第二个循环检查标注坐标合法性——YOLO 格式下坐标是 0 到 1 的归一化值出现大于 1 或者宽高为负数基本可以确定是标注软件导出设置错了或者数据本身有损坏。参数说明errorsignore是必须的Windows 上有些标注工具会写出 GBK 编码的文件直接读 UTF-8 会炸ignore 之后至少能先把文件读完。这一步做完我一般还会从每个类别里抽三张图片把标签可视化出来用 OpenCV 直接画框不借助 labelImg 之类的工具。肉眼检查的意义在于有些标注框只是框住了裂缝的一部分或者把裂缝两边黑边一起框进去了这种系统性的标注误差直接决定模型能学到什么比任何算法调参都重要。3. 格式统一与划分让 YOLO 能在三分钟内吃下这套数据很多人以为 YOLO 训练就是把数据集扔进去自动跑实际上 YOLO 的输入要求非常死板图片建议统一尺寸标签必须是 txt 且与图片严格同名目录结构必须匹配配置文件中的路径。当前数据集如果解压后不是这样的结构就需要先做转换。这个过程不需要多少智慧但非常需要耐心出错的概率也最高。经常出问题的是文件名编码、标签坐标原点不一致、以及训练集和验证集划分时不小心把同源图片分到了两边。3.1 规范化为 YOLO 目录这个步骤没有任何技术含量但别跳YOLO 官方约定俗成的数据集目录结构如下dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/images/train/xxx.jpg与labels/train/xxx.txt一一对应。你要做的就是按照这个结构把原数据整理一遍。我一般在这个阶段不直接改原文件而是复制出一个dataset/目录宁可浪费点磁盘空间也不冒险把原始带标签数据搞乱——这是最便宜的后悔药。mkdir -p dataset/images/train dataset/images/val dataset/labels/train dataset/labels/val # 如果原始图片和标签在平铺目录直接先全部放进 train cp images/*.jpg dataset/images/train/ 2/dev/null || cp images/*.png dataset/images/train/ 2/dev/null cp labels/*.txt dataset/labels/train/ 2/dev/null # 统计一下看有多少对不上的孤儿文件 diff (ls images | sed s/\.[^.]*$// | sort) (ls labels | sed s/\.[^.]*$// | sort) | head -10逻辑说明先把所有东西平铺进train目录再统一抽一部分到val这样不用在转换格式阶段就纠结划分比例。diff命令对比去掉后缀后的文件名列表找出两边对不上的。参数说明sed s/\.[^.]*$//表示匹配最后一个点号及后续字符并删除得到不带扩展名的纯文件名。如果命令执行后没有输出说明文件全部配对成功有输出的话那几行就是你要手动处理的问题文件。3.2 划分训练集与验证集按文件级别抽签而不是随机数3258 张图常规划分是 9:1、8:2 或者 7:3。对于几十万张的大数据集7:3 都没问题但对这个量级建议 8:2验证集 650 张左右足够让评估指标稳定。划分时最容易犯的错是纯随机抽签结果某个场景下的裂缝图片全被抽进验证集导致验证集和训练集分布不一致训练曲线难看得要命。更合理的做法是先按图片名排序然后再按比例抽——因为拍摄照片通常是连续采集的排序后间隔抽取就能大致把不同路段的图片均匀分到两边。# split_train_val.py import os, random from pathlib import Path src_img Path(dataset/images/train) src_lbl Path(dataset/labels/train) dst_img_t Path(dataset/images/train) dst_lbl_t Path(dataset/labels/train) dst_img_v Path(dataset/images/val) dst_lbl_v Path(dataset/labels/val) all_files sorted([p.stem for p in src_img.glob(*.jpg)]) # 固定随机种子保证同一个数据集多次划分结果一致 random.seed(42) # 先用洗牌打乱顺序 random.shuffle(all_files) # 前 80% 留在训练集后 20% 移到验证集 val_count int(len(all_files) * 0.2) val_files set(all_files[:val_count]) for stem in all_files: src_img_file src_img / f{stem}.jpg src_lbl_file src_lbl / f{stem}.txt if stem in val_files: dst_img dst_img_v / f{stem}.jpg dst_lbl dst_lbl_v / f{stem}.txt else: dst_img dst_img_t / f{stem}.jpg dst_lbl dst_lbl_t / f{stem}.txt os.rename(src_img_file, dst_img) os.rename(src_lbl_file, dst_lbl) print(f训练集: {len(all_files) - val_count} 张, 验证集: {val_count} 张)逻辑说明先排序后打乱再按比例切片。加random.seed(42)是为了保证可复现——你或者你的同事换台机器重新跑一次脚本划分结果完全一致后面如果想追溯某个验证集样本到底属于哪一批对照同一个 seed 的记录即可。参数说明0.2是验证集比例你可以按需要改成 0.15 或 0.3如果数据集中有同一路段连续拍摄的图片洗牌后它们会被打散分布这恰好避免了“路段泄漏”——也就是同一场景同时出现在训练集和验证集中导致的指标虚高。3.3 写 data.yaml一行路径都不能错项目根目录在road_crack_data创建config/data.yamlpath: /absolute/path/to/road_crack_data # 数据集根目录建议写绝对路径 train: images/train val: images/val # test: images/test nc: 1 names: [crack]逻辑说明path是数据集根目录下面train和val都是相对path的路径。如果你在别的电脑上跑记得改path这个字段写相对路径很容易出问题因为 YOLO 会基于当前工作目录拼接——倒不是说不能用但不同机器跑结果不一致调试时找错很浪费时间。参数说明nc是类别数names列表里的字符串顺序必须和标签文件里的classID 索引对齐。之前检查标签时如果发现多类别这里就要写多个名字顺序搞反了模型训练出的含义就完全错位了。如果你的标签原来是 VOC xml 格式或者 COCO json需要额外写一段脚本把多边形顶点转成最小外接矩形的 YOLO 坐标如果是 txt 但坐标没有归一化则需要把像素坐标除以图片宽高。这个过程不复杂但网上一堆二手资料的转换脚本各有各的糟点最常见的是坐标系搞反——VOC 的原点在左上角YOLO 的cx, cy是以矩形中心为基准再归一化公式是cx (xmin xmax) / 2 / img_width千万别写成(xmax - xmin)。这一步错了模型不是不能训而是裂缝框会整体偏移位置完全对不上。4. 训练 YOLO 裂缝检测模型从命令到参数照抄这一套格式整理好之后训练本身反而是最没悬念的部分。YOLO 系列发展到现在训练一个单类别检测模型的流程已经极度标准化。选哪个版本倒是值得斟酌一下如果你有 GPU建议直接用 YOLOv8 或者更新一代的系列默认配置很成熟开箱即用的效果比 v5 好如果目标是部署到特别老的嵌入式设备上可以选 v5s 这个经典版本。这里以当前生态最普遍的 YOLOv8 为例因为它在官方库中集成了数据增强、融合、以及非常直观的训练日志对裂缝这种单类别任务尤其省事。4.1 环境准备与最小训练命令pip install ultralytics # 如果之前装过老版本先升级避免 Torch 兼容性玄学 pip install -U ultralytics环境这步是很多人耗时最长的地方主要是 PyTorch 版本和 CUDA 版本的匹配问题。经验之谈直接装 ultralytics 会连带装好适配的 torch不要自己手动先装一个 torch 再装 ultralytics那样大概率碰上版本冲突。安装完成后先不急着训跑一个单 batch 的 smoke testyolo detect predict modelyolov8n.pt sourcehttps://ultralytics.com/images/bus.jpg这是验证环境最稳妥的路径几秒钟推理完一张图且不报错说明环境没问题。能跑通再进入正式训练。# 在 road_crack_data 目录执行否则 yaml 里的相对路径会出错 yolo detect train \ modelyolov8n.pt \ dataconfig/data.yaml \ epochs100 \ imgsz640 \ batch16 \ device0 \ patience20 \ projectrun_crack \ nameexp001逻辑说明modelyolov8n.pt是官方预训练权重在 COCO 上训过迁移到裂缝检测上有很好的起点。data指向刚写好的 yaml。project和name决定训练输出目录跑多次对比实验时只要改name就行。参数说明epochs100对 2600 多张训练图来说够用imgsz640是 YOLO 默认输入尺寸裂缝图一般都是路面拍摄的高分辨率大图640 意味着会先缩放而这会在后面引出一个小目标问题到避坑章节细说batch16取决于显存8GB 显存用 16 没压力6GB 建议改成 8patience20是早停参数20 个 epoch 内验证集 mAP 没有明显提升就自动停训省时间。如果训练时显存溢出优先调低 batch不建议动 imgsz因为输入分辨率直接影响裂缝这种细长目标的检测精度。4.2 训练过程中的三个判断信号训练跑起来的头十五分钟不要盯着准确率要看下面这几个输出是否正常第一loss的前几个 epoch 变化。正常情况是剧烈下降——第一轮 loss 可能在 1.5 上下到第十轮就掉到 0.4 左右。如果你的 loss 前五轮还在原地不动或者不降反升先停住去看看数据是不是出了问题标签文件格式错了、类别 ID 越界、或者图片数量与标签数量严重不匹配。这种跑起来不动的情况九成是数据问题不是模型问题。第二验证集指标mAP50-95和mAP50。裂缝是强目标背景干扰大但目标本身对比度足够一般 20 个 epoch 后 mAP50 就能到 0.3 以上。如果你的 mAP50 到 50 个 epoch 还在 0.1 附近徘徊说明裂缝实例太小或者标注框质量太差导致模型学不到稳定特征。第三早停。patience20意味着验证集指标连续 20 轮不更新最好记录就自动结束训练。如果 100 轮没跑完就停了别慌看下最后一次输出权重best.pt是不是出现在训练中期——如果是说明后期过拟合了如果停在最后一轮附近说明模型还有余量可以直接再加 50 轮继续训。训练时我习惯开着 TensorBoard 看曲线tensorboard --logdir run_crack/exp001浏览器打开本地 6006 端口重点看train/box_loss和val/box_loss的变化趋势——训练结束时两者都在下降且没有明显分叉说明模型还没过拟合如果训练 loss 继续降而验证 loss 回升说明模型开始死记训练集这时候再训多少轮都没意义。4.3 试跑 baseline 后干什么先切小图再来谈技巧首次训练跑完先别急着调一大堆参数。一个非常重要的习惯是先用生成的结果反推问题再决定下一步。下载下来几张验证集图片上模型预测的效果把置信度阈值调低到 0.1看看模型有没有在大裂纹上给出低置信度的框。如果大裂缝框得不错但细裂缝完全没有响应恭喜你遇上了目标检测里最常见的“小目标失效”问题——裂缝这种目标跟行人、车辆不一样长宽比极其极端它可能在一张 2000x3000 的路面图里只占 60x300 像素缩放成 640x640 输入后只剩 20x90特征已经丢得差不多了。两步解决把imgsz调大。640 改到 1280显存不够就把batch从 16 调到 8甚至 4。代价是训练时间和显存占用急剧上升但对裂缝检测来说收益非常明显。再配合mosaic数据增强让模型在小目标上见过更多样本。Ultralytics 默认开了 mosaic但如果你用的是老版本要注意确认。yolo detect train \ modelrun_crack/exp001/weights/best.pt \ dataconfig/data.yaml \ epochs50 \ imgsz1280 \ batch8 \ device0 \ projectrun_crack \ nameexp002逻辑说明第二个实验在第一次训练结果的基础上继续微调而不是从头开始。model指向上次最优权重保留已经学到的特征分辨率翻倍后模型有机会看到更细节的纹理。参数说明epochs50是本次微调轮次batch8对应 1280 分辨率下的显存占用如果你的卡只有 8GB建议直接降到 4nameexp002和 exp001 分开存放方便后续对比。5. 训练 YOLO 裂缝模型的避坑手册翻车现场还原这一章的每一条都是实战中反复出现的真实问题。写成“现象 → 原因 → 解决”的结构方便你直接对照排查。5.1 现象loss 正常下降但 mAP 始终为 0你可能遇到过这种情况训练输出里box_loss从 1.5 降到了 0.3看起来万事大吉但验证集的 mAP 列始终是 0或者只有 0.001 这种几乎等于零的值。然后你会发现验证集的图片上模型一个框都不出。原因分析最常见的原因是验证集和训练集的路径搞反了。YOLO 训练时只看你data.yaml里val字段指向的目录如果这个目录意外指向了空目录训练逻辑会静默跳过导致验证 mAP 永远是 0。另一个常见原因是验证集图片里确实存在裂缝但模型因为输入分辨率过低完全没学到小裂缝特征导致置信度全都在阈值 0.25 以下一个框都画不出来。解决路径第一步检查data.yaml里val的路径是否真实存在且有图片第二步直接用训练集里效果最好的图片做单张预测确认模型本身没有出问题第三步再把验证集图片按 1280 分辨率重新验证一次如果此时有框说明之前的 640 输入分辨率严重不足。有一个小技巧——用yolo detect val命令单独评估把置信度阈值调低yolo detect val \ modelrun_crack/exp002/weights/best.pt \ dataconfig/data.yaml \ conf0.05conf0.05是人为降低置信度阈值看看模型到底有没有产生低置信度的预测。如果降到 0.05 后 mAP 还是 0那问题基本锁定在数据路径上如果 mAP 明显上升说明问题出在置信度阈值设置入坑在模型这边微调时加上相应的思路即可。5.2 现象裂缝框中间断开一条裂缝被拆成两三个框模型明明检测到了裂缝但同一个裂缝被预测框拆成了两截中间有一小段空隙无法形成连续边界。原因分析裂缝的形状不是标准矩形一条裂缝可以延续几百甚至上千像素。而矩形框在表达这种细长形状时天生很笨拙——它的上半段和下半段如果是弯的矩形框就会框住大量背景YOLO 的锚框机制和 NMS 算法会把一条弯曲裂缝误认为两个或三个独立目标。另一个原因是训练时裁切当裂缝跨越 mosaic 的拼接边界时数据集制造了半截裂缝的假样本。解决路径模型层面治标不治本的做法是降低 NMS 的 IoU 阈值让相邻的预测框更容易被合并但更推荐楼主一步到位的做法——算裂缝长宽比。如果数据集中多数目标的长宽比大于 5:1说明矩形框的回归本身就是在为难模型优先考虑把裂缝按小段重割或者换成旋转框检测模型。另外训练前检查一下 mosaic 增强是否把裂缝撕裂了如果是可以调低mosaic概率甚至暂时关掉它在数据增强参数上加限制。5.3 现象白天训练的模型一到阴天或者傍晚就失灵训练集里全是晴天大太阳下拍的照片模型学习到的是“强对比度下的暗色线条”。一到阴天整张图对比度整体下降裂缝边缘模糊模型几乎全部漏检。原因分析数据集单一场景下的过拟合模型没有见过足够多的光照变化样本。3258 张图听起来不少但如果全部来自同一条路同一个时间段信息量可能只相当于几百张。解决路径优先在训练中开颜色和光照扰动。Ultralytics 默认的训练增强里包含一定程度的 HSV 变换但默认强度比较温和对光照分布极端的裂缝场景不够用。可以在训练参数中调整yolo detect train \ modelrun_crack/exp002/weights/best.pt \ dataconfig/data.yaml \ epochs30 \ hsv_h0.02 \ hsv_s0.8 \ hsv_v0.6 \ degrees10 \ translate0.1 \ scale0.4参数说明hsv_v0.6表示把亮度扰动幅度调到 0.6整数形式原始意义是 0 到 1 区间的扰动比例模型会随机调整训练图亮度模拟阴天和傍晚的光照条件hsv_s0.8增强饱和度扰动让模型别死记颜色特征degrees10允许图片随机旋转 10 度模拟拍摄角度变化scale0.4缩放扰动范围。这组参数对路况场景比较均衡不容易把训练分布扭曲到失真。同时如果确实有夜间或者强逆光的数据无论多少张也放进来参与训练——这点经验极其重要模型的泛化能力上限主要取决于数据覆盖的光照空间而不是绝对数量。5.4 现象训练时突然报错CUDA out of memory或者Segmentation fault现象描述很直观训练跑到某个 epoch程序直接崩溃退出没有任何中间警告。原因分析显存溢出是正常的因为 mosaic 增强会把 4 张图拼成一张峰值显存占用比单张推理高出一大截。另一个隐蔽原因是 pytorch 和数据加载线程之间发生了互斥死锁通常发生在 Windows 系统上而且num_workers设置得过大。Segmentation fault 多数原因指向某个图片文件损坏OpenCV 读取时直接崩了。解决路径显存溢出优先把batch降到 4 或者用accumulate参数让梯度累积模拟更大 batch把 mosaic 关闭或者调低到 0.5Windows 用户直接在训练命令里加workers0如果错误消失说明是数据加载线程问题。顺便给一个排查图片损坏的快速脚本# 检查所有图片是否可被 OpenCV 正常读取 python -c import cv2, glob bad [] for f in glob.glob(dataset/images/*/*.jpg): img cv2.imread(f) if img is None: bad.append(f) print(损坏图片:, bad) # 用官方自带的检查命令也可以 yolo detect train ... cacheTruecacheTrue第一次运行会做完整的数据加载并在本地生成缓存文件。如果某个图片文件存在问题它会直接报出具体路径。建议拿到数据集之后都先跑一次缓存生成相当于做一次全量数据的完整性体检。6. 验证模型是否真的可用从指标到现场环境的最后一公里验证阶段是决定模型“能不能真的上生产”的分水岭。很多人在训练结束后看一眼 mAP 就开始部署用不了多久就发现模型在现场各种翻车。mAP 是统计指标它衡量的是整个验证集上的平均表现但它掩盖了最致命的问题——你的模型到底在哪几种裂缝上翻车了在多远的距离上失效了。6.1 不看 mAP 看什么分类别遗漏和误检对单类别检测模型来说mAP50 是网络图上最好看的指标但它的分母是整个验证集的平均值个别难例的糟糕表现会被大量简单样本稀释。更可靠的检查办法是跑验证时把图片导出看看预测结果重点检查两类图片一类是标注框面积特别小的图片另一类是裂缝和阴影同时出现的图片。用官方 val 命令的save_json加可视化参数yolo detect val \ modelrun_crack/exp002/weights/best.pt \ dataconfig/data.yaml \ save_json \ save_txt \ save_conf逻辑说明save_json会把每个预测结果转成 JSON 文件方便写脚本统计哪些样本漏检较多save_txt输出每张图的 YOLO 格式预测坐标可以直接对比真实标签save_conf在可视化图片框上方标出置信度。参数说明save_conf默认不参与模型运算它只影响导出文件里是否带置信度。看文件能判断什么如果某个小目标裂缝的置信度一直在 0.2 到 0.3 区间徘徊说明模型对它没有把握部署时不要直接把阈值设太高。6.2 部署时维持训练分辨率前处理环节不能乱来训练用的是 1280部署推理时也尽量用相同分辨率千万不要因为速度把输入分辨率改到 640 甚至 416——你将直接破坏模型学到的特征尺度。如果现场设备性能确实不够不要只调分辨率应该先考虑换更小的模型结构比如从 YOLOv8m 换到 YOLOv8n然后重新在 640 分辨率下训练一个专用模型这比用同一个模型跑两个分辨率可靠得多。用 ONNX 导出和 TensorRT 部署到边缘设备是很常见的选择导出时注意把动态尺寸关掉固定成训练分辨率省掉后续处理的一堆麻烦yolo export modelrun_crack/exp002/weights/best.pt formatonnx imgsz1280 opset12导出后建议用onnxruntime写一个 10 行左右的推理脚本先跑几张现场实拍图看效果。这一步的意义在于PyTorch 环境和生产环境的图像前处理流程未必完全一致——像素归一化方式、通道顺序、尺寸变换的插值算法稍微有差异模型的输出就会漂移。很多模型落地时表现变差不是训练的问题而是前处理流程的问题。6.3 让模型越用越准从 3258 张到可持续升级的半自动标注训练完一个可用模型之后最增值的动作是回来给数据集升级。主管道是用当前最准的模型对新采集的原始图片做自动预标注人工只负责修正微调再把新增的样本混合到旧数据里做一次增量训练。这个过程能把新场景夜间、雨天、匝道口的数据积累成本降到最低。具体做法用yolo predict批量跑一段没标注过的道路图片然后指定save_txt生成坐标文件直接用labelImg或者x-anylabeling打开把模型画的框当作初始值人工调整边界。一篇适合结合 YOLO 裂缝检测的讲解材料也可以把模型预标注结果截图放进去——一张原图、一张标签图、一张模型预测图三张图摆在一起讲给施工人员或者非技术同事听比任何表格都直观。这也是业内用一个 3258 张带标签的数据集起步逐步滚成十万张级自有数据资产的标准路径。我的习惯是给每个版本的数据集标注好版本号比如crack_v1_3258、crack_v2_5000保存到独立的目录。后续模型性能出现回退时能迅速确认是数据分布变了还是模型训练出了问题。3258 张不是终点是让整个流程跑通的最小启动量当你的模型在你的路面上、你的摄像头角度下、你的光照条件里稳定输出时这套数据才真正完成了它的使命。希望这篇笔记能帮你少踩几个我用一次次重训换来的坑。本文还有配套的精品资源点击获取
返回列表