资讯动态

图像分类算法选型指南:传统特征工程与深度学习实战对比

发布时间:2026/9/13 5:21:38 来源:尧图企业网站定制
图像分类这个任务说直白点就是让机器看图说话给它一张图它告诉我们这张图属于哪一类。图像分类传统算法和深度学习算法简单介绍不是让大家站队而是把两条路线的逻辑、适用边界和实操细节摆清楚。传统算法更像老师傅手工做特征颜色直方图、HOG、SIFT、LBP、纹理统计再送给SVM、随机森林、KNN去做判断深度学习算法则把特征提取和分类器揉进一个网络里CNN、ResNet、MobileNet、EfficientNet、ViT、Swin Transformer都属于这条线。刚入门计算机视觉的人、做森林图像分类的遥感或林业同学、准备跑CNN花卉图像分类的开发者都适合按这篇的思路走一遍。我自己踩过的坑很典型小数据集上直接上大模型效果还不如HOG加SVM但数据量一上来传统算法的天花板很快就摸到了。下面把选型、原理、参数、代码和避坑经验拆开讲。1. 图像分类到底在解决什么问题传统和深度学习的分水岭1.1 从“看图识物”到概率输出任务定义与常见场景图像分类在学术上通常指单标签监督学习给定一张输入图像模型输出一个类别标签或者输出每个类别的概率。比如输入一张花卉图输出“玫瑰”“郁金香”“向日葵”输入一张森林遥感图输出“松林”“阔叶林”“竹林”。实际项目里还会遇到多标签分类一张图里同时有“树”和“雾”或者细粒度分类要区分不同品种的鸟、不同型号的零件。场景不同难点也不同。森林图像分类常见于树种识别、病虫害识别、遥感地物分类、火险等级评估。这类数据的麻烦在于类内差异大同一树种不同季节、不同光照、不同拍摄高度颜色和纹理都可能变。CNN花卉图像分类则常见于公开数据集比如Oxford Flowers-102类别多、类间相似有些花只有花蕊或花瓣差别。电商图像分类、工业质检、医疗影像分类也类似核心都是把像素映射到语义类别。评价一个分类模型不能只看准确率。类别不平衡时准确率会骗人。比如1000张图里950张是“无病害”50张是“有病害”模型全部预测“无病害”也能有95%准确率但召回率是0。所以实务中要同时看精确率、召回率、F1、混淆矩阵必要时看top-3准确率。图像分类的输入也不只是RGB图遥感常用多光谱工业常用灰度医疗常用高动态范围。输入通道数、位深、分辨率都会影响后面选传统算法还是深度学习算法。1.2 传统算法与深度学习算法的分水岭在哪里传统图像分类算法的核心是“人工设计特征分类器”。人工设计特征这一步靠的是领域知识。判断树叶病害你可能提取颜色矩、LBP纹理、HOG边缘判断花卉你可能提取HSV直方图和SIFT关键点。分类器只是最后做决策SVM、随机森林、KNN、朴素贝叶斯都能用。它的优点很明显数据量小也能跑CPU就能算模型可解释调参相对直观。缺点同样明显特征泛化能力有限换一个光照、换一个背景之前设计的特征可能就失效了。深度学习算法的分水岭在于“特征自动学习”。卷积神经网络通过卷积核在图像上滑动自动学到边缘、纹理、局部形状再到高层语义。Vision Transformer把图像切成patch用自注意力建模全局关系。你不再手工写HOG而是让网络从数据里学。这条路在数据量充足、算力够用、类别语义复杂时优势巨大。但它不是万能药小样本容易过拟合训练成本高可解释性差部署到移动端还要做量化剪枝。我的经验是传统算法适合做基线、做快速验证、做可解释性要求高的场景深度学习算法适合数据量大、语义复杂、追求精度的场景。两者不是替代关系而是不同预算和约束下的工具。1.3 选型时先看数据量、算力和可解释性选型时我通常先问三个问题每类有多少张图有没有GPU业务方要不要解释每类少于100张优先考虑传统算法或迁移学习每类100到1000张用预训练CNN微调通常比从零训练更靠谱每类超过1000张并且算力允许再考虑ResNet、EfficientNet或ViT。算力方面传统算法在CPU上就能跑SVM训练几千张图几分钟搞定CNN如果没有GPU训练会非常慢但推理可以用ONNX Runtime或TFLite加速。可解释性方面林业、医疗、工业质检经常需要知道模型为什么这么判传统算法能输出特征重要性CNN可以靠Grad-CAM热力图Transformer可以看注意力图但解释成本更高。下面这张表是我在项目里常用的快速选型参考不是死规矩但能帮你少走弯路。条件更建议的路线理由注意点每类少于100张特征明显传统算法 SVM/随机森林数据少手工特征可控特征要归一化交叉验证每类100到1000张预训练CNN微调迁移学习效果好别冻结全部层微调后半段每类超过1000张算力充足ResNet/EfficientNet/ViT能学复杂语义要防过拟合增强要合理需要强解释传统算法或Grad-CAM能追溯依据解释不等于因果移动端/嵌入式MobileNetV3、TFLite参数量小延迟低量化后精度会掉一点遥感/多光谱传统特征CNN结合光谱特征手工提更稳波段归一化很关键注意不要因为深度学习火就无脑上大模型。我见过用ResNet50跑几百张花卉图结果不如HOGSVM原因就是数据量撑不起参数量。先跑基线再决定要不要加复杂度。2. 传统图像分类算法的核心套路与实操要点2.1 手工特征三件套颜色、纹理、形状传统图像分类的特征工程基本围绕颜色、纹理、形状三件套展开。颜色特征最直观RGB直方图、HSV直方图、Lab直方图、颜色矩都常用。RGB对光照变化敏感HSV的H分量对颜色更贴近人眼感知Lab在颜色距离上更均匀。做森林图像分类时我通常把RGB转成HSV再统计H和S的直方图bins取16到32太大容易稀疏太小区分度不够。颜色矩只取均值、方差、偏度维度低适合小样本。纹理特征里LBP、GLCM、Gabor、HOG是常客。LBP计算局部二值模式对光照变化有一定鲁棒性适合树叶、树皮、织物。GLCM统计灰度共生矩阵的对比度、能量、熵能描述粗糙度。Gabor滤波器像一组不同方向和频率的条纹检测器适合纹理方向明显的场景。HOG把图像分成小cell统计梯度方向直方图再归一化适合行人、物体轮廓。形状特征包括Hu矩、轮廓周长面积比、SIFT/SURF/ORB关键点。SIFT尺度不变但计算慢ORB快适合实时。形状特征对分割结果依赖大背景复杂时不好用。参数上HOG常用cell 8x8、block 2x2、9个方向归一化用L2-Hys。LBP半径取1到3邻域点数8到24。GLCM距离取1到5方向0、45、90、135度。颜色直方图记得做L1或L2归一化否则图像尺寸不同会导致计数不可比。特征拼在一起之前一定要做标准化比如StandardScaler或MinMaxScaler不然数值范围大的特征会主导SVM。2.2 经典流程预处理、特征提取、编码、分类器传统算法的完整流程一般是读图、预处理、特征提取、特征编码、分类器训练、评估。预处理包括统一尺寸、灰度化、去噪、直方图均衡、归一化。尺寸统一不是必须但为了HOG和GLCM方便我通常缩到256x256或512x512。去噪用高斯滤波或中值滤波直方图均衡能增强对比度但可能放大噪声要视情况用。特征提取之后如果特征维度太高可以用PCA或LDA降维。PCA保留方差大的方向LDA利用标签信息适合分类。编码这一步常被忽略但Bag of Visual Words很经典先对SIFT描述子做K-Means聚类得到视觉词典再把每张图的描述子映射到最近的视觉词统计直方图。Fisher Vector更强但计算更重。分类器选择上SVM适合小样本高维随机森林适合特征混合且需要特征重要性KNN简单但预测慢。下面是一段可直接参考的Python示例用skimage提HOG用sklearn训练SVM。实际项目要加交叉验证和网格搜索。import numpy as np from skimage.feature import hog from skimage.io import imread from skimage.transform import resize from sklearn.svm import SVC from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline from sklearn.model_selection import GridSearchCV def extract_hog(img_path, size(128, 128)): img imread(img_path, as_grayTrue) img resize(img, size, anti_aliasingTrue) features hog( img, orientations9, pixels_per_cell(8, 8), cells_per_block(2, 2), block_normL2-Hys, visualizeFalse ) return features # X [extract_hog(p) for p in image_paths] # y labels pipe Pipeline([ (scaler, StandardScaler()), (svm, SVC(kernelrbf, probabilityTrue)) ]) param_grid { svm__C: [0.1, 1, 10, 100], svm__gamma: [scale, 0.001, 0.01, 0.1] } # grid GridSearchCV(pipe, param_grid, cv5, scoringf1_macro) # grid.fit(X, y) # print(grid.best_params_)注意SVM的C越大对训练误差容忍越低容易过拟合gamma越大决策边界越弯曲也容易过拟合。先用交叉验证找大致范围再细化。特征缩放必须放在交叉验证管道里不然会数据泄漏。2.3 传统算法在森林图像分类中的落地案例森林图像分类用传统算法很常见尤其是遥感影像和无人机影像。比如区分针叶林和阔叶林颜色和纹理差异明显针叶林颜色偏深绿纹理更细密阔叶林颜色变化大纹理更粗糙。我会先做波段归一化然后提取HSV直方图、LBP纹理、GLCM统计量再拼成特征向量最后用随机森林分类。随机森林能输出特征重要性方便判断哪些波段和纹理真正有用。具体步骤第一步把原始影像按地块裁剪成小图块比如64x64或128x128太小丢失纹理太大混入其他地物。第二步去云、去阴影必要时用中值滤波。第三步提取颜色特征HSV的H、S、V直方图各16维颜色矩9维。第四步提取纹理特征LBP直方图10到20维GLCM四个方向的对比度、相关性、能量、同质性共16维。第五步拼接后标准化用PCA降到50到100维。第六步随机森林训练n_estimators取200到500max_depth不设或设10到30class_weight用balanced。第七步用验证集看混淆矩阵重点看针叶林和阔叶林是否互相混淆。实测下来小样本森林图像分类用这套方法准确率做到80%左右是可行的。但要注意季节影响夏天和秋天的颜色特征差异很大如果训练集只有夏天测试集有秋天准确率会明显掉。解决办法是加入多季节样本或者用对季节不敏感的特征比如纹理和形状。还有一个坑是地理位置泄漏同一片林地的图块被随机分到训练集和测试集模型可能记住位置而不是树种。正确做法是按地块或按航带划分数据集而不是按图块随机分。2.4 传统算法的优缺点与常用参数传统算法的优点计算资源低CPU可跑小样本可用可解释性强调参直观方便和领域知识结合。缺点特征设计耗时泛化能力有限对光照、尺度、旋转、遮挡敏感复杂语义分类效果差。我通常把传统算法当基线如果基线已经满足业务要求就不折腾深度学习如果基线不够再上CNN并且用传统算法的结果做对照。算法常用特征关键参数适合场景注意点SVMHOG、颜色直方图、LBPC、gamma、kernel小样本、高维必须缩放特征随机森林颜色矩、GLCM、LBPn_estimators、max_depth混合特征、可解释树多但别无限加KNN任意特征k、距离度量简单基线预测慢维度灾难朴素贝叶斯颜色、纹理平滑参数文本/低维特征独立假设强Bag of Visual WordsSIFT/ORB词典大小、聚类数纹理丰富词典训练要独立常用参数速查SVM的C从0.1到100试gamma用scale或0.001到0.1随机森林n_estimators 200到500max_depth 10到30KNN的k取3到9距离用欧氏或余弦PCA保留95%方差或固定50到100维。特征标准化用StandardScaler如果特征稀疏用MaxAbsScaler。交叉验证至少5折类别不平衡用StratifiedKFold。3. 深度学习图像分类算法到底强在哪3.1 CNN卷积、池化、全连接的基本原理CNN的核心是卷积层。卷积核在图像上滑动每个位置做点乘求和提取局部特征。浅层卷积学到边缘、角点、颜色斑块中层学到纹理和局部形状深层学到语义部件。权值共享让参数量大幅减少局部感受野让网络关注邻域池化层降低空间分辨率增大感受野同时带来一定平移不变性。全连接层把特征图展平后映射到类别分数Softmax转成概率。为什么CNN能自动学特征因为卷积核的参数是通过反向传播和梯度下降学出来的不需要人写HOG。训练时损失函数衡量预测和真实标签的差距梯度回传更新卷积核和全连接权重。批归一化让训练更顺Dropout减少过拟合ReLU提供非线性。感受野计算很关键两层3x3卷积的感受野等于5x5三层等于7x7但参数量更少非线性更多。所以VGG之后大家喜欢堆3x3卷积。下面是一个简单CNN的PyTorch示例适合理解结构不适合直接上复杂任务。import torch import torch.nn as nn class SimpleCNN(nn.Module): def __init__(self, num_classes10): super().__init__() self.features nn.Sequential( nn.Conv2d(3, 32, kernel_size3, padding1), nn.BatchNorm2d(32), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), nn.Conv2d(32, 64, kernel_size3, padding1), nn.BatchNorm2d(64), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), nn.Conv2d(64, 128, kernel_size3, padding1), nn.BatchNorm2d(128), nn.ReLU(inplaceTrue), nn.AdaptiveAvgPool2d((1, 1)) ) self.classifier nn.Linear(128, num_classes) def forward(self, x): x self.features(x) x torch.flatten(x, 1) return self.classifier(x)注意小数据集上不要从零训练这种网络参数量虽不大但样本少一样过拟合。优先用预训练模型微调把最后全连接层换成自己的类别数。3.2 从LeNet到ResNet、MobileNet、EfficientNet的演进LeNet-5是早期卷积网络用于手写数字结构简单。AlexNet在ImageNet上引爆深度学习用了ReLU、Dropout、数据增强。VGG把3x3卷积堆深结构规整但参数量大。GoogLeNet用Inception模块多尺度并行降低计算量。ResNet引入残差连接解决深层网络退化问题让上百层网络可训练。DenseNet把每层和前面所有层连接特征复用强。MobileNet用深度可分离卷积把标准卷积拆成逐通道卷积和逐点卷积大幅减少计算量适合移动端。EfficientNet用复合缩放同时调整深度、宽度、分辨率在精度和效率之间找平衡。模型核心改进参数量趋势适合场景注意点LeNet-5早期卷积池化很小教学、简单数字输入小语义弱AlexNetReLU、Dropout中等入门图像分类现在多作历史参考VGG163x3堆叠大迁移学习基线全连接层参数多ResNet50残差连接中等通用分类预训练权重好用MobileNetV3深度可分离SE小移动端、嵌入式量化后部署EfficientNet-B0复合缩放较小精度效率平衡输入分辨率别乱改ConvNeXt现代卷积设计中等替代ViT的卷积方案训练技巧要求高选择建议服务器上做通用分类ResNet50或EfficientNet-B0起步移动端用MobileNetV3追求更高精度且数据充足试EfficientNet-B4以上或ConvNeXt如果数据量非常大再考虑ViT和Swin Transformer。不要一上来就选最大模型训练时间和显存会教你做人。3.3 Transformer图像分类ViT、Swin Transformer怎么工作ViT把图像切成固定大小的patch比如16x16每个patch展平后经过线性映射变成token再加上位置编码和class token送入多层Transformer编码器。每层包含多头自注意力和MLP。自注意力让每个patch和所有patch交互建模全局关系。分类时取class token的输出接全连接层。ViT的优点是大数据下性能强全局建模能力好缺点是需要大量数据或强增强否则不如CNN。小数据集上直接训练ViT准确率往往很难看但用ImageNet预训练权重微调会好很多。Swin Transformer做了分层设计和窗口注意力。它把图像分成不重叠的窗口在窗口内算自注意力再通过移动窗口让相邻窗口交互。这样计算量随图像尺寸线性增长适合高分辨率图像。Swin在检测、分割、分类上都表现不错细粒度分类也常用。ConvNeXt则反过来用现代卷积设计吸收Transformer的思路比如大卷积核、LayerNorm、GELU纯卷积也能打。Transformer图像分类的实操要点第一数据增强要强RandAugment、Mixup、CutMix都值得试。第二学习率用AdamWwarmup和余弦退火很关键。第三权重衰减设0.05左右别用太大。第四输入分辨率要匹配预训练模型ViT-B/16通常224或384。第五小样本优先微调不要从零训练。第六推理时可以用测试时增强但会增加延迟。森林图像分类用Transformer时要特别注意多光谱通道预训练权重通常只接受3通道需要把多光谱降维或改第一层卷积。3.4 CNN花卉图像分类的完整训练流程CNN花卉图像分类是很好的练手项目。以Oxford Flowers-102为例102类每类40到258张总共8000多张类间相似度高适合练迁移学习。流程如下数据划分用train/val/test比例大约7:2:1或者用官方划分。预处理用Resize到256再RandomResizedCrop到224随机水平翻转ColorJitter调亮度、对比度、饱和度Normalize用ImageNet均值方差。模型选ResNet18或ResNet50加载预训练权重把最后的fc层换成102类。损失用CrossEntropyLoss类别不平衡时加class_weight。优化器用AdamW学习率3e-4到1e-3权重衰减0.01到0.05余弦退火epoch 30到50batch size 32或64。早停看验证集F1。import torch from torch import nn, optim from torch.utils.data import DataLoader from torchvision import datasets, transforms, models train_tf transforms.Compose([ transforms.Resize(256), transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ColorJitter(0.2, 0.2, 0.2, 0.05), transforms.ToTensor(), transforms.Normalize( mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225] ) ]) val_tf transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize( mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225] ) ]) train_ds datasets.ImageFolder(flowers/train, transformtrain_tf) val_ds datasets.ImageFolder(flowers/val, transformval_tf) train_loader DataLoader(train_ds, batch_size32, shuffleTrue, num_workers4) val_loader DataLoader(val_ds, batch_size32, shuffleFalse, num_workers4) model models.resnet18(weightsmodels.ResNet18_Weights.IMAGENET1K_V1) model.fc nn.Linear(model.fc.in_features, 102) device torch.device(cuda if torch.cuda.is_available() else cpu) model model.to(device) criterion nn.CrossEntropyLoss() optimizer optim.AdamW(model.parameters(), lr3e-4, weight_decay0.01) scheduler optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max30) for epoch in range(30): model.train() for images, labels in train_loader: images, labels images.to(device), labels.to(device) optimizer.zero_grad() outputs model(images) loss criterion(outputs, labels) loss.backward() optimizer.step() scheduler.step() # 这里写验证集评估记录 accuracy、F1、混淆矩阵实测下来ResNet18预训练加合理增强花卉分类验证准确率能到90%以上ResNet50会再高一点但训练更慢。如果数据更少可以只训练fc层再逐步解冻后面几层。注意不要用测试集调参所有超参数在验证集上定。类别不平衡时别只看准确率看macro F1。混淆矩阵里经常混淆的花种可以回到图像看是不是背景干扰必要时做目标检测裁剪花区域。4. 实操对比传统算法与深度学习算法怎么选、怎么调、怎么部署4.1 数据集准备与增强小样本、类别不平衡、脏数据数据集准备决定项目上限。先收集再清洗再标注。标注要统一标准比如“针叶林”和“阔叶林”的边界定义不同标注员认知不一致会引入噪声。划分数据集要按场景划分不要同一张图重复进训练和测试。遥感图像按地块或航带划分花卉图像按拍摄批次划分工业图像按生产批次划分。比例一般7:2:1如果数据极少用交叉验证。数据增强方面传统算法可以加旋转、翻转、亮度变化但特征提取前做增强要小心有些特征对旋转敏感。深度学习增强更丰富RandomResizedCrop、HorizontalFlip、ColorJitter、Rotation、Mixup、CutMix、RandAugment。小样本优先用迁移学习冻结骨干只训练分类头再解冻微调。类别不平衡用重采样、类别权重、Focal Loss。脏数据要处理重复图、模糊图、标注错误图。我通常会训练一个简单模型看损失最高的样本人工复核往往能抓出一批标错的数据。4.2 训练参数与评估指标准确率、召回率、F1、混淆矩阵评估指标要按业务选。准确率适合类别均衡精确率关注误报召回率关注漏报F1是折中。森林病虫害分类里漏报病害比误报更严重所以召回率优先。工业质检里误报太多会导致人工复检成本高精确率也要看。top-k准确率适合类别特别多且允许候选的场景。AUC适合二分类和排序。混淆矩阵能看出哪些类别互相混淆指导下一步加数据或改特征。指标计算含义适合场景注意点准确率预测正确比例类别均衡不平衡时失真精确率预测为正里真正比例误报成本高和召回率权衡召回率真正例被找出的比例漏报成本高可牺牲精确率F1精确率和召回率调和综合评估macro看类别公平混淆矩阵类别间误判分布错误分析指导补数据top-k前k个包含正确类类别极多部署可能只给一个训练参数上CNN常用AdamW或SGD。SGD加动量在图像分类里泛化有时更好但调参麻烦AdamW对学习率不那么敏感适合快速起步。学习率用LR finder找范围或者从1e-3开始余弦退火。batch size受显存限制32、64、128都常见太小训练波动大太大泛化可能变差。epoch看验证集早停不要硬跑。传统算法用网格搜索或随机搜索交叉验证5折评分用F1。4.3 部署与推理优化量化、剪枝、ONNX、移动端训练完只是开始部署才是落地。传统算法部署简单OpenCV读图提特征sklearn模型用joblib保存Flask或FastAPI包一层接口。缺点是特征提取可能成为瓶颈尤其HOG和SIFT。深度学习模型部署先导出ONNX再用ONNX Runtime、TensorRT、OpenVINO、TFLite推理。量化分FP16和INT8FP16几乎不掉精度INT8速度更快但可能掉点。剪枝去掉不重要的权重蒸馏用大模型教小模型。移动端优先MobileNetV3、EfficientNet-Lite输入分辨率别太大。部署时要测延迟、内存、功耗不要只看准确率。注意量化校准集要覆盖真实场景否则INT8量化后某些类别精度会崩。导出ONNX后要用onnxruntime验证输出和原模型一致别直接上线。4.4 常见问题排查速查表问题现象排查思路解决方向过拟合训练准确率高验证低看学习曲线增强、正则、早停、减参欠拟合训练和验证都低看模型容量加层、换模型、调学习率损失不下降loss几乎不变看学习率、标签调LR、检查标签、换优化器准确率震荡上下跳动大看batch size、LR降LR、加batch、梯度裁剪偏向多数类少数类召回低看混淆矩阵类别权重、重采样、Focal Loss部署慢延迟高看输入尺寸、算子量化、剪枝、换小模型线上掉点测试好线上差看数据分布重新采样、增量训练5. 常见问题与避坑心得5.1 传统算法常见坑特征不鲁棒、阈值拍脑袋传统算法最容易踩的坑是特征不鲁棒。你在实验室拍的花卉背景干净、光照均匀HOG加SVM能到95%到了户外背景杂草、阴影、逆光一上来准确率可能掉到60%。解决办法是训练数据要覆盖真实场景增强要模拟光照和遮挡。颜色特征尽量用HSV或Lab少用原始RGB。纹理特征注意尺度同一纹理在不同分辨率下表现不同。特征拼接前一定要标准化不然数值大的特征会压制数值小的。另一个坑是阈值拍脑袋。传统算法里经常要设定分割阈值、SVM概率阈值、KNN距离阈值。这些阈值不能凭感觉要在验证集上画PR曲线或ROC曲线按业务需求选。比如病虫害检测宁可误报也不能漏报阈值就调低提高召回率。还有特征维度过高导致维度灾难KNN和SVM都会变慢PCA或LDA降维很有必要。最后传统算法也要做交叉验证不要用测试集反复调参。5.2 深度学习常见坑过拟合、学习率、数据泄漏深度学习第一个坑是过拟合。小数据集上大模型训练损失一直降验证损失先降后升。解决办法数据增强、权重衰减、Dropout、早停、减小模型、冻结骨干。第二个坑是学习率。学习率太大损失震荡甚至发散太小收敛慢还容易陷局部最优。用warmup和余弦退火通常有效。第三个坑是数据泄漏。同一张图或同一场景的图被分到训练和测试模型看起来很强上线就崩。遥感尤其要注意按地理区域划分医疗按患者划分工业按批次划分。还有几个细节预训练模型的归一化参数必须和训练时一致ImageNet均值方差不是随便写的多光谱图像要改第一层卷积或做通道投影标签平滑能缓解过自信混合精度训练省显存但要注意数值溢出随机种子要固定方便复现。最后别忽略错误样本可视化。把验证集里预测错的图拉出来看经常能发现标注错误、模糊图、类别定义不清的问题这比盲目调参有效得多。5.3 我的实操体会与最后的小技巧我自己的习惯是任何图像分类项目先跑一个传统算法基线HOG加SVM或者颜色直方图加随机森林花不了多少时间但能快速知道数据难度。如果基线已经够用就继续优化特征和分类器如果基线差得远再上CNN迁移学习。CNN花卉图像分类这类任务ResNet18预训练加增强通常就能拿到不错结果没必要一开始就上ViT。森林图像分类更看重数据划分和季节覆盖模型反而不是最关键的。Transformer图像分类在大数据、细粒度、多类别场景更有优势但训练成本和调参难度也更高。最后分享一个小技巧训练时保存每个epoch的混淆矩阵和错误样本索引不要只保存准确率。项目复盘时这些信息能告诉你模型到底错在哪。还有推理服务上线前拿一批线上真实图跑一遍别只用测试集。数据质量永远比模型花活重要标注错了再大的模型也救不回来。

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

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

免费获取报价