计算机视觉中图像分类任务脉络梳理

inchbyinch inchbyinch     2023-04-03     120

关键词:

本文大致梳理了计算机视觉中图像分类的脉络,包括常用数据集、经典模型和性能对比。

1 图像分类常用数据集

以下是几种常用的分类数据集,难度依次递增。列举了各算法在各数据集上的性能排名。

  • MNIST,60k训练图像、10k测试图像、10个类别、图像大小1×28×28、内容是0-9手写数字。
  • CIFAR-10,50k训练图像、10k测试图像、10个类别、图像大小3×32×32。
  • CIFAR-100,50k训练图像、10k测试图像、100个类别、图像大小3×32×32。
  • ImageNet,1.2M训练图像、50k验证图像、1k个类别。每年会举行基于ImageNet数据集的ILSVRC竞赛,这相当于计算机视觉界奥林匹克。鉴于图像分类任务上,DL已经超越人类水平,ImageNet挑战赛在2017年是最后一届。

2 图像分类经典结构

基本架构 我们用conv代表卷积层、bn代表批量归一层、pool代表池化层。最常见的网络结构顺序是conv -> bn -> relu -> pool,其中卷积层用于提取特征、池化层用于减少空间大小。随着网络深度的进行,图像的空间大小将越来越小,而通道数会越来越大。当然也有不少其他架构。

两个特点:纵观这些卷积神经网络提高效果的方向,主要是更深、更宽、更多的分支结构和短连接等;AlexNet提出了卷积网络5+3的结构,后续不少经典网络都是在此基础上改进。

经典网络:

  • LeNet-5
  • AlexNet
  • ZF-Net
  • GoogLeNet
  • VGG
  • ResNet
  • ResNeXt
  • DenseNet
  • SENet

2.1 LeNet-5

技术图片

早期卷积神经网络中最有代表性的架构,是Yann LeCun在1998年设计的,用于手写数字识别的卷积神经网络,当年美国很多银行用它来识别支票上面的手写数字。

2.2 AlexNet

技术图片

2012年ILSVRC冠军,6千万参数。由于准确率远超传统方法的第二名(top5错误率为15.3%,第二名为26.2%),引起了很大的轰动。自此之后,CNN成为在图像识别分类的核心算法模型,带来了深度学习的大爆发。这里有整体架构的可视化具体的参数。

特点:

  • 采用更深的网络结构,为了减弱梯度消失,使用Relu替换之前的sigmoid的作为激活函数;
  • 使用Dropout和数据扩充Data Augmentation抑制过拟合;
  • 使用Overlapping Pooling(覆盖的池化操作)
  • 多GPU训练和LRN(但是没啥用)

2.3 ZF-Net

2013年ILSVRC冠军,结构和AlexNet区别不大,分类效果也差不多。这篇文章的贡献在于,提出了一种CNN特征可视化方法:反池化、反激活、反卷积,从而成为CNN特征可视化的开山之作。

2.4 VGG

技术图片

2014年ILSVRC亚军网络,1.38亿参数。由于网络结构十分简单,很适合迁移学习,因此至今VGG-16仍在广泛使用。

特点:

2.5 GoogLeNet

技术图片

2014年ILSVRC冠军网络。同样也是5+3的模式(以池化层为界),参数量约为5百万,核心模块是Inception Module。Inception历经了V1、V2、V3、V4等多个版本的发展,不断趋于完善。GoogLeNet取名中L大写是为了向LeNet致敬,而Inception的名字来源于盗梦空间中的"we need to go deeper"梗。

Inception V1:加大深度、加大宽度(通过增加分支)、减少参数

深度方面:层数更深,论文采用了22层,为了避免梯度消失问题,GoogLeNet在不同深度处(4b和4e处,以最大池化为界)增加了两个分支,来回传梯度。

宽度方面:采用多分支分别处理然后拼接的Inception Module。

  • 用1×1、3×3、5×5、max pooling这四种核并行的方式,让网络自己决定该用什么样的卷积核;
  • 采用不同大小的卷积核意味着不同大小的感受野,可以捕捉到不同尺度的信息,最后拼接意味着不同尺度的特征进行信息融合;(不同于2011年Yann LeCun的交通标志识别模型,那个是不同层级特征,这个是不同视野)
  • 为了避免concat起来的feature map厚度过大,Inception模块在3×3前、5×5前、max pooling后分别加上了1×1的卷积核,降低feature map厚度。

另外,为了减少参数,网络最后采用了average pooling来代替第一个全连接层,参数可以减少一个数量级。

Inception V2:主要做了两个改动

  • 学习VGG网络,将7×7和5×5卷积分解成若干等效3×3卷积;(减少参数同时增加非线性转换)
  • 增加了BN层,加快收敛速度,且有一定的正则化效果;(配合其他操作:增大学习率,更彻底的对训练数据进行shuffle,减少数据增广中图像的光学畸变等;要达到V1结构相同的准确率,训练时间只有之前的1/14)

Inception V3:主要在两个方面改造

  • 引入Factorization into small convolutions的思想,将一个较大的二维卷积拆成两个较小的一维卷积,比如将7×7卷积拆成1×7卷积和7×1卷积。适用于中度大小的feature map,对于m×m大小的feature map,建议m在12到20之间。作用是:1.节约参数,减小计算量,减轻过拟合;2.中间可以加一层relu激活,增加模型非线性表达能力;
  • 优化Inception Module的结构。现在模块中有35×35、17×17和8×8三种不同的结构。这些Inception Module只在网络的后部出现,前部还是普通的卷积层。并且还在Inception Module的分支中还使用了分支。

Inception V4:结合了残差神经网络ResNet,进一步降低了0.4%的错误率

2.6 ResNet

技术图片

2015年ILSVRC冠军网络。核心是带短连接的残差模块,其中主路径有两层卷积核(Res34),短连接把模块的输入信息直接和经过两次卷积之后的信息融合,相当于加了一个恒等变换。短连接是深度学习又一重要思想,除计算机视觉外,短连接思想也被用到了机器翻译、语音识别/合成领域。

两篇论文,分别提出V1版V2版。

结构特点:

  • 总体架构:类似5+3结构,第一个模块为普通卷积,第2、3、4、5为模块组,然后经过一个平均池化,直接送到最后一层fc;(注意:GoogleNet中将fc6换成了平均池化层,然后经过fc7,fc8,但是ResNet直接将fc7也省掉了)
  • 两种残差模块:除了左图的残差模块,对于很深的网络(超过50层),ResNet使用了更高效的瓶颈结构(BottleNeck)(主路径的第一层和第三层均为1×1卷积,如右图);
  • 两路信息融合时有三种选择:直接相加(前后特征图厚度一致时)+填充0后直接相加(前后特征图厚度不一致时);直接相加+线性变换(用1×1卷积);全部线性变换。(注:前后特征图尺寸不一致时,1×1卷积核的步长为2,起到了下采样的效果)作者推荐短路连接采用恒等变换,这样保证短路连接不会有阻碍。
  • 更好的残差模块preResNet:作者在V2中对不同的残差单元做了细致的分析与实验,最优的残差结构如下图所示。改进前后一个明显的变化是采用pre-activation,BN和ReLU都提前了。

技术图片

残差网络解决了什么,为什么有效?

背景要点:

  • NN好用的原因:一是表达能力特别强大,能拟合任意函数;二是免去了繁重的特征工程,特别适合于非结构化数据。
  • 但NN总是有一些问题,除了过拟合之外,还有特别常见的梯度消失/爆炸,和网络退化的问题。
  • 网络退化的原因:虽然56层网络的解空间包含了20层网络的解空间,但是我们在训练网络用的是随机梯度下降策略,往往解到的不是全局最优解,而是局部的最优解,显而易见56层网络的解空间更加的复杂,所以导致使用随机梯度下降算法无法解到最优解。
  • 残差网络解决了网络深度过大带来的网络退化问题。

残差网络为何有效的三种解释:

  • 何恺明等人从前后向信息传播的角度给出了残差网络的一种解释。在反向传播过程中,由于模块学习的是F(x)+x,导数为F(x)的导数加1,因此后面的梯度能比较顺畅地传到前面,即抑制了梯度消失的现象;而在前向传播的过程中,由于普通网络中x在经过网络层时候总要乘以其中的权重矩阵,因此很难保持前后恒等,换句话说,当网络深度过大时候,超出的层因为没法保证这一模块的输入输出一致,导致模型退化,而残差模块F(x)+x因为加了一个恒等项,模块学习的就不再是恒等映射H(x)=x,而是H(x)=0,后者比前者更容易学习,因此在很大程度上解决了网络退化的问题。综上可以认为残差连接使得信息前后向传播更加顺畅。(当然也有人认为主要是解决的网络退化问题,因为梯度消失问题基本上已经通过relu、特殊的初始化、BN来解决了。残差模块虽然有助于减轻梯度消失,但主要还是解决了网络退化。)
  • 集成学习的角度。16年一篇论文指出,残差网络展开后实际上相当于一系列浅层网络的集成,在训练中贡献了梯度的是那些相对较短的路径。
  • 梯度破碎的角度。2018年的一篇论文指出了一个新的观点,尽管残差网络提出是为了解决梯度弥散和网络退化的问题,但它解决的实际上是梯度破碎问题。梯度破碎就是在标准前馈神经网络中,随着深度增加,梯度逐渐呈现为白噪声的现象,即神经元梯度的相关性(corelation)按指数级减少;同时,梯度的空间结构也随着深度增加被逐渐消除。因为现在基于梯度的许多优化方法假设梯度在相邻点上是相似的,所以破碎的梯度会使这些优化方法的效果大打折扣。而残差连接可以极大地保留梯度的空间结构,缓解了梯度破碎问题。2018年有一篇可视化的论文支持这一说法,作者比较了Res56网络带残差模块和不带残差模块的损失函数三维图,不带残差模块的损失函数表面是一片怪石嶙峋,而带残差模块的损失函数表面像一片平缓的山丘,更有利于优化。

2.7 ResNeXt

技术图片

ResNet的另一改进。主要是采用了VGG堆叠思想和Inception的split-transform-merge思想,在不增加参数复杂度的前提下提高准确率。ResNeXt发现,增加分支数是比加深或加宽更有效地提升网络性能的方式。结构关键点是:

  • 沿用ResNet的短路连接,并且重复堆叠相同的模块组合;
  • 多分支分别处理;
  • 使用1×1卷积降低计算量;
  • 利用分组卷积进行实现(如图c),结构更简洁而且速度更快。

2.8 DenseNet

技术图片

CVPR2017的oral。主要思想是将每一层都与后面的层连接起来,如果一个网络中有L层,那么会有L(L+1)/2个连接。通过这样的密集连接,每一层在正向时候都能直接接受原始输入信号,在反向时候也都能直接接受损失函数的梯度,即这种连接方式使得特征和梯度的传递更加有效,网络也就更加容易训练。

当然,如果全部采用这种密集连接的方式,特征图的厚度就会很大。于是采用两种方式降低参数量:一是将密集连接的层做成一个模块,整个网络采用模块堆叠的方式,而不是所有层全部密集连接;二是在dense block中引入bottleneck layer,即卷积3x3前增加1x1卷积,以此来减少feature map数量。

缺点是太吃显存。通常占用显存的主要是推断过程中产生的feature map和参数量。有些框架会有优化,自动把比较靠前的层的feature map释放掉,所以显存就会减少,或者inplace操作通过重新计算的方法减少一部分显存,但是densenet因为需要重复利用比较靠前的feature map,所以无法释放,导致显存占用过大。

2.9 SENet

技术图片

2017年ILSVRC冠军网络。是一个模块,可以和其他的网络架构结合,比如GoogLeNet、ResNet等。

两大步骤:Squeeze和Excitation。相当于在通道上应用注意力机制,即学习各个通道的权重,根据重要程度增强有用的通道、抑制没有用的通道。

3 各种经典模型的比较

前面介绍的各种图像分类模型都比较经典,特别是VGG16、GoogLeNet和ResNet,现在仍然在广泛使用。截至2017年初,各种经典架构对比如下。

技术图片

Reference

深度学习在计算机视觉中应用综述

...光教授于2017年1月7日于北京师范大学所做的《深度学习在计算机视觉中的应用与前景》讲座的内容总结梳理。1视觉智能的内涵计算机视觉系统的任务就是像人一样描述摄像机拍摄到的内容。常见的视觉任务:距离估计目标检... 查看详情

计算机视觉一个简单易上手的图像分类任务pipeline代码

整理了一个针对图像分类任务的pipeline,主要用于快速开始验证现有模型结果,以及后续的自定义模型的开发。https://github.com/jzsherlock4869/image-classification-pipeline对于图像分类任务来说,主要可以分为【数据】、【网络... 查看详情

机器视觉halcon中图像获取(代码片段)

00.目录文章目录00.目录01.概述02.相机接口2.1USB接口2.2IEEE1394接口2.3CameraLink接口2.4GigE千兆以太网接口2.5CoaXPress接口2.6Nbase-T接口2.7光纤接口03.Halcon图像采集过程3.1打开设备3.2设置相机参数3.3获取图像3.4结束采集图像04.Halcon相机助手0... 查看详情

计算机视觉领域的三大任务

计算机视觉的三大分类任务:图像分类、目标检测、图像分割; 1.图像分类(Classification),即是将图像结构化为某一类别的信息,用事先确定好的类别(category)或实例ID来描述图片。2.目标检测(Detection)。分类任务关心整体... 查看详情

浅谈yolo

...n.net/qq_30815237/article/details/91949543【嵌牛导读】当我们谈起计算机视觉时,首先想到的就是图像分类,没错,图像分类是计算机视觉最基本的任务之一,但是在图像分类的基础上,还有更复杂和有意思的任务,如目标检测,物体定... 查看详情

计算机视觉(cv)基于全连接网络实现宝石分类(代码片段)

【计算机视觉(CV)】基于全连接网络实现宝石分类(文章目录)前言(一)、任务描述本次实践是一个多分类任务,需要将照片中的宝石分别进行识别,完成宝石的识别实践平台:百度AI实训平台-AIStudio、PaddlePaddle2.0.0动态图(二)、环... 查看详情

如何提高 Python 中图像分类 keras 模型的准确性?

】如何提高Python中图像分类keras模型的准确性?【英文标题】:HowcanIincreasetheaccuracyofmyimageclassificationkerasmodelinPython?【发布时间】:2018-10-0505:00:12【问题描述】:我正在尝试将一组蜜蜂图像分为两类-大黄蜂和蜜蜂,结果格式为CSV... 查看详情

计算机视觉(cv)基于高层api实现宝石分类(代码片段)

【计算机视觉(CV)】基于高层API实现宝石分类(文章目录)前言(一)、任务描述图像分类是根据图像的语义信息将不同类别图像区分开来,是计算机视觉中重要的基本问题宝石识别属于图像分类中的一个细分类问题实践平台:百度... 查看详情

计算机视觉(cv)基于卷积神经网络实现美食分类(代码片段)

【计算机视觉(CV)】基于卷积神经网络实现美食分类(文章目录)前言任务描述如何根据据图像的视觉内容为图像赋予一个语义类别是图像分类的目标,也是图像检索、图像内容分析和目标识别等问题的基础。本实践旨在通过一... 查看详情

现在的自动驾驶处理的是2d还是3d

...的好坏。目前,环境感知技术有两大主流技术路线:①以视觉为主导的多传感器融合方案,典型代表是特斯拉;②以激光雷达为主导,其他传感器为辅助的技术方案,典型代表如谷歌、百度等。我们将围绕着环境感知中关键的视... 查看详情

计算机视觉概述

2020-02-26对计算机视觉深度学习方面的任务概述#include图像分类  图像检测目标检测语义分割实例分割目标追踪图像生成图像检索图像描述  查看详情

计算机视觉(cv)sklearn之分类算法与手写数字识别(代码片段)

【计算机视觉(CV)】sklearn之分类算法与手写数字识别(文章目录)前言(一)、任务描述数据介绍数据读取与存储形式sklearn分类模型代码实现与结果(二)、环境配置本实践代码运行的环境配置如下:Python版本为3.7,PaddlePaddle版本为2.... 查看详情

『计算机视觉』物体检测之refinedet

TwoStage的精度优势二阶段的分类:二步法的第一步在分类时,正负样本是极不平衡的,导致分类器训练比较困难,这也是一步法效果不如二步法的原因之一,也是focalloss的motivation。而第二步在分类时,由于第一步滤掉了绝大部分... 查看详情

图像分类任务介绍imageclassification

...xff1f;它有哪些应用场景?        图像分类任务是计算机视觉中 查看详情

【技术综述】多标签图像分类综述

参考技术A图像分类作为计算机视觉领域的基础任务,经过大量的研究与试验,已经取得了傲人的成绩。然而,现有的分类任务大多是以单标签分类展开研究的。当图片中有多个标签时,又该如何进行分类呢?本篇综述将带领大... 查看详情

openmmlabai实战营——学习笔记

(一)计算机视觉算法基础与OpenMMLab介绍一、计算机视觉基础1.ComputerVisionTasks    机器视觉(又名计算机视觉),计算机视觉是一门让计算机学会"看"的学科,通过计算机算法对图像或视频信息进行... 查看详情

图像分类综述

...来说,判别出一个图像的类别是件很容易的事,但是对于计算机来说,并不能像人眼那样一下获得图像的语义信息。  计算机能看到的只是一个个像素的数值,对于一个RGB图像来说,假设图像的尺寸是32*32,那么机器看到的就... 查看详情

计算机视觉——典型的目标检测算法(fastr-cnn算法)(五)

...任务,近年来,出现了很多目标检测算法。【嵌牛鼻子】计算机视觉【嵌牛提问】如何理解目标检测算法——FastR-CNN【嵌牛正文】    为克服SPP-Net存在的问题,2015年Girshick等提出基于边界框和多任务损失分类的FastR... 查看详情