简介:图像分类是计算机视觉领域的基础任务,其核心原理在于让模型从大量标注样本中学习区分不同类别的关键特征。在真实工业场景中,这项技术的价值不仅体现在自动识别物体,更在于能够支撑品牌管理、电商检索、市场分析等具体业务。以服装品牌识别为例,模型需要从商品图或街拍图中准确检测并分类Logo,这属于典型的细粒度图像分类问题,对数据的质量与划分方式极为敏感。一个覆盖296类主流服装品牌Logo的图像分类数据集,为训练和评估此类模型提供了良好基础,其完整的类别体系与划分结构能有效降低数据准备成本。围绕该数据集,实践者需要关注数据清洗、类别长尾分布、分层抽样划分以及针对细粒度任务的模型调优等关键环节。结合迁移学习与合理的训练策略,该数据集可支撑从电商品牌字段自动填充到社交媒体品牌露出统计等多种应用,为真实场景中的品牌识别系统搭建提供可复用的工程路径。 做服装品牌图像识别这类实际项目,最耗精力的往往不是模型结构,而是数据本身。我前阵子处理一个品牌识别需求,目标是识别服装图片中的品牌logo,就用到了一个大型296种服装品牌logo图像分类数据集。这个数据集不仅类别覆盖广,而且已经完成了训练集、验证集、测试集划分,省掉了最脏最累的整理环节。但说实话,拿到手之后我并没有直接开训,而是先花了三天时间重新理解划分逻辑、清洗质量和数据分布,因为在图像分类任务里,数据划分是否合理,直接决定你后面所有指标能不能信。这篇就把整个流程写出来,给正在做logo分类、品牌识别或者想自己构造图像分类数据集的朋友做个参考。
1. 296类服装品牌logo分类:这个数据集到底能干什么
1.1 我为什么要做这样一个logo分类数据集
先说需求背景。服装电商平台在后台上架商品时,品牌字段经常是空着的,要么卖家不填,要么填得五花八门,比如“Nike”和“耐克”被当成两个品牌。如果纯靠人工补全,面对每天几千条上新根本忙不过来。另一个场景是二手服装交易,买家上传一张实物图,平台需要用品牌信息做价格评估和正品初筛,logo识别就是第一道关口。还有品牌方做市场调研,想统计某个商圈里各品牌的出现频次,也需要从街拍图里自动识别logo。
以往我用的公开数据集大多是通用物体分类,ImageNet、CIFAR、Food-101这类,这些数据跟“服装品牌logo”完全是两码事。通用分类关注的是“这是什么物体”,而logo识别属于细粒度分类,目标是区分同一大类的不同子类,比如同样是运动品牌,Nike、Adidas、Puma、New Balance摆在面前,普通人一眼能分清,但模型要学到的是logo图形本身的设计差异,而不是衣服轮廓。所以当我找到一个296类的服装品牌logo数据集时,第一反应是:这个规模够用了。类别太少,模型会缺乏泛化能力;类别太多,头部和尾部品牌数量悬殊,训练难度又上去了。296类算是一个比较舒服的规模,既能覆盖市面上主流服装品牌,又不会因为类别过多导致难以收敛。
1.2 296类品牌覆盖面与实际应用场景
这296类里面,不同品牌的图像数量差异很大,头部品牌可能成百上千张,尾部小众品牌可能只有几十张,这是所有真实世界数据集都逃不过的规律。覆盖范围大致有几类:运动户外品牌、快时尚品牌、轻奢品牌、奢侈品牌、本土设计师品牌,还有一些电商渠道常见的网红品牌。这种分布和真实的服装销售结构其实很像,头部品牌曝光率高,样本多,小品牌虽然单类样本少,但加起来就是一个长尾,靠这部分才能体现“296类”的价值。
实际应用场景比想象中多。我接的几个需求里,用得最频繁的是电商品牌字段自动填充,其次是社交平台街拍图的品牌露出统计,还有服装供应链里用来做款式品牌侵权初筛。不同场景对模型的精度和速度要求不一样:电商图背景干净,分类器精度很高;街拍图光照复杂、遮挡严重,还需要后续做检测定位。如果你正在做类似的项目,这个数据集可以当作一个预训练底座,先在上面把模型训到能区分296类,再拿自己的业务数据微调,比从零开始训要快得多。
2. 数据从哪来、怎么清洗到能训练
2.1 图像来源的三种思路
我拿到的这个296类数据集,图像来源大体是公开网络渠道,这种数据集的构建思路可以复用到自己的项目里。第一种是电商平台商品图,特点是背景干净、logo清晰、角度正面,但缺点是单一场景,数据分布偏“白底图”。第二种是社交平台和街拍图,真实感强,有光照变化、遮挡、透视变形,但标注成本高,需要大量人工确认。第三种是品牌官网和新闻媒体图,这类图质量高,但数量有限,适合补充每个类别的“标准样本”。
实际清洗时,最怕的是同一个品牌在不同来源下长相差太多。比如Nike的logo在鞋舌上是刺绣,在T恤上是印花,在羽绒服上可能是反光材质,如果数据集里只有刺绣图,模型一遇到印花就会懵。所以构建数据时,我一般建议至少保留2到3种不同场景来源,让模型学到“logo的核心形状”,而不是“某种材质下的纹理”。这也是我判断一个现成数据集好坏的第一标准——不是看总张数,而是看每个类别内图像的多样性。
2.2 清洗流程:多logo、无logo、模糊、重复和版权标注
数据集到手后,不管别人宣称已经清洗过,我都会自己再跑一遍基础清洗。流程分四步:
第一步,去重。
网络数据集最大的问题是重复,同一个品牌logo图可能在多个网页出现,被爬虫重复归档。去重不能用简单的md5,因为图片可能被压缩过、尺寸缩放,md5对像素级修改很敏感。我习惯用感知哈希,pHash或dHash都行,对尺寸缩放和轻微压缩不敏感,两张图如果哈希距离很小就判定为重复。下面这段代码可以处理大部分情况:
import imagehash from PIL import Image def dedup_by_phash(image_paths, hash_size=16, threshold=5): seen = {} dupes = [] for path in image_paths: try: img = Image.open(path) h = imagehash.phash(img, hash_size=hash_size) except Exception: dupes.append((path, "corrupted")) continue matched = False for existing_path, existing_hash in seen.items(): if h - existing_hash <= threshold: dupes.append((path, existing_path)) matched = True break if not matched: seen[path] = h return dupesthreshold取值很有讲究,我试过5和10,5会漏掉一些经过强压缩的重复图,10又容易把不同角度拍摄的同一件衣服误判成重复。实际用下来,电商白底图取8左右比较稳,街拍图因为视角和光照变化大,取6比较保守,宁可漏掉,不要误删。
第二步,过滤无logo和logo过小的图。
这是最容易被忽视的一环。分类数据集要求图像主体是logo本身,但网络爬回来的图经常是一张完整衣服图,logo只占画面的一小部分。我用一个简单的规则:如果logo区域小于图像面积的5%,直接踢掉。因为没有标注框的话,只能靠ResNet这类主干网络“硬看”,logo太小模型根本学不到,只会记住背景。对于这种问题,更可靠的做法是先用目标检测模型粗筛一遍,把检测到的logo裁出来,再做分类。后面第六部分我会详细讲这个方案。
第三步,清晰度和模糊过滤。
用OpenCV的Laplacian方差可以快速判断图像清晰度,方差低于阈值就判为模糊。这里有个经验值:对200x200以上的logo图,方差阈值设在100到150之间比较合适,低于100的图基本是手机对焦失败或者运动模糊。
import cv2 def is_blurry(image, threshold=120): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) return cv2.Laplacian(gray, cv2.CV_64F).var() < threshold注意阈值不能设太高,否则会把一些真实场景中本来就是“随拍感”的图删掉,街拍数据本身就带噪点,模糊过滤要跟应用场景匹配,电商场景可以严格,街拍场景反而要留一部分模糊样本增强鲁棒性。
第四步,版权和合规标注。
这是一个很多人不重视但必须做的事。网络爬取的logo图像涉及品牌商标和图片版权,用于学术研究问题不大,但商用必须做合规审查。我的习惯是在数据集目录里建一个origin.json,记录每张图的来源链接和抓取时间,方便后续追溯和删除。
2.3 类别平衡处理:长尾分布怎么处理
296类logo数据集的典型问题是长尾分布,Nike、Adidas这类头部品牌样本可能上千张,而一些设计师品牌只有几十张。如果直接训练,模型会倾向于把所有不确定样本都预测成头部品牌,因为这样做loss最小。常见的解法有三种:
- 设置最小样本数,比如每个类别至少保留30张,少于30张的类别合并到“其他”类。
- 对少样本类别做过采样,训练时每个epoch从少样本类里重复采样,配合数据增强。
- 使用类别加权损失,给少样本类更大的权重。
我实际测试下来,最有效的是“过采样+标签平滑”的组合。过采样让每类每个epoch出现的次数接近,标签平滑减少模型对头部类别的过度自信。还有一个比较隐蔽的点:不是所有类别都值得保留。如果某个品牌图像来源太单一,比如全部来自官网同一个页面,那它学到的只是这个页面的背景,不是logo本身,这种类哪怕只有30张,我也会手动去掉,宁可类别数少一点,也要保证每个类都是“真实世界的logo变体”。
3. 数据集划分:为什么“已做划分”是训练前最重要的一步
3.1 切分原则一:按品牌/类别分层,而不是随机切
网上很多人拿到数据集就按8:1:1随机切分,这个做法在类别均衡且样本足够多时勉强能用,但在296类长尾数据上会埋大雷。随机切分最极端的情况是,某些小类别因为样本太少,可能全部落在测试集里,训练集里一个都没有,模型根本没见过这个类,测试时准确率直接掉到0;反过来也可能全部落在训练集里,测试时没有样本,评估结果虚高。
正确做法是按类别分层抽样,保证每个类别在训练集、验证集、测试集中的比例都一致。如果用sklearn,要先按类别分组,再进行stratify切分:
from sklearn.model_selection import train_test_split # image_paths: 所有图片路径 # labels: 对应的类别id # 先按类别分层切出 train 和 temp train_paths, temp_paths, train_labels, temp_labels = train_test_split( image_paths, labels, test_size=0.3, stratify=labels, random_state=42 ) # 再把 temp 按类别分层切成 val 和 test val_paths, test_paths, val_labels, test_labels = train_test_split( temp_paths, temp_labels, test_size=0.5, stratify=temp_labels, random_state=42 )这个代码看起来简单,但很多人在写的时候漏了stratify参数,导致切分结果完全没分层。我见过一个项目,训练集准确率95%,测试集只有60%,排查半天发现就是切分的时候没做stratify,测试集里大量小类别样本,而训练集里根本没有这些小类别。
3.2 切分原则二:防止同源/场景泄漏
这是比类别分层更隐蔽的一个坑,也是我判断一个现成数据集质量的核心指标。假设一个品牌在某个电商平台有100张商品图,这些图来自同一个商品页的不同角度,如果随机切分,很可能训练集里出现这个商品的正面图,测试集里出现同一个商品的背面图,模型实际上是在“认商品”,不是在“认logo”。
这种泄漏会导致训练指标非常漂亮,到了真实场景立刻崩盘。我遇到过最典型的情况:模型对某个品牌的准确率奇高,但换了一批真实街拍图之后准确率掉了30个百分点。后来发现训练集里大量来自同一来源,模型记住了图片的色调和背景,而不是logo本身。
处理办法是按“数据源”分组切分,而不是按图片切分。构建数据时,每个来源(比如同一商品ID、同一篇帖子ID)的所有图片必须全部进入同一个集合。如果手上数据集没有这个信息,就只能靠图像特征聚类来近似还原同源性,比如提取颜色直方图和感知哈希,把特别相似的图片归到同一组,再按组切分。这个步骤虽然麻烦,但能避免你后面无数个调参之夜。
3.3 训练/验证/测试比例、目录结构示例
常见比例有两种,一种是7:2:1,适合数据量在几万张以下的项目,验证集留20%能保证评估波动小;另一种是8:1:1,适合数据量很充沛的情况,训练集多一点,有利于模型收敛。我个人做296类这种长尾数据,偏向7:2:1,因为少样本类别本身的测试样本可能只有个位数,验证集太小的话,早停和调参的决策完全不可信。
现在市面上绝大多数图像分类数据集都采用ImageFolder格式,也就是每个类别一个目录,目录名就是标签。这个296类的数据集如果也是类似结构,目录大致是这样的:
dataset/ ├── train/ │ ├── nike/ │ │ ├── nike_001.jpg │ │ └── nike_002.jpg │ ├── adidas/ │ └── puma/ ├── val/ │ ├── nike/ │ └── adidas/ └── test/ ├── nike/ └── adidas/这种结构最大的好处是PyTorch的torchvision.datasets.ImageFolder可以直接读,不需要自己维护csv映射。需要注意的是,如果新增类别,必须在三个集合的目录下同步创建,否则训练和评估的类别数量对不上,程序会直接报错。
我拿到数据集后会先写一个脚本统计每个集合每类的样本数,输出成表格,人工检查一遍有没有类别缺失。这个检查非常重要,因为有些数据集在划分时用的类别名大小写不统一,比如“Nike”和“nike”被当成两个类,看起来有296个类目录,实际语义类别可能只有280个左右,如果不检查,训练出来的模型维度都会错乱。
4. 用这份数据集训练图像分类模型:从基线到调优
4.1 数据加载与增强策略
数据准备好了,第一步是写数据加载。PyTorch的ImageFolder可以直接用,但对于logo分类这种细粒度任务,数据增强策略跟通用分类有很大区别。通用分类喜欢RandomResizedCrop,随机裁剪缩放,让模型学习物体整体结构;但logo分类里,logo往往只占图像的一部分,如果随机裁剪太狠,很容易把logo切掉一半,模型只能学局部纹理,学不到完整图形。
我的增强策略是:先Resize到256x256,再随机裁剪224x224,但这个裁剪范围要控制,scale参数设在0.5到1.0之间,避免把logo裁出画面。然后加随机旋转、水平翻转、颜色扰动和光照扰动。这里有一个很重要的点:logo有方向性,有些品牌logo翻转后会变成完全不认识的图形,比如字母类logo,翻转后会变成镜像,现实世界里几乎不会出现,这类品牌水平翻转反而会误导模型。所以我一般只对无文字的图形类logo开启水平翻转,或者直接不开启,用随机旋转和光照扰动来弥补数据量不足。
代码示例:
from torchvision import transforms train_transform = transforms.Compose([ transforms.Resize((256, 256)), transforms.RandomResizedCrop((224, 224), scale=(0.5, 1.0)), transforms.RandomRotation(15), transforms.ColorJitter(brightness=0.3, contrast=0.3, saturation=0.3), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) val_transform = transforms.Compose([ transforms.Resize((256, 256)), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ])4.2 模型选型:为什么从ConvNeXt/EfficientNet开始
模型选型上,我建议从EfficientNet或ConvNeXt这类现代CNN开始,而不是老一代的ResNet。这里给一个简单对比:
| 模型 | 参数量 | 训练速度 | 对细粒度任务表现 | 预训练权重可得性 |
|---|---|---|---|---|
| ResNet50 | 25M | 快 | 一般 | 高 |
| EfficientNet-B4 | 19M | 中等 | 较好 | 高 |
| ConvNeXt-Tiny | 28M | 中等 | 好 | 高 |
| ViT-Base | 86M | 慢 | 好但要数据足 | 高 |
ResNet在ImageNet时代是标杆,但到了细粒度分类,它的下采样路径比较粗暴,中间层的空间细节保留不足。EfficientNet用NAS搜出来的复合缩放,同样的FLOPs下准确率更高。ConvNeXt把Transformer的设计思路搬到CNN里,在ImageNet和迁移学习上都表现不错。我的经验是:如果单个类别样本少于50张,用ViT容易过拟合,老老实实选ConvNeXt或者EfficientNet;如果样本量很大,再考虑ViT。
用timm库加载预训练权重很方便:
import timm import torch.nn as nn model = timm.create_model("convnext_tiny", pretrained=True, num_classes=296)注意,加载预训练权重的目的不是让它直接认识logo,而是让它保留低层和中层的纹理、边缘、形状特征。logo识别真正要学的是这些基础特征的高层组合方式,所以迁移学习的收益非常大。我对比过从零训练和用ImageNet预训练权重微调,同样的epoch,准确率能差15到20个百分点。
4.3 训练pipeline与常见调参
训练部分,我习惯使用AdamW配合cosine学习率调度,batch size根据显存定,单卡3090或者A100上用128没问题,如果显存小就32到64,同时按比例调低学习率。这里给一个参考训练配置:
import torch from torch.optim import AdamW from torch.optim.lr_scheduler import CosineAnnealingLR optimizer = AdamW(model.parameters(), lr=3e-4, weight_decay=0.05) scheduler = CosineAnnealingLR(optimizer, T_max=50) criterion = nn.CrossEntropyLoss(label_smoothing=0.1)label_smoothing=0.1对logo分类非常有帮助。因为数据集中存在一定比例的标注噪声,比如某张图片上同时出现了两个品牌的logo,标注员只标了主要品牌,模型如果学得太“死”,会对这种歧义样本产生过强的信心,导致泛化变差。label smoothing等于给模型的概率输出留了一点空间,让它不要对任何一类过于笃定。
类不平衡问题,我在损失函数上做了加权。权重可以按每个类别样本数的反比计算,但不要直接反比,否则尾部类别的权重会大到让头部类别完全学不到,我一般用weight = 1 / sqrt(count),既能照顾少样本类,又不至于压垮头部类。训练epoch从40到80不等,具体要看验证集loss是否还有下降空间。每次epoch结束存一次checkpoint,记录验证集top1准确率和loss,方便回滚。
5. 实测中最容易翻车的几个问题
5.1 类别不平衡的隐藏陷阱:Accuracy虚高
我训练完第一版模型,看到测试集top1准确率有87%,心里还挺高兴。结果一算各类别的平均召回率,只有不到70%。问题出在类别不平衡上,头部品牌样本量大,模型把它们全猜对了,就把整体准确率拉上去了,尾部品牌基本瞎猜。
后来我改了评估方式,不只盯着top1准确率,而是同时看三个指标:
- balanced accuracy,也就是每个类别准确率的平均值。
- 每个类别的召回率,尤其是尾部100类的召回率。
- 混淆矩阵里错误集中的类别对。
balanced accuracy从87%掉到71%,这才暴露了模型的真实水平。后面我加了过采样和类别加权,balanced accuracy提到78%,虽然top1准确率反而降到84%,但这是模型真正变强的信号,因为它不再靠牺牲小类别来换取头部类的性能了。如果你发现自己的模型也有“总体准确率高但少数类完全没用”的症状,建议先查类别分布和评估指标,别急着改网络结构。
5.2 Logo形似与背景干扰:Nike对勾和comma
训练过程中,我盯着混淆矩阵发现一个特别典型的错误簇:Nike的Swoosh和那个类似对勾设计的品牌被反复搞混。这两个logo确实在形变之后很像,尤其当logo很小、被褶皱拉扯、或者拍摄角度倾斜时,模型根本分不清。
这类问题靠调参解决不了,只能从数据和模型输入下手。我试过这样几种方案:
- 把输入分辨率从224提到320,小logo的细节保住了,准确率提升大概2个百分点。
- 加入局部注意力模块,让模型关注logo中心区域而不是整图背景。
- 手动收集一批容易混淆的负样本,也就是那些看起来像Nike但其实是其他品牌的图,作为难例继续训练。
最后实际起作用的是“高分辨率+难例挖掘”。如果你拿到的数据集里这些容易混淆的类别本身样本就少,那就要考虑人工补充,把网上能找到的相似logo图都收进来,甚至可以把两个logo做成同一张训练图的不同裁剪,逼模型学会真正的判别特征。
5.3 跨域泛化:网页图和街拍图差异
这是所有用公开网络数据集训练的人都会撞上的墙。数据集里的图大多是电商白底图,背景干净、光照均匀、logo角度正;但真实场景里,可能是夜晚街拍、逆光、logo被衣服褶皱挡住一半。我用一份街拍测试集去测,准确率从87%跌到68%,掉得很惨。
解决跨域问题,我的经验是分两步。第一步是在训练阶段做domain augmentation,也就是在图像增强里加入灰度化、亮度剧烈扰动、添加高斯噪声、模拟运动模糊,让模型不再依赖干净背景和标准光照。第二步是如果有条件,收集少量真实街拍图,哪怕每类只有20到50张,用这些图对模型做二次微调,学习率调到正常微调的三分之一,这样既能保留原有语义,又能适应新域。切记不要用太多真实场景图从头训练,会把之前学到的logo特征冲掉。
5.4 标注噪声带来的评估失真
还有一个所有真实数据集都躲不过的问题:标注本身有错。296个类,人工标注几万张图,出错率再低也有百分之一二。一张本应是Adidas的图被标成Nike,模型训练时看到这种矛盾的样本会学得很“分裂”。而且如果这种噪声样本恰好落在测试集里,评估结果会失真,本来模型预测对了,标签是错的,硬被算成错误。
我的处理方法是训练完第一版后,用模型本身来找标注噪声。具体做法是:跑一遍训练集,把所有置信度低于某个阈值的样本挑出来,人工review。模型对这个样本很犹豫,往往说明样本本身有问题,要么是模糊图,要么是多logo,要么是标签标错。Review完改正之后再重新训练,通常能再提升1到2个百分点。这个步骤虽然费时间,但效果立竿见影,比盲目换模型结构有效得多。
6. 后续扩展:从“分类整图”到“检测+识别”
6.1 定位加分类的两阶段方案
纯分类方案有一个明显短板:它要求输入图像里“主要logo”占据足够大的面积,而且只能有一个品牌。但真实场景里,一件衣服可能有多个logo,比如正面一个、背面一个,或者一张街拍图里出现三个品牌logo。这时候纯分类模型会懵,它只能输出一个类别,代表不了整张图。
解决这个问题,我采用两阶段方案。第一步用目标检测模型定位logo区域,YOLOv8就是一个很顺手的选择,它能输出多个候选框;第二步把每个候选框裁出来,送到前面训练的296类分类器里,得到每个框的品牌标签。这样一张图可以同时识别出多个品牌,而且每个品牌都有对应位置,后续做品牌统计、商品结构化都更方便。
这个方案里有一个细节很多人会忽略:检测模型用的训练数据需要标注框,如果手上只有分类数据集,没有框标注,可以先人工标一批框,数量不用太多,每种品牌标注50到100个框就够训出一个能用的检测器了。检测器的作用不是直接分类,而是先“把logo从背景里抠出来”,所以它的准确率可以低一点,但召回率必须高,宁可多框一些,不能漏框。
6.2 用训练好的模型做品牌影响力分析
分类模型稳定之后,我拿它做了一个市场分析小项目:搜集某个社交媒体平台上带服装标签的公开图片,跑一遍“检测+识别”,统计不同品牌的出现频次、出现场景和季节变化。这个数据非常有意思,比如某些运动品牌在健身场景占比明显高,某些轻奢品牌在通勤场景更常见,这类信息对品牌方的广告投放和渠道策略都有参考价值。
做这类统计分析时,要注意“出现频次”和“真实占有率”不完全等价。有些品牌logo本身做得大、显眼,模型更容易识别出来,频次统计会偏高;有些品牌logo小、设计低调,模型容易漏检,频次统计会偏低。因此统计结果只能做相对比较,不能当作绝对市场份额。如果能结合人工小样本抽检校正,可信度会更高。
6.3 数据集的更新与维护
296类看起来很多,但服装品牌是动态的,每年都有新品牌冒出来,老品牌换logo的也不少见。我遇到最有意思的是某个品牌更新了logo字体,新旧logo差异很大,模型只认识旧版,新版全不识别。这说明数据集必须持续维护,不是训完就完事。
我的做法是搭一套半自动数据回流流程:模型上线后,把每次预测置信度低于0.5的样本单独存下来,定期有人工标注队列给这些难例打标,打标完补充进训练集,每个月重新微调一次模型。这样模型会越来越适应真实场景,而不是只停留在初始数据分布上。另外一个思路是如果发现某个新品牌频繁出现在业务数据里,就单独新建一个类别,收集几百张图,在现有模型上做增量训练,不需要把所有296类重新训一遍,只冻结大部分层、只训练最后一两层和新增类别相关的参数。
最后再分享一个小技巧,也是我踩过几次坑之后养成的习惯:拿到任何“已划分”的公开数据集,不要直接信任它的划分文件,先写脚本验证每个集合的类别数是否一致、每张图能否正常读取、有没有空目录、类别标签是否重复。这些检查看起来机械,但能省下后面排查问题的大把时间。图像分类项目的成败,很多时候就藏在这些不起眼的数据细节里,数据靠谱,模型才有靠谱的基础。
本文还有配套的精品资源,点击获取