图像分类是深度学习计算机视觉技术中极其重要的应用场景和技术基础,图像检测、语义分割等等各种任务场景都需要基于图像分类的基础能力。也是大家入门深度学习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中,可以很方便地在配置文件中对上面的参数进行配置,如下代码。

use_mix: True # 是否使用混叠类数据增广
ls_epsilon: 0.1 # label smoothing的epsilon值,该值不在(0,1)区间或者为None表示不使用label smoothingOPTIMIZER:function: 'Momentum'params:momentum: 0.9regularizer:function: 'L2'factor: 0.000070 # weight_decay的值TRAIN:transforms:- DecodeImage: # 读入图像并转为RGB通道to_rgb: Trueto_np: Falsechannel_first: False- RandCropImage: # 随机裁剪size: 224scale: [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.5sl: 0.02sh: 0.4r1: 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

如在使用过程中有问题,可加入飞桨官方QQ群进行交流:1108045677。

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

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

GitHub: 

https://github.com/PaddlePaddle/Paddle 

Gitee: 

https://gitee.com/paddlepaddle/Paddle

·飞桨官网地址·

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

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

  1. 「面试必备」常见Java面试题大综合 马云见了都点赞

    一.Java基础 1.Arrays.sort实现原理和Collections.sort实现原理 答:Collections.sort方法底层会调用Arrays.sort方法,底层实现都是TimeSor ...

  2. 图像处理算法工程师——1必备技能总结——2面试题大全

    图像算法工程师三重境界 : 一.传统图像算法工程师:  主要涉及图形处理,包括形态学.图像质量.相机成像之3A算法.去雾处理.颜色空间转换.滤镜等,主要在安防公司或者机器视觉领域,包括缺陷检测: 二. ...

  3. AI工程师的自我修养

    原创:晏茜 资料来源:Lee AI 行业如今是一个炙手可热的行业,也许有一些正从事或曾经从事于其他行业的同学,希望能有一个更好的职业选择,而 AI 行业正如火如荼的发展,他们想加入 AI 发展的浪潮, ...

  4. 如何快速get到AI工程师面试重点,这12道题必备!

    作者 | JP Tech 译者 | 刘畅 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100) [导读]2020 年的三月春招要来了,现在想要 Get 一个算法工程师的实习或全职机 ...

  5. 6个月达不到25.6万年薪AI工程师,进不了大厂全额退款

    据新浪科技报道,阿里AI labs年薪百万美元引进两位科学家. 除AI顶尖科学家外,华为也是为多位AI应届博士开出了200万的高价年薪. LinkedIn发布的<全球 AI 领域人才报告> ...

  6. “我想进大厂做AI工程师”“你冷静一下”

    未来十年最紧缺职业的职业是什么,无论是中国的2025计划还是美国.德国的智能制造计划全部都指向一个目标:人工智能技术对应的人工智能工程师.由于人工智能发展时间短,技术门槛高,且难以通过短时间的学习掌握 ...

  7. 【转载】运维职业向!我是怎么入得运维行业?运维工程师入门必备技能以及打怪升级篇...

    前言:转载 陈浩一个从事安全运维向的前辈文章.写的很好.人非常nice,遇到了问题,qq上很快就回复了我. 大道三千 入门最难,凡事入了行,也就什么都好说了,好的自然不断努力奋斗修行,不好的自然很快就 ...

  8. 年薪40万AI工程师必备的能力项,你达标了吗?

    对人工智能而言,2017是不平凡的一年: AlphaGo再胜人类 腾讯宣布进军AI 百度无人驾驶汽车上五环 AI教育要从娃娃抓起 寒武纪成全球AI芯片首个独角兽 阿里巴巴成立达摩院 类人机器人Soph ...

  9. 《百面机器学习》---AI算法工程师求职必备“面经”

    [导读]今天给大家推荐一本人工智能算法工程师求职必备"面经" --百面机器学习(文末附pdf下载方式,限时领取哟!) 自2018年面世以来,该书现已成为机器学习算法工程师求职面试必 ...

最新文章

  1. java ordered list_关于并行处理:Java 8的forEachOrdered()和sequence()方法之间的区别?...
  2. Python的可视化包 – Matplotlib 2D图表(点图和线图,.柱状或饼状类型的图),3D图表(曲面图,散点图和柱状图)...
  3. 【数理知识】《矩阵论》方保镕老师-目录及关于符号的含义
  4. c 函数多次声明_C++核心准则C.132:不要没有理由就将函数声明为虚函数
  5. android自验签名证书,没有以前的互联网连接,无法验证Android自签名证书
  6. CSS日常公用样式与一些解决方案
  7. 正则表达式的\b与\B总结
  8. 转专业计算机c语言,转专业申请美国计算机专业研究生必须要做的准备
  9. Moss/Sharepoint:自定义 Oracle Membership
  10. mysql数据库优化语句_MySQL优化之三:SQL语句优化
  11. [Beta阶段]第十次Scrum Meeting
  12. luogu P3802 小魔女帕琪
  13. kis商贸系列加密服务器,金蝶KIS商贸系列V3.0发版说明教程.doc
  14. 杭州电子科技大学计算机学硕复试,2019杭州电子科技大学计算机软件考研复试手册.docx...
  15. 慧都MES系统怎么实施?有哪些注意事项?
  16. 推荐一款非常好用的鼠标手势软件StrokeIt
  17. Android 图片文件读取
  18. Android文字跑马灯简单实现的三种方法
  19. adb命令查看手机电池信息
  20. 代码对比工具:我最喜欢用的还是这几个

热门文章

  1. Ubuntu下利用Mono,Jexus搭建Asp.Net(MVC) Web服务器
  2. 游戏UI设计(1.2)--Textures Sprite之封装
  3. Binary classification - 聊聊评价指标的那些事儿【实战篇】
  4. 浮点数运算的精度问题:以js语言为例
  5. SAN,NAS区别的联系
  6. 我就是我,不一样的browser
  7. IOS atomic与nonatomic,assign,copy与retain的定义和区别
  8. Flash的层叠顺序问题(z-index)
  9. Oracle 启动监听命令
  10. 如何发表自己的第一篇SCI?