深度学习之图像分类

时间:2024-03-20 20:30:25

第一篇CSDN文章,写的不好,还请各位大佬指正。万事开头难,千里之行始于足下!

1.什么是图像分类

图像分类,核心是从给定的分类集合中给图像分配一个标签的任务。实际上,这意味着我们的任务是分析一个输入图像并返回一个将图像分类的标签。标签总是来自预定义的可能类别集。
示例:我们假定一个可能的类别集categories = {dog, cat, eagle},之后我们提供一张图片(图1)给分类系统:

深度学习之图像分类
图1 图像分类目标是根据输入图片且根据预定义类别分配标签

这里的目标是根据输入图像,从类别集中分配一个类别,这里为eagle,我们的分类系统也可以根据概率给图像分配多个标签,如eagle:95%,cat:4%,panda:1%。

2.图像分类和图像识别的区别

图像分类和图像识别这两个概念很容易搞混,很多做了几年视觉的人也搞不清它俩的区别,在此说明他俩的区别,让初学者少走弯路。
以人脸识别为例,假设一个班级里有20个人,用图像分类做来区分每个学生,可以采集20个人的人脸图片进行训练模型分类,但是如果班级新来一个同学,我们就需要采集新来同学的图像重新训练模型,预测的图像是把训练好的模型作为特征提取器给softmax分类器做分类;而图像识别是使用卷积网络训练大量人脸图像,训练好的模型作为特征提取器,预测的时候利用特征提取器和注册人脸图像计算相似度。

深度学习之图像分类

3.图像分类适合什么场景

图像中待分类物体是单一的,如上图(1),如果图像中包含多个目标物,如下图(2),可以使用多标签分类或者目标检测算法。
深度学习之图像分类

4.目前图像分类的网络模型

常用的标准网络模型:Lenet、Alxnet、Vgg系列、Resnet系列、Inception系列、Densenet系列、Googlenet、Nasnet、Xception、Senet(state of art)

轻量化网络模型:Mobilenet v1,v2、Shufflenet v1,v2,Squeezenet
以上网络模型不做具体说明,网络博客很多,如有不懂,可加我微信:JGQ863995835

目前轻量化模型在具体项目应用时用的比较广泛:

优点:(1)参数模型小,方便部署(2)计算量小,速度快

缺点:(1)轻量化模型在精度上没有Resnet系列、Inception系列、Densenet系列、Senet的accuracy高

如果使用Finetune tricks,轻量化模型也能达到上述模型精度的水平,所以在此力推轻量化模型。

(注:我个人在项目中常用的网络模型resnet系列、mobilenet v2、lenet,不要小瞧lenet,在工业领域绝对大杀器,自然场景不适用。我自己改进lenet的模型,在项目应用中比lenet高3%,大家可以参考:https://github.com/machine52vision/Imporve-lenet)

5.图像分类中的tricks

利用好tricks可以有效改善模型精度,下面介绍各种方法

方法一:魔改网络结构

(1)使用resnet的shortcut方法

(2)使用Inception 多尺度卷积核

(3)使用convolution的stride代替pool层

(4)使用正则化方法Batch normalization、Layer normalization、Instance normalization、Group Normalization;如果使用多GPU可以使Synchronized Batch Normalization

(5)对于不规则目标使用deform convolution

(6)轻量化模型使用group convolution

(7)小卷积核大视野使用dilate convolution

(8)去掉线性层使用全卷积层

(9)如果使用线性层,使用一维的Normalization,可以加快收敛并且(此方法其他网络没有)

方法二:模型初始化

(1)如果不使用finetune方法,尽量不使用随机初始化,推荐kaiming方法初始化,是xavier的改进版;

(2)大力推荐finetune方法,少量数据就可达到较高的accuracy;

方法三:损失函数和优化器

(1)一般分类使用softmax+Cross Entropy损失,MSE(均方误差)由于非凸函数,尽量不使用

(2)优化器推荐又快又好的AdaBound(新鲜出炉的算法,比SGD快,比Adam好,反正是又快又好!!!)

方法四:学习率调整

(1)Warmup

(2)Linear scaling learning rate

(3)力荐cosine learning rate或ReduceLROnPlateau learing rate

方法五:**函数

(1)sigmoid,tanh由于后期梯度消失或者梯度很小,导致收敛比较慢,尽量不使用;

(2)推荐relu及其各种改进版本,Elus、Leaky relu、Slus、PRelu、RRule等;

方法六:数据扩增方法

(1)Random image cropping and patching (RICP)

(2Cutout

(3)Mixup train

(4)随机旋转

(5)上下、左右flip

(6)调整亮度、对比度、饱和度

(7)其他各种裁剪方法

方法七:其他方法

(1)Knowledge distillation

(2)batch size不要设置太大(收敛慢),也不要太小(梯度随机性大),依据经验在224*224图像,在现存不溢出的时候,batch size=64。

(3)使用finetune方法,一般epoch=10左右就可达到很高的accuracy;如果不使用finetune方法,一般epoch=50~100左右(以上是根据工程经验,数据集在几万张,类别小于100的情况下,如果误导,还请指正)

(4)对权重使用L2正则化,可以有效抑制过拟合

(5)Momentum一般设置0.9,根据前10次梯度方向向量的经验来加上此次的梯度方向向量来更新梯度(防止梯度突变;1/(1-0.9)=10)

(6)label smooth

以上是我依据工程项目经验的一些心得,如果写的有误还请多多包涵并指出!喜欢可关注我微信公众号:52机器视觉

下一篇会介绍深度学习之目标检测,这是一个大坑