《Deep Learning for Computer Vision withPython》

StarterBundle总结概述

//2022.2.4日下午16:18开始总结


第2章-什么是深度学习

  1. 分层特征学习:有监督、无监督、半监督学习;
  2. 深度学习由于人工神经网络(ANN)权重的庞大及网络的深度不断增加引来了一段时间的AI冬天;当网络超过10层时就可以认为是深的。

第3章-图像基础

  1. 像素:图像的构建块;
  2. 大多数像素由灰度/单通道或颜色两种方法表示;
  3. 从通道形成图像,也就是将RGB中三个不同颜色通道相互堆叠就可以形成图像;
  4. 介绍图像坐标系;
  5. 图像作为Numpy数组阵列;
  6. 使用OpenCV中的imread()函数读取图像实例;
  7. 图像缩放和纵横比;
  8. 在RGB颜色空间中,通道数量(也就是深度)总是保持为3;

第4章-图像分类基础

  1. 图像分类的核心是:从一组预定义的类别中为图像指定标签;
  2. 可以在分类系统中,为同一张图片分配多个标签;
  3. 数据集包含了多张图片;
  4. 应用特征提取可以量化图像的内容;
  5. 特征提取是获得输入图像、应用算法并获得量化图像的特征向量( 即为数字列表的过程)。
  6. 图像分类面临的挑战:视点变化、尺度变化、变形、遮挡的处理、背景的混乱、类内变异、要始终考虑图像分类器的范围、
  7. 学习类型:监督学习、无监督学习、半监督学习;
  8. 深度学习时间图像分类的pipeline:收集数据集、分割数据集(注意训练集\验证集\测试集)、训练网络、评估网络、保存model权重(并序列化网络);
  9. 基于特征的学习与图像分类的深度学习:主要是在上述的pipeline中的第2,3步骤之间加入特征提取过程,然后训练分类器对图像进行分类;
  10. 要始终注意模型的泛化能力;

第5章-用于图像分类的数据集

  1. MNIST数据集:目标是正确分类手写数字0-9;
  2. Animals:dogs、cats and pandas:目标是将图像正确分类为包含狗、猫或熊猫;
  3. CIFAR-10数据集:CIFAR-10由10类组成,包括:飞机、汽车、鸟类、猫、鹿、狗、青蛙、马、船和卡车;
  4. Cifar-10经常用于测试新的CNN结构;SMILE数据集由微笑和不微笑的人脸组成,数据集中总共有13165个灰度图像,每个图像的大小为64×64;
  5. Kaggle:Dogs VS Cats数据集旨在设计一种学习算法,将图像正确分类为包含狗或猫的图像。总共提供25000张图像,用于训练具有不同图像分辨率的算法;
  6. Flowers-17数据集是一个17类数据集,由Nilsback等人策划,每类80幅图像。[52]。该数据集的目标是正确预测给定输入图像的花卉种类;此外,由于每个类只有80张图像,因此深度学习模型在不过度拟合的情况下学习每个类的表示形式变得很有挑战性。作为一般的经验法则,在训练深度神经网络时,建议每个类有1000-5000张示例图像;
  7.  CALTECH-101数据集是一种流行的目标检测基准数据集,该数据集共有8677幅图像,包括101个类别,涵盖了各种各样的物体,包括大象、自行车、足球,甚至人脑,仅举几个例子。 CALTECH-101数据集显示出严重的阶级不平衡(这意味着某些类别的示例图像比其他类别多),这使得从阶级不平衡的角度进行研究变得有趣。
  8. Tiny ImageNet 200数据集中共有200个图像类,其中500个图像用于培训,50个图像用于验证,每个类50个图像用于测试。每幅图像都经过预处理并裁剪为64×64×3像素,使学生更容易专注于深度学习技术,而不是计算机视觉预处理功能;
  9. Adience数据集用于促进年龄和性别识别的研究。数据集中共包含26580张图像,年龄范围为0-60岁。该数据集的目标是正确预测图像中主体的年龄和性别;
  10. ImageNet实际上是一个项目,旨在根据定义的一组单词和短语将图像标记和分类为近22000个类别;ImageNet项目中有超过1400万张图像。为了组织如此大量的数据,ImageNet遵循WordNet层次结构。WordNet中每个有意义的单词/短语简称为“同义词集”或“同义词集”。在ImageNet项目中,图像根据这些语法集进行组织,目标是每个语法集有1000多个图像;
  11. ILSVRC大规模视觉识别挑战赛:本挑战中图像分类跟踪的目标是训练一个模型,该模型可以使用大约120万张图像进行训练,50000张用于验证,100000张用于测试,将图像分类为1000个单独的类别。

Kaggle:面部表情识别挑战(FER):目标是从一张人脸照片中正确识别一个人正在经历的情绪。FER挑战赛共提供35888张图像,目标是将给定的面部表情分为七个不同类别:1.生气2。厌恶(由于阶级不平衡,有时与“恐惧”组合在一起)3。恐惧4。快乐5。悲伤的6。惊喜 7.中立 ;

  1. Indoor CVPR数据集由许多室内场景组成,包括商店、房屋、休闲空间、工作区和公共空间。该数据集的目标是正确训练能够识别每个区域的模型;
  2. Stanford Cars数据集由196类汽车的16185张图像组成。您可以根据车辆制造商、型号甚至制造商年份,以任何方式对该数据集进行切片和切分;

第6章-配置开发环境

  1. 基本的开发环境:以windows为例:CUDA、cudNN、pycharm,python3.6、conda构建虚拟环境、keras、sklearn、maxnet、OpenCV、scikit-image,独立显卡GPU;

第7章-第一个图像分类器

  1. 使用kNN算法对Animals数据集中的图片进行分类:仅使用原始像素强度来区分数据集中的每一个动物类型;
  2. 图像的预处理方法:平均减法、随机采样补丁、将图像调整为固定大小等;详细代码见本系列之前发布的文章;
  3. 欧几里得距离和曼哈顿(或城市街区)距离的使用;
  4. kNN采用对前几名最近图像距离进行投票,获得最高票数的即为当前图片的分类;
  5. kNN中的两个超参数:k的值(也就是对前k个距离进行排序)和使用曼哈顿还是欧几里得距离。
  6. kNN算法更适合低维特征空间,同时可以使用ANN(近似最近邻算法来解决kNN的时间开销)。
  7. kNN不需要训练,直接得到图像点然后求任意一个图片与其他图片的距离并进行排序即可;

第8章-参数化学习

  1. 四个组成部分:数据、评分函数、损失函数、权重和偏差;
  2. 数据:包括数据点(图像的像素强度,提取的特征等)和数据相关的标签;通常用多维矩阵表示数据;
  3. 得分函数接受输入的数据,并将数据映射到类标签;
  4. 损失函数:量化了预测的类别标签和ground-truth标签的吻合程度;
  5. 权重和偏差:权重通常记作w,偏差bia通常记作b;
  6. 线性分类-从图像到标签:将包含有三个通道的图像展开为一个1维的向量,然后和w权重矩阵相乘并加上偏差之后得到最终的得分;
  7. 参数学习的优势:一旦完成了对模型的训练就可以序列化保存权重,减少了模型的大小;同时,对测试用例的分类,仅需要进行简单的矩阵点积运算加上偏差b之后,得到最终的评分即可。这样比kNN算法快得多;
  8. 损失函数:正常情况下,损失将会随着时间的推移而减少;
  9. 多类SVM loss:对一张图片进行多种类别的评分,然后取得最高的那个作为图片最终的分类;
  10. 交叉熵Loss 和 Softmax分类器:Softmax分类给出每个类别标签的概率,而不是实际的分数;Softmax分类器是Logistic回归的二元形式的推广;

第9章-优化方法和正则化

  1. SGD:整个loss曲线的最小的局部最小值就是全局的最小值,理想情况下,需要找到的就是这个全局最小值;在优化过程中,损失沿着w的斜率方向走就是近似的梯度方向;梯度下降的解释:通过迭代过程,在loss最小的方向上迈出一步,以优化得分函数中的参数,实现低损失和高分类精度;
  2. 将SGD看作一个凸函数问题,这个时候最小的局部最小值就是全局的最小值;但是,在实际应用中,没有得到全局最小值,那么找到一个低loss的区域也是可以的;优化算法不能保证在合理的时间内达到局部最小值,但是通常会在足够快的时间内找到一个非常低的loss函数值,从而使得使用优化算法变得有用;
  3. 偏差的使用:一般可以将偏差bias作为和权重w一样的参数使用loss函数学习;
  4. 随机SGD的使用:在小批量数据上运行而不是在整个数据集上运行,batch size的大小影响算法整体运行速度;这种方法可以实现更快的收敛,并对最后的损失和精确度产生较小的影响;在每个epoch中使用batch size次权值的更新。
  5. 用于加速SGD的方法:momentu和Nesterov加速度(是标准栋梁的加深);
  6. momentum动量项:增加梯度相同方向的维度的更新强度,降低梯度相反方向的维度的更新强度;动量项γ通常设为0.9;尽管另一种常见的做法是将γ设置为0.5,直到学习稳定下来,然后将其增加到0.9 -看到动量小于0.5是极其罕见的;

nestrrov加速度:如果我们积累了太多的动量,我们可能会超过一个局部最小值,然后继续前进。因此,有一个更智能的滚动将是有利的,它知道什么时候减速,这是Nesterov加速梯度的切入点。

使用标准动量,我们计算梯度(蓝色小矢量),然后在梯度的方向上做一个大跳跃(蓝色大矢量)。在Nesterov加速下,我们首先会在之前的梯度(棕色向量)的方向上做一个大的跳跃,测量梯度,然后进行修正(红色向量)-绿色向量是Nesterov加速的最终修正更新(改编自Ruder)。

  1. 动量是一个可以增加模型收敛性的重要项。作者本身的观点:只要使用SGD都尽量动量项并设置为0.9。并随着时间的增加不断增加动量项的值。对于Nesterov加速来说,可以在较小的数据集上使用它。
  2. 正则化:在ML中以增加训练误差为代价而使得测试误差减少的策略统称为正则化;

有各种类型的正则化技术,如L1正则化、L2正则化(通常称为“权值衰减”)和Elastic Net[98],用于更新损失函数本身,增加一个额外的参数来约束模型的容量。Droupout是一种用于网络架构本身的正则化方式;在训练过程中也使用隐形正则化:数据增强,早期停止;

  1. 参数正则化方法:修改Loss函数,更新函数;
  2. 正则化可以确保模型更好地在没有训练的数据上进行正确的分类;提高模型的泛化能力;
  3. 学习率是一个对loss函数的重要参数,如果过大,那么loss将会在最小值左右跳来跳去,不会从数据中真正学习任何模式;如果过小,那么需要大量的迭代才可以达到合理的损失。

第10章-神经网络NN基础

1. ANN和感知器算法解释;

2. 激活函数:最简单的激活函数是阶跃函数,还有:sigmoid函数,ReLu函数,ELU函数,tanh函数,Leaky ReLu函数;然而,选择一个合适的激活函数可能是一项艰巨的任务;

3. 感知器算法是第一个被创建的ANN(人工神经网络)之一;

4. 感知器算法对AND OR XOR数据集做出预测;感知器是一个二分类的分类器;

5. 反向传播和多层网络:前向传播:输入通过网络传递并获得输出预测;反向传播:在网络中的最后一层计算loss函数的梯度,并使用梯度根据链式法则更新网络中的权值;

6. 将偏差作为权值矩阵中的一个可以训练的参数,可以使得训练更加有效,也更容易实施。

7. 反向传播过程:激活函数必须是可微分的,那么就可以计算误差给定权值wi,j,损失(e),节点输出oj和网络输出net j的偏导数。

  1. 需要注意的是XOR感知机一定需要bias层进行训练;
  2. 在使用Keras库在MINIST数据集上进行编程时,使用one-hot编码对数据集的标签进行编码;
  3. 神经网络中的各层:输入层(需要确定RGB形式的输入是通道有限还是通道在最后),隐藏层(也就是中间包含有激活函数,权值连接,BN的单层神经元的组合),最后的输出层(包含有分类器)。
  4. 神经网路中的四种组成:数据集,loss函数,网络架构,优化方法;
  5. 优化方法包含:Adam,SGD,RMSprop,Adagrad,Adadelta;
  6. 一般使用均匀分布或正态分布得到权重的初始值;权重的初始化方法也可以为:LeCun均匀正态,Glorot/Xavier 均匀正态,He et al./Kaiming/MSRA 均匀正态;

第11章-卷积神经网络

  1. CNN的组成:输入层,CONV卷积层,BN正则化层,激活层,POOL层,FC全连接层,dropout层,classifier分类层;
  2. 卷积核,过滤器filters等概念的详细解释详见本人之前发布的文章:

卷积神经网络(CNN)/目标检测领域相关名词解释_wyy_persist的博客-CSDN博客_rcnn是什么神经网络

  1. 卷积层往往包含k个filters/kenels。
  2. CNN中的名词:depth/stride/padding等解释详见地址:

卷积神经网络(CNN)/目标检测领域相关名词解释_wyy_persist的博客-CSDN博客_rcnn是什么神经网络

  1. Max pooling Average Pooling等pool方法;
  2. BN(批量归一化层)作用:用来规范输入在网络中传递到下一层。
  3. 使用BN可以显著提高分类精度,且可以得到更低的final loss和更稳定的Loss curve;允许更大的learning rate和正则化强度;
  4. Keras的创建者和维护者声明应该将BN放在activation层之后实现;
  5. Dropout层:对于训练集中的每个小批处理,dropout层随机断开网络体系结构中前一层到下一层的输入,其概率为p。在架构的FC层之间放置dropout层是最常见的。
  6. 常见的CNN训练模式:层模式(包含input->多个[conv->relu->pool层]->[FC->RELU]层->FC层)。当然有些网络也放弃了pool层的实现,而是换成了使用CONV层进行下采样从而降低维度。
  7. 一般来说CONV层应该使用较小的过滤器尺寸:3 x 3,5 x 5等;微小的1 x 1过滤器用于学习局部特征;较大的7 x 7和11 x 11可以用作网络中的第一个CONV层。
  8. 对pool层的使用在掌握了使用conv进行下采样之后便可以替换掉;
  9. 除非数据集包含了整个360度范围内旋转的数字,否则CNN对旋转不是旋转不变的(无法识别旋转角度过大的图片);

第12章-训练自己的CNN网络架构

  1. 使用Keras配置和转换图像到数组详细代码详见本人github:

TheWangYang/Code_For_Deep_Learning_for_Computer_Vision_with_Python: A code repository for Deep Learning for Computer Vision with Python. (github.com)

  1. 实现ShallowNet并在CIFAR-10上训练;

第13章-保存和加载模型;

1. 将模型序列化保存到磁盘上及从磁盘中加载预训练模型;

第14章-LeNet识别手写数字实例;

1. 实现LeNet;

2. LeNet在MNIST数据集上的测试;

第15章-MiniVGGNet:深的CNN

  1. MiniVGGNet实例;该架构的独特之处在于使用了3 x 3的内核;使用的是CIFAR-10数据集;

第16章-学习率调度器

  1. 学习率调度器实现了学习率的自适应调整;包含了:基于步进的衰减,使用keras定义关于epoch的衰减计划;

第17章-定位欠拟合和过拟合

1.欠拟合和过拟合的监测;

第18章-检查点模型

1. 检查点神经网络的改进;

2. 检查点最佳CNN;

第19章-可视化网络结构

  1. 需要使用graphviz和pydot-ng库实现网络结构的可视化;

第20章-直接使用的CNN

1. Keras中可以直接使用的CNN:VGG16 VGG19 ResNet50 Inception V3 Xception;

2. 使用预训练模型对图片进行分类;

第21章-案例学习:使用CNN破解网站上的验证码;

第22章-案例学习:微笑检测;(使用视频流作为测试)

本文作为StarterBundle的概述总结,主要用于向读者列出了书中每章节的大致内容,可以配合笔者之前发布的StarterBundle系列博客进行阅读。

上述案例及所有代码详见本人github地址:

TheWangYang/Code_For_Deep_Learning_for_Computer_Vision_with_Python: A code repository for Deep Learning for Computer Vision with Python. (github.com)

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐