资讯动态

用模型挑错:图像分类与目标检测中的数据清洗实战

发布时间:2026/10/14 14:15:21 来源:尧图企业网站定制
1. 这个实验到底在折腾什么数据标注这件事干过的人都知道有多磨人。一张图一张图地框一个类别一个类别地打标签标注完了还得抽检抽检完了还得返工。我之前做过一个图像分类的小项目三千多张图六个人轮流标最后一致性检查的时候发现大概有百分之七左右的样本标签是错的——有的是手滑点错了类别有的是对边界样本的理解不一致还有的是纯粹复制粘贴的时候串行了。后来我就想能不能用模型来帮我做这件事不是让模型去标注而是让模型去挑错。具体来说就是先拿一批已经标好的数据训练一个模型然后用这个模型去预测训练集里的样本看看哪些样本的预测结果和人工标签差异特别大。这些差异大的样本大概率就是标错的或者至少是值得人工再确认一遍的。这个思路其实不新鲜学术界叫置信学习或者噪声标签学习但我这次想做的是一次更接地气的实验从图像分类到目标检测看看这套方法在不同任务上到底好不好使有哪些坑需要怎么调。为什么选这两个任务因为图像分类是离散标签一张图一个类别模型输出的是概率分布挑错逻辑很直接——预测概率最高的类别和人工标签不一致且置信度很高那大概率是标错了。目标检测就复杂多了一张图里有多个框每个框有类别和坐标模型输出的是一堆候选框还要做非极大值抑制还要算IoU挑错的逻辑需要重新设计。这次实验我用的数据集是自己攒的一个小规模数据集图像分类部分大概五千张图分十个类别目标检测部分大概两千张图主要是日常场景里的常见物体。模型方面图像分类用了ResNet50和ViT两个 backbone 做对比目标检测用了YOLOv8。训练环境就是一台带单卡的工作站具体配置后面会说。这篇文章我会把整个实验过程拆开来讲包括数据准备、模型训练、挑错逻辑设计、结果分析、踩过的坑以及如果你也想在自己的项目里用这套方法需要注意什么。适合有一定深度学习基础、做过数据标注、想提升数据质量的读者。小白也能看我会尽量把原理讲清楚但实操部分需要你至少跑过训练脚本。2. 整体思路与方案选型2.1 为什么不用现成的标注工具市面上有不少数据标注和清洗的工具有些也集成了模型辅助标注的功能。但我这次没有用它们原因有几个。第一我想控制整个流程的每一个环节。现成工具的黑盒程度比较高你不知道它内部是怎么筛选可疑样本的阈值怎么设的置信度怎么算的。对于实验来说我需要完全掌控这些细节。第二我的数据集规模不大自己写脚本更灵活。五千张图的分类数据集两千张图的检测数据集用Python脚本跑一遍预测再写几行分析代码前后不到一百行比配置工具快多了。第三我想把分类和检测两个任务的挑错逻辑统一起来看。现成工具通常只针对某一种任务分类是分类检测是检测我想看看能不能抽象出一套通用的思路。当然如果你是在团队里做生产级的数据清洗现成工具可能更合适因为它们有界面、有协作功能、有版本管理。但如果你是想理解这套方法的原理或者想在自己的小项目里快速验证自己写脚本是更好的选择。2.2 核心思路用模型预测和人工标签的差异来定位可疑样本这套方法的核心假设很简单如果一个模型在训练集上对某个样本的预测结果和人工标签高度不一致那么这个样本的标签很可能是错的。为什么这个假设成立因为模型在训练过程中会学习到数据的整体分布规律。如果大部分样本的标签都是对的模型会倾向于拟合这些正确的模式。当它遇到一个标签错误的样本时它会按照自己学到的正确模式去预测结果就和人工标签对不上。但这里有个关键问题模型可能会过拟合。如果模型容量足够大训练时间足够长它完全可以把所有训练样本都记住包括那些标错的样本。这时候模型对错误样本的预测就会和人工标签一致挑错就失效了。所以这套方法要 work必须控制模型的过拟合程度。具体来说有几个策略用交叉验证的方式把数据分成K折每次用K-1折训练在剩下的1折上预测。这样模型没有见过被预测的样本预测结果更能反映样本的真实难度和标签质量。用早停在验证集损失开始上升的时候就停止训练避免模型过度拟合训练集。用较强的正则化比如权重衰减、Dropout、数据增强等。我这次实验主要用了交叉验证的方式因为它的逻辑最干净不需要太多调参。具体来说分类任务用了5折交叉验证检测任务用了3折因为检测训练更慢。2.3 分类和检测的挑错逻辑差异图像分类的挑错逻辑很直接。对于每个样本模型输出一个概率分布取概率最高的类别作为预测类别。如果预测类别和人工标签不一致且预测概率超过某个阈值比如0.9就认为这个样本可疑。但这里有个细节如果模型对某个样本的预测概率很低比如最高概率只有0.4那说明模型本身就不确定这时候预测类别和人工标签不一致不一定说明标签错了可能只是这个样本本身很难。所以阈值不能设太低。目标检测的挑错逻辑就复杂多了。一张图里有多个目标每个目标有类别和边界框。模型输出的是一堆候选框经过非极大值抑制后得到最终的检测结果。要判断某个标注框是否可疑需要做几件事对于每个标注框找到模型预测中与它IoU最大的那个框。如果这个最大IoU低于某个阈值比如0.5说明模型没有检测到这个目标可能是标注框的位置不对或者这个目标本身就不明显。如果IoU够高但类别不一致且类别置信度很高说明可能是类别标错了。如果IoU够高类别也一致但置信度很低说明这个目标可能标得有问题或者模型没学好。这套逻辑比分类复杂因为多了空间维度的匹配。而且检测模型本身就有很多超参数比如NMS的IoU阈值、置信度阈值等这些都会影响挑错结果。2.4 为什么选ResNet50、ViT和YOLOv8ResNet50是图像分类的经典 backbone结构简单训练稳定适合作为 baseline。ViT是近年来比较火的架构基于Transformer对数据的全局信息捕捉能力更强但需要更多的数据才能训好。我选这两个是为了对比不同架构在挑错任务上的表现。YOLOv8是目标检测里比较新的一个版本速度和精度平衡得不错而且Ultralytics的代码封装得很好训练和推理都很方便。我之前用过YOLOv5这次想试试v8有什么改进。另外我还想看看预训练权重对挑错效果的影响。ResNet50和ViT都有ImageNet预训练权重YOLOv8也有COCO预训练权重。用预训练权重初始化模型收敛更快但也可能带来一些偏见——比如预训练数据里某些类别的先验会影响挑错结果。这个后面会具体分析。3. 数据准备与预处理3.1 图像分类数据集的构建与清洗我的分类数据集是从几个公开数据集中抽取并合并的十个类别包括猫、狗、鸟、汽车、飞机、轮船、花、树、建筑、人。每个类别大概五百张图总共五千张左右。构建过程中有几个注意点类别平衡尽量让每个类别的样本数量接近避免模型偏向样本多的类别。如果某个类别样本太少可以通过数据增强或者从其他来源补充。图像尺寸统一原始图像尺寸不一我统一缩放到256x256然后随机裁剪到224x224用于训练。这样既能保证输入尺寸一致又能通过随机裁剪做数据增强。去重用感知哈希pHash做了一遍去重把相似度极高的图片删掉。重复图片会导致模型过拟合也会影响挑错的准确性。人工抽检随机抽了五百张图人工检查标签是否正确。这一步是为了建立一个“ ground truth ”的参考后面用来评估挑错方法的准确率。这里有个经验数据集的构建阶段就要开始记录元数据比如每张图的来源、标注人、标注时间、是否经过审核等。这些信息在后面分析挑错结果时很有用。比如如果发现某个标注人标的样本错误率特别高就可以针对性地返工。3.2 目标检测数据集的标注规范检测数据集我是用LabelImg标的两千张图主要包含人、车、狗、猫、瓶子、椅子这几类。标注规范如下每个目标一个矩形框框要尽量紧贴目标边缘但不要切掉目标的一部分。对于遮挡目标如果遮挡面积超过百分之五十就不标如果小于百分之五十标可见部分。对于模糊目标如果人眼都很难分辨就不标。对于同一类别的多个目标分别标框不要合并。标注完成后我做了两轮检查。第一轮是自查把标注文件可视化出来一张一张看发现了一些漏标和错标。第二轮是交叉检查让另一个人随机抽了三百张图重新标然后和我标的对比计算IoU和类别一致性。结果发现大概有百分之五的框存在位置偏差百分之三的框类别标错了。这些错误在后面用模型挑错的时候有一部分被成功识别出来了也有一部分模型也没发现。这个后面会详细说。3.3 数据增强策略的选择数据增强对挑错任务来说是一把双刃剑。一方面增强可以增加数据的多样性让模型学到更鲁棒的特征减少过拟合。另一方面增强会改变样本的视觉特征可能让模型对某些样本的预测变得不稳定影响挑错的准确性。我这次用的增强策略比较保守分类任务随机水平翻转、随机裁剪、颜色抖动亮度、对比度、饱和度微调。检测任务随机水平翻转、马赛克增强YOLOv8自带、HSV颜色空间微调。没有用太激进的增强比如旋转、缩放、CutMix等因为这些增强会改变目标的形状和位置可能让模型对标注框的预测产生偏差。另外验证集和测试集不做增强只做缩放和归一化。这是基本要求但新手容易忽略。3.4 训练集、验证集、测试集的划分分类任务用了5折交叉验证所以没有固定的验证集。每一折里训练集占百分之八十验证集占百分之二十。测试集是单独留出的五百张图不参与训练和挑错只用来评估最终模型性能。检测任务用了3折交叉验证每折训练集占百分之七十验证集占百分之十五测试集占百分之十五。检测数据少所以每折的验证集和测试集都比较小评估结果的波动会大一些。这里有个经验交叉验证的折数要根据数据量和训练成本来定。数据量小、训练快可以多用几折比如10折数据量大、训练慢少用几折比如3折。折数越多每个模型见过的数据越少挑错结果可能偏保守折数越少模型见过的数据越多挑错结果可能偏激进。4. 模型训练与推理4.1 图像分类模型的训练配置ResNet50的训练配置优化器SGD学习率0.001动量0.9权重衰减1e-4。学习率调度CosineAnnealingLRT_max设为总epoch数。Batch size32。Epoch50配合早停patience10。损失函数CrossEntropyLosslabel smoothing0.1。ViT的训练配置优化器AdamW学习率3e-4权重衰减0.05。学习率调度CosineAnnealingLRwarmup 5个epoch。Batch size16ViT显存占用大batch size调小。Epoch100早停patience15。损失函数CrossEntropyLosslabel smoothing0.1。这里有个细节ViT对学习率和warmup很敏感。我一开始用和ResNet50一样的学习率0.001结果训练loss一直震荡后来降到3e-4才稳定。warmup也很重要前几个epoch用很小的学习率让模型慢慢适应数据分布。另外label smoothing对挑错任务有帮助。它可以让模型输出的概率分布更平滑减少过度自信的情况。如果模型对错误标签过度自信挑错时就容易漏掉。label smoothing0.1是个比较常用的值可以试试0.05到0.2之间的范围。4.2 目标检测模型的训练配置YOLOv8的训练配置优化器SGD学习率0.01动量0.937权重衰减5e-4。学习率调度线性warmup 3个epoch然后余弦退火。Batch size16。Epoch100早停patience20。损失函数YOLOv8自带的分类损失、框回归损失、DFL损失。数据增强Mosaic、HSV、水平翻转关闭旋转和缩放。YOLOv8的默认配置已经调得不错我主要改了batch size和epoch数。因为我的数据集小batch size设16epoch设100配合早停。这里有个坑YOLOv8的Mosaic增强在训练后期可能会影响收敛。Mosaic把四张图拼成一张增加了目标的多样性和上下文但也会让目标变小、位置偏移。如果训练后期还开着Mosaic模型可能学不到精确的框回归。YOLOv8默认在最后10个epoch关闭Mosaic这个策略是合理的。4.3 推理与置信度提取训练完成后用模型对训练集或者交叉验证中的验证集做推理提取每个样本的预测结果。分类任务的推理输出是一个概率向量长度等于类别数。我记录了每个样本的预测类别argmax预测概率max人工标签是否一致概率分布的熵用来衡量模型的不确定性检测任务的推理输出是一堆检测框每个框有坐标、类别、置信度。我记录了每个标注框与预测框的匹配情况最大IoU匹配到的预测框的类别匹配到的预测框的置信度是否匹配上IoU大于阈值类别是否一致这些信息后面用来设计挑错规则。4.4 训练环境与显存优化训练环境是一台工作站配置如下GPU单卡24GB显存。CPU16核。内存64GB。系统Ubuntu 20.04。框架PyTorch 2.0CUDA 11.8。显存优化方面有几个技巧混合精度训练用torch.cuda.amp可以节省大概百分之三十的显存速度也有提升。梯度累积如果batch size受显存限制可以用梯度累积模拟更大的batch size。比如实际batch size8累积4步等效batch size32。及时释放显存每个折训练完后把模型和优化器删掉调用torch.cuda.empty_cache()。数据加载用num_workers4pin_memoryTrue加快数据加载速度。这些技巧在单卡环境下很实用尤其是做交叉验证的时候要反复训练多个模型显存管理不好很容易OOM。5. 挑错逻辑的设计与实现5.1 分类任务的挑错规则分类任务的挑错规则我设计了三条规则一高置信度不一致。预测类别和人工标签不一致且预测概率大于0.9。这条规则最直接挑出来的样本大概率是标签错了。规则二低置信度一致。预测类别和人工标签一致但预测概率小于0.5。这条规则挑出来的是模型不确定的样本可能是标签对但样本本身很难也可能是标签错了但模型碰巧预测对了。规则三高熵样本。预测概率分布的熵大于某个阈值比如1.5说明模型对各个类别的概率比较平均不确定该分到哪一类。这类样本也值得人工检查。这三条规则可以单独用也可以组合用。我实验的时候是分别统计的看看哪条规则挑出来的样本中真正标错的比例最高。这里有个经验阈值不要拍脑袋定要用验证集调。我一开始把高置信度阈值设成0.8结果挑出来太多样本人工检查成本太高。后来在验证集上画了precision-recall曲线发现0.9到0.95之间的阈值比较合适既能挑出大部分错误样本又不会引入太多假阳性。5.2 检测任务的挑错规则检测任务的挑错规则更复杂我设计了四条规则一漏检。标注框没有匹配到任何预测框即最大IoU小于0.3。这说明模型完全没检测到这个目标可能是标注框位置严重偏离或者这个目标本身就不该标。规则二位置偏差。最大IoU在0.3到0.5之间。模型检测到了类似的目标但位置对不上可能是标注框画得太松或太紧或者模型定位不准。规则三类别错误。最大IoU大于0.5但预测类别和标注类别不一致且预测置信度大于0.7。这说明模型认为这个目标属于另一个类别可能是标注时类别选错了。规则四低置信度匹配。最大IoU大于0.5类别一致但预测置信度小于0.3。这说明模型虽然检测到了但很不确定可能是目标模糊、遮挡严重或者标注本身有问题。这四条规则覆盖了检测标注中常见的错误类型。实际用的时候可以根据需求调整阈值。比如如果漏检特别多可以放宽规则一的IoU阈值如果类别错误特别多可以收紧规则三的置信度阈值。5.3 阈值选择与误报率控制阈值选择是挑错任务里最关键的环节。阈值太松挑出来一堆样本人工检查累死阈值太紧漏掉很多错误样本挑错就失去意义了。我的做法是在验证集上人工确认一批样本建立一个小的“金标准”。具体来说从验证集里随机抽五百个样本人工仔细检查每个样本的标签是否正确记录下哪些是错的。然后用不同的阈值跑挑错规则计算挑出来的样本中真正错误的比例precision和所有错误样本中被挑出来的比例recall。分类任务的结果阈值PrecisionRecallF10.80.450.720.550.90.620.580.600.950.780.410.54从表里可以看出阈值0.9的F1最高但precision和recall的平衡取决于你的需求。如果你更怕漏掉错误样本选0.8如果你更怕误报太多选0.95。检测任务的阈值选择更复杂因为有多条规则每条规则有自己的阈值。我的做法是先用默认阈值跑一遍看看每条规则挑出来的样本数量和人工确认的错误率然后针对性调整。5.4 交叉验证在挑错中的具体操作交叉验证在挑错中的操作流程如下把训练集分成K折。对于每一折用其他K-1折训练一个模型。用这个模型对当前折的样本做预测。收集所有折的预测结果每个样本都有一个来自“没见过它”的模型的预测。基于这些预测结果应用挑错规则。这样做的好处是每个样本的预测都来自没有见过它的模型避免了过拟合导致的挑错失效。但交叉验证也有代价训练K个模型时间成本是单次训练的K倍。如果数据量大、模型复杂这个成本可能很高。我的分类任务用了5折检测任务用了3折都是在可接受的时间范围内。另外交叉验证的折数会影响挑错结果的稳定性。折数少每个模型见过的数据多预测可能更准但模型之间的差异大挑错结果波动大。折数多每个模型见过的数据少预测可能不准但模型之间更一致。我实验下来5折是个比较平衡的选择。6. 实验结果与分析6.1 分类任务挑错结果分类任务五千张图人工抽检发现大概三百五十张标签有问题错误率百分之七左右。用交叉验证加挑错规则结果如下规则一高置信度不一致挑出二百一十张其中人工确认错误的一百六十张precision 0.76recall 0.46。规则二低置信度一致挑出四百八十张其中人工确认错误的八十五张precision 0.18recall 0.24。规则三高熵样本挑出三百二十张其中人工确认错误的九十五张precision 0.30recall 0.27。三条规则合并取并集挑出七百五十张其中人工确认错误的二百八十张precision 0.37recall 0.80。这个结果说明规则一的precision最高但recall低只能挑出一半不到的错误样本。规则二和规则三的precision低但能补充一些规则一漏掉的错误样本。合并后recall提升到0.80但precision降到0.37意味着人工检查七百五十张图只能找到二百八十张错的效率不算高。对比ResNet50和ViT的结果模型规则一 Precision规则一 Recall合并 Precision合并 RecallResNet500.760.460.370.80ViT0.810.520.420.83ViT在规则一上的precision和recall都略高于ResNet50合并后的precision也更高。这可能是因为ViT的全局注意力机制让它对图像的上下文理解更好对标签错误的样本更敏感。但ViT的训练成本更高推理速度更慢。如果数据量大用ViT做挑错可能不划算。ResNet50的效果已经不错性价比更高。6.2 检测任务挑错结果检测任务两千张图人工抽检发现大概一百二十个标注框有问题错误率百分之六左右。用3折交叉验证加挑错规则结果如下规则一漏检挑出八十五个框其中人工确认错误的三十二个precision 0.38recall 0.27。规则二位置偏差挑出一百二十个框其中人工确认错误的二十八个precision 0.23recall 0.23。规则三类别错误挑出四十五个框其中人工确认错误的三十个precision 0.67recall 0.25。规则四低置信度匹配挑出一百六十个框其中人工确认错误的十八个precision 0.11recall 0.15。四条规则合并挑出三百五十个框其中人工确认错误的九十个precision 0.26recall 0.75。检测任务的挑错效果比分类任务差一些。原因有几个检测任务本身更难模型的不确定性更大。检测标注的错误类型更多样有位置错误、类别错误、漏标、多标等单一规则很难覆盖所有类型。检测数据量小模型训练不充分预测结果波动大。规则三类别错误的precision最高达到0.67说明模型对类别判断比较可靠。规则四低置信度匹配的precision最低只有0.11说明低置信度不一定意味着标签错误可能只是目标本身难检测。6.3 不同模型和参数的影响除了ResNet50和ViT的对比我还试了YOLOv8的不同规模YOLOv8nnano、YOLOv8ssmall、YOLOv8mmedium。结果如下模型规则三 Precision合并 Precision合并 RecallYOLOv8n0.520.210.68YOLOv8s0.610.240.72YOLOv8m0.670.260.75模型越大挑错效果越好但提升幅度递减。YOLOv8s到YOLOv8m的提升已经不太明显但训练时间增加了不少。如果追求性价比YOLOv8s是个不错的选择。另外预训练权重对挑错效果有影响。我用COCO预训练的YOLOv8和从头训练的YOLOv8做了对比预训练版本的挑错precision高了大概百分之十。这是因为预训练模型的特征提取能力更强对目标的定位和分类更准挑错时更可靠。但预训练也可能带来偏见。比如COCO数据集里某些类别的样本特别多预训练模型对这些类别的先验更强可能会把一些标注正确的稀有类别样本误判为错误。这个需要在实际应用中注意。6.4 挑错方法的局限性这套方法不是万能的有几个明显的局限性第一模型本身的错误会传导到挑错结果。如果模型对某个类别的识别能力很差它会把很多正确标注的样本误判为错误产生大量假阳性。所以挑错之前要先确保模型在验证集上的性能达标。第二系统性标注错误难以发现。如果某个标注人对某个类别的理解一直有偏差导致一批样本都标错了模型可能会学到这个偏差反而不认为这些样本有问题。这时候需要人工审查标注规范或者用多个模型做交叉验证。第三挑错结果需要人工确认。模型挑出来的可疑样本最终还是要人工看一眼。这套方法的价值在于缩小人工检查的范围而不是完全替代人工。第四对长尾类别效果差。如果某个类别的样本很少模型很难学好挑错时要么漏掉要么误报。对于长尾类别可能需要单独处理比如用少样本学习的方法。7. 常见问题与排查技巧7.1 模型不收敛或收敛慢怎么办训练不收敛是常见问题排查思路如下检查学习率。学习率太大loss震荡学习率太小loss下降慢。可以先用一个很小的学习率跑几个epoch看看loss是否下降然后逐步增大。检查数据预处理。归一化参数是否正确图像尺寸是否一致标签是否从0开始编号。检查损失函数。分类任务用CrossEntropyLoss检测任务用YOLOv8自带的损失。如果自定义损失检查实现是否正确。检查batch size。batch size太小梯度噪声大收敛不稳定batch size太大可能陷入局部最优。用预训练权重。从头训练收敛慢用ImageNet或COCO预训练权重可以加速收敛。我踩过的一个坑是ViT的warmup没设好前几个epoch学习率太大模型直接训崩了。后来加了5个epoch的warmup学习率从1e-6线性增加到3e-4才稳定下来。7.2 挑错结果假阳性太多怎么调假阳性太多说明阈值太松或者模型本身性能不够。调整策略收紧阈值。提高置信度阈值或者降低IoU阈值减少挑出来的样本数量。增加规则。比如要求同时满足多个条件才判定为可疑减少误报。提升模型性能。用更大的模型、更多的数据、更长的训练时间让模型的预测更可靠。人工确认一批样本。从假阳性中随机抽一批看看它们有什么共同特征针对性调整规则。我的经验是假阳性和假阴性永远是一对矛盾不可能同时降到零。关键是根据你的需求找平衡点。如果人工检查成本低可以放宽阈值多挑一些如果人工检查成本高就收紧阈值只挑最可疑的。7.3 检测任务中IoU阈值怎么定IoU阈值决定了什么算“匹配上”。阈值太高很多正确的检测框会被判为漏检阈值太低一些位置偏差大的框也会被判为匹配。常用的IoU阈值是0.5这是目标检测评估的标准。但在挑错任务中0.5可能太严了。因为标注框本身可能有偏差模型预测的框也有偏差两个有偏差的框之间的IoU可能不到0.5。我的做法是先用0.5跑一遍看看漏检率。如果漏检率很高比如超过百分之三十说明阈值太严降到0.3或0.4试试。如果漏检率很低但位置偏差的样本很多说明阈值太松升到0.6或0.7。另外不同类别的IoU阈值可以不同。大目标的框通常比较准IoU阈值可以高一些小目标的框偏差大IoU阈值可以低一些。7.4 交叉验证折数怎么选折数选择要考虑数据量和训练成本数据量小几千张训练快几分钟到几十分钟可以用5折或10折。数据量大几万张以上训练慢几小时到几天用3折或5折。如果数据量极小几百张可以用留一法但训练成本极高。我这次分类任务用5折检测任务用3折都是在可接受的时间范围内。如果时间充裕可以多用几折挑错结果更稳定。7.5 挑错后怎么处理可疑样本挑出可疑样本后有几种处理方式人工确认。最可靠但成本高。适合可疑样本数量不多的情况。重新标注。对于确认标错的样本重新标注。如果错误率高可能需要返工整个数据集。删除样本。对于无法确认或争议大的样本直接删除避免影响模型训练。降低权重。对于可疑但不确定的样本在训练时降低其损失权重减少对模型的影响。我的做法是先人工确认一批统计错误率。如果错误率超过百分之五十说明挑错规则有效继续人工确认剩下的如果错误率低于百分之二十说明挑错规则太松需要调整阈值。8. 实操心得与避坑指南8.1 数据质量比模型更重要这次实验最大的体会是数据质量决定了模型性能的上限。我一开始用了一个标注质量一般的数据集训练模型在验证集上的准确率只有百分之七十多。后来花了两天时间清洗数据把标错的样本修正准确率直接提升到百分之八十五以上。挑错方法的价值就在这里它帮你找到数据中的问题让你把时间花在真正需要修正的样本上而不是盲目地增加数据量或换模型。8.2 不要过度依赖模型挑错模型挑错是辅助工具不是万能药。它挑出来的样本最终还是要人工确认。而且模型本身有偏见可能会漏掉一些系统性错误。我的建议是把模型挑错和人工抽检结合起来。模型挑错负责缩小范围人工抽检负责兜底。两者互补才能保证数据质量。8.3 记录实验过程方便复现这次实验我详细记录了每个步骤数据集的版本、模型的配置、训练的超参数、挑错的阈值、人工确认的结果。这些记录在后面分析结果、调整方案时非常有用。尤其是挑错任务涉及很多阈值和规则如果不记录过几天就忘了当时为什么设这个值。建议用表格或配置文件的方式记录方便对比不同设置的效果。8.4 小数据集上的经验我的数据集不大分类五千张检测两千张。在小数据集上做挑错有几个特殊之处交叉验证是必须的。小数据集上模型容易过拟合不用交叉验证的话挑错结果不可靠。模型不要选太大。小数据集上大模型容易过拟合反而挑错效果差。ResNet50和YOLOv8s这种中等规模的模型比较合适。数据增强要保守。激进的增强会让模型对样本的预测不稳定影响挑错准确性。阈值要调低。小数据集上模型的不确定性大阈值设太高会漏掉很多错误样本。8.5 从分类到检测的迁移经验分类和检测的挑错逻辑有相通之处但检测更复杂。如果你先做了分类的挑错想迁移到检测需要注意检测的挑错规则更多需要针对不同错误类型设计不同规则。检测的阈值更多IoU阈值、置信度阈值、类别阈值等调参空间更大。检测的标注成本更高挑错的价值也更大。一个漏标的框可能导致模型学不到这个目标影响整个类别的检测性能。检测的挑错结果更难可视化需要把标注框和预测框画在一起人工对比。8.6 工具与代码组织建议最后分享一些工具和代码组织上的经验用配置文件管理超参数。不要硬编码在脚本里用YAML或JSON文件方便修改和对比。用TensorBoard或WandB记录训练过程。loss曲线、准确率曲线、学习率曲线这些对调试很有帮助。把挑错逻辑封装成函数。输入是模型预测和人工标签输出是可疑样本列表。这样可以在不同数据集上复用。可视化工具。分类任务可以用混淆矩阵、t-SNE降维检测任务可以把框画在图上用不同颜色区分正确和可疑。版本控制。数据集、代码、模型权重都要版本控制。我用DVC管理数据集Git管理代码模型权重存在对象存储里。这套方法我后来用在了几个实际项目里效果都还不错。当然每个项目的数据特点不同阈值和规则需要重新调。但整体思路是通用的用模型找差异用人工做确认迭代优化数据质量。如果你也在做数据标注相关的项目不妨试试这套方法。一开始可能觉得麻烦但一旦跑通后面省下的返工时间会让你觉得值得。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑