ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

道路裂缝检测数据集处理指南:YOLO训练前的标签与可视化核查

道路裂缝检测数据集处理指南:YOLO训练前的标签与可视化核查 简介针对道路裂缝检测任务提供一套已按YOLO格式整理好的目标检测数据集类别为crack并已完成训练集约520张与验证集约130张的数据划分。压缩包内图像与txt标签一一对应txt文件记录归一化后的类别与边界框坐标可直接被YOLO系列模型解析附有类别class文件和数据可视化py脚本脚本无需修改即可随机读取一张图片并绘制边界框、保存至当前目录便于快速核对标注是否准确。整个压缩包共1323个文件以660张jpg图像和661个txt标签为主体辅以1个可视化脚本和1张png示例图整体仅7.3MB轻量易下载适合本地快速部署与实验。目前已有87人学习/下载对于道路病害检测、巡检场景或目标检测课程设计而言可省去格式转换、数据划分与标注可视化的重复工作拿到后便能直接接入YOLO系列模型开展训练与测试。类别相对单一适合作为二分类基准数据集也可用于快速验证YOLOv5改进模块对裂缝检测效果的影响帮助初学者理解YOLO数据组织方式和标注文件结构。1. 道路裂缝检测数据包拿到手先别急着训练这份数据的价值在标签和划分“目标检测数据集道路裂缝检测数据”这个标题在道路巡检、路面养护评估和毕设场景里属于那种看起来不起眼、实际很抢手的东西。道理很简单公开的目标检测数据集里猫狗、车辆、行人一抓一大把但能让检测模型专门识别裂缝的成体系数据集少得可怜。裂缝在图像里是细长线状目标一条裂缝在1080p原图上往往只有几个像素宽属于典型的小目标检测难题普通通用数据集根本覆盖不了这种分布。这套数据集的核心卖点不是“有多少张图”而是标题里那句“包含数据、标签、类别class文件、数据可视化脚本已做数据划分”——这意味着它不是一个半成品图包而是能直接进入训练流程的整合数据。这篇笔记我会按“格式核对 → 目录整理 → 可视化检查 → 训练参数 → 踩坑修复”的顺序把它拆开讲清楚适合正在跑道路检测项目、或第一次拿YOLO系训练自己数据集的人照着跟。2. 裂缝数据集先看三样东西类别体系、标签格式与class文件的对齐2.1 类别体系单类crack还是多类裂缝class文件怎么定义道路裂缝检测在工程上最常见的类别划分是按裂缝形态分横向裂缝、纵向裂缝、网状裂缝龟裂、坑槽。对应到class文件里就是每一行一个类别名行号从0开始作为类别索引vertical_crack transverse_crack alligator_crack pothole这里的关键认知是类别名用什么英文单词不重要类别顺序直接决定了模型输出层的索引。class.txt第一行对应索引0第二行对应索引1训练配置里的names顺序必须和它一模一样。坑也藏在这里——很多人拿到数据集后习惯按自己的习惯重排class文件顺序结果标签里的索引全对不上了训练直接报class index out of range。选单类还是多类我的建议是看用途。如果你只是做“这条路有没有裂缝”的巡检分诊单类crack就够了模型好训、漏检率低。如果你要生成养护报表区分横向、纵向、龟裂才有意义。但注意裂缝形态是连续过渡的标注员经常把横向裂缝标成纵向多类数据里的类别噪声会直接把模型训练带偏。所以我的习惯是先跑一个单类crack版本拿到baseline再基于这个baseline决定要不要上多类。顺便说一句裂缝边缘模糊是客观存在的学术界有人用软标签处理边缘像素工程上靠硬标签加足够样本量完全够用没必要在数据阶段给自己增加复杂度。2.2 标签格式YOLO txt与VOC xml的区别以及标注工具怎么选目标检测的标签格式五花八门这个数据集标题里明确提到“标签”和“class文件”大概率是YOLO系能直接用的txt格式。我先用一个表把三种常见格式说清楚方便你判断手上这份数据的形态格式扩展名坐标含义是否要转换典型使用场景YOLO txt.txt归一化的中心点x、y、宽w、高h免转换直接训YOLOv5/v8/v11等YOLO系VOC XML.xml像素级的左上角x1、y1右下角x2、y2需转YOLO跨工具标注交接旧项目COCO JSON.json像素级的左上角x、y、宽w、高h需转YOLO大规模数据集、mmdetection常见的标注工具里LabelImg导出VOC XML最方便X-anylabeling强在能导出YOLO和COCO两种格式而且支持半自动化辅助标注。对付裂缝这种长条状目标纯手画框效率很低我一般用X-anylabeling的Segmentation模式先描一个大致多边形再让它生成外接框比手动拖框快不少。无论标签是什么格式拿到手后的统一动作是先随机挑10个txt文件用文本编辑器打开看一眼内容。YOLO格式的txt每一行应该是“类别索引 中心x 中心y 宽 高”五个数字、空格分隔前一个数字是整数后四个是0到1之间的浮点数。如果看到的是整数像素值说明这份标签不是YOLO原生格式或者是半成品转换——这个问题我在第五章会专门讲它是可视化全歪的常见元凶。2.3 已做数据划分随机划分还是分组划分直接影响评估可靠性标题里写了“已做数据划分”这是这个数据集比“只有图片和标签”高一个段位的地方。但划分方式本身有讲究。道路检测图像的采集方式是设备沿路拍摄连续帧之间的背景几乎一模一样。如果采用的是随机划分那训练集和验证集里很可能同时出现同一段路面的不同帧验证集分数虚高外业实测一测就翻车。我的做法是拿到划分好的数据后先不训练先做两件事。第一统计train和val目录下的图片数量比例。常规比例在8:2到7:3之间如果val占比超过40%要警惕是不是为了凑验证集把重复帧塞进去了。第二看文件命名。很多巡检数据的文件名带拍摄时间戳或路段编号比“IMG_20241015_093215.jpg”这种你可以用文件名的前半段判断划分逻辑——如果同一时间戳前缀的图片同时出现在train和val里那就是随机划分如果train是一个时间段、val是另一个时间段就是更严谨的按路段划分。两种划分都能训但前者评估出来的mAP参考价值要打折扣。这一章最后给你两个最基础的核查命令在解压目录下执行就能看到结果# 统计train和val的图片数量 find train/images -type f -name *.jpg | wc -l find val/images -type f -name *.jpg | wc -l # 统计train和val的标签文件数量应和图片数量大致相等 find train/labels -type f -name *.txt | wc -l find val/labels -type f -name *.txt | wc -l如果图片数量远大于标签数量说明有一部分图是没有标注的你后面训练时要么把这部分图从目录里移除要么自己补标否则训练时YOLO会跳过没标签的图白白占用目录扫描时间。3. 目标检测数据集处理三步目录重排、划分复核与可视化脚本跑通3.1 先把目录改成YOLO训练习惯的布局不管这个数据集原始解压出来是什么结构训练前最好统一成YOLO系约定俗成的目录布局crack_dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ ├── class.txt └── crack.yaml有些数据集是图片和标签混合放在一个大目录里后缀不同有些是train和val已经分好但目录名不标准。我一般会写一个一次性脚本把结构归位而不是手工拖拽因为几百上千个文件手工处理容易漏。下面这个脚本处理的是“images_all里有全部图片、labels_all里有全部txt”的常见情况它会先按8:2划分再把文件复制到目标目录from pathlib import Path import random import shutil # 原始数据目录改成你解压后的实际路径 src_img Path(images_all) src_lab Path(labels_all) dst Path(crack_dataset) random.seed(0) # 固定随机种子保证每次划分结果一致 for split in [train, val]: (dst / images / split).mkdir(parentsTrue, exist_okTrue) (dst / labels / split).mkdir(parentsTrue, exist_okTrue) imgs sorted(src_img.glob(*.jpg)) sorted(src_img.glob(*.png)) random.shuffle(imgs) val_cnt int(len(imgs) * 0.2) # 20% 做验证集你按需调整 for i, img in enumerate(imgs): split val if i val_cnt else train lab src_lab / (img.stem .txt) # 图片复制过去标签存在才复制不存在的打印出来 shutil.copy(img, dst / images / split / img.name) if lab.exists(): shutil.copy(lab, dst / labels / split / lab.name) else: print(f缺少标签: {img.name})代码逻辑说明脚本先把所有图片路径读进来打乱再按8:2切分图复制到images对应的同stem名txt复制到labels。打印“缺少标签”是为了让你知道有多少张无标注图混在里面这类图后面要么剔除要么补标。参数上值得改动的只有两点val_cnt对应的比例和图扩展名列表。如果你的数据是jpg和png混合上面的写法已经兼容如果还有jpeg或webp在glob里再加一项。3.2 可视化脚本把框画到原图上一眼看出标签质量训练前必做的一步是可视化复核。光看txt里数字人眼分不出对错把框画到图上就清楚多了。标题里提到“数据可视化脚本”但不管脚本是现成的还是要自己写核心逻辑都一样读txt、读图、用标签坐标画框、输出新图。下面这个脚本是通用的可以直接存成vis_labels.py使用import cv2 import numpy as np from pathlib import Path label_path Path(labels/train) # 改成你的标签目录 image_path Path(images/train) # 改成你的图片目录 out_path Path(check_vis) # 可视化结果输出目录 out_path.mkdir(exist_okTrue) def load_classes(filepath): 读取class文件一行一个类别名返回类别名列表 with open(filepath, encodingutf-8) as f: return [line.strip() for line in f if line.strip()] classes load_classes(class.txt) # 类别文件路径 # 给每个类别分配一个随机颜色 colors np.random.randint(0, 255, (len(classes), 3)).tolist() for lab_file in sorted(label_path.glob(*.txt)): # 图片可能jpg或png两个都试 img_file image_path / (lab_file.stem .jpg) img cv2.imread(str(img_file)) if img is None: img cv2.imread(str(img_file.with_suffix(.png))) if img is None: # Windows下中文路径cv2.imread会失效用np.fromfile兜底 candidates list(image_path.glob(lab_file.stem .*)) if candidates: img cv2.imdecode(np.fromfile(str(candidates[0]), dtypenp.uint8), cv2.IMREAD_COLOR) if img is None: print(f图片读取失败: {lab_file.stem}) continue h, w img.shape[:2] for line in open(lab_file, encodingutf-8): parts line.split() if len(parts) 5: continue # 空行或损坏行跳过 cls, cx, cy, bw, bh int(parts[0]), *map(float, parts[1:5]) # 归一化坐标换算成像素坐标 x1 int((cx - bw / 2) * w) y1 int((cy - bh / 2) * h) x2 int((cx bw / 2) * w) y2 int((cy bh / 2) * h) color colors[cls % len(colors)] cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) cv2.putText(img, classes[cls], (x1, max(y1 - 5, 0)), cv2.FONT_HERSHEY_SIMPLEX, 0.6, color, 2) out out_path / (lab_file.stem _vis.jpg) # imencode tofile 绕开中文路径写入失败问题 cv2.imencode(.jpg, img)[1].tofile(str(out)) print(可视化完成输出目录:, out_path)代码逻辑说明脚本对每个txt取同名的图片解析每一行标签的五个数字把归一化中心点坐标和宽高换算成像素级左上角、右下角然后用cv2画出矩形和类别名。参数上需要注意两点一是colors的取模防止类别索引越界导致数组访问报错二是如果class.txt里只有一行crack那classes[cls]永远返回crack画出来的图看着全是同样颜色的框这是正常的。跑完脚本后怎么检查我一般随机抽50张输出图看三个方面框是不是贴住裂缝边缘、有没有一条裂缝被截成好几段却只标了一段、有没有两个框重叠超过一半。裂缝数据最常见的质量问题不是标了错框而是漏标——一条长裂缝只在中间标了一小段模型学着学着会觉得裂缝就是那个短块推理时看到长裂缝会只框出一小截。3.3 类别分布统计class文件顺序和标签索引到底对不对可视化解决“框画在哪”统计脚本解决“每个类有多少目标”。这一步经常被跳过但它能提前暴露两类问题类别名顺序不一致和某个类样本量低到没法训。直接上脚本from collections import Counter from pathlib import Path counter Counter() # 统计每个类别索引的出现次数 for split in [train, val]: label_dir Path(flabels/{split}) if not label_dir.exists(): print(f目录不存在: {label_dir}) continue for lab_file in label_dir.glob(*.txt): for line in open(lab_file, encodingutf-8): parts line.split() if len(parts) 5: counter[int(parts[0])] 1 # 读取class文件把索引翻译成可读的类别名 with open(class.txt, encodingutf-8) as f: names [line.strip() for line in f if line.strip()] for idx, name in enumerate(names): print(f类别 {idx} ({name}): {counter.get(idx, 0)} 个目标) # 找出标签里出现但class文件里不存在的索引 label_indexes set(counter.keys()) class_indexes set(range(len(names))) if label_indexes - class_indexes: print(警告以下索引在标签中出现但class文件里没有定义:, sorted(label_indexes - class_indexes))代码逻辑说明脚本遍历所有标签文件用Counter统计每个类别索引的总目标数。最后一段是关键——如果标签里出现了索引5而class.txt只有5行索引范围0到4训练时必然报错。这个脚本在训练前跑一次能省掉一次执行到一半的报错时间。正常情况下单类crack数据集的输出应该是一个“类别0 (crack): 几千个目标”的统计结果多类数据集则要观察类别分布是否均衡如果pothole只有几十个目标那这个类别基本训不出来要么补数据要么先合并到crack里跑单类。4. 用YOLOv8训练自己的数据集最小命令与3个影响精度的参数4.1 写data.yaml路径、划分目录、类别名三件事目录整理好、可视化检查过之后就可以进入训练配置了。YOLOv8的训练入口是data.yaml文件它只做三件事告诉模型数据在哪、训练验证集怎么分、有几个类且类名是什么。一个裂缝数据集的最小示例如下# crack.yaml path: D:/datasets/crack_dataset # 改成你的数据根目录绝对路径 train: images/train # 相对path的训练图片目录 val: images/val # 相对path的验证图片目录 names: # 顺序必须与class.txt完全一致 0: crack 1: pothole参数说明path建议写绝对路径相对路径在本地练习时能跑但项目目录一旦移动就会整个失效排查起来还特别隐蔽。names的顺序是整个配置文件里最容易出错的地方class.txt第一行是crack那这里索引0就必须是crack不能按字母序重排。有一位同事曾经把names按字母序排了一遍训练正常启动但mAP一直起不来查了两天才发现是类别错位损失了完整的一个周末这个坑不值得踩第二次。4.2 最小训练命令从预训练权重起步imgsz给到1280环境准备这里不再展开ultralytics装好即可。训练命令本身不复杂但裂缝检测的参数默认值需要针对性地改。我一般在数据验证通过后的第一次训练用这条命令yolo detect train \ data../crack.yaml \ modelyolov8s.pt \ epochs100 \ imgsz1280 \ batch16 \ device0 \ projectruns_crack \ nameexp1代码说明modelyolov8s.pt代表从预训练权重起步而不是从零开始训练这是用中小型数据集做检测最快收敛的做法。epochs100配合早停机制够看趋势。device0表示用第一张显卡CPU训练的话devicecpu但速度慢得多。命令跑起来后终端会实时打印每个epoch的box_loss、cls_loss和mAP指标第一轮出结果后不需要等全部跑完先看loss值是不是在稳定下降。这条命令里有3个参数对裂缝检测影响最大imgsz默认值是640对裂缝检测来说太小。裂缝在1080p原图上细长且窄缩放到640后宽度往往不足一个像素相当于信息直接丢失。我一般给到1280有条件给1536也常见。代价是显存占用和训练时间翻几倍属于小目标检测里不得不花的成本。batch默认值在你的显卡上可能会OOM显存不足时把batch从16降到8同时把mosaic增强关掉或调低。Batch改变时不用手动去调学习率YOLOv8会自动按batch大小做学习率缩放。modelyolov8s是兼顾速度和精度的起点如果你想追求更高精度可以换成yolov8m或者yolov8l。但裂缝这种细长目标模型容量的收益远不如imgsz上调来得直接先把输入分辨率拉满再考虑加大模型。4.3 训练完看哪几张图不只看mAP要看框贴不贴裂缝训练结束后结果都在project后面指定的runs_crack/exp1目录里。第一步看的不是最终mAP而是results.png里的四条曲线train_loss、val_loss、mAP50、mAP50-95。如果loss持续下降而mAP50-95在某个epoch后停滞说明模型对裂缝这种极端长宽比目标的定位精度到了瓶颈这很正常裂缝框本身的长宽比动辄1:10以上IoU阈值一上去评分自然掉得惨烈。第二步是看验证集的可视化预测图。runs_crack/exp1目录下的val_batch*.jpg是模型在验证集上的预测叠加图一张图里能看到真实框和预测框的对比。我通常直接观察两点裂缝有没有被拦腰截成两段分别框出以及框是否紧贴裂缝边缘。前者说明模型的感受野还不足以“看到”整条裂缝靠提高imgsz或切片推理能缓解后者说明框回归没收敛得加训练轮次或检查标签本身的紧致度。最后跑一次单图推理确认模型部署时的表现yolo predict \ modelruns_crack/exp1/weights/best.pt \ sourcetest_imgs/ \ imgsz1280 \ save_txtTrue代码说明source可以是一个目录或单张图路径save_txtTrue会同时输出预测标签方便后续做评估对比。这里有个小习惯测试时要挑一张训练集里没见过的、包含复杂背景的路面图别拿验证集里出过多次的同一路段图否则结果会被数据泄漏抬高。别忘了yolo predict默认输入尺寸是640前面训练用1280这里推理也要保持一致否则同样的模型在不同尺度下输出质量会有明显差别。5. 裂缝检测数据集的常见问题排查5个能让你白训一整天的坑5.1 小目标检测场景裂缝把mAP50-95拖垮先查这里现象训练跑完mAP50看着有0.7mAP50-95却只有0.1几两个指标差距大得离谱。 原因裂缝是典型的细长小目标。同一张图里裂缝框的面积占比极小IoU计算时预测框哪怕只偏移几个像素和真实框的重叠度就跌破0.5。mAP50-95把0.5到0.95的阈值平均进去长宽比越极端、目标越小分数掉得越凶。 解决小目标检测场景的第一优先级永远是输入分辨率。训练时imgsz1280、推理时imgsz1280是直接见效的做法。如果原图太大、显存扛不住按切片推理的思路把大图切成若干patch分别检测再拼回坐标是工程上最常见的兜底方案。另外检查一下是不是用了默认的640尺度在推理这是最常见的“训练评估很好、部署效果拉胯”的原因。5.2 验证集分数虚高同路段图像泄漏现象训练loss正常下降验证集mAP高达0.8以上但把模型拿到真实巡检视频上一测漏检多到没法用。 原因道路图像是按顺序连续拍摄的相邻两帧的背景、裂缝形态几乎一样。如果数据划分是随机抽帧同一个路段的前后帧会同时出现在train和val里模型相当于提前看过验证题的“相似答案”。 解决拿到划分好的数据后先按文件名前缀或拍摄时间段判断分组逻辑。如果是随机划分建议重新做一次分组划分按“同一路段全部进train另一路段全部进val”的原则切分。虽然分组划分后验证集mAP会明显下降但那才是真实泛化水平的体现。血泪经验是宁可验证集分数难看也不要自欺欺人的高mAP。5.3 class index out of rangeclass文件顺序错位现象训练刚启动就报错提示索引超出names长度或者训练不报错但预测结果全部张冠李戴。 原因数据集标注过程中标注工具里的类别列表和最终class.txt不一致。比如标注时用了4个类别后续整理时删了一类标签文件里的索引3变成了“不存在的类”。另一种情况是class文件行数少于标签里的最大索引值。 解决用第3章的类别分布统计脚本跑一遍脚本会在“标签里的索引集合”大于“class文件索引范围”时打印警告。修正办法有两个方向标签索引统一减1或把缺失的类别名补回class.txt的对应位置。无论哪个方向都要保证class.txt顺序和data.yaml里的names顺序、标签txt里的索引三方一致。检查这一条只要一分钟跑train前务必补上。5.4 画出来的框整体偏移归一化坐标与原点不统一现象可视化脚本跑完框整体向右下角偏或者直接跑到图片外面。图能显示但框和裂缝位置完全对不上。 原因YOLO标签是“归一化中心点坐标”有些标注工具导出的是“像素级左上角坐标”转换时如果只把坐标值除以图片宽高、没有把x,y从左上角换算成中心点画出的框就会整体偏移半个框身。这种标签拿去训练虽然不报错但模型的框回归从一开始就在学错误映射效果可想而知。 解决看标签前先自己手动验算一行。打开任意一张图的txt取第一个目标用可视化脚本里的公式把归一化坐标乘以宽高再和原图上裂缝的真实位置对一下。如果偏移量恰好是半个框宽确认是坐标原点问题写个脚本把所有标签做转换把左上角坐标转成中心点坐标再重新可视化直到框贴合裂缝边缘为止。这也是为什么我一直强调训练前必须先跑可视化脚本黑匣子里面的数字漂亮不等于模型学到的东西是对的。5.5 Windows下可视化全黑中文路径和编码的双重陷阱现象可视化脚本运行无报错但输出的图全是黑图或者有几张图没画框但程序也不退出。 原因两个问题叠加。第一个是OpenCV的cv2.imread在Windows下对中文路径支持不完整,图片读不出来自然画不了框第二个是标签txt文件编码不统一有的是UTF-8有的是GBKopen默认的编码读GBK文件会直接抛UnicodeDecodeError。 解决读图统一用np.fromfile配cv2.imdecode而不是cv2.imread读txt时先按UTF-8尝试失败再回退GBK或者统一用errorsignore忽略异常字节。第3章的可视化脚本里我已经把这两个处理都写进去了你直接复制即可。这个问题特别隐蔽因为它在Linux下一切正常很多教程作者根本遇不到遇到了也别怀疑自己改掉读图方式就解决了。6. 训练前先跑一个覆盖度统计脚本这份裂缝数据能不能直接用先看这几个数字6.1 数据质量健康度检查覆盖率、空标签、越界框如果你只打算记住这篇笔记里的一件事那就是拿到任何裂缝检测数据集训练前先跑数据健康度检查别让模型在烂数据上白白烧卡。下面这个脚本汇总了三个核心指标from pathlib import Path for split in [train, val]: img_dir Path(fimages/{split}) lab_dir Path(flabels/{split}) imgs list(img_dir.glob(*.jpg)) list(img_dir.glob(*.png)) labs list(lab_dir.glob(*.txt)) img_names {p.stem for p in imgs} lab_names {p.stem for p in labs} # 指标1有图无标签的数量 missing_lab img_names - lab_names # 指标2空标签文件数量文件存在但没有有效行 empty_lab 0 # 指标3坐标越界文件数归一化坐标不在0~1范围内 out_of_range 0 for lab in lab_dir.glob(*.txt): lines [l.split() for l in open(lab, encodingutf-8) if l.strip()] if not lines: empty_lab 1 for parts in lines: if len(parts) 5 and not all(0 float(v) 1 for v in parts[1:5]): out_of_range 1 break print(f[{split}] 图片数:{len(imgs)} 标签数:{len(labs)} f缺标签:{len(missing_lab)} 空标签:{empty_lab} 越界文件:{out_of_range})跑完输出无非三种状态数据干净、缺少量标签、质量问题严重。缺标签数量超过图片总量10%时要么补标要么把那部分图移出数据集空标签文件数量超过20%说明混入大量背景图对裂缝这种正样本本就稀疏的任务来说背景太多会把模型往“什么都不检测”的方向带。这三个数字全部健康再进入第4章的训练流程这才是能复现、可评估的路径。6.2 一个值得做的增强复制粘贴式增广专治小目标裂缝裂缝数据的样本瓶颈往往不在总量而在形态多样性。一个实操上有效的增广思路是复制粘贴增强把标注框内的裂缝目标裁剪出来经过随机旋转、缩放后粘贴到另一张不含裂缝的路面背景图上同时生成对应的标签。这类增广对小目标检测非常有效因为它直接增加了“裂缝出现在不同路面纹理、不同光照、不同位置”的样本量。使用时注意两个边界一是贴入的目标要按原图比例缩放不要把一条1米长的裂缝缩成10像素的短线尺度失真反而破坏特征二是粘贴位置避开图像边缘防止目标被裁剪掉一半导致标签失效。这份数据集的整合标签和可视化脚本正是为这类增广方案提供了可操作的基础——先验证标签干净再做目标级扩充最后重训一轮很多场景下比盲目加预训练模型版本更直接。我自己的习惯是把这套检查固定成流程解压后先跑健康度脚本再跑可视化抽查50张确认标记干净才动训练命令。曾经有一份数据就是栽在“缺标签”指标上当时没查直接开训训练日志里loss一路走低、mAP一路走高最后推理实测翻车回头一查训练集里几百张无标签图被忽略的同时把val也污染了。从那之后数据检查成了我脑子里雷打不动的第一道工序。希望帮到你。本文还有配套的精品资源点击获取
返回列表