图像识别
- 信息时代的一门重要技术;
- 目的是让计算机代替人类处理大量的物理信息;
- 随着计算机技术的发展,人类对图像识别技术的认识越来越深刻;
- 图像识别技术利用计算机对图像进行处理\分析\理解,识别不同模式的目标和对象;
- 过程分为信息的获取\预处理\特征抽取和选择\分类器设计\分类决策;
模式识别
- 是人工智能和信息科学的重要组成部分;
- 指对表示事物或现象的不同形式的信息做分析和处理,得到对事物或现象描述\辨认和分类的过程;
- 计算机图像识别技术是模拟人类的图像识别过程;
- 在图像识别的过程中进行模式识别是必不可少的;
- 模式识别是人类的一项基本智能;
- 随着计算机的发展和人工智能的兴起;
- 人类本身的模式识别满足不了生活的需要;
- 希望用计算机代替或扩展人类的部分脑力劳动,于是产生了计算机模式识别;
- 模式识别就是对数据进行分类,与数学紧密结合,所用思想大部分是概率与统计;
图像识别的过程
- 信息的获取;
- 预处理;
- 特征抽取和选择;
- 分类器设计;
信息的获取
- 通过传感器,将光或声音等信息转化为电信号;
- 通过某种方法将其转变为机器能够认识的信息;
预处理
- 指图像处理中的去噪\平滑\变换等操作;
- 加强图像的重要特征;
- 图像增强;
特征抽取和选择
- 模式识别中,需要进行特征抽取和选择;
- 是图像识别过程中非常关键的技术;
分类器设计
- 通过训练得到一种识别规则;
- 通过该识别规则得到一种特征分类;
- 使得图像识别技术可以得到高德识别率;
- 分类决策时在特征空间中对被识别对象进行分类;
- 从而更好的识别所研究的对象;
图像识别的应用
- 图像分类
- 网络搜索
- 以图搜图
- 智能家居
- 拍照识别/扫描识别
- 农林:森林调查;
- 金融
- 安防
- 医疗
- 娱乐监管
机器学习方法的发展
分类与检测
- 分类是识别图片内容,并进行归类的过程;
- 检测是知道了图片的内容,在图片中将其框选出来的过程;
- 分类与检测在很多领域广泛应用;
分类与检测的应用领域
- 人脸识别
- 行人检测
- 智能视频分析
- 行人跟踪
- 交通场景物体识别
- 车辆计数
- 逆行检测
- 车牌检测与识别;
- 基于内容的图像检索
- 相册自动归类
常见的卷积神经网络
VGG
- VGG的经典之处在首次将深度学习做的非常"深",达到16-19层;
- 同时使用了非常小的卷积核(3x3);
VGG16
- 一张原始图片,resize到(224,224,3);
- conv1两次[3,3]卷积,输出特征层64,形状为(224,224,64),2x2最大池化,输出net(112,112,64);
- conv2两次[3,3]卷积,输出特征层128,形状为(112,112,128),2x2最大池化,输出net(56,56,128);
- conv3三次[3,3]卷积,输出特征层256,形状为(56,56,256),2x2最大池化,输出net(28,28,256);
- conv3三次[3,3]卷积,输出特征层256,形状为(28,28,512),2x2最大池化,输出net(14,14,512);
- conv3三次[3,3]卷积,输出特征层256,形状为(14,14,512),2x2最大池化,输出net(7,7,512);
- 卷积模拟全链接层,效果等同,输出net(1,1,4096),进行两次;
- 卷积模拟全链接层,效果等同,输出net(1,1,1000);
卷积层与全链接层的区别
- 卷积层为局部链接;
- 全链接层使用图像的全局信息;
- 最大的局部等于全局;
- 说明全链接层使用卷积层替代可行;
卷积层代替全链接层
- 卷积层和全链接层都进行了一个点乘操作;
- 他们的函数形式相同;
- 全链接层可以转化为对应的卷积层;
- 只需要把卷积核的尺寸变为和输入的feature map大小一致,为(h,w);
- 这样卷积和全链接层的参数一样多;
1X1卷积的作用
- 实现特征通道的升维和降维;
- 控制卷积核的数量,从而控制通道数;
- 池化层只改变尺寸,无法改变通道数;
Residual net(残差网络)
- 将靠前若干层的某一层数输出直接跳过多层引入到后面数据层的输入;
残差神经单元
- 某段神经网络的输入为x;
- 期望输出为H(x);
- 如果我们直接将输入x传到输出作为初始结果;
- 需要学习的目标为:;
- 这就是一个残差神经单元;
- 相当于改变了学习目标;
- 不再是学习一个完整的输出;
- 而是学习输出和输入的差别:,即残差;
直连卷积神经网络与ResNet的区别
- ResNet有很多旁路的支线将输入直连到后面的层;
- 后面的层可以直接学习残差;
- 这种结构也被称为shortcut或skip connections;
- 传统卷积层或全连接层在信息传递时会存在信息丢失\损耗等问题;
- ResNet直接将输入信息绕道传到输出,保护信息的完整性;
- 整个网络只学习输入\输出差别的那部分,简化了学习目标和难度;
ResNet50
- ResNet50有两个基本的模块;
- 分别是Conv Block和Identity Block;
- Conv Block的输入和输出维度不一样,不能连续串联;
- 其作用是改变网络的维度;
- Identity Block输入维度和输出维度相同,可串联,用于加深网络;
BatchNormalization
- 所有输出保证在0~1之间;
- 所有输出数据的均值接近0;
- 标准差接近1的正态分布;
- 这样能够使数据落入激活函数的敏感区,避免梯度消失,加快收敛;
- 加快模型收敛速度,并具有一定的泛化能力;
- 可减少dropout的使用;
卷积神经网络迁移学习-fine tuning
- 实践中,由于数据集不够大,很少有人从头开始训练网络;
- 常见的做法是使用预训练的网络;
- 对预训练的网络来重新fine-tuning;
- 或者使用预训练网络作为特征提取器;
- 迁移学习就是将训练好的模型,通过简单的调整快速移动到另一个数据集上;
- 随模型层数及复杂度的增加,错误率不断降低;
- 训练复杂的神经网络需要非常多的标注信息;
- 也需要长至几天甚至几周的训练时间;
- 为了解决上述问题可以使用迁移学习;
常见的两类迁移学习场景
- 卷积网络当做特征提取器;
- Fine-tuning卷积网络;
卷积网络当做特征提取器
- 使用在ImageNet上预训练的网络;
- 去掉最后的全连接层;
- 剩余部分当做特征提取器;
- 这样提取的特征称为CNN节点;
- 可以使用线性分类器来分类图像;
Fine-tuning卷积网络
- 替换网络的输入层;
- 使用新的数据来训练;
- 可以选择fine-tune全部曾或部分层;
- 通常前面的层提取图像的通用特征(generic features);
- 通用特征对许多任务都有用;
- 后面的层提取与特定类别有关的特征;
- Fine-tuning常常只需要微调后面的层;
Inception
- Inception网络是CNN发展史上的一个重要里程碑;
- Inception出现之前的CNN仅是堆叠卷积层,网络越来越深;
- 以期得到更好的性能;
多层卷积网络深度存在的问题
- 图像中突出部分的大小差别很大;
- 由于信息位置的巨大差异,卷积操作选择合适大小的卷积核比较困难;
- 信息分布更全局的图像偏好较大的卷积核;
- 信息分布较局部的图像偏好较小的卷积核;
- 非常深的网络更容易过拟合;
- 将梯度更新传到整个网络是困难的;
- 简单堆叠卷积层非常消耗计算资源;
Inception module解决方案
- 鉴于多层卷积神经网络具有的以上问题;
- 为什么不在同一层上运行多个尺寸的滤波器呢?
- 那么网络本质上变得宽一些,而不是更深一些;
Inception模块
- 使用三个不同尺寸的滤波器:1X1,3x3,5x5,以及最大池化;
- 对输入执行卷积操作;
- 所有子层的输出最后被级联起来;
- 传送至下一个模块;
- 一方面增加了网络的宽度;
- 另一方面增加了网络的尺度适应性;
降维Inception模块
- 如前,深度神经网络耗费大量资源;
- 为了降低算力成本,在3x3,5x5卷积层之前添加额外的1x1卷积层;
- 以此来限制输入通道的数量;
- 尽管添加额外的卷积操作反直觉;
- 但是1x1的卷积较5x5的卷积廉价许多;
- 输入通道数量的减少有利于降低计算成本;
1x1卷积降低运算成本比较
Inception V1
- Googlenet出品
- 采用了Inception 模块化结构;
- 共计9个模块,22层;
- 避免梯度消失,增加2个辅助softmax;
- 用于前向传导梯度;
Inception V2
- 输入增加了BatchNormalization;
- 用两个连续的3x3卷积层(stride=1)组成的小网络代替单个5x5卷积;
- 5x5卷积核参数是3x3卷积核参数的25/9=2.78倍;
- 此外,作者将 nxn的卷积核尺寸分解为1xn和nx1的两个卷积;
- 前面三个原则用来构建三种不同类型的Inception模块;
type | patch size/stride | input size |
conv | 3x3/2 | 299x299x3 |
conv | 3x3/1 | 149x149x32 |
conv padded | 3x3/1 | 147x147x32 |
pool | 3x3/2 | 147x147x64 |
conv | 3x3/1 | 73x73x64 |
conv | 3x3/2 | 71x71x80 |
conv | 3x3/1 | 35x35x192 |
3 X Inception | 35x35x288 | |
5 X Inception | 17x17x768 | |
2 x Inception | 8x8x1280 | |
pool | 8x8 | 8x8x2048 |
linear | logits | 1x1x2048 |
softmax | classifier | 1x1x1000 |
Inception V3
- 整合了InceptionV2的所有升级,使用了7X7卷积
type | patch size/stride | input size |
conv | 3x3/2 | 299x299x3 |
conv | 3x3/1 | 149x149x32 |
conv | 3x3/1 | 147x147x32 |
pool | 3x3/2 | 147x147x64 |
conv | 3x3/1 | 73x73x64 |
conv | 3x3/2 | 71x71x80 |
conv | 3x3/1 | 35x35x192 |
3 X Inception | 35x35x288 | |
3 X Inception | 17x17x768 | |
3 x Inception | 8x8x1280 | |
pool | 8x8 | 8x8x2048 |
linear | logits | 1x1x2048 |
softmax | classifier | 1x1x1000 |
Inception V3 设计思想
- 分解成小卷积很有效;
- 可以降低参数量,减轻过拟合;
- 增加网络非线性的表达能力;
- 卷积网络从输入到输出;
- 应该让图片尺寸逐渐减小;
- 输出通道数逐渐增加;
- 让空间结构化,将空间信息转化为高阶抽象的特征信息;
- Inception Module使用多个分支;
- 提取不同抽象程度的高阶特征;
- 丰富网络的表达能力;
Inception V4
- 图中1为基本的Inception V2/V3模块;
- 使用两个3x3卷积代替5x5卷积;
- 并且使用average pooling;
- 该模块主要处理尺寸为35x35的feature map;
- 图2中模块使用1xn和nx1卷积代替nxn卷积;
- 同样使用average pooling;
- 该模块主要处理尺寸为17x17的feature map;
- 图3将3x3卷积用1x3卷积和3x1卷积代替;
- Inception V4中基本的Inception module沿袭了Inception V2/V3的结构;
- 不同的是结构看起来更为简洁统一;
- 且使用更多的Inception module,实验效果更好;
Inception模型优势
- 采用1x1卷积核,性价比高;
- 很少的计算量可增加一层特征变换和非线性变换;
- 提出Batch Normalization;
- 通过一定手段,将每层神经元的输入分布拉到均值0方差1的正态分布;
- 使其落入激活函数的敏感区;
- 避免梯度消失,加快收敛;
- 引入Inception module 4个分支结合的结构;
卷积神经网络迁移学习
- 现在工程中最常用的是vgg\resnet\Inception这几种结构;
- 设计者通常先直接套用原版模型;
- 对数据进行一次训练;
- 选择较好的模型进行微调与模型缩减;
- 工程上使用的模型必须高进度和高速度;
- 常用模型缩减的方法是减少卷积个数与减少resnet的模块数;
卷积神经网络迁移学习-Inception
- 据相关论文,保留训练好的Inception模型所有卷积层的参数;
- 只替换最后一层全链接层;
- 最后全链接层之前的网络称为瓶颈层;
- 瓶颈层输出的节点向量可作为任何图像的一个具有表达能力的特征向量;
- 在新的数据集上,利用训练好的网络对图像进行特征提取;
- 提取的特征向量作为输入训练一个全新的单层全连接神经网络;
- 处理新的分类问题;
- 在数据量足够的情况下;
- 迁移学习的效果不如完全重新训练的效果;
- 迁移学习所需的训练时间和样本远小于完整模型的训练;
- Inception模型与Alexnet结构完全不同;
- Alexnet模型中,不同卷积层串联连接;
- Inception模型中Inception结构并联不同的卷积层;
Mobilenet
- google针对手机等嵌入式设备提出;
- 一种轻量级的深层神经网络;
- 其核心思想为深度可分离卷积;
- depthwise separable convolution;
- 3x3卷积核厚度只有一层;
- 卷积核在输入张量上一层层的滑动;
- 每一次卷积生成一个输出通道;
- 卷积完成后,利用1x1的卷积调整厚度;
- 对于一个卷积点;
- 假设有一个3x3大小的卷积层;
- 其输入通道为16,输出通道为32;
- 32个3x3大小的卷积核会遍历16个通道中的每个数据;
- 可得所需的32个输出通道;
- 所需参数为16x32x3x3=4608个;
- 应用深度可分离卷积;
- 用16个3x3大小的卷积核遍历16通道的数据;
- 得到16个特征图谱;
- 接着用32个1x1大小的卷积核遍历16个特征图谱;
- 所需参数为16x3x3+16x32x1x1=656个;
- 可以看出,depression separable convolution 可减少模型的参数;
卷积神经网络设计的问题背景
- 熟练掌握训练神经网络的能力并不容易;
- 与机器学习的思维一样,细节决定成败;
- 训练神经网络需要处理更多的技术细节;
- 应该了解数据和硬件;
- 知道从何种网络开始;
- 了解需要建立多少卷积层;
- 熟悉激励函数的设置;
- 学习速率是调整神经网络训练的最重要超参数;
- 也是最难优化的参数之一;
- 学习率太小,可能永远不会得到一个解决方案;
- 学习率太大,可能会错过最优解;
- 自适应的匹配学习率,可能需要花费代价在硬件资源上;
- 设计选择和超参数的设置极大影响了CNN训练和性能;
- 资源的稀缺和分散对深度学习的新进者,可能更有利于架构设计的直觉培养;
卷积神经网络的设计技巧
1.架构遵循应用
- Google Brain 或者Deep Mind 实验室有许多耀眼的新模型;
- 但其中很多是不可实现,或于你的需求不适用;
- 应该使用对特定的应用最有意义的模型;
- 这种模型或许非常简单,但仍然强大,比如VGG;
2.路径激增
- 每年ImageNet Challenge的冠军都比上一年使用更加深层的网络;
- 从AlexNet到Inception再到Resnets;
- 网络路径的数量有成倍增长的趋势;
3.追求简约
- 更大的不一定是更好的
4.增加对称性
- 对称性是质量和工艺的标志;
5.金字塔形状
- 总是在表征能力和减少冗余或者无用信息之间权衡;
- CNNs通常会降低激活函数的采样;
- 增加从输入层到最终层之间的连接通道;
6.过度训练
- 训练准确度和泛化能力是衡量模型的另一个标准;
- 可使用drop-out或dro-path提升泛化能力;
- 这是神经网络的重要优势;
- 用比实际用例更难的问题训练网络,以提高泛化能力;
7.覆盖问题的空间
- 为了扩大训练数据和提升泛化能力;
- 使用噪声和人工增加训练集的大小;
- 比如随机旋转\裁剪和一些图像增强操作;
8.递增的功能结构
- 成功的结构会简化每一层的工作;
- 在非常深的神经网络中,每层会递增的修改输入;
- 在ResNet中,每一层的输出可能类似于输入;
- 在实践中,请在ResNet中使用短的跳过长度;
9.标准化层的输入
- 标准化是可以使计算层的工作变得更加容易的一条捷径;
- 在实际中可以提升训练的准确性;
- 标准化 把所有曾的输入样本放在了一个平等的基础上;
- 允许反向传播可以更有效的训练;
10.使用微调过的预训练网络(fine tuning)
- 如果你的视觉数据和ImageNet相似;
- 可用预训练网络使得模型学习的更快;
- 低水平的CNN通常可被重复使用;
- 他们大多能够检测线条和边缘这些常见的模式;
- 比如用自己的层替换分类层,用特定的数据训练最后几层;
11.使用循环的学习率
- 学习率的实验会消耗大量时间;
- 且中间会遇到错误;
- 自适应学习率在计算上可能是非常昂贵的;
- 循环学习率不会大量消耗计算资源;
- 使用循环学习率,可设置一组最大最小边界;
- 并在最大最小范围内改变;