ARTICLE DETAIL

资讯详情

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

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

图像分类算法选型指南:传统特征与深度学习的对比与实践 先说个有意思的事。我职业生涯里接过不少图像分类的活儿前几年还好大家思路很统一提特征、训分类器。但深度学习火起来之后争议就来了。有甲方拿着几百张图就要上ResNet有同事守着老代码死活不肯碰PyTorch。其实两条路线根本不是谁取代谁的关系而是在不同条件下各有活法。这篇博客就把两条线的底层逻辑、实操要点、坑和适用场景捋清楚帮你在接到新项目时能快速做出靠谱的技术选型。1. 内容整体设计与思路拆解1.1 算法选型的现实逻辑先搞懂“人工定规则”和“机器学特征”的本质差异图像分类这件事本质上是让机器把一张图片映射到一个离散标签上。传统算法和深度学习在这件事上的路径截然不同理解这点是所有选型的前提。传统算法走的是“人工特征 浅层分类器”的路线我们先告诉机器“什么是重要的”比如颜色分布、边缘方向、纹理周期把这些信息用数学方式描述出来这就是特征提取再把这些描述向量扔给SVM、随机森林这类分类器去学决策边界。整个过程里特征设计是灵魂需要人对领域有深度理解。深度学习走的是“端到端学习”的路线输入原始像素输出类别概率中间所有特征直接让网络自己学。卷积核的权重一开始是随机的经过反向传播不断调整最终自动学到能从数据中区分类别的特征。这带来的好处是省去了人工设计特征的巨大工程量坏处是你很难精确控制模型到底学到了什么特征。从业者的第一反应不该是“哪个更火用哪个”而是先评估手头资源的约束条件。我见过很多翻车项目本质问题都是选型逻辑错了数据量只有几千张、算力只有CPU硬上了深度模型结果过拟合严重推理速度还慢得离谱。反过来在数据量足够大的情况下硬套传统特征精度天花板也很明显。1.2 什么场景下传统算法依然能打小数据、可解释性、低硬件成本的现实需求很多人一听到传统算法就觉得过时但在几个实际场景下它依然是优解。第一个场景是小样本问题。深度学习极度依赖大训练集通常每类上千张起步而实际项目中很多分类任务的样本量只有每类几十到二三百张。这种情况下基于颜色直方图、HOG、LBP这类人工特征去做分类配合合理的数据增强通常能达到够用的精度而且不会出现深度模型那种“训练集精度高、测试集惨不忍睹”的过拟合。第二个场景是可解释性要求高的行业。医疗、工业质检、安防这类领域客户经常要求“你为什么把它判为缺陷”。传统特征有明确的物理意义比如HOG特征的梯度分布能对应到“边缘方向”你完全可以指着某个直方图bin解释清楚而CNN中间层学到的东西想精确解释就困难得多。第三个场景是硬件受限的快速部署。嵌入式和边缘设备往往没有GPUCPU推理是刚需。传统算法在低算力硬件上能做到几十毫秒级的推理延迟而一个稍微像样点的CNN模型在树莓派这类设备上跑一次推理可能要几秒钟。这种差距是质的直接影响产品能否落地。这些场景不是我的想象而是我在真实项目中踩过的坑。有一次做工业零件瑕疵分类数据量是一百多张客户指定的部署环境是老式工控机CPU还是赛扬级别。当时毫不犹豫选了HOG特征加SVM效果稳定得令人感动。1.3 深度学习算法为什么成为主流大数据、算力与端到端学习的正向循环深度学习崛起是数据、算法、算力三者互相成就的结果。2012年AlexNet在ImageNet上把错误率从26%降到15%靠的是GPU训练提速、ReLU激活函数解决梯度消失、Dropout缓解过拟合更关键的是有了百万级标注数据。之后这个循环越滚越快模型变深变复杂VGG、ResNet、DenseNet、EfficientNet结构创新不断残差连接、注意力机制、Transformer算力也在突飞猛进。大数据集上深度学习模型的精度天花板远超传统算法。以ImageNet标准评测为例传统特征加SVM的Top-5错误率大概在20%以上而当前主流模型已经能降到2%以内。更重要的一点是深度学习把从业者的门槛大大降低了。传统路线需要你掌握颜色空间变换、梯度计算、尺度空间理论、特征编码等一堆底层的数学基础深度学习路线上主流框架提供了大量预训练模型你只需要懂训练的基本流程和微调技巧就能搭建一个效果相当不错的分类系统。但这不代表深度学习是银弹。它有一个绕不开的前提数据、标注和算力。很多项目在启动阶段高估了自己的数据积累低估了标注成本最后陷入深度学习“训不动、调不好、部署不了”的困境。所以真正有经验的工程师会先做数据审计再决定技术路线而不是上来就套一个高大上的模型。2. 传统图像分类算法的核心原理与实操要点2.1 特征描述子逐个拆解颜色直方图、HOG、SIFT、LBP怎么选传统图像分类的基石是特征描述子。它负责把像素信息压缩成一个有判别力的数值向量。选哪种特征取决于你的对象是什么研究颜色、纹理还是形状。颜色直方图是最朴素的一类特征统计每个颜色区间出现的频率。它实现简单、计算极快、对旋转和平移不敏感但完全丢失了空间位置信息和光照鲁棒性。实操中常用HSV颜色空间而不是RGB因为HSV把色相和亮度分开对光照变化更鲁棒。如果项目是森林图像分类这类场景——区分森林与裸地、不同林种、植被覆盖度颜色直方图的判别力非常强。HOG方向梯度直方图统计图像局部区域的梯度方向分布。核心思想是目标的形状和外观可以通过局部的梯度分布来描述而不需要知道梯度像素的确切位置。HOG把图像划分成小的cell单元在每个cell内统计梯度方向直方图再做局部对比度归一化。它对光照变化有一定鲁棒性适合行人检测、车辆识别这类边缘轮廓清晰的任务。SIFT尺度不变特征变换最大的特性是尺度不变同一物体在不同距离拍摄提取到的SIFT特征依然能匹配上。它通过构建高斯差分金字塔、搜索尺度空间极值点、精确定位关键点、计算方向直方图最终生成128维的特征描述子。SIFT的计算量比前几个大得多但特征匹配能力是一流的。如果物体存在明显的旋转、尺度变化SIFT是首选。LBP局部二值模式是分析纹理的利器。它计算每个像素与邻域像素的灰度关系输出一个二值编码统计所有编码的直方图作为纹理特征。LBP优点是计算量小、灰度单调变化下保持性很好所以在木材纹理分类、织物瑕疵检测、路面裂缝识别这些纹理敏感的场景中非常实用。特征选择没有绝对的“最好”只有“最合适”。我的做法是先用几种特征都提一遍各自训练一个简单的分类器做基准测试比较精度和速度再决定要不要做特征融合。直接凭经验猜很容易错杀好方案。2.2 经典分类器SVM、随机森林的训练策略与调参心得特征向量有了接下来的任务是把它们映射到类别标签上。传统路线里最常用的是SVM和随机森林。SVM的核心思想是找到一个超平面让两类样本的间隔最大化。对于线性不可分的数据它通过核函数RBF高斯核最常用把数据映射到高维空间在高维空间里寻找线性分割面。SVM在小样本、高维特征场景下有很好的泛化能力这正是传统特征比如HOG能产生几千维的特征向量再好不过的搭档。训练SVM时有两个关键参数惩罚系数C和RBF核的gamma。C控制对误分类样本的容忍度过大容易过拟合过小则欠拟合gamma控制RBF核的作用范围小gamma让决策边界平滑大gamma则容易拟合噪声。实操中我习惯用网格搜索配合交叉验证来调这两个参数。先用大范围粗搜锁定时圈再在小范围细搜。一个实用的调参技巧是让C和gamma在数量级上有交集比如C在0.1、1、10、100里选gamma在0.001、0.01、0.1、1里选这样可以覆盖大多数场景。随机森林则是由多棵决策树组成的集成模型每棵树基于随机采样的样本和随机选择的特征子集训练最终通过投票决定类别。它对特征量纲不敏感不需要做标准化能输出特征重要度得分这在我做特征筛选时非常有用还能天然处理多分类问题。调随机森林时主要关注树的棵树n_estimators和树的最大深度max_depth。n_estimators数值越大多样性越丰富但超过一定值后收益递减我通常设置在100到500之间max_depth设置过深容易过拟合一般限制在10到30层。还有一个常被忽略的参数min_samples_leaf叶节点最小样本数把它设为一个较小的值比如1到5能有效防止树生长得过深带来的过拟合。2.3 一个完整的传统分类流程实操以森林图像分类为例下面用一个示例来演示怎么把上述内容串成一个可用系统。这个流程我在森林覆盖类型分类项目里完整跑通过数据就是普通的光学遥感影像。预处理阶段把输入图像统一缩放到224x224像素转成HSV颜色空间。然后提取三种特征颜色特征使用HSV空间的颜色直方图H、S、V通道分别量化为16、8、8个bin拼接得到32维特征向量。纹理特征使用LBP以每个像素为中心、半径为1的8邻域计算LBP编码再把整张图的编码统计成64维直方图。形状特征使用HOG单尺度提取每张图得到3780维特征向量。三种特征拼接后生成约3876维的特征向量。这里要注意不同特征的量纲差异LBP直方图的值范围是0到1之间HOG特征的值范围也可能是0到1之间但SIFT特征实际很少参与这种简单拼接博主在实际森林项目中用的是颜色纹理形状三类传统特征SIFT多用于配准和匹配任务这里就不强行加入了。特征值范围差距过大会让SVM的RBF核受到量纲较大的特征主导。所以拼接前我会使用StandardScaler对每个特征维度做标准化让均值归零、方差归1。将标注好的样本随机划分成80%训练集和20%验证集。SVM采用RBF核通过5折交叉验证网格搜索最佳C和gamma参数。模型训练完成后用验证集评估精度。这个流程跑下来在几千张样本的森林分类任务上我通常能看到85%以上的准确率。而当我把同样的任务丢给一个随机初始化的CNN去训时几千张数据上精度反而可能只有70%出头因为小数据集上深度模型很容易过拟合。2.4 传统算法绕不开的瓶颈特征表达能力的土顶层传统算法最核心的瓶颈在于特征表达能力的天花板。不论你用多精巧的特征设计、多先进的编码方式人工特征能捕捉到的模式始终是有限的。以人脸识别为例传统特征LBP直方图、HOG特征能捕捉局部纹理和轮廓信息但对于姿态变化、表情变化、光照变化、遮挡这些复杂因素的综合影响靠人工设计特征来建模几乎不可能。深度学习能学习的特征层次更丰富——浅层学到边缘和纹理中层学到部件和结构深层学到全局语义模式——这种层次化的表达能力是传统算法不具备的。这个差异直接反映在精度上。在细粒度分类比如区分不同品种的花卉、森林里的不同树种、大规模分类比如ImageNet上千类、复杂场景分类这些任务上传统算法的精度天花板明显低于深度学习方法。所以当你的数据规模足够、精度要求又高时传统算法就应该被替换掉而不是死守不放。3. 深度学习图像分类模型的演进与实践3.1 CNN基础组件与信号流卷积核、池化、全连接、Softmax都在干什么深度学习图像分类的主力是卷积神经网络CNN。它的三个核心组件各有明确的职责。卷积层用一组可学习的卷积核在输入图像上滑动计算局部区域的加权和。这里的空间局部连接和权值共享机制让模型既保留了空间结构信息又大幅减少了参数量。卷积操作本质上是模板匹配浅层的卷积核学会检测边缘和颜色块深层的卷积核把低层特征组合成更复杂的目标部件。一个卷积核扫过图像后得到一张特征图多个卷积核就生成多张特征图代表从不同角度观察这个区域得到的结果。池化层的作用是降采样用池化窗口区域内最大值最大池化或平均值平均池化来替代整个区域。它减小了特征图尺寸扩大了感受野还提供了平移不变性。最大池化的实际效果相当于“检测到这个特征就增强响应”平均池化则更像“把局部特征做平滑”。主流模型多数偏向最大池化。全连接层把卷积输出的高维特征图展平成向量再与权重矩阵相乘映射到类别维度的输出。在分类任务中最后的输出层接入Softmax函数把网络输出的logits转成和为1的概率分布训练阶段与交叉熵损失配合使用让概率分布逐步逼近真实标签的独热编码。在网络设计上还有一个通用的特征提取器范式从输入到输出特征的通道数逐渐增加、空间尺寸逐渐减小。通道数增加意味着模型在同一位置学习到更丰富的信息比如分别对边缘、纹理、颜色响应空间尺寸减小则是因为高层特征是在更大感受野的范围内提取的整体语义信息。这个设计原则贯穿了从AlexNet到EfficientNet的所有经典模型。3.2 从LeNet到EfficientNet经典CNN架构的演进脉络与选型理由深度学习图像分类模型的演进就是不断处理“更深网络训不动、更宽网络加不动”这两个问题的历史。LeNet-5是鼻祖1998年由Yann LeCun提出用于手写数字识别。它只有5层网络但定下了卷积-池化-全连接的基础结构。AlexNet在2012年引入ReLU激活函数解决梯度消失、Dropout防止过拟合、GPU并行训练把深度学习的潜力展现给了全世界。VGG证明了增加网络深度确实能提升性能但16-19层已经是它最大的合理深度继续加深收益甚微。ResNet的核心创新是残差连接让网络不只学习原始映射而是学习输入与输出之间的残差。这让几十层甚至上百层的网络都能有效训练。从我的使用经验看ResNet50是性价比非常高的一个模型它平衡了精度、速度和显存占用。DenseNet让每一层都直接连接之前所有层加强了特征复用和梯度流动参数量比ResNet更少但显存占用更高。EfficientNet则通过神经架构搜索同时优化深度、宽度和分辨率在不改变计算量级别的条件下达到了极致的精度但实际部署时对工程实现要求比较高。做实际项目时我的选型逻辑很实在先考虑精度指标是否达标再看推理环境。移动端优先考虑MobileNet系列精度要求低但对尺寸和延迟有硬性限制服务器端且数据充足选ResNet系列做基准再考虑升级到EfficientNet或其他新结构。如果项目紧急直接从ImageNet预训练权重开始微调永远是收益最高的策略。3.3 Transformer架构的崛起ViT和Swin Transformer怎么理解Transformer原本是自然语言处理领域的结构2017年在《Attention Is All You Need》中被提出后开始向视觉领域扩张。它和CNN的核心区别在于CNN通过局部感受野的卷积核逐层提取特征Transformer则通过自注意力机制让每个像素都能直接与全局任意位置交互建模。Vision TransformerViT是整个视觉Transformer浪潮的起点2021年问世。它把图像分割成固定大小的patch比如16x16像素把每个patch线性映射为token向量再加上位置编码后输入标准Transformer编码器。思路非常直接但有两个实际问题一是需要大规模数据集训练因为自注意力缺乏CNN的归纳偏置在一个小数据集上容易欠拟合二是计算复杂度是$O(n^2)$对于高分辨率输入token数量过多会让显存爆炸。Swin Transformer是在ViT基础上的重要改进。它引入了层次化结构和窗口注意力机制只在窗口内部计算自注意力并通过窗口移位引入跨窗口信息交互。这样可以保持线性的计算复杂度也让模型能够作为通用的视觉骨干网络像CNN一样运用于分类、检测、分割等各类视觉任务。我的实际经验是如果只有几万张规模的数据且没有预训练权重ViT较难训好Swin Transformer由于引入了更接近CNN的层次归纳偏置相对容易收敛。但齐平数据集上表现优异的仍常常是预训练过的CNN模型。Transformer的真正优势要在大规模数据上才能完全体现。2021年之后还有ConvNeXt、RepLKNet这些把网络结构同构化的模型借鉴Transformer的思路改造CNN也取得了很强的效果。3.4 微调实战用CNN给花卉分类数据增强与超参数设置全流程下面以“用CNN给花卉分类”为例子记录一下我用预训练模型做微调的完整实操流程。数据准备每类100张花卉图片5个类别共500张。单类数据少所以数据增强必做。基础增强方案随机水平翻转、随机旋转正负15度、随机缩放裁剪0.8到1.0比例、亮度饱和度抖动。PyTorch里用torchvision.transforms组合这些操作即可。这里有一个很重要的原则增强操作不能改变图片的语义类别比如旋转角度过大、裁剪比例过小都会导致图像内容变模糊或无意义。网络选型与改造加载torchvision里在ImageNet预训练过的ResNet50把最后的全连接层替换成输出维度为5的新全连接层。加载预训练权重时除了最后一层之外的所有层参数固定不动即冻结骨干网络只训练新添加的全连接层。这样既能利用预训练模型学习到的通用视觉特征又能避免小数据集训练大网络引发的过拟合。训练超参数设置batch_size设为16原因是单卡显存有限且batch过大会让梯度更新次数减少、训练不稳定。优化器选择Adamlearning rate设为0.001。Adam自适应调节每个参数的学习率收敛更快对初始学习率的敏感度也较低适合微调场景。损失函数使用交叉熵损失这是多分类任务的标准选择。epoch数设置为20但每个epoch后在验证集上评估精确率并保存验证集精度最高的模型权重。如果连续5个epoch验证集精度不提升就停训练早停。这种方法可以有效防止后期过拟合。训练策略上我习惯分两个阶段第一阶段冻结骨干网络只训练分类头跑5个epoch第二阶段解冻骨干网络的最后几层比如ResNet50的layer4用更小的学习率0.0001再训10个epoch。这样既能让模型较快收敛到可用状态又能在精度上进一步提升。微调后的模型一般能在验证集上达到90%以上的准确率推理速度在GPU上单张不到10毫秒。这一套流程对大多数中小数据集场景都适用是我在项目中最常复用的基础方案。3.5 图像分类模型的最新趋势大模型、CLIP零样本分类与细分领域落地2021年之后的图像分类领域进入了一个新阶段。大模型和预训练-微调范式正在主导方向以CLIPContrastive Language-Image Pre-training为代表的模型通过在海量图文对上进行对比学习让模型学会了图片和文本之间的语义对齐。这意味着分类可以不再受固定标签类别的限制你想分什么类别你就输入“一张森林照片”“一片裸地的照片”模型会计算图片与这些文本描述的相似度直接输出预测结果这称为零样本分类。在这个范式下分类任务从“训练一个固定类别分类器”转变成了“定义类别语义并对比匹配”。这对于小样本、动态类别、开放场景比如森林监测中的地面物体识别有巨大的应用价值。另一个趋势是针对细分领域的落地。火灾烟雾图像分类、农作物病害分类、海洋垃圾识别、医疗影像分类等垂直场景中通常没有足够大的公开数据集支持从头训练大型模型所以主流的做法依然是使用在大数据集上预训练的通用模型然后在自建的小数据集上做微调。CLIP这类大模型在小规模的细分数据上微调也比从头训练CNN更容易取得好效果。从我的视角看未来图像分类的趋势有三个一是模型越来越大、越通用、越适合零样本和小样本场景二是传统CNN和Transformer的界限正在模糊出现了大量混合架构三是在落地层面部署和工程化的复杂度在不断简化但真正成功的关键依然是对数据质量和业务场景的理解。4. 传统与深度学习分类方法的对比与典型问题排查实录4.1 两种路线的核心性能差异对比维度传统算法特征描述子SVM/随机森林深度学习CNN/Transformer数据依赖程度每类几十到几百张即可数据量敏感度低每类上百张起步通常需要几万张以上才能发挥优势特征学习方式人工设计并提取自动从数据中学习可解释性较高特征物理含义清晰较低难解释模型内部逻辑计算资源需求低CPU即可流畅运行高GPU训练几乎是刚需推理速度快毫秒级相对较慢受模型规模影响大精度上限中低水平受限于特征表达高大数据条件下接近甚至超过人类水平部署难度低依赖库少模型文件小相对较高需要框架和推理优化适合任务样本少、算力弱、可解释性要求高数据充分、算力充足、精度优先这个表格想表达的核心信息是你不是要找到“最好”的算法而是要找到“最合适”的算法。把客户的硬件条件、数据规模、精度要求摊开在桌面上答案常常一目了然。4.2 传统算法项目中的常见坑与解决方案传统算法方案在落地时常碰到几个固定问题分享出来供各位参考。光照变化导致精度骤降。颜色直方图对光照极其敏感同一片林子晴天和阴天的色调差异就可能让直方图分布完全不同。解决办法是优先在HSV空间提取特征、在训练数据中加入光照变化增强样本亮度扰动、对比度扰动等。特征维度高但样本数量不足导致过拟合。几千维特征配上几百个样本SVM很容易学出适应训练集却不会泛化的边界。此时有两个常用手段一是用主成分分析PCA把特征降到几十或上百维二是用随机森林的特征重要度做筛选只保留贡献最大的特征维度。两者结合效果更佳。不同来源的图像尺寸、分辨率差异大。训练集是224x224的截图线上来的是1920x1080的原图算出的HOG或者LBP特征分布会完全不同。我开始做项目时吃过亏后来总结的教训是一定要根据实际部署场景来预处理输入图像统一缩放和颜色归一化。类别分布严重不均衡。例如森林图像分类中“森林”类的样本数量远超“稀疏林地”模型会倾向于把什么都判成森林。行业常规做法是采用类别权重class_weight给少数类更高的惩罚权重或者使用SMOTE等过采样方法合成少数类的特征向量。4.3 深度学习项目中的常见坑与排查技巧深度学习的坑一个比一个隐蔽这里挑几个我最常遇到的展开讲。训练集精度高但验证集精度低典型的过拟合。解决从简到繁的手段是增加数据增强、增大Dropout比率比如0.2提到0.5、减缩模型规模或减小输入分辨率、早停。注意不要一上来就怀疑模型结构先排查数据层面的问题。验证集精度即使好但测试时线上效果差。原因大概率是训练集和线上实际数据分布不一致数据分布漂移。解决方案是收集尽可能接近真实线上场景的数据并在预处理阶段保持完全一致。训练不收敛loss震荡不降。先检查数据是否正常标签和图像是否对应、学习率是否过大用2e-3、1e-3、5e-4、1e-4逐档调试、输入图像是否归一化一般按ImageNet的mean和std归一化。这些顺序是最符合排查逻辑的。类别不平衡问题。深度模型对多数的偏向比传统算法更严重因为模型在每一批mini-batch里就接触到严重失衡的类别分布。常用手段有加权采样每个batch内保证各类别的均衡比例、Focal Loss让模型专注于难样本。调试的思路本质上都是一样的先做最小化复现把模型的单batch过拟合作为第一步验证然后逐步加复杂度直到在完整训练集上复现出训练损失收敛再调验证集的最终表现最后做线上的性能测试。这套流程能定位绝大多数问题。4.4 两条路线结合使用的场景从传统特征到深度特征的混合方案在实战中我发现有一种混合方案很有实用价值用深度学习模型提取特征再用传统分类器分类。这个流程是用在大数据集上预训练好的CNN模型去掉最后的全连接层把倒数第二层的输出当作一个高维特征向量比如ResNet50在ImageNet上预训练后倒数第二层会输出2048维特征。对传统特征提取得到的向量做标准化后再投入SVM或者随机森林做分类。这种做法的优势在两个维度特别明显一是保留深度特征的强表达能力因为CNN特征提取时已经把图像语义知识编码进去了二是引入SVM在小样本上良好的泛化能力、对高维特征的处理能力。而且这类模型部署时非常轻量保存一个几百KB到几MB的SVM模型就足够了推理速度快还不需要为DL推理准备独立的运行环境。在制造业质检系统里我多次用过这种方案。因为线上设备性能有限同时客户又对精度有较高要求传统特征加SVM的精度不达标而端到端CNN的推理速度又不能满足节拍要求。折中方案就是用CNN提取特征再用SVM分类同时满足精度和速度两个硬指标。这个思路的核心启发是把特征提取和分类决策两个环节解耦就能更灵活地压缩部署成本、适配更复杂的业务约束。5. 实际项目技术选型与迁移扩展建议5.1 新项目启动时的决策流程和小数据集实战建议新项目启动时我建议按下面的流程做算法选型能在决策阶段避免很多后期麻烦。第一步是做数据审计。统计已有效样本数量、每个类别分布、图像分辨率、来源场景多样性。把两个数字写下来目前有多少样本、预计一小段时间后能扩到多少样本。这是所有后续决策的地基。第二步是做资源评估。训练阶段能不能用GPU是自购服务器还是用云端部署阶段是服务器还是边缘设备CPU是多少核的内存多大延迟上限是多少第三步是跑一个快速基线测试。用传统算法比如HSV颜色直方图加SVM不管数据规模如何先跑一个基线记录训练时间和验证精度。同时加载一个ImageNet预训练的ResNet50冻结骨干网络只训练最后的分类头也记录结果。两个基线横向对比就能看出如果数据量很少传统基线不一定差如果预训练模型微调的效果显著更好就优先考虑深度方案。第四步是定方案、做迭代计划。确定主方案后再留一个备选方案投入人力之前先想好防脱策略。如果是小数据集且还没法拉更多标注我的经验是这些措施非常有效优先用预训练模型微调而不是从头训练以小规模的数据增强为常规配置必要时用类别权重或少数类过采样来应对不平衡数据评估时用分层K折交叉验证而不是一次性的固定验证集结果更可靠、也更抗噪。5.2 对VGG、ResNet、Inception、EfficientNet、ViT等模型实际应用的横向建议针对不同模型在实际应用中的行为我来做一个经验型的补充说明方便读者有一个直接的判断框架。VGG系列VGG16、VGG19结构简单、思路朴素但参数量大VGG16约为1.38亿参数、计算量大。如果项目没有硬性精度要求且设备资源充足拿它做基准模型比较合适因为它最容易解释和调试。否则不推荐用它做产品级方案性价比偏低。ResNet系列ResNet50、ResNet101这是当前工业界最常用的一类骨干网络。ResNet50各方面均衡几乎可以看作“图像分类的默认选择”。无论是训练时间、精度、显存占用还是微调稳定性都非常可预期。我的建议是不确定选择的时候就选ResNet50。Inception系列InceptionV3、InceptionResNetV2用多种尺度的卷积核并行提取特征在图像尺寸变化大时有优势。但它结构相对复杂工程实现和导出部署时不如ResNet全家桶顺手维护成本更高。现代项目里它的使用频率逐渐下降了。EfficientNet系列精度高而且提出了Google刷精度常用的复合缩放策略但在推理优化和部署上有一些工程壁垒其有些算子比如swish激活函数、SE模块在端侧或老式硬件上未必支持得很好。服务器端且版本也支持到位的情况下值得用否则建议慎重。ViT系列ViT、Swin Transformer适合数据量在十万级以上的任务或已经有足够规模的预训练模型的迁移微调场景。Swin还具备通用骨干特性在检测、分割任务里很容易替换其他模型。小数据量下直接上手ViT效果很可能不如ResNet50。5.3 从分类任务向外扩展检测、分割、检索与多模态的思路图像分类是很多视觉任务的基础单元。当一个项目里基础的分类能力已经稳定之后最常见的扩展方向有四类目标检测是在整张图上定位目标并给出类别。技术上最常用的是两阶段Faster R-CNN为代表和单阶段YOLO系列为代表模型。如果分类任务已经成功可以把分类器输出的深层特征导向检测头把分类网络做成检测模型的骨干网络这是比较自然的演进路径。语义分割是对每个像素做类别预测效果上更精细。主打模型是U-Net系列和DeepLab系列。分类网络ResNet等常被用作编码器部分说明分类能力本质上可以被当作更好的特征提取器。图像检索解决的是“找相似图像”的问题相比分类更灵活。常用做法是提取图像特征深度学习模型的embedding向量把检索转化为向量距离计算如余弦相似度。在度量学习范式下分类任务可以和检索任务同时优化、共同提升。多模态分类是整个领域最前沿的趋势不再只输入图像而是同时接收图像、文本、语音等多模态的数据让模型学习不同模态之间的语义关系。CLIP这类模型就是典型代表——它通过图像和文本的对比学习实现了跨模态的语义对齐在进行分类任务时可以直接用文本定义类别样本效率比传统监督学习高出不少。5.4 数据标注规范与模型迭代的工程化管理一条完整的技术方案需要工程化的管理流程才能走稳。数据标注是被低估的一环直接决定模型质量上限。标注规范的核心是“标注者之间的一致性”。多个人标注同一个类别时意见不能出现明显分歧。我在项目初期都会做标注基准测试让标注员独立标注同一批抽样数据算出方差再和项目成员共同评审修正标注标准。一个团队在不同阶段标注出来的同一个类一致性差的话模型学到的东西都是混乱的。模型迭代应当走版本化管理每个模型版本记录训练代码、数据版本从哪一刻开始拉的原始数据、数据增强方式、超参数配置、评估指标、训练日志。这一步能换来完全可溯源、可复现的实验链条——什么改动提升了精度、什么改动反而造成下降有记录才不会重蹈覆辙。模型上线之后需要关注漂移监控。如果线上输入的数据分布发生了变化比如森林图像的拍摄季节变化带来的光照或者相机设备换了导致色温不同模型的精度会逐步下降。最实际的做法是周期性地从新输入数据里抽样做人工评估一旦精度不达标就触发重新标注、微调的流程。这套机制我在多个长期运营的项目里用过很有效。还有一个小技巧值得分享把测试集做得“脏”一点。不要只放干净的正规图放一些带模糊、遮挡、反转、压缩噪声的困难样本进去。这个困难测试集能直接反映模型在实际场景里的鲁棒性比你一个劲优化干净测试集上的精度有用得多。结尾我做了这么多年图像分类项目有个体会特别深技术选型这件事很多时候不是选择更好的模型而是选择更适合场景和资源的方案。传统算法不是落后的代名词在算力受限、样本有限、要求可解释的场景里它依然能扛大梁深度学习也不是万能药数据不足、硬件跟不上就硬上反而会陷入调参泥潭。最后再分享个小技巧不管走哪条技术路线先跑一个“最朴素版本”的基线都错不了。传统算法花半小时写个颜色直方图加SVM或者深度学习加载一个预训练ResNet跑一下。这个基线的意义在于让你对当前数据的难点建立直觉——如果连强表达能力的模型都跑不动那问题大概率出在数据上而不是模型上。有了这个基线后续调优和换方案都会明确很多。图像分类这条路说到底拼的是对数据的理解不是对模型的迷信。
返回列表