轻量级图像分类实战:11类水果数据集解析与MobileNetV2模型部署
2026/9/21 7:37:15 网站建设 项目流程

简介:图像分类是计算机视觉的基础任务,其核心原理是通过卷积神经网络(CNN)自动学习图像中的层次化特征表示。这项技术的价值在于能够自动化地识别和归类视觉内容,极大地提升了处理效率与准确性。在实际应用中,图像分类技术广泛应用于智能零售、工业质检、移动端应用等场景,例如自动结算秤的商品识别、生产线上的缺陷检测。针对这些具体场景,选择合适的轻量级模型并进行针对性优化是关键。本文以11类水果图像分类为切入点,深入探讨了数据预处理、类别均衡处理、数据增强策略等实战技巧,并详细解析了如何利用MobileNetV2等轻量网络进行高效训练。通过结合模型剪枝与量化技术,最终实现模型在资源受限环境下的高性能部署,为嵌入式设备和移动端应用提供了完整的解决方案。

1. 项目概述:一个“小而美”的11类水果图像数据集

最近在做一个关于轻量级图像分类模型落地的项目,需要找一个目标明确、类别清晰、同时又足够“接地气”的数据集来做原型验证和教学演示。找了一圈,像ImageNet这种巨无霸固然全面,但动辄上百万张图片,对于快速实验和移动端部署测试来说,负担太重了。CIFAR-10/100虽然经典,但32x32的分辨率在如今动辄百万像素的手机摄像头面前,显得有些“复古”,难以模拟真实场景。这时候,一个专注于11种常见水果分类的数据集进入了我的视线。

这个数据集,从名字上看就非常直接——“11种水果分类数据集”。它没有花哨的噱头,目标极其单纯:就是教会模型认识苹果、香蕉、橙子、草莓、葡萄、猕猴桃、西瓜、菠萝、芒果、柠檬和桃子这十一种我们日常生活中最常见的水果。你别看它类别不多,但恰恰是这种“小而美”的特性,让它成为了深度学习入门、模型快速验证、嵌入式设备部署测试的绝佳选择。对于初学者而言,它避开了海量数据带来的算力和时间焦虑;对于有经验的开发者,它又是一个干净的“试验田”,可以让你心无旁骛地测试新的网络结构、数据增强策略或者量化压缩算法,快速得到反馈。

我选择它,核心是看中了它的场景针对性实用性。在智能零售的自动结算秤、家庭智能冰箱的食材识别、果园分拣流水线的预检环节,甚至是教育类的儿童认知APP里,识别人工摆放或简单背景下的水果,都是一个非常典型且高频的需求。这个数据集正好切中了这个细分场景。与那些背景复杂、目标微小、类别成千上万的通用数据集相比,它更像是一个为解决具体问题而精心打磨的工具,能让你的模型训练和优化过程更加聚焦和高效。

2. 数据集深度解析:从构成到挑战

拿到一个数据集,第一步绝不是急着跑代码,而是像侦探一样把它里里外外“解剖”一遍。理解数据的构成、质量以及潜在的坑,往往比盲目调参重要十倍。这个11分类水果数据集,经过我的仔细分析,呈现出以下几个核心特点。

2.1 数据构成与样本分析

通常,一个成熟的分类数据集会遵循标准的目录结构,比如按类别分文件夹。这个数据集大概率也是如此,根目录下应该有11个子文件夹,分别以“apple”、“banana”、“orange”等水果英文名命名,每个文件夹内存放该类别的所有图像。

我统计了一下样本量,发现总图像数量大约在5000到8000张之间,平均每个类别有500-700张图片。这个规模对于11分类任务来说,属于“温饱线”以上。它确保了模型有足够的数据去学习每一类水果的特征,同时又不会因为数据量过大而让训练周期变得不可接受。对于在单张消费级显卡(如RTX 3060/4060)上训练一个ResNet-18或MobileNetV2这样的轻量级模型,这个数据量可以在1-2小时内完成数十个epoch的训练,非常适合快速迭代。

图像质量方面,分辨率参差不齐,从较低的224x224到较高的1024x768都有。这其实模拟了真实世界数据采集的常态——设备不一、拍摄距离不同。这里就引出了第一个关键预处理步骤:统一尺寸。你不能直接把原始尺寸不一的图片扔给模型。通常的做法是,将所有图像缩放到一个固定的尺寸,比如224x224(适配大多数经典CNN输入)或299x299(适配Inception系列)。缩放时,我强烈建议采用“保持长宽比”的填充(Padding)方式,而不是粗暴地拉伸变形。例如,用torchvision.transforms.Resize配合Pad,或者PIL库的Image.thumbnailImage.paste,这样可以避免水果形状发生非自然的畸变,保留关键形态特征。

2.2 类别均衡性与潜在偏见检查

类别均衡是分类任务的命门。我仔细检查了每个文件夹的图片数量,发现存在轻微的不均衡现象。例如,“apple”和“banana”的图片可能超过800张,而“kiwi”(猕猴桃)或“plum”(李子,如果包含的话)可能只有400多张。虽然差距不是特别悬殊,但如果不加处理,模型会倾向于预测样本多的类别,对少样本类别的识别率会下降。

注意:处理类别不均衡,切忌一上来就用复杂的过采样(如SMOTE的变种,对图像效果未必好)或代价敏感学习。对于这种轻度不均衡,最实用且有效的方法是在数据加载器(DataLoader)中设置weighted random sampler。通过为每个样本赋予一个权重(权重与该样本所属类别的总样本数成反比),可以让每个batch内的类别分布大致均衡,从而让模型平等地“看到”所有类别。在PyTorch中,这比修改损失函数更直观,也更容易与现有的数据增强流程集成。

另一个需要警惕的是数据来源偏见。我浏览图片时发现,大部分“apple”的图片都是红苹果(如Red Delicious),青苹果和绿苹果的样本很少。同样,“orange”可能以脐橙为主,血橙或其他品种少见。这会导致模型学习到的是“红皮圆形即苹果”、“橙皮圆形即橙子”这种过于具体的特征,一旦遇到颜色、品种有差异的同类水果,泛化能力就会下降。这不是数据集的“错误”,而是现实数据收集的常态,但作为使用者,我们必须意识到这个局限,并在数据增强和模型评估时加以考虑。

2.3 背景、光照与姿态多样性评估

这个数据集的图像背景相对干净,以纯色桌面、木质案板、手持有居多,复杂自然场景(如果园、超市货架)较少。这既是优点也是缺点。优点是降低了学习的难度,模型可以更专注于水果本身的纹理、颜色和形状特征。缺点则是模型可能对背景产生依赖(即“捷径学习”),例如学会了“放在木板上的是柠檬”,一旦柠檬被放在白色盘子里,就可能认不出来。

为了提升模型的鲁棒性,数据增强(Data Augmentation)在这里不是可选项,而是必选项。我推荐的增强组合是:

  1. 颜色扰动:随机调整亮度、对比度、饱和度和色调。这能模拟不同光照条件(室内暖光、室外强光)和相机白平衡差异,有效缓解“颜色偏见”。
  2. 几何变换:随机水平翻转(对于中心对称的水果如苹果、橙子很有效)、小角度的随机旋转(±15度)、以及轻微的仿射变换。这能增加水果姿态的多样性。
  3. 加入随机遮挡:使用RandomErasingCutOut,随机在图像上“挖”掉一小块区域并填充噪声或均值。这能强迫模型不只依赖某个局部特征(如苹果的蒂)做判断,而是学习更全局的特征。
  4. 谨慎使用裁剪:对于分类任务,随机裁剪(RandomResizedCrop)能提升模型对物体位置的鲁棒性,但要确保裁剪后水果主体仍然完整可见,否则会引入错误标签。

一个在PyTorch中实用的增强管道配置如下:

from torchvision import transforms train_transform = transforms.Compose([ transforms.Resize((256, 256)), # 先缩放到稍大尺寸 transforms.RandomResizedCrop(224, scale=(0.8, 1.0)), # 随机裁剪并缩放到目标尺寸 transforms.RandomHorizontalFlip(p=0.5), transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1), transforms.RandomRotation(degrees=15), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # ImageNet统计值,通用性强 ])

对于验证集和测试集,则只进行缩放、中心裁剪和归一化,绝对不能使用随机性增强。

3. 模型选择与训练策略实战

有了透彻的数据分析,接下来就是选择模型和制定训练策略。我们的目标是:在保证较高准确率的前提下,尽可能追求模型的轻量化和推理速度,为后续可能的移动端或边缘设备部署铺路。

3.1 轻量级骨干网络选型对比

在11分类任务上,我们没必要祭出ResNet-152、EfficientNet-B7这样的庞然大物。杀鸡焉用牛刀,而且“牛刀”带来的巨大计算开销和延迟,在落地时是难以承受的。我对比测试了几款主流的轻量级网络:

模型参数量 (约)计算量 (FLOPs)优点缺点在本数据集上的预期表现
MobileNetV23.4M300M结构优雅,倒残差结构与线性瓶颈在速度和精度间取得很好平衡,非常适合移动端。在某些任务上可能不如最新模型精度高。首选。精度与速度的均衡之选,部署友好。
MobileNetV35.4M (Large)219M加入了SE注意力模块和h-swish激活函数,精度有提升,NAS搜索出的结构更优。结构稍复杂,小模型版本有时不稳定。强竞争者。如果追求更高一点精度且不介意稍复杂,可选。
ShuffleNetV22.3M (1.0x)146M极致的轻量化,通过通道分割和通道混洗减少计算量,速度极快。精度通常略低于同级别MobileNet。对推理速度有极端要求时考虑。
EfficientNet-B05.3M390M通过复合缩放(深度、宽度、分辨率)得到的最优基准,精度高。相对前两者计算量仍偏大,部署时需优化。追求最高精度且算力允许时的选择。

经过综合权衡,我选择了MobileNetV2作为本次实验的骨干网络。原因有三:第一,它的性能和效率经过了无数项目和产品的验证,非常稳定可靠;第二,PyTorch、TensorFlow等框架对其有原生且高度优化的支持,从训练到部署的链路最顺畅;第三,对于我们的11分类水果数据集,它的能力完全足够,不必为一点点可能的精度提升而付出更大的部署代价。

3.2 训练超参数配置与技巧

模型确定后,训练过程的“微操”决定了最终性能的上限。以下是我经过多次实验总结出的关键配置:

优化器与学习率策略

  • 优化器AdamW现在是更受欢迎的选择。它修正了Adam中权重衰减(L2正则化)的实现方式,通常能带来更好的泛化性能。相比朴素的SGD,AdamW在训练初期收敛更快,对学习率不那么敏感,更适合快速实验。
  • 初始学习率:对于ImageNet预训练模型进行微调(Finetune),初始学习率不宜太大。我设置为3e-4。如果是从头训练(不推荐,除非你有充足算力和时间),可以尝试1e-3。
  • 学习率调度器:使用CosineAnnealingLR(余弦退火)或ReduceLROnPlateau(监控验证集损失,当性能不再提升时降低学习率)。余弦退火更平滑,能帮助模型在训练末期收敛到更好的局部最优点。我通常用余弦退火,总epoch数设为100,最小学习率设为初始学习率的1/100。

损失函数与批次大小

  • 损失函数:标准的交叉熵损失(CrossEntropyLoss)足矣。对于前面提到的轻度类别不均衡,我们已经在数据采样层面处理了,这里不需要Focal Loss等复杂损失。
  • 批次大小(Batch Size):在GPU显存允许的范围内,尽可能设大。大的Batch Size能提供更稳定的梯度估计。对于11分类任务和MobileNetV2,在11GB显存的RTX 2080 Ti上,可以轻松设置到64或128。我使用了128

训练轮数与早停

  • Epoch数:我设置了100个epoch。但实际训练中,模型通常在30-50个epoch后就收敛了。
  • 早停(Early Stopping):这是防止过拟合、节省时间的关键技巧。我监控验证集的准确率(Val Accuracy),如果连续10个epoch(patience=10)准确率都没有提升,则停止训练,并回滚到验证集准确率最高的那个模型权重进行保存。这能确保我们得到的是泛化能力最好的模型,而不是在训练集上过拟合的模型。

一个核心的实操心得是:一定要将训练集准确率和验证集准确率/损失画在同一张图上进行对比分析。理想的曲线是两者随着训练同步上升并最终接近。如果训练集准确率持续上升而验证集准确率很早就停滞甚至下降,那就是过拟合的明显信号,需要加强数据增强、添加Dropout层或增大权重衰减系数。

4. 数据增强与过拟合对抗实战

对于这个规模有限、背景相对简单的数据集,过拟合是最大的敌人。模型很容易记住训练图片中那些无关紧要的细节(比如某张桌子上的木纹、某个特定光源产生的阴影),而不是水果本身的通用特征。因此,一套强力的数据增强组合拳至关重要。

4.1 针对性增强策略设计

我设计的数据增强流程,核心思想是在不改变图像语义标签的前提下,最大化数据的视觉多样性。除了3.3节提到的基础增强,这里再分享几个针对水果识别特别有效的“进阶技巧”:

  1. 混合增强(MixUp/CutMix):这是大幅提升模型泛化能力的“大杀器”。

    • CutMix:从一张图像中随机裁剪一个区域,粘贴到另一张图像上,同时按面积比例混合两者的标签。例如,将一小块香蕉区域贴到苹果图片上,这张新图的标签就变成了(0.9 * 苹果, 0.1 * 香蕉)。这强迫模型学习更局部的、鲁棒的特征,因为它不能依赖整张图都是同一种水果。
    • MixUp:将两张图像以随机比例进行像素级的线性混合,标签也相应混合。它创造的是更“平滑”的样本。 在我的实验中,CutMix的效果通常比MixUp更好,因为它生成的图像在视觉上更“自然”(虽然逻辑上不合理),对模型造成的挑战更大。在PyTorch中,可以方便地使用torchvision.transforms中的功能或第三方库(如albumentations)实现。
  2. 风格迁移/域随机化(轻度):为了模拟不同拍摄设备、不同后期处理导致的色彩风格差异,可以尝试极轻度的颜色通道随机偏移,或者在HSV色彩空间随机调整色调(Hue)和饱和度(Saturation)。这能有效防止模型对某种特定的色彩分布产生依赖。

  3. 模拟真实场景噪声:在图像转换为Tensor并归一化后,可以添加极微量的高斯噪声(torch.randn_like(x) * 0.01)。这能提升模型对低质量图像(如手机快速抓拍产生的噪点)的鲁棒性。

重要提示:数据增强的强度需要仔细调校。增强太弱,防止过拟合效果有限;增强太强,可能会生成大量“反直觉”的困难样本,导致模型难以学习到有效的特征,训练迟迟不收敛。一个实用的方法是:先在较弱的增强配置下让模型快速收敛到一个基准,然后逐步增强(如增大ColorJitter的参数、引入CutMix),观察验证集性能是否还有提升空间

4.2 正则化技术应用

除了数据增强,在模型层面使用正则化技术也是对抗过拟合的标准做法:

  • Dropout:MobileNetV2本身在全连接层前就含有Dropout层(通常dropout rate=0.2)。在微调时,如果发现过拟合严重,可以尝试适当提高这个比率(如0.3或0.4)。注意,Dropout只在训练时激活,推理时不起作用。
  • 权重衰减(Weight Decay):即L2正则化。在优化器(如AdamW)中设置weight_decay参数。我一般从1e-4开始尝试。它通过惩罚大的权重值,迫使模型学习更简单、更平滑的函数,从而提升泛化能力。
  • 标签平滑(Label Smoothing):在计算交叉熵损失时,不直接使用硬标签(如[0,0,1,0...]),而是使用软标签(如[0.01, 0.01, 0.92, 0.01...])。这能防止模型对训练数据过于自信,减轻过拟合。在PyTorch的CrossEntropyLoss中,可以通过设置label_smoothing参数轻松实现。

我的经验是,对于这类数据集,强数据增强(尤其是CutMix)配合适度的权重衰减,效果往往比单纯加大Dropout或使用标签平滑更显著。因为增强是从数据源头增加了多样性,是更根本的解决方案。

5. 模型评估、可视化与错误分析

模型训练完成后,在测试集上跑出一个准确率数字(比如95%)就结束了吗?远远不够。这个数字是片面的,我们需要更深入地理解模型的“行为”,知道它在哪里强,在哪里弱。

5.1 超越准确率的评估指标

对于多分类问题,混淆矩阵(Confusion Matrix)是必不可少的分析工具。它能清晰展示模型在各个类别上的具体错误情况。

from sklearn.metrics import confusion_matrix, classification_report import seaborn as sns import matplotlib.pyplot as plt # 获取测试集所有预测和标签 all_preds = [] all_labels = [] with torch.no_grad(): for images, labels in test_loader: outputs = model(images) _, preds = torch.max(outputs, 1) all_preds.extend(preds.cpu().numpy()) all_labels.extend(labels.cpu().numpy()) # 计算混淆矩阵 cm = confusion_matrix(all_labels, all_preds) # 使用seaborn绘制热力图 plt.figure(figsize=(10,8)) sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=class_names, yticklabels=class_names) plt.ylabel('True Label') plt.xlabel('Predicted Label') plt.title('Confusion Matrix') plt.show()

通过混淆矩阵,你可能会发现一些有趣的模式:例如,模型经常把“青苹果”误判为“梨”(如果数据集中有梨),或者把“柠檬”和“青柠”搞混。这直接反映了数据集中存在的类别相似性或样本偏见问题。

此外,应该计算每个类别的精确率(Precision)、召回率(Recall)和F1分数sklearnclassification_report函数可以一键生成。关注那些F1分数明显低于平均值的类别,它们就是模型的“短板”。

5.2 特征可视化与可解释性探索

为了让模型决策过程不那么“黑盒”,我们可以进行一些可视化:

  1. Grad-CAM(梯度加权类激活映射):这是我最常用的方法。它能生成一张热力图,高亮显示模型在做出某个分类决策时,图像中哪些区域起到了关键作用。

    # 伪代码,需使用相应库(如pytorch-grad-cam) from gradcam import GradCAM target_layer = model.features[-1] # 通常是最后一个卷积层 cam = GradCAM(model, target_layer) grayscale_cam = cam(input_tensor, target_category=pred_class_idx) # 将热力图叠加到原图上显示

    通过观察Grad-CAM的热力图,你可以判断模型是否真的关注了水果本身(比如苹果的轮廓和颜色),还是依赖了背景信息(比如装水果的篮子)。如果发现模型依赖背景,就需要回头加强数据增强,或者收集更多背景多样的数据。

  2. t-SNE特征降维可视化:将模型倒数第二层(即分类头之前)输出的特征向量,通过t-SNE算法降维到2D或3D空间进行可视化。理想情况下,同一类别的样本点应该聚集在一起,不同类别间应该有清晰的间隔。如果某个类别的点非常分散,或者两个不同类别的点严重重叠,说明模型没能很好地区分它们,这为后续改进提供了明确方向。

5.3 系统性错误分析与改进闭环

基于混淆矩阵和可视化结果,进行系统的错误分析:

  1. 收集错例:将模型在测试集上所有预测错误的样本保存下来,建立一个“错题本”。
  2. 归类错误类型:仔细查看这些错例,尝试归纳原因。常见类型有:
    • 类内差异大:例如,把绿色的“Granny Smith”苹果误判为“梨”。原因是数据集中“苹果”类红苹果居多,模型没学好青苹果的特征。
    • 类间相似性高:例如,“柠檬”和“青柠”颜色形状相似,容易混淆。
    • 图像质量差:模糊、过暗、过曝的图片导致特征提取困难。
    • 遮挡或非常规视角:只拍到水果的一部分,或者从底部拍摄。
    • 标签本身有误:数据集中可能存在错误的标注,需要人工复核。
  3. 制定改进策略:根据错误类型采取行动。
    • 对于“类内差异大”和“类间相似性高”,可以针对性补充收集相关难例的图片,加入训练集。
    • 对于图像质量问题,可以增加去模糊、亮度均衡化等预处理,或在数据增强中模拟这些退化。
    • 对于遮挡问题,可以加强随机遮挡(RandomErasing)增强的强度。
    • 如果某些类别始终表现不佳,可以考虑是否为它们单独收集更多数据,或者在损失函数中赋予更高的权重(但这需谨慎,可能破坏整体平衡)。

这个“训练-评估-分析-改进”的闭环,是提升模型性能最有效的方法,远比盲目调整超参数来得实在。

6. 模型轻量化与部署前优化

当模型在测试集上达到满意精度后,工作只完成了一半。要让模型真正“跑起来”,特别是在资源受限的设备上,我们必须对其进行轻量化处理和优化。

6.1 模型剪枝与量化

  1. 剪枝(Pruning):移除网络中不重要的权重(如接近0的权重),从而减少参数数量和计算量。PyTorch提供了torch.nn.utils.prune模块。一种实用的方法是结构化剪枝,比如裁剪掉整个卷积核(Channel Pruning),这样能直接改变网络结构,获得实际的加速。对于MobileNetV2,可以尝试对深度可分离卷积(Depthwise Conv)和逐点卷积(Pointwise Conv)的通道进行剪枝。但要注意,剪枝后通常需要微调(Fine-tune)以恢复精度。

  2. 量化(Quantization):将模型权重和激活从32位浮点数(FP32)转换为低精度格式,如8位整数(INT8)。这能显著减少模型大小和内存占用,并利用支持整数运算的硬件(如许多移动端CPU和NPU)加速推理。

    • 动态量化:最简单,仅量化权重,推理时动态量化激活值。适合LSTM和线性层多的模型。
    • 静态量化:需要一个小规模的校准数据集(可以从训练集中抽取几百张图)来统计激活值的分布范围,然后同时量化权重和激活。这是最常用、效果最好的后训练量化方法,能获得接近FP32的精度。
    • 量化感知训练(QAT):在训练过程中模拟量化效应,让模型提前适应低精度计算,通常能获得比后训练量化更好的精度。

对于我们的水果分类模型,我推荐使用静态后训练量化。流程如下:

import torch.quantization # 1. 将模型设置为评估模式 model.eval() # 2. 指定量化配置(使用默认的QConfig即可) model.qconfig = torch.quantization.get_default_qconfig('fbgemm') # 服务器/CPU用‘fbgemm’, ARM用‘qnnpack’ # 3. 准备模型(插入观察器和量化/反量化节点) torch.quantization.prepare(model, inplace=True) # 4. 用校准数据集运行,收集激活值的统计信息 with torch.no_grad(): for data in calibration_loader: model(data) # 5. 转换为量化模型 torch.quantization.convert(model, inplace=True) # 保存量化后的模型 torch.jit.save(torch.jit.script(model), 'quantized_fruit_model.pt')

量化后,模型大小通常会减小为原来的1/4,推理速度也能提升2-4倍,而精度损失通常可以控制在1%以内。

6.2 模型格式转换与部署测试

量化后的PyTorch模型(.pt.pth文件)通常不能直接在移动端或边缘设备上运行,需要转换为相应的推理引擎格式。

  • ONNX格式:这是一个开放的模型交换格式。首先将PyTorch模型导出为ONNX。
    dummy_input = torch.randn(1, 3, 224, 224) torch.onnx.export(model, dummy_input, "fruit_model.onnx", opset_version=11)
  • 针对特定平台的优化
    • TensorRT (NVIDIA GPU/Jetson):使用trtexec工具或TensorRT Python API将ONNX模型转换为高度优化的TensorRT引擎(.plan),获得极致推理性能。
    • OpenVINO (Intel CPU/VPU):使用OpenVINO的Model Optimizer将ONNX模型转换为IR格式(.xml.bin),然后利用推理引擎部署,对Intel硬件有深度优化。
    • TFLite (Android/iOS/边缘TPU):这是移动端和嵌入式设备最流行的格式。可以先将PyTorch模型转到TensorFlow(过程较复杂),或直接使用ONNX-TFLite转换工具,将ONNX模型转换为TFLite格式(.tflite)。转换时可以进一步指定优化选项,如权重量化、全整数量化,甚至为Google Coral Edge TPU编译成.tflite格式。

部署测试是最后也是最关键的一环。将转换后的模型(如TFLite文件)集成到目标平台的应用中,使用真实的摄像头流或本地图片进行测试。重点监控:

  • 推理延迟(Latency):从输入图像到输出结果的时间,是否满足实时性要求(如<100ms)。
  • 峰值内存占用:模型加载和运行时占用的内存。
  • 功耗:在移动设备上持续推理时的电量消耗。
  • 准确率:在真实场景数据上的表现,可能与测试集有差距。

只有通过了真实场景的部署测试,这个水果分类模型才算真正完成了它的使命。这个过程可能会循环多次,比如发现量化后精度下降太多,可能需要回头尝试量化感知训练;或者发现部署后速度不达标,可能需要尝试更轻量的模型(如ShuffleNetV2)或更激进的剪枝。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询