资讯动态

垃圾分类数据集训练避坑指南:从数据清洗到模型上线

发布时间:2026/10/20 15:08:14 来源:尧图企业网站定制
简介面向垃圾分类入门实践与环境光电识别等场景这套资料提供6类常见生活垃圾图像数据集覆盖硬纸板、纸张、塑料瓶、玻璃瓶、铜制品及不可回收物适合学习图像分类、训练卷积神经网络模型的开发者或高校学生使用。配套代码包含训练脚本、预测脚本、图像预处理工具与结果可视化脚本并附带已训练好的h5权重文件环境依赖明确为TensorFlow、NumPy、Keras及OpenCV便于快速上手完成模型推理和效果验证。资源共7个文件以Python脚本、h5权重和数据集压缩包为主整体大小约161MB结构紧凑下载后即可按脚本说明开展预测实践。目前已有30656人浏览学习适用于具备一定Python基础并希望完整体验数据加载、模型预测与结果展示流程的入门级玩家。整体来看省去了自行收集标注数据和训练调参的繁琐环节可作为图像分类项目的基础模板也为后续扩展更多垃圾类别或优化模型结构提供了可修改的起点。1. 垃圾分类数据集与代码公开数据到可用模型之间隔着哪些坑网上搜“垃圾分类数据集及代码”能找到的资料大多停在百科词条式的概括上垃圾分类分成可回收、有害、厨余、其他数据集有几千张图片代码能跑训练。但真把这套东西落到实拍识别第一次基本都会翻车——验证集准确率很高对着真实垃圾桶一拍置信度掉得没法看。问题大多不出在模型而是出在数据本身类别体系没对齐、验证集泄漏、坏图混入、背景偏差。这篇文章按实际做这类项目的顺序来讲先拆数据集再把数据组织成训练流水线然后调参数训练基线模型最后说清上线前必须避开的几个高频坑。适合刚拿到数据集想快速跑通基线的开发者也适合已经跑完一轮训练但仍被准确率困惑的人。2. 拆开垃圾分类数据集类别体系、目录结构与完整性校验拿到任何一份垃圾分类数据集第一件事不是急着写训练代码而是先把“这份数据到底长什么样”摸清楚。这一步做不好后续所有训练结果都会失真。我一般会花半天时间做一次完整盘点内容包括三部分类别体系怎么定义的、目录和标注文件怎么组织的、有没有损坏或标注异常的文件。2.1 常见数据集的类别体系四分类还是细分类公开的垃圾分类数据集主要有两类组织方式。第一类是通用四分类也就是可回收、有害、厨余、其他标签少训练快类间差异大适合验证流程第二类是细分类把物品拆成塑料瓶、玻璃瓶、易拉罐、纸箱、电池、灯管等几十个具体类别更贴近投放点或回收线的真实需求但训练难度高样本不均衡也严重得多。类别体系优点常见陷阱四分类标签少、训练快、基线容易跑通类别内部差异极大“可回收”里瓶子、纸箱、金属形态完全不一样细分类贴近实际投放与回收场景按物品种类投放更精准类间视觉差异小透明玻璃瓶和透明塑料瓶容易混部分类别样本极少我的建议是第一次跑通闭环时先用四分类或者从细分类里挑几个差异大的类做小实验不要一上来就吞下全部几十类。细分类数据集里经常出现某类只有一两百张、另一类有五六千张的情况这种数量差会让模型直接忽略小类后面再调类别权重也更麻烦。2.2 目录结构与标注格式文件名、类别与 CSV 的配对关系数据集的目录结构决定了后面写 DataLoader 的方式。常见有两种一种是train/可回收/001.jpg这种按类别分目录的结构可以直接用现成的 ImageFolder 读取另一种是images/001.jpg加一个labels.csvCSV 里写文件名和类别这种结构更通用但需要自己维护文件名到标签的映射。先写一个快速摸底脚本统计每个类别的图片数量。这里要注意过滤隐藏文件macOS 下很容易混入.DS_Store。import os from collections import Counter root data/train class_counts Counter() for cls in os.listdir(root): cls_dir os.path.join(root, cls) if not os.path.isdir(cls_dir): continue n len([f for f in os.listdir(cls_dir) if f.lower().endswith((.jpg, .jpeg, .png, .bmp))]) class_counts[cls] n for cls, n in class_counts.most_common(): print(cls, n)这段代码只统计 train 目录因为 val 和 test 的类别分布通常是按 train 切出来的。most_common()按数量倒序排列一眼就能看出哪些类特别少。如果发现某个类别的目录为空或者某个类只有个位数图片下一步必须决定是删掉这个类还是合并到上级类别而不是硬着头皮留给模型学。如果数据集是 CSV 标注还需要检查 label 列的取值是否干净。很多数据集是从网上抓的CSV 里可能出现前后空格、中文全角空格、大小写不一致比如“可回收 ”和“可回收”会被当成两个类。import pandas as pd df pd.read_csv(labels.csv) df[label] df[label].astype(str).str.strip() print(df[label].value_counts()) print(唯一标签数:, df[label].nunique())str.strip()把标签首尾空格去掉避免同一个类别因为隐形字符被拆成两个。检查唯一标签数时如果发现和预期类别数对不上多半是脏字符问题先用这个脚本清洗再继续。编码问题也常见中文 CSV 有时是 GBK 编码读出来乱码时给pd.read_csv加encodinggbk或encodinggb18030试一下。2.3 下载后的第一件事文件计数、图像解码校验与类别分布检查数据集压缩包下载完解压后第一件事永远是对所有图像做一次解码校验。很多公开数据集里混着损坏的图片原因包括上传时截断、抓取时没下载完、格式伪装等。这类坏图平时不影响文件列表统计但会在训练跑到一半时让整个进程崩掉。from PIL import Image import os bad [] for root, _, files in os.walk(data): for f in files: if not f.lower().endswith((.jpg, .jpeg, .png, .bmp)): continue p os.path.join(root, f) try: img Image.open(p) img.verify() # 只校验文件头与完整性不加载全图 except Exception: bad.append(p) print(坏图数量:, len(bad)) for p in bad[:20]: print(p)img.verify()是轻量校验读文件头确认它是不是有效图像速度快适合全量扫描。它不保证图像能完整解码成像素如果需要更严格的检查把img.verify()换成img Image.open(p); img.load()这会真正解码全部像素但耗时可能会膨胀好几倍。发现坏图后不要直接删先看坏图集中在哪个类别——如果某个类集中损坏了十几张而这个类本身只有两三百张影响比预想的大。做完这一步手里就有了三类信息类别清单及数量、目录/标注格式、坏图清单。接下来才能安全地做清洗和切分否则后面每一步都在一个不可靠的数据地基上盖楼。3. 把数据集组织成训练流水线清洗、分组切分与 DataLoader数据集本身能跑和数据集能被可靠地用来训练是两回事。我最常看到的做法是解压完直接ImageFolder开训结果验证集指标一路飘高到了真实环境全面崩盘。这一章把清洗、切分、装载三个环节拆开讲每一环节都决定最终模型的可信度。3.1 数据清洗坏图、重复图与标签不一致怎么处理第一步是把上一章扫出来的坏图统一移到一个cleaned_discard/目录而不是直接删除。保留一份原始规避清单后面如果模型表现异常还能回溯是不是清洗过度造成的。移动比删除安全这是工程习惯不是技术必需。第二步是去重。公开数据集经常从同一图源池里抓图同一个物品可能以几乎相同的图出现多次。严格去重可以用文件的 MD5 值作为指纹视觉去重可以用感知哈希但后者实现复杂度高容易把不同亮度下的同一物品误判为重复实际效果不稳定。我一般先做 MD5 去重再做小样本人工抽查。import hashlib from collections import defaultdict import os def file_md5(path, chunk_size1024 * 1024): h hashlib.md5() with open(path, rb) as f: for chunk in iter(lambda: f.read(chunk_size), b): h.update(chunk) return h.hexdigest() md5_to_files defaultdict(list) for root, _, files in os.walk(data/train): for f in files: p os.path.join(root, f) md5_to_files[file_md5(p)].append(p) dups {k: v for k, v in md5_to_files.items() if len(v) 1} print(重复文件组数:, len(dups))参数上注意chunk_size1MB逐块读文件避免大图一次性载入内存。md5_to_files按哈希值分组只要哈希相同就说明文件字节级一致。这类精确重复图在抓取型数据集中相当常见保留一组里的任意一张即可。这样处理只能去掉“同一张图”对“同一物品不同角度拍摄”的近重复图无效那部分靠后面的分组切分控制。标签不一致是更隐蔽的问题。有些数据集目录名是一套、CSV 里的 label 是另一套甚至 CSV 的行顺序和图片文件名顺序对不上。遇到冲突时不要凭文件名猜类别拿图像看内容按实际内容为准。没有文档说明时以“图像本身长什么样”作为最终依据。3.2 训练/验证/测试切分三个常见的泄漏方向随机切分是最省事的切分方式也是验证集指标虚高的头号元凶。垃圾图片大多按来源批次采集同一个来源的连拍图、同一网页图集里的相似图被随机切分后训练集和验证集里都会出现几乎一模一样的图。模型记住的是这些近重复图的表层特征验证集当然分数高。常见做法是按“来源批次”分组再切分。很多数据集的文件名自带前缀比如batch01_0001.jpg、batch02_0333.jpg前缀就是批次号。以前缀为分组单位把同一批次整体划入训练集或验证集能有效避免近重复图跨集。import os import random from collections import defaultdict random.seed(42) src_dir data/train_images files [f for f in os.listdir(src_dir) if f.lower().endswith((.jpg, .jpeg, .png))] def group_key(filename: str) - str: return filename.split(_)[0] # 把文件名前缀当作批次/来源 group_to_files defaultdict(list) for f in files: group_to_files[group_key(f)].append(os.path.join(src_dir, f)) groups list(group_to_files) random.shuffle(groups) val_count max(1, int(len(groups) * 0.2)) val_groups set(groups[:val_count]) val_files, train_files [], [] for g, fs in group_to_files.items(): if g in val_groups: val_files.extend(fs) else: train_files.extend(fs) print(train:, len(train_files), val:, len(val_files))关键在于group_key返回文件名下划线前的部分把同一次拍摄批次归到同一组。如果文件名没有批次前缀可以用上一级目录名代替或者用 EXIF 拍摄时间按天聚合。随机切分适合“每张图独立采集”的数据集而垃圾分类数据集大多不是这种来源所以分组切分更可靠。切分比例上数据量几千张时我习惯训练、验证、测试按 8:1:1 或 7:2:1。测试集一旦划出去就不再参与任何调参决策只留到最后评估。特别提醒不要为了骗高指标把验证集里模型预测错的图加回训练集那等于把测试泄漏到训练过程上线必崩。3.3 构造 DataLoader类别映射、transforms 与数据增强切分完成之后目录结构基本就是train/类别名/图片和val/类别名/图片PyTorch 的ImageFolder能直接读。但如果用的是 CSV 标注或者想对类别映射有完全控制自定义 Dataset 更实用。import os import torch from torch.utils.data import Dataset from PIL import Image class GarbageDataset(Dataset): def __init__(self, df, image_dir, label_map, transformNone): self.df df.reset_index(dropTrue) self.image_dir image_dir self.label_map label_map self.transform transform def __len__(self): return len(self.df) def __getitem__(self, idx): row self.df.iloc[idx] img Image.open(os.path.join(self.image_dir, row[filename])).convert(RGB) label self.label_map[row[label]] if self.transform: img self.transform(img) return img, torch.tensor(label, dtypetorch.long)label_map负责把“类别名字符串”映射成“数字 ID”它必须在训练、验证、推理时用同一个实例或同一份配置不能从 CSV 里动态推导否则一旦数据排序变化类别 ID 就全错位了。convert(RGB)把所有图片统一成三通道避免灰度图和 PNG 透明通道干扰训练。数据增强配置直接决定垃圾分类模型的泛化能力参数不能随意拍脑袋。from torchvision import transforms train_transform transforms.Compose([ transforms.RandomResizedCrop(224, scale(0.7, 1.0)), transforms.RandomHorizontalFlip(), transforms.ColorJitter(brightness0.3, contrast0.3), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), ]) val_transform transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), ])训练用RandomResizedCrop随机裁切并缩放模拟不同距离和角度的拍摄验证集不做随机增强只做中心裁剪保证指标稳定可复现。这里特别要注意ColorJitter不要太强塑料瓶的颜色、纸箱的黄色都是垃圾分类里的判别特征把颜色抖动调过头模型会丢掉这些关键线索。Normalize 用的均值和标准差是通用预训练权重的标准化参数如果自己从零训练这套值不适用需要按数据集统计。4. 训练垃圾分类基线模型主干选型、训练脚本与核心参数数据流水线就绪后训练本身反而不是最花时间的部分。一个能用的垃圾分类基线模型通常从 ResNet 类主干起步把最后一层替换成自己的分类头再配合合理的优化器参数跑几十个 epoch。这一章不追 state-of-the-art只给稳定可复现的基线方案。4.1 主干网络与预训练权重ResNet 打底MobileNet 上线垃圾图片分类是典型的图像分类任务主干网络选型主要看两个约束训练稳定性和部署环境。ResNet-50 是稳妥的基线选择优化简单训练不容易发散适合在服务器上先跑通指标如果后面要部署到靠近垃圾桶的边缘设备或摄像头侧再换 MobileNet 系列或 EfficientNet 系列这类轻量网络在推理速度和精度之间更平衡。import torch import torch.nn as nn from torchvision import models def build_model(arch: str resnet50, num_classes: int 4, pretrained: bool True): model getattr(models, arch)(weightsNone) if pretrained: state torch.load(pretrained_weights.pth, map_locationcpu) model.load_state_dict(state, strictFalse) in_features model.fc.in_features model.fc nn.Linear(in_features, num_classes) return model代码里有几个需要留神的地方。第一model.fc是 ResNet 系列的分类头名字换成 MobileNet 后分类头字段变成classifier需要对应修改否则AttributeError跑不掉的。第二strictFalse表示只加载结构上能对齐的参数原分类头的权重因输出维度不匹配会被自动跳过这是正常现象不用慌。第三pretrained_weights.pth是从通用图像数据上预训练过的权重具体获取方式随框架版本变化按所用框架的官方接口下载即可注意权重文件必须和主干结构一致不能拿一个 for ResNet 的文件往 MobileNet 里塞。预训练权重的价值在垃圾分类这种中等规模数据上非常明显。公开数据集通常单类只有几百到几千张完全从零训练很难收敛到高精度加载通用预训练再微调通常几十个 epoch 就能达到可用的效果。细分类场景下有些人会先用四分类训练再微调细分类我实际测试下来只要数据量不是特别少直接用通用预训练权重学细分类就够了分阶段训练增加的复杂度远大于收益。4.2 训练脚本的核心参数学习率、批大小、输入尺寸与训练轮数训练脚本是整个项目里最常被复制粘贴的部分但粘完必须理解每个参数的改动方向。以下是一个完整的基线训练循环。import torch from torch import nn from torch.utils.data import DataLoader device torch.device(cuda if torch.cuda.is_available() else cpu) model build_model(num_classeslen(label_map)).to(device) criterion nn.CrossEntropyLoss() optimizer torch.optim.AdamW(model.parameters(), lr3e-4, weight_decay1e-4) scheduler torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max25) for epoch in range(25): model.train() total_loss, correct, total 0.0, 0, 0 for images, labels in train_loader: images, labels images.to(device), labels.to(device) optimizer.zero_grad() logits model(images) loss criterion(logits, labels) loss.backward() optimizer.step() total_loss loss.item() * images.size(0) _, pred logits.max(dim1) correct (pred labels).sum().item() total labels.size(0) scheduler.step() print(fepoch{epoch} loss{total_loss / total:.4f} acc{correct / total:.4f})images.size(0)是当前 batch 的样本数用它把每个 batch 的 loss 加权求和最后除以总样本数这样不同 batch size 下打印的 loss 才有可比性。logits.max(dim1)取每个样本预测概率最大的类别下标和labels对比累计正确数。参数推荐值整理成表实际调节时按这个顺序验证参数推荐值说明输入尺寸224×224通用基线值玻璃碎渣等小物体场景可提至 320batch size32显存不够降到 16不要为了调大 batch 而缩小输入尺寸优化器AdamW适配 Transformer 和 CNN 都稳定weight_decay 默认 1e-4学习率3e-4AdamW 下 1e-4 到 3e-4 是常见区间太大容易发散训练轮数25配 cosine 衰减和早停观察验证 loss 不再下降就停学习率调度CosineAnnealingLRT_max 必须和总 epoch 数一致否则衰减曲线对不上这是多年跑 CNN 图像分类的血泪经验先把输入尺寸、主干、batch size 固定住只调学习率和数据增强。如果模型在验证集上明显过拟合训练 acc 比验证 acc 高出一大截优先加增强强度或加 weight_decay而不是换主干。如果验证 loss 不降才考虑学习率是不是太大或太小用1e-4、3e-4、1e-3三个档位快速试探一发即可。4.3 类别不均衡的处理类别权重与标签平滑垃圾分类数据集的类别分布天然不均衡厨余垃圾里剩菜、果皮样本多有害垃圾里电池、灯泡样本少。不做处理时模型会把所有模棱两可的图都猜成大类验证准确率看着不低但小类的召回率几乎为零。解决手段是给损失函数加类别权重。import torch from collections import Counter class_counts Counter(...) # 从清洗后的数据统计各类别数量 counts torch.tensor([class_counts[c] for c in sorted_classes], dtypetorch.float) weight counts.sum() / (counts * len(counts)) # 样本数倒数归一化 weight weight / weight.sum() * len(counts) # 缩放使均值等于 1 criterion nn.CrossEntropyLoss(weightweight.to(device))weight的计算逻辑是样本数少的类别获得更大的权重公式里第一行让权重与样本数成反比第二行把权重均值归一化到 1这样总损失量级和未加权时接近学习率不用另外调整。权重设置上我一般先尝试“样本数倒数的平方根”版本即把第一行改成1 / counts.sqrt()效果往往比完全反比更稳因为反比权重过大会让小类反复过拟合同一批少样本。nn.CrossEntropyLoss还提供一个label_smoothing参数设置为 0.1 可以让模型不要过分自信地押注某一个类别对公开数据集里常见的标注噪声有一定抵抗作用但幅度有限不要指望它能修复标签错位。验证阶段不要只盯准确率要打印每类的召回率和宏平均 F1。from sklearn.metrics import classification_report all_labels, all_preds [], [] model.eval() with torch.no_grad(): for images, labels in val_loader: images images.to(device) logits model(images) preds logits.argmax(dim1).cpu() all_labels.extend(labels.tolist()) all_preds.extend(preds.tolist()) print(classification_report(all_labels, all_preds, target_nameslabel_map.keys()))classification_report会输出每个类别的 precision、recall、F1 和样本数。看报告时重点盯小类别的 recall电池这一类 recall 如果只有 0.1说明类别权重还没生效或者小类样本本来就少到学不出来。这时候的下一步不是盲目加训练轮数而是回到数据层面看小类样本是否需要补充或做过采样。5. 垃圾分类训练避坑指南4 个高频翻车点与排查方法这一章写的是我自己在垃圾分类项目里真实踩过的坑每条都按“现象 → 原因 → 解决”展开。这 4 个问题在公开数据集上出现的概率极高提前知道能省下至少一整周的排查时间。5.1 验证集接近满分、一到实拍就崩数据泄漏与背景偏差现象训练 25 轮后验证集准确率 97%拿手机对着垃圾桶拍几张实拍图预测置信度只有 40% 上下而且总把带标签的塑料瓶判成纸张。原因这是典型的验证集泄漏加背景偏差。公开数据集里的图按来源批次组织同一批次的连拍图被随机切分后验证集里混入了和训练集几乎一样的图模型学到的是这批图共有的背景和噪声模式而不是物体本身。另一个叠加因素是很多数据集用纯色或干净桌面做背景实拍环境是厨房灯光下的塑料袋、混杂垃圾域差距巨大。解决先从切分下手把随机切分改成按来源分组切分具体脚本在第三章已经给出。然后检查验证集里是否存在与训练集视觉高度相似的图可以对验证集每张图计算和训练集的余弦相似度取最大值做排序抽出相似度最高的几十张人工看一眼。如果清理完数据泄漏后验证准确率显著下降那是正常现象说明之前的指标是虚的。5.2 loss 正常下降但准确率纹丝不动标签错位与映射混乱现象loss 一路从 1.2 降到 0.3训练集准确率也能到 90% 以上但验证集准确率卡在 50% 附近而且无论怎么调学习率都不动。原因最常见的是类别映射错位。数据集 CSV 里的 label 顺序和我们构造的label_map对不上或者目录遍历顺序和标签文件顺序不一致。模型在训练时把“可回收”当成了“有害”来学loss 当然能降因为模型真的记住了错误的映射只是验证时对不上账。解决不要盯着指标调参先打印出一个 batch 的图像和标签人工核对 10 张图。更快的办法是取出验证集里 50 张图用训练好的模型做预测然后把预测结果、真实标签、图像文件名并列输出一眼就能发现是不是系统性错位。这类问题极少能用调参解决排查路径很明确先核对label_map定义再核对 DataLoader 输出最后核对 CSV 行序。5.3 训练到一半被坏图中断批量图像解码报错现象训练跑到第 3 个 epochPIL 直接抛OSError: image file is truncated整个训练进程中断前面的 epoch 白跑。原因数据文件本身就是损坏的压缩包下载时没有完整校验而img.verify()只检查文件头不保证像素数据完整。有些开发者为了图省事会设置ImageFile.LOAD_TRUNCATED_IMAGES True来跳过报错但这会让模型隐式学到几张半截图像的噪声特征生产环境坚决不要用。解决在数据清洗阶段做一次全量解码校验把img.verify()换成Image.open(p)后调img.load()强制逐像素解码。发现坏图后按第三章的做法移出数据集再重新切分。不要直接在训练循环里加异常捕获去跳过坏 batch这样会让同一批坏图的行为在多次训练中不可复现。5.4 同一份代码换台机器结果对不上随机性问题现象昨晚同一份代码和同一份数据跑出 90% 准确率今天换一台机器重跑只有 88%代码和数据都没变。原因训练流程里的随机源太多了。DataLoader 的 shuffle 顺序、数据增强的随机裁剪、CUDA 上卷积算法的不确定性任何一个变化都会导致结果波动。单次训练的指标差异在 12 个百分点内都算正常但如果波动更大说明训练流程没有固定随机种子。解决在训练入口固定所有随机源。import random import numpy as np import torch def set_seed(seed: int 42): random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed_all(seed) torch.backends.cudnn.deterministic True torch.backends.cudnn.benchmark False set_seed(42)torch.backends.cudnn.deterministic True让 cuDNN 使用确定性卷积算法benchmark False避免它根据输入尺寸自动选算法这两个设置会牺牲少量训练速度换来的结果可复现性足够支撑日常调参。注意 DataLoader 的worker_init_fn也要基于固定种子初始化否则多进程数据读取仍会引入随机性。6. 从验证集到真实场景推理预处理、置信度兜底与数据回流模型在验证集上稳定后离“能用”还差最后一段路。推理阶段的预处理不一致、置信度阈值缺失、数据不回流这三点是上线后翻车的重灾区。6.1 推理脚本里的预处理一致性推理掉点这个问题经常被归成玄学其实大部分是预处理不一致导致的。训练时用 RandomResizedCrop验证时用 Resize CenterCrop如果推理脚本里用了另一种缩放插值最终特征分布就和训练时对不上。摄像机拍到的画面先经过裁切再缩放和验证时输入模型的图像分布也可能不同。现在的习惯是固定一个统一的 preprocess 函数训练和验证共用同一份 transforms 定义推理只去掉随机增强保留确定性部分。def preprocess(image): image image.convert(RGB) image transforms.Resize(256)(image) image transforms.CenterCrop(224)(image) image transforms.ToTensor()(image) image transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])(image) return image.unsqueeze(0)6.2 置信度阈值、拒识与规则兜底垃圾分类不能硬分类。模型输出 4 个类别的概率最高那个不到 0.6 时实际画面里往往混着多个物品或者光线过暗、物体被遮挡。正确的做法是低于阈值时输出“无法识别”让设备语音提示用户单独投放而不是强行归到某一类。有害垃圾尤其要严格电池、灯管这类物品宁可拒识转人工核验也不要误投进可回收桶造成后续处理事故。6.3 数据回流把误判样本收回来持续迭代任何公开数据集训练的模型上线后都会遇到没见过的物品形态。我现在的做法是线上设备和 App 端把低置信度样本和用户反馈的误判截图每周汇总一次人工标注后回流到训练集每周用增量数据重训一轮。这个循环跑起来后模型的实拍准确率才会稳定爬升公开数据集那几千张图只是起点不是终点。垃圾分类识别从来不是一个“下载数据集、跑通训练脚本、上线收工”的流程而是一个以数据为中心持续迭代的系统。模型和代码只是载体真正决定上限的是对数据的理解深度。希望帮到你。本文还有配套的精品资源点击获取

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

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

免费获取报价 →
↑