前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >预备AI工程师升级必备:大厂常见图像分类面试题

预备AI工程师升级必备:大厂常见图像分类面试题

作者头像
黄博的机器学习圈子
发布2020-10-30 11:32:59
6530
发布2020-10-30 11:32:59
举报

图像分类是深度学习计算机视觉技术中极其重要的应用场景和技术基础,图像检测、语义分割等等各种任务场景都需要基于图像分类的基础能力。也是大家入门深度学习CV方向任务开发极好的切入点。

针对如此关键的图像分类任务,飞桨PaddleClas团队提炼、总结了在开发过程中常遇到的问题和一些巧妙的开发技巧(Trick),希望能帮助开发者更快、更好地获得最佳的模型及应用效果。这门武功秘笈分为四篇:《基础知识》、《模型训练》、《数据大法》和《模型推理预测》,本文节选了其中10个小技巧,供各位大侠使用。

基础知识篇

Q1:

图像分类领域常用的评估指标有哪几种?

A:

场景一:对于单标签的图像分类问题(仅包含1个类别与背景),评估指标主要有Precision、Recall和F-score等。

计算公式:

  • Precision = TP / (TP + FP)
  • Recall = TP / (TP + FN)
  • F-score = 2×Precision×Recall / ( Precision + Recall)

其中,TP(True Positive)表示将正类预测为正类;FP(False Positive)表示将负类预测为正类;TN(True Negative)表示将负类预测为负类;FN(False Negative)表示将正类预测为负类。

我们以一个例子来说明TP、FP、TN、FN(故事纯属虚构,如有雷同……)

富土康流水线三号质检员张全蛋和赵铁柱同时追求李小花的事儿在厂内闹得沸沸扬扬,小花同志要如何选择呢?思来想去,小花决定考验一下他们的看家本领。

李小花找来100个产品,已知有20个次品,80个良品,让全蛋和铁柱将里面的次品挑选出来,谁的结果令小花满意,小花就和谁处对象。结果全蛋挑选出50个他认为的次品,而实际情况是这50个里面,只有20个次品,剩余30个是良品;铁柱挑选出了10个次品,而实际情况是这10个全部是次品。谁的技能更强一些呢?

小花委托相关部门用图像分类的统计指标计算了一下。

张全蛋的数据统计结果

计算结果:

Precision=0.4,Recall=1,F-score =0.57

赵铁柱的数据统计结果

计算结果:

Precision=1,Recall=0.5,F-score=0.66

从数据统计结果看,虽然铁柱的F-score分值高于全蛋,但是全蛋的Recall却高于铁柱。最终,小花选择了全蛋。小花说,作为手机质检流水线的质检员,必须保证不能有一个坏的手机流向市场,允许有误检、但是不能有漏检的情况。于是乎幸福的全蛋抱得美人归了。

场景二:对于类别数大于1的图像分类问题,评估指标主要有Accuary和Class-wise Accuracy。

  • Accuary表示所有类别预测正确的图像数量占总图像数量的百分比;
  • Class-wise Accuracy是先对每个类别的图像计算Accuracy,再对所有类别的Accuracy取平均。

Q2:针对不同的业务场景,如何选择合适的模型进行训练?

A:

说到选择,很多人会有选择困难症,而究其原因,往往就是“穷“。当手里只有一两个模型的时候,选择什么都一样。但当你拥有PaddleClas就不一样了,它有24个系列模型,122个预训练模型。

如果想在服务器端部署,推荐使用ResNet_vd、Res2Net_vd、DenseNet、Xception等适合于服务器端的系列模型;如果想在移动端侧部署,则推荐使用MobileNetV3、GhostNet等适合于移动端的系列模型。下面两张图分别给出了服务端系列模型在T4 GPU上,以及移动端模型在骁龙855芯片上的精度-速度指标,在模型选取时,可以参考。

Q3:

针对深度神经网络参数冗余的问题,目前有哪些比较好的解决方式?

A:

可以通过剪枝、量化、知识蒸馏等方法对模型进行压缩,减少模型参数冗余。

  • 模型剪枝:将权重矩阵中相对不重要的权值剔除,然后再重新对网络进行微调;
  • 模型量化:一种将浮点计算转成低比特定点计算的技术,如:8 bit、4 bit等,可以有效的模型在推理过程中的计算复杂度,提高推理速度,降低推理计算的能耗。
  • 知识蒸馏:使用教师模型(teacher model)去指导学生模型(student model)学习特定任务,保证小模型在参数量不变的情况下,性能有较大的提升,甚至获得与大模型相似的精度指标。PaddleClas提供了一种简单的知识蒸馏策略(Simple Semi-supervised Label Distillation, SSLD),基于ImageNet-1k验证集,不同模型经过SSLD蒸馏均有3%以上的精度提升,更多细节可以参考SSLD知识蒸馏文档: https://github.com/PaddlePaddle/PaddleClas/blob/master/docs/zh_CN/advanced_tutorials/distillation/distillation.md

模型训练篇

Q1:

在目标检测、图像分割、关键点检测等任务中,如何选择合适的分类网络做为骨干网络?

A:

1. 在不考虑速度的情况下,对于大部分任务,推荐使用精度更高的预训练模型和骨干网络。PaddleClas开源了一系列的SSLD知识蒸馏预训练模型,如ResNet50_vd_ssld、 Res2Net200_vd_26w_4s_ssld等,在模型精度和速度上非常有优势;

2. 对于一些特定的任务,如图像分割、关键点检测等,对图像分辨率的要求比较高,更推荐使用HRNet等能够同时兼顾网络深度和分辨率的神经网络模型。PaddleClas提供了HRNet_W18_C_ssld、HRNet_W48_C_ssld等精度非常高的HRNet SSLD蒸馏系列预训练模型。

大家可以使用这些精度更高的预训练模型与骨干网络,提升自己在其他任务上的模型精度。

Q2:

训练过程中模型收敛很差,如何处理?

A:

建议您通过如下几个维度进行检查:

  • 检查数据标注,确保训练集和验证集的数据标注正确;
  • 尝试调整学习率(初期以10倍为单位进行调节),过大(训练震荡)或者过小(收敛太慢)的学习率都可能导致收敛效果差;
  • 数据量太大,选择的模型太小,难以学习所有数据的特征;
  • 查看数据预处理的过程中是否使用了归一化,如果没有,会影响收敛速度;
  • 如果数据量比较小,可以尝试加载PaddleClas中提供的基于ImageNet-1k数据集的预训练模型,可以大大提升训练收敛速度;
  • 数据集存在长尾问题,可以参考数据长尾问题解决方案。https://github.com/PaddlePaddle/PaddleClas/blob/master/docs/zh_CN/faq.md#jump

Q3:

在模型训练中,如何选择合适的batch size?

A:

batch size是训练神经网络中的一个重要的超参数,该值决定了一次将多少数据送入神经网络参与训练。当batch size与学习率的值呈线性关系时,收敛精度几乎不受影响。在基于ImageNet-1k数据集训练神经网络模型时,大部分的神经网络选择的初始学习率为0.1,batch size是256。在实际任务中,可以根据模型大小和显存情况,将学习率设置为0.1k,batch_size设置为256k,并通过不断调节学习率参数以获得更优的性能。

Q4:在模型训练过程中,有哪些调优的技巧?

A:

在模型训练的过程中,通常会打印每一个epoch的训练集准确率和验证集准确率,二者刻画了该模型在两个数据集上的表现。

通常来说,训练集的准确率比验证集准确率微高或者二者相当是比较不错的状态。如果发现训练集的准确率比验证集高很多,说明在这个任务上已经过拟合,需要在训练过程中加入更多的正则,如增大weight_decay的值、加入更多的数据增广策略、加入label_smoothing策略等;如果发现训练集的准确率比验证集低一些,说明在这个任务上可能欠拟合,需要在训练过程中减弱正则效果,如减小weight_decay的值、减少数据增广方式、增大图片RandomCrop区域面积、减弱图片拉伸变换、去除label_smoothing等。

在PaddleClas中,可以很方便地在配置文件中对上面的参数进行配置,如下代码。

代码语言:javascript
复制
use_mix: True # 是否使用混叠类数据增广
ls_epsilon: 0.1 # label smoothing的epsilon值,该值不在(0,1)区间或者为None表示不使用label smoothing

OPTIMIZER:
    function: 'Momentum'
    params:
        momentum: 0.9
    regularizer:
        function: 'L2'
        factor: 0.000070 # weight_decay的值

TRAIN:
    transforms:
        - DecodeImage: # 读入图像并转为RGB通道
            to_rgb: True
            to_np: False
            channel_first: False
        - RandCropImage: # 随机裁剪
            size: 224
            scale: [0.08, 1.0] # RandomCrop的区域面积比例范围
        - RandFlipImage: # 随机水平翻转
            flip_code: 1
        - AutoAugment: # 使用自动增广方式进行数据增广(图像变换类)
        - NormalizeImage: # 对图像进行归一化
            scale: 1./255.
            mean: [0.485, 0.456, 0.406]
            std: [0.229, 0.224, 0.225]
            order: ''
        - RandomErasing: # 使用随机擦除的方法进行数据增广(图像裁剪类)
              EPSILON: 0.5
              sl: 0.02
              sh: 0.4
              r1: 0.3                                     
              mean: [0., 0., 0.]
        - ToCHWImage:
    mix: # Mixup数据增广,在use_mix设置为True时有效(图像混叠类)
        - MixupOperator:    
            alpha: 0.2 # Mixup的超参数配置

数据大法篇

Q1:

在数据不足的情况下,有哪些常见的数据增广方法呢?

A:

数据增广的目的是提升数据样本的丰富度,PaddleClas将比较常见的数据增广方法分为三大类:

  • 图像变换类:主要包括AutoAugment和RandAugment;
  • 图像裁剪类:主要包括CutOut、RandErasing、HideAndSeek和GridMask;
  • 图像混叠类:主要包括Mixup和Cutmix。

图:数据增广的可视化效果

更多数据增广介绍可参考:PaddleClas教程→数据增广。

https://github.com/PaddlePaddle/PaddleClas/blob/master/docs/zh_CN/advanced_tutorials/image_augmentation/ImageAugment.md

Q2:

对于精度要求不是很高的图像分类任务,需要准备多大的训练数据集呢?

A

训练数据的数量往往和需要解决问题的复杂度有关,难度越大、精度要求越高,则数据集需求越大。通常情况下,训练数据越多效果越好,但实际应用时,数据获取往往比较困难,因此PaddleClas提供了一系列的预训练模型,以降低用户在自己的场景中,使用图像分类模型时对数据的依赖。

  • 如果您已经加载了PaddleClas中提供的预训练模型,每个类别包括10-20张图像即可保证基本的分类效果;
  • 如果您没有加载预训练模型,每个类别需要至少包含100~200张图像以保证基本的分类效果。

模型推理篇

Q1:

有哪些合适的预测方法可以进一步提升模型精度呢?

A:

PaddleClas在预测环节提供了多种提升模型精度方案,供开发者选用。

  • 使用更大的预测尺度,比如说训练时使用的是224,那么预测时可以考虑使用288或者320,这会直接带来0.5%左右的精度提升;
  • 使用测试时增广的策略(Test Time Augmentation, TTA),将测试集通过旋转、翻转、颜色变换等策略,创建多个副本,并分别预测,最后将所有的预测结果进行融合,这可以大大提升预测结果的精度和鲁棒性;
  • 使用多模型融合的策略,将多个模型针对相同图片的预测结果进行融合。

如果您在使用PaddleClas的遇到问题时,欢迎移步到ISSUE提问,有丰富经验的飞桨资深工程师会及时帮你解决。

PaddleClas项目地址:(欢迎大家点Star支持!)

https://github.com/PaddlePaddle/PaddleClas

https://gitee.com/paddlepaddle/PaddleClas

如果您想详细了解更多飞桨的相关内容,请参阅以下文档。

·飞桨开源框架项目地址·

GitHub:

https://github.com/PaddlePaddle/Paddle

Gitee:

https://gitee.com/paddlepaddle/Paddle

·飞桨官网地址·

https://www.paddlepaddle.org.cn/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习初学者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档