技术--2021-12-《深度学习与图像识别原理及实践》-阿里达摩院
创建时间: | 2021/12/12 9:48 |
---|---|
更新时间: | 2021/12/20 17:29 |
作者: | HelloXF |
第一章 机器视觉 在行业中的应用
机器视觉的发展背景
人工智能
机器视觉
传统的图像处理方法和深度学习效果对比
图像处理+KNN(22%)、图像处理+MLP(24%)、浅层神经网络(43%)、深层神经网络(88%)
应用场景
人脸识别
人脸支付、人脸开卡、人脸登录、人脸签到、考勤、闸机、会员识别、安放监控、相册分类、美颜
视频监控分析
其他
交通拥堵治理、异常事件监测和轨迹跟踪、口罩监测、温度监测、平安城市情报收集分析、门店客流分析
工业瑕疵监测
图片识别分析
自动驾驶/辅助驾驶
三维图像视觉
医疗影像诊断
文字识别
图像/视频生成及设计
第二章 图像识别前置技术
深度学习框架
Theano
TensorFlow 2015年11月谷歌开源
MXNet 亚马逊
Keras
高层神经网络API
pytorch
图是动态的,利于扩展
caffe c++
搭建图像识别开发环境
Anaconda
包管理、虚拟环境管理
pytorch
Numpy
高性能科学计算和数据分析的基础包
第三章 图像分类之KNN算法
KNN 理论基础和实现
k-NearestNeighbor 最近相邻算法 找到最近的K个邻居
KNN算法的计算逻辑
-
给定测试对象,计算它与训练集中每个对象的距离
-
圈定距离最近的K个训练对象,作为测试的邻居
-
根据这k个邻居 找到占比最高的类别
常见的距离测算工具
曼哈顿距离
欧式距离
图像分类识别预备知识
数据初始
图像预处理归一化
knn 距离计算方式
模型参数调优
训练集、验证集、测试集
第四章机器学习基础
线性回归模型
介绍线性回归(Linear Regression)模型之前,首先介绍两个概念:线性关系和回归问题。
1)线性关系:变量之间的关系是一次函数,也就是说当一个自变量x和因变量y的关系被画出来时呈现的是一条直线,当两个自变量x1、x2和因变量y的关系被画出来时呈现的是一个平面。反之,如果一个自变量x和因变量y的关系为非线性关系,那么它们的关系被画出来时呈现的是一条曲线,而如果两个自变量x1、x2和因变量y的关系为非线性关系时,那么它们的关系被画出来时呈现的就是一个曲面。我们再用数学表达式来解释一下,y=ax1+bx2+c的自变量和因变量就是线性关系,而y=x2、y=sin(x)的自变量和因变量就是非线性关系。
2)回归问题:即预测一个连续问题的数值。这里列举一个例子以方便读者理解:小王站在银行的柜台前想知道他可以办理多少贷款,银行的工作人员会问小王几个问题,比如年龄多少(特征1),每个月收入多少(特征2)。之后根据小王的回答,银行工作人员根据模型(线性回归)分析结果,回答可以给小王10万(回归即是对据图数值的预测)的贷款。线性回归会根据历史上其他人的历史贷款数据(年龄和工资对应的两个特征分别记为x1和x2),找出最好的拟合面来进行预测(如果是一个特征则是线)。这个例子中用年龄和收入预测出具体的贷款额度,而贷款额度是一个连续的数值,因此该问题即为回归问题。
一元线性回归问题
一元线性回归可以表示为y=a*x+b,其中只有x一个自变量,y为因变量,a为斜率(有时也称为x的权重),b为截距
比如,我们目前有如下这样一组数据:
x = np.array([1,2,4,6,8]) #铺设管子的长度
y = np.array([2,5,7,8,9]) #收费,单位为元
学习一元线性模型的过程就是通过训练数据集得到最合适的a和b的过程,也就是说该一元线性模型的参数即为a和b。当输入一个新的测试数据点的时候,我们可以通过训练好的模型(y=ax+b)来进行预测。例如,对于一个测试数据x_test(不在np.array([1,2,4,6,8])中),由于模型参数a和b已知,因此可以计算线性方程ax_test+b得到预测的结果y_predict。
其中,x和y分别代表数据集中x和y的平均值。至此,我们完成了一元线性回归的理论介绍,得到了一元线性回归模型y=a*x+b中的参数a和b。
![](技术--2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [1].png)
实例代码:
import numpy as np
import matplotlib.pyplot as plt
if name=='main':
x = np.array([1,2,4,6,8])
y = np.array([2,5,7,8,9])
x_mean = np.mean(x)
y_mean = np.mean(y)
denominator = 0.0
numerator = 0.0
for x_i, y_i in zip(x, y):
numerator += (x_i - x_mean) * (y_i - y_mean)
按照a的公式得到分子
denominator += (x_i - x_mean) ** 2
按照a的公式得到分母
a = numerator / denominator
得到a
b = y_mean - a * x_mean
得到b
y_predict = a * x + b
plt.scatter(x,y,color='b')
plt.plot(x,y_predict,color='r')
plt.xlabel('管子的长度', fontproperties = 'simHei', fontsize = 15)
plt.ylabel('收费', fontproperties='simHei', fontsize=15)
plt.show()
多元线性回归
在现实社会中,一种现象常常是与多个自变量(或者说特征)相联系,由多个自变量的最优组合共同来预测或者估计因变量(预测值)会更符合实际情况。例如,房子售价预测的关系中,房子的售价往往与房子的住房面积、房间数量、与市中心的距离(地段),旁边是否有便利的交通等因素息息相关。表达式的形式一般如下:多
元 线 性 回 归 与 一 元 线 性 回 归 类 似 , 都 是 使
得尽可能的小。多元线性回归也可以使用最小二乘法进行计算,最终得出θ0、θ1、θ2等参数。
![](技术--2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [2].png)![](技术--
2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [3].png)![](技术--
2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [4].png)
这 个 公 式 就 是 多 元 线 性 回 归 的 正 规 方 程
解(NormalEquation)。下面我们根据这个公式使用Python实现多元线性回归。实现代码具体如下:
import numpy as np
from numpy import linalg
class MLinearRegression:
def init(self):
self.coef_ = None #代表的是权重
self.interception_ = None #代表的是截距
self._theta = None #代表的是权重+截距'''规范下代码,X_train代表的是矩阵X大写,y_train代表的是矢量y小写
'''def fit(self,X_train, y_train):assert X_train.shape[0] ==
y_train.shape[0],"训练集的矩阵行数与标签的行数保持一致"
ones = np.ones((X_train.shape[0], 1))
X_b = np.hstack((ones, X_train)) #将X矩阵转为X_b矩阵,其中第一列为1,其余不变
self._theta = linalg.inv(X_b.T.dot(X_b)).dot(
X_b.T).dot(y_train)
self.interception_ = self._theta[0]
self.coef_ = self._theta[1:]
return self
def predict(self,X_predict):
ones = np.ones((X_predict.shape[0], 1))
X_b = np.hstack((ones, X_predict)) #将X矩阵转为X_b矩阵,其中第一列为1,其余不变
return X_b.dot(self._theta) #得到的即为预测值
def mean_squared_error(self, y_true, y_predict):
return np.sum((y_true - y_predict) ** 2) / len(y_true)
def score(self,X_test,y_test): #使用r square
y_predict = self.predict(X_test)
return 1 - (self.mean_squared_error(y_test,y_predict) / (np.var(y_test)))
逻辑回归模型
简单理解逻辑回归模型,就是在线性回归的基础上加一个Sigmoid函数对线性回归的结果进行压缩,令其最终预测值y在一个范围内。在逻辑回归中,计算出的预测值是一个0到1的概率值,我们通常以0.5为分界线,如果预测的概率值大于0.5则会将最终结果归为1这个类别,如果预测的概率值小于等于0.5则会将最终结果归为0这个类别。而1和0在实际项目中可能代表了很多含义,比如1代表恶性肿瘤,0代表良性肿瘤,1代表银行可以借给小王贷款,0代表银行不能借给小王贷款等。
![](技术--2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [5].png)
Sigmoid函数(压缩函数)
![](技术--2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [6].png)
该公式中,e约等于2.718,z是线性回归的方程序,p表示计算出来的概率,范围在0到1之间。接下来我们将这个函
数绘制出来,看看它的形状。使用Python的Numpy以及Matplotlib库进行编写,代码如下:
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x):
y = 1.0 / (1.0 + np.exp(-x))
return y
plot_x = np.linspace(-10, 10, 100)
plot_y = sigmoid(plot_x)
plt.plot(plot_x, plot_y)
plt.show()
![](技术--2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [7].png)
梯度下降
梯度下降算法
(GradientDescent
Optimization)是常用的最优化方法之一。“最优化方法”属于运筹学方法,是指在某些约束条件下,为某些变量选取哪些值,可以使得设定的目标函数达到最优的问题。最优化方法有很多种,常见的有梯度下降法、
牛顿法、共轭梯度法
第五章 神经网络基础
本章的要点具体如下。
·神经元的基本介绍。
·激活函数。
·神经网络的基本介绍。
·前向传播。
·输出层。
·损失函数。
·最优化。
·基于数值微分的反向传播。
神经网络
![](技术--2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [8].png)
一个输入层,一个输出层,多个隐藏层
我们可以列举一个小例子,假设我们现在手
里有一堆手写数字识别的数据,每个图像的灰度值编码将作为神经元的输入,假设输入的图片都是2828的灰度图,那么我们的输入神经元就有2828=784个输入神经元。如果我们想知道这张图片是0-9中的哪个数字,那么神经网络的输出层则需要定义10个神经元,它们分别代表该数字是否为0,是否为1,是否为2……是否为9。每个神经元都将预测该图片是某个数字的概率是多少,终我们可以从这10个神经元输出的结果中抽取概率最大的那个作为最后的预测结果。
神经元
![](技术--2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [9].png)
如图5-5所示,一个神经网络的训练算法就是让权重的值调整到最佳,以使得整个网络的预测(或者分类)效果最好。
![](技术--2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [10].png)
之前我们简单介绍了神经元的概念,现在我们来看下,在神经网络中设置神经元的个数是否会影响分类效果,一般来说更多神经元的神经网络可以表达更复杂的函数。然而这既是优势也是不足,优势是可以分类更复杂的数据,不足是可能会造成对训练数据的
过拟合 。 过拟合(Overfitting)是指网络对数据中的噪声有很强的拟合能力,而没有重视数据之间潜在的基本关系。
5.8基于测试集的评价
损失函数的值正在不断地变小,这虽然是一个好的现象,但是也只能说明神经网络能够正确识别训练集数据而已,并不能说明对于测试集数据,神经网络也能正确识别。
过拟合是指:基于训练集的数据,神经网络可以正确识别,但是对于训练数据集以外的数据(比如测试集),就无法识别了。
神经网络利用训练数据进行学习,并用测试数据评价学习到的模型,神经网络的训练是以损失函数为指标进行的,更新权重以及偏移量,最终使得损失函数的值不断减小。
数值微分是非常耗时的,但是其实现过程却比较容易理解。第6章中,我们将要实现的是稍微复杂一点的误差反向传播,以高速地计算梯度。
第6章 误差反向传播
第5章介绍了神经网络,并通过数值微分计算了神经网络的权重参数以及偏置量(bias)。虽然数值微分实现起来比较容易,但是在计算上花费的时间却比较多。本章将重点介绍一个高效计算权重以及偏置量的梯度方法——误差反向传播法。
本章的要点具体如下。
·激活函数层的实现。
·Affine层的实现。
·Softmax层的实现。
·整体实现。
·正则化惩罚。
第7章PyTorch实现神经网络图像分类
本章将主要介绍如何使用PyTorch编写神经网络,在之前的章节中,我们已经带领读者根据所学的知识编写出属于自己的神经网络图像分类程序,但是如今业界有非常多成熟的深度学习框架(在本书第二章有详细介绍)可以直接应用。在本章中,我们将介绍如何使用PyTorch构建神经网络的一些必备元素,带你进一步了解PyTorch。之后我们会带领大家使用之前接触过的MNIST和Cifar10两个数据集做图像分类任务,这一次我们将使用PyTorch构建神经网络算法完成实验。
本章的要点具体如下。
·PyTorch要点概述。
·PyTorch构建神经网络处理图像的分类问题。
第8章 卷积神经网络
卷积神经网络(ConvolutionalNeuralNetwork,CNN)是一种深度前馈神经网络,目前在图片分类、图片检索、目标检测、目标分割、目标跟踪、视频分类、姿态估计等图像视频相关领域中已有很多较为成功的应用。本章首先会介绍卷积神经网络的基础知识,然后介绍一些常见的卷积神经网络的结构,最后给出卷积神经网络在Cifar10上的实战案例。
8.1.1全连接层
全连接层(Fully Connected Layer)可以简单地理解为前面章节中提到的神经网络的一个隐藏层,它包含权重矢量W和激活函数。
具体来说,对于一张32323的图片(宽和高均为32个像素,有RGB三个信道,可以将其理解为一个32323的矩阵),要通过全连接层,首先要将其拉伸为3072*1的矢量作为神经网络隐藏层的输入,然后该矢量与权重矢量W做点乘操作,再将点乘后的结果作为激活函数(如
Sigmoid或tanh)的输入,最终,激活函数输出的结果便是全 连 接 层 的 最 终 结 果 。 操 作 过 程 如 图8-1所 示 , 其
中activation中蓝色圆圈的值表示所有3072个输入和10维权重矢量W点乘的结果。
补充说明:
当完成激活(activation)后的结果为一维矢量时,通常将该结果称为特征矢量(或激活矢量);当激活后的结果为二维矢量时,通常称为特征层(feature
map,有时也称为激活层,activation map)。由于后面要介绍的卷积层也需要经过激活函数,因此卷积操作得到的结果通常被称为“特征层”。
![](技术--2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [11].png)
8.1.2卷积层
卷积层(Convolution
Layer)与全连接层不同,它保留了输入图像的空间特征,即对于一张32323的图片而言,卷积层的输入就是32323的矩阵,不需要做任何改变。在卷积层中,我们引入了一个新的概念:卷积核kernel(常简称为卷积,有时也称为滤波器filter)。卷积的大小可以在实际需要时自定义其长和宽(常见的卷积神经网络中通常将其设置为11、33、5*5等),其信道个数一般设置为与输入图片信道数量一致。
必要的概念已经介绍完毕,接下来我们讲一下卷积的过程: 让卷积(核)在输入图片上依次进行滑动 ,滑动方向为从左到右,从上到下;
每滑动一次,卷积(核)就与其滑窗位置对应的输入图片x做一次点积计算并得到一个数值。
这里需要提到另外一个概念:步长(stride)。 步长是指卷积在输入图片上移动时需要移动的像素数,如步长为1时,卷积每次只移动1个像素
,计算过程不会跳过任何一个像素,而步长为2时,卷积每次移动2个像素。
![](技术--2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [12].png)![](技术--
2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [13].png)
8.1.3池化层
池化(pooling)是对图片进行压缩(降采样)的一种方法,池化的方法有很多,如max pooling、average pooling
等 。
8.1.4批规范化层
批规范化层(BatchNorm层)是2015年Ioffe和Szegedy等人提出的想法,主要是为了加速神经网络的收敛过程以及
提高训练过程中的稳定性。
8.2常见卷积神经网络结构
8.2.1 AlexNet
8.2.2 VGGNet
VGGNet包含两种结构,分别为16层和19层
8.2.3 GoogLeNet
8.2.4 ResNet
2015年,何凯明提出了152层的ResNet[4],以top1误差3.6%的图像识别记录获得了2015年ILSVRC比赛的冠军,同
时也使得卷积神经网络有了真正的“深度”。ResNet的提出是革命性的,它为解决神经网络中因为网络深度导致的“梯度消失”问题提供了一个非常好的思路。
8.3 VGG16实现Cifar10分类
第9章 目标检测
9.1定位+分类
定位+分类问题是分类到目标检测的一个过渡问题,从单纯地图片分类到分类后给出目标所处的位置,再到多目标的
类别和位置。
9.2目标检测
9.2.1 R-CNN
9.2.2 Fast R-CNN
9.2.3 Faster R-CNN
9.2.4 YOLO
9.2.5 SSD
SSD[4]同时借鉴了YOLO网格的思想和Faster R-CNN的anchor机制,使SSD可以在进行快速预测的同时又可以相对
准确地获取目标的位置。
9.3 SSD实现VOC目标检测
第10章 分割
10.1语义分割
10.2实例分割
第12章 神经网络可视化
12.3图片风格化
12.3.1理论介绍
图片风格化看起来很神奇,那么风格化的功能是如何设计出来的呢?首先,为了产生风格化的合成图,需要2个输入,即原图和艺术风格图,而输出图片则完全是被创造出来的一张新图片。那么,接下来就是神经网络设计中最重要的部分,即如何让网络实现“风格化”这个功能。
我们将问题细分,对于输入图片中的原图,我们想获取的是其“内容”,而对于输入图片中的艺术画,我们想获取的是其“风格”。那么对于新产生的这张图片,我们想同时保留原图的“内容”以及艺术的“风格”,因此可以为网络设置一个学习目标,如公式(12-1)所示,使其既可以学习到“内容”,也可以学习到“风格”。也就是说,让新产生的图片在“内容”和“风格”之间达到平衡,同时最小化二者之间的差异。其中,α和β分别为产生新图片时内容和风格的权重系数。
![](技术--2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [14].png)
(1)学习内容
通过前面的知识我们可以了解到,神经网络的高层信息
可以学习到图片的内容。因此,内容就是对网络高层特征的
重现,如公式(12-2)所示。其中p为原图,x为待产生的新
图,Pl和Fl分别对应原图和新图在第l层的特征, 为新图在
第l层的第i个Kernel的第j个位置的激活情况(这里已将二维
的Kernel矢量化为一维)。根据公式(12-2)给出的方差计
算方法,计算其梯度并反向传播,使得x的内容尽可能地接
近p。
![](技术--2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [15].png)
(
2)学习风格
风格即纹理,表现的是卷积神经网络不同层、不同特征
之间的关系。在数学上是使用神经网络特征层之间的内积来
表达这种“纹理”关系,如公式(12-3)所示(G为格雷姆矩
阵)。而不同层的纹理表示优势不一样,因此风格学习的最
终目标如公式(12-5)所示,对不同层的误差进行累加,每
层的误差则是艺术风格图片与新图在该层上格雷姆矩阵的均
方差,如公式(12-4)所示,其中a为风格图,x为待产生的
新图。后续的优化与普通神经网络的学习类似,即使用梯度
回传的方式最小化误差Lstyle使得x的纹理尽可能地接近a。
![](技术--2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [16].png)![](技术--
2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [17].png)
第13章 图像识别算法的部署模式
![](技术--2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [18].png)![](技术--
2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [19].png)![](技术--
2021-12-《深度学习与图像识别原理及实践》-阿里达摩院_files/Image [20].png)