深度学习成长之路(一)概述--计算机视觉的任务及对应的网络模型(图像分类)

  学了好久的深度学习,主要是在做人脸识别、生成这一方面,但是一直感觉徘徊在深度学习的大门之外。深度学习成长之路第一篇就是为了搞清楚计算机视觉到底在做什么,让自己对计算机识别方向有一个整体的框架。有些地方写的不对的,还请大家多多指教,共同学习。

正文开始:

  计算机视觉的任务具体有几大类,说法很多。我更倾向于是三大类,图像分类(classfication),图像识别/目标检测(object detection)、图像分割(segmentation,semantic/instance segmentation)。

图像分类(classification)

  输入一张图片,判断属于哪一类。属于计算机视觉中最基本的任务,个人觉得其他的任务都需要在完成分类的基础上在进行操作。

(1)数据集

  数据集的介绍,网上有很多而且十分具体,可以去搜一下。常用的有MNIST(手写数字)、CIFAR-10(10类32×*32的图片)、FASHION-MINIST(企图替代MNIST的数据集,大小跟MNIST一样)。

(2)网络模型

  首先,与深度学习的卷积网络不同的网络模型有KNN(K-Nearest Neighbor 最近邻分类器),大体思路为,选取一个样本在特征空间中的K个最邻近的样本,其中这K个样本中大多数所属的类别,就是测试样本的类别。KNN算法中所选取的邻居都是已经正确分类的对象(也就是需要全部记录训练数据和对应的类别)。分类结果很大程度取决于K的选择。

KNN综述的论文地址:https://arxiv.org/pdf/1601.01549v2.pdf

  SVM(Support Vector Machine 支持向量机),一种线性分类器,有许多SVM模型。常见的有多分类svm,使用Hinge loss(合页损失,因为函数图像像合页),例子如下:(选自斯坦福的cs231n,强烈推荐去看)

深度学习成长之路(一)概述--计算机视觉的任务及对应的网络模型(图像分类)

但是存在一个问题,当loss为0时,对w缩放,结果仍是0,无法进行训练。因此完整的多类别SVM还需要加上正则化loss。

正则项可以选择多种距离。

深度学习成长之路(一)概述--计算机视觉的任务及对应的网络模型(图像分类)

  Softmax分类器属于逻辑回归,与SVM都是常见的分类器。与SVM的区别在于,SVM是对样本在各类上进行打分,而Softmax分类器输出的是样本在各类的概率,使用的是交叉熵损失。个人觉得Softmax是在SVM的基础上做了改进,将得分归一化得出概率。

深度学习成长之路(一)概述--计算机视觉的任务及对应的网络模型(图像分类)

单一样本的loss

深度学习成长之路(一)概述--计算机视觉的任务及对应的网络模型(图像分类)

  进入深度学习,主要是使用的卷积层的网络框架,用conv代表卷积层,bn代表批量归一层,activ代表**层,pool代表池化层,fc代表全连接层。基本的网络框架: conv ->> bn ->> activ ->> pool  ->> fc 。

先放一张CNN结构演化的历史的结构图(如有侵权,请及时联系):

深度学习成长之路(一)概述--计算机视觉的任务及对应的网络模型(图像分类)

  首先是,LeNet网络最经典的conv网络,其基本架构为:input(32 x 32) ->> conv1 (channels 6, kernel size 5*5,stride 1)->>  pool1 ->> conv2(channels 16, kernel size 5*5,stride 1 ) ->> pool2 ->> conv3(channels 120 ,kernel size 5*5 ,stride 1) ->> fc4(84) ->> fc5(10) ->> output(高斯链接层)

深度学习成长之路(一)概述--计算机视觉的任务及对应的网络模型(图像分类)

  feature map大小计算: H' / W'=(H / W - kernel size + 2padding)  / stride + 1

  参数的计算: (kernel size + bias)x feature map 

  链接个数的计算: feature map size x 参数个数

例如,conv1 

feature map 大小: (32 - 5 + 0 )/ 1  + 1 = 28

参数个数: (5 x 5 +1)x 6 = 156

链接个数: 28 x 28 x 156 = 122304

论文地址:http://vision.stanford.edu/cs598_spring07/papers/Lecun98.pdf

AlexNet网络在2012年夺得了ImageNet图像分类的冠军,而且远远超过当年的第二名。

网络结构如下图:

深度学习成长之路(一)概述--计算机视觉的任务及对应的网络模型(图像分类)

input(227 x 227 x 3) ->> conv1(channels 96 [平分为2组], kernel size 11*11, stride 4 ) ->>  pool1(kernel size 3*3, stride 2) ->> conv2(channel 256[2 组], kernel size 5*5 ,padding 2, stride 1  ) ->> pool2(kernel size 3*3, stride 2) ->> conv3(channel 384[2 组], kernel size 3*3, padding 1, stdide 1) ->>  conv4 (channel 384[2组], kernel size 3*3, padding 1, stride 1) ->> conv5(channel 256[2组], kerbel size 3*3, padding 1, stride 1) ->> pool3(kernel size 3*3, stride 2) ->>  fc6(4096[2组])+ dropout ->> fc7(4096[2组]) + dropout  ->>  fc8(1000) ->> output

AlexNet网络的创新点在于:

1、使用relu作为非线性**函数。

2、使用了dropout(随机失活)。在全连接网络,dropout以概率P随机地删除隐藏层的部分单元,并让其他神经元以1-P的概率保留,强迫一个神经单元和随机挑选出来的神经单元共同工作,从而增强了泛化能力。dropout可以比较有效地减轻过拟合的发生。dropout一般选择0.5或者0.3效果比较好。

3、采取了data augmentation (数据增益)的方法,通过一些变换从已有的数据集中生成新的数据,减轻了过拟合的发生。

4、overlap pooling(重叠池化),一般的池化是不会重叠,但是在AlexNet中每次池化的stride要小于池化kernel size,所以产生了重叠。通过这种方法,可以提高精度。

5、local Reponse Normalization(局部响应归一化),与BN不一样,局部响应归一化发生在经relu输出后的不同的相邻的卷积核之间。但是现在基本上都在使用BN(batch normalization 批量归一化)。

6、采用多GPU进行训练,之所以卷积核会分成两组,就是采用两块GPU进行训练。

论文地址:

https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

VGG-16/VGG-19网络ILSVRC2014的亚军,相比AlexNet,网络采用连续的几个3*3的卷积核代替AlexNet中较大的卷积核。对于给定的感受野(receptive field,CNN中某一层输出的结果对应输入层的一个映射),采用堆积小的卷积核,优于使用大的卷积核。此外,VGG取消了LRN层,池化的siz变成了2*2。整体来说,VGG更深更宽。

深度学习成长之路(一)概述--计算机视觉的任务及对应的网络模型(图像分类)

  基本网络结构: input ->> conv1 ^ 2(channel 64, kernel size 3*3, stride 1,重复2次)  ->> pool1(kernel size 2*2,  stride 2) ->> conv2 ^ 2 (channel 128,kernel size 3*3, 重复2次) ->> pool2(kernel size 2*2, stride 2) ->> conv3 ^ 3(channel 256, kernel size 3*3, stride 1, 重复3次) ->> pool3(kernel size 2*2 , stride 2) ->> conv4 ^ 3(channel 512, kernel size 3*3, stride 1) ->> pool4(kernel size 2*2, stride 2) ->> conv5  ^ 3 (channel 512 ,kernel size 3*3, stride 1) ->> pool5(kernel size 2*2, stride 2) ->>fc6(4096) ->>fc7(4096) ->> fc8(1000) ->> softmax

   VGG-19结构要类似于VGG-16,堆叠的层数变多,最多有4层,性能要比VGG-16好一点,但是参数变多,需要消耗更多的资源,所以更多的还是采用VGG-16进行特征提取。下图是作者实验时测试的各种网络结构:

深度学习成长之路(一)概述--计算机视觉的任务及对应的网络模型(图像分类)

论文地址:https://arxiv.org/pdf/1409.1556.pdf

GoogLeNet网络  2014年ImageNet竞赛的冠军。与VGG在之前的AlexNet网络做改进不同,GoogLeNet提出了Inception模块。而且之前都是叫GoogLeNet网络,现在简称为Inception vN, N代表版本号。

GoogLeNet 论文地址: https://arxiv.org/pdf/1409.4842.pdf

Inception v2 论文地址: https://arxiv.org/pdf/1502.03167.pdf

Inception v3 论文地址:https://arxiv.org/pdf/1512.00567.pdf

Inception v4 论文地址: https://arxiv.org/pdf/1602.07261.pdf

深度学习成长之路(一)概述--计算机视觉的任务及对应的网络模型(图像分类)

  上图是inception v1模型,左边是最原始的版本,将 1*1,3*3,5*5的卷积和3*3的pool层堆叠在一起,输入是上一层的所有输出,但是这样会造成5*5卷积核的计算量太大,因此就产生右图的改进,也就是真正的inception v1模型。

  inception模块主要采用了1*1的卷积核进行升维和降维,同时在不同的kernel size上进行卷积,提取不同尺度的特征使最后的分类更为准确。

  其中1*1的卷积核,放在3*3和5*5之前起到了降维的作用,减少了参数的数量;放在pool层后起到升维作用,保证最后的特征数目不变。而且,在相同尺寸的感受野中叠加更多的卷积,能提取的更丰富的特征(network in network https://arxiv.org/pdf/1312.4400.pdf)

Inception v2加入了BN层,此外改变了卷积核的大小,减少了参数。Inception v3 将卷积核进行了分解,如将3*3分解为1*3和3*1,这样加速了计算,同时使的网络更加深。Inception v4 结合了ResNet,提升了性能。

ResNet网络 ILSVRC 2015年的冠军。ResNet网络主要是为了解决网络加深后梯度消失的问题,提升训练过程中的优化能力。

   文章提出了Residual模块,增加了恒等映射(identity mapping),也就是下图中的曲线,通过shortcut connection实现。具体来说,随着网络变深,如果深层网络后面的层都是恒等映射,那么模型就变成了一个浅层网络。理论上深层模型应该比浅层网络的效果好,但是实际并不是这样。因此现在需要解决的就是学习恒等映射函数。

    直接学习潜在的恒等映射 H(x) = x 比较难,但是将原本网络所要学习的函数H(x)转换为F(x) + x ,学习残差函数F(x) = H(x) - x会简化难度。在这里假设优化残差映射F(x)比优化原来的映射H(x)容易。实验证明确实如此。

  引入残差后的映射对输出的变化更加敏感。因为残差去掉了相同的主体部分,只留下了变化部分。

  shortcut将输入和输出进行了element-wise(对应元素)的相加,简单的加法不会增加额外的参数和计算量,但是需要x和F(x)的维度相同,不然需要对x进行线性映射。

深度学习成长之路(一)概述--计算机视觉的任务及对应的网络模型(图像分类)  

   之后作者在《Identity Mappings in Deep Residual Networks》论文中详细的解释恒等映射的好处,并对identity mapping进行了改进。具体如下图。

深度学习成长之路(一)概述--计算机视觉的任务及对应的网络模型(图像分类)


Deep Residual Learning for Image Recognition论文地址:https://arxiv.org/pdf/1512.03385.pdf

Identity Mappings in Deep Residual Networks 论文地址:https://arxiv.org/pdf/1603.05027.pdf


写在最后:

  以上是图像分类中比较常见的网络模型,并且给出了相应的论文地址。基本上在pytorch中都已经有预训练好的模型,可以直接使用。个人觉得这些网络都是两部分组成:全连接层之前的都是特征提取部分,之后的部分就是进行了分类。因此在具体使用的时候,把输入输出改一下,再把全连接部分修改为适合自己任务的结构,其他的超参进行微调。具体效果如何,我会在之后的文章中给出。

  这篇博客只是介绍了图像分类任务(因为写这篇文章就花费了一天...),另外两个任务及其常见的网络结构会在之后更新。