1.卷积神经网络的图像识别原理:
通过过滤函数 来描绘出图像的边界: 过滤函数和图像相同区域的数值进行相乘,得到新的图像, 新图像则只剩下边图像。
cross-correlation: 可以旋转过滤函数,让不同方向的边都可以识别。
1 1 1 -1 0 1
0 0 0 -1 0 1
-1 -1 -1 -1 0 1
n*n为大图, f*f为核函数, p为边padding默认为0, s为步长stride默认为1, o*o为输出图像
公式为: (n+2p-f) /s +1 = o
2.RGB图像边界识别问题:
height, width, channel , RGB是3个channel
a. 多层数值的图像,对应的过滤函数也是多层。 比如3*3*3相乘的过程,就是27个数值相乘再相加, 得到边界值。
b. 水平和垂直的过滤函数, 对一个图像进行多个方向的过滤,得到多个方向的边界图像值, 构成多层图像channel
n * n *nc 乘以 f * f * nc --> (n - f +1) * (n - f +1) * n1/c
n1/c为边界方向的个数,比如水品,垂直,45度就是3
3.图像边界识别和神经网络计算结合a, z, w, b的映射
单层卷积网络:
a0为输入矩阵,也就是RGB图像的n*n*3的数值矩阵
w0+b为过滤函数Cube数,每个Cube为f*f*3的矩阵,每个边界分割的角度建1个Cube,10个角度就是280个参数。 280=10 *(3*3*3 +1)
a1=Relu(a0*w0+b) 输出图像为: (n-f+1) * (n-f+1)的 10层的结果
4.卷积神经网络的数据流结构ConvNet
是否是Cat:
输入的RGB图像,经过一层filter转换成新的边界图像,边界图像再下一层filter转化为新图像, 在最后一层的时候,把图像展开为1维的向量, 1维向量再接入到普通的DNN多层神经网络中,最后softmax再输出分类结果9~0
卷基层:ConvNet: 每层都是用filter来过滤出新层。
池化层:PoolNet: 每层filter,filter中不是相乘,而是取最大值(max pooling, average pooling),得到新层输出。 filter没有参数值,只有size. 只有2个参数filter, stride
FC层:FullConnect: 普通的神经网络层
输入层 --> ConvNet --> MaxPooling --> ConvNet --> MaxPooling --> FC1 --> FC2 --> FC3 --> SoftMax
5.卷积的好处
原始的图像识别: 16*16的像素,摊开成256的输入向量,最后用SoftMax来分类。
卷积的方法相比的好处:
Filter过滤,转换像素值。 每层向下的像素精简了,剔除了冗余的训练数据,只保留了边界等明显的特征像素。因此,最后用于神经网络训练的数据大幅减少。
1.Parameter Sharing: 单个Filter可以在全图使用,RGB三层都可以,也可以在相似的应用场景共享。
2.Sparsity Connection: 卷积过程各种,每个输出的值,只依赖很少的输入数据和参数。 因此容易回溯和调整
6.经典的图像识别网络
通过论文发布的一些比较固定的层级框架
LeNet-5 : 1980
(5Filter + 2AvgPool) * 6Channel --> (5Filter + 2AvgPool) * 16Channel --> FC120 --> FC84 --SoftMax
Filter之后可以加一层激活函数层,就是对生成的矩阵进行激活函数值转换, 然后取max pooling,效果比较明显。
AlexNet :
(11Filter + 3MaxPool) * 96Channel --> (5Filter + 3MaxPool)*256Channel -->3MaxPool-->3MaxPool-->3MaxPool-->3MaxPool --> FC9216 -->FC4096-->FC4096-->SoftMax
参数非常多,不太好用
VGG -16: 16表示有16层
每层的filter和max_pool参数都是一样: f=3 s=1,p=1, max_pool=2, s=2 channel数从64开始,递增到512,最大为512.
512重复一次filter+pool的块,之后接2层FC4096, 最后SoftMax分类
7.残差网络
ResNet: 152层 Redidual Network
几个华裔发明的计算方法,让网络能够支持更多的层次。 要点就是在把a值,跳过一层,或者多层,直接加到目标层的 z值里面 , 之后再调用激活函数进行输出。
一般的网络随着网络层次的增加,training error会变大,而ResNet则不会,可以持续降低Training Error.
有用的原因:
1.由于有增大z值,因此,让w取值有更大的可选范围。 不会因为w多次相乘变得特别小
2.从dimension的角度是看,a和后面的z的dimension必须一样,不然无法相加。 因此,可以增加ws * al,来转换dimension
8.ResNet 基于残差网络的图像识别方案:
在CNN的卷积层之间做残差网络,以VGG的理念为基础, 每个Conv的输出前后保持一直, 同时channel也保持一致, 因此:
g(z(l+2) + a(l)) 的dimension是可以相加的, 另外如果出现了pool层的残差跳跃, 需要引入ws,修正dimension. (ws可以是固定的,也可以是变动的)
9.使用1*1卷积
主要用于调整图像的dimension
32*32*196的图像, 应用 1*1* *32的卷积, 调整后得到32*32*32的图像
在32*32中取1格, 196个值和卷积值相乘, 最后relu输出。32*32格子计算出平面层, 32个channel输出32个层
10.谷歌的Inception注入网络:
对于一个Conv卷积层,通常是选定一个filter 比如1*1,3*3, 5*5. 而inception的方案,则是同时选择很多个filter,通过调整padding和stribe让众多的filter结果生成的输出结果是同样的dimension.
使用 1*1 卷积,把一个很大层次的图像减少到相对比较少的层次,再进行Inception的操作,1*1减少了计算的次数,降低到了10%
a.Inception Module是指一个Conv层包含了多个不同规格的filter,而输出结果是统一规格。 Inception Network是指卷积神经网络中,包含一系列的Inception Module.
b.通常一个Inception Block是分2层,先卷积1*1, 再加filter,减少计算的次数。 同时在Inception Block的filter中要包含Max_Pool的filter.
c.分支上输出可以直接用于分类,效果可能也不会太差。
11.迁移学习的三种方案
迁移学习是指下载一些比较好的分类结果的代码和weight,用在自己的应用场景中。
1.自己应用场景数据比较少的情况下,去掉下载代码的SoftMax层,把自己的数据+Weight转换之后,形成新的数据,本地保存,再用这个数据去进行分类训练。 下载的Weight在训练中不会更改。
2.自己自己的数据+90%Weight的数据,本地保存后,再填充几个隐藏层,加上自己的SoftMax进行分类训练。下载的Weight在训练中少量更改。
3.构建一样的网络,只是用下载的Weight进行初始化, 下载的Weight在训练中会全部更改。
12数据扩充
把图片进行镜像,旋转, 截取,缩放等操作,生成新的图片用于标记。
13.计算机视觉现状
a.数据是指有label的数据(Label Data),这种数据有时候是非常昂贵的。
b.如果有label的数据非常少,则适合使用hand engineering,数据多则可以用AI
物体识别(自动驾驶): 目前数据非常少,主要原因是标记数据的成本太高。
图片识别: 中等数据量,比如识别人,识别猫狗等,人脸等。 有许多标记好的数据。
语音识别: 数据量非常多, 适合AI
Transfer Learning:迁移学习, 少量数据的救星。
Benchmark: 基准比赛的诀窍
Ensembling Learning: 集成学习: 同时训练多个网络,最后把所有网络的y`,输出进行平均,而不是权重进行平均。 效果比较显著,但是耗时非常大, 因此一般用于比赛, 很少用于生产环境。
Multi-Crop: 1张图片衍生出10张图片,分别计算出y`,最后进行平均。 同样也是消耗资源较大,很少用于生产环境。 比赛预算够的话可以实施。同时运行10个以上network, 并保持同步。
建议:
1.用别人的Pretained Mode,别人已经用上千GPU训练了结果
2.用OpenSource的框架
3.计算机视觉的很多模型是通用的,因此尽量不要从0开始搭建系统
4.网络层级架构尽量采用已经在学术文献中公布的架构。比如ResNet,VGG等。尽量不要重复发明轮子。
14.目标定位
a.目标识别是在图片分类的范畴
b.目标定位是目标识别的基础上,再识别目标在图片中的位置。主要表现为用红框把物体标记出来
c.多个目标在图片中的定位,空间距离
侦测图片上的行人,车辆,自行车,背景。 SoftMax分4类
目标定位的输出数据:
Bx,By,Bw,Bh, + 分类1,分类2, 分类x
Bx,By,Bw,Bh 能标识出红框在图片上的位置,以及图片的分类。 因此训练过程中的label data,就包括具备分类标签的图片,以及红标。
红框的值,以(0,0),(1,1)坐标体系为基准,x,y为右上角点的坐标, w,h为水平和垂直的长度
标记数据y的表示:
Pc: 是否有行人,车辆,自行车 0/1
C1: 有行人 0/1
C2: 有车 0/1
C3: 有自行车 0/1
Bx: (0,0),(1,1)坐标体系内红框中心点的x坐标
By: (0,0),(1,1)坐标体系内红框中心点的y坐标
Bw: 红框x方向上的宽度
Bh: 红框y方向上的长度
15.特征点检测LandMark Detection
特征点是指图片上一组标记的点,用于定义相应的标签, 比如4个眼角的点,定义眼睛。 或者64个点,定义脸部。
标记数据y的表示 (0,0),(1,1)坐标体系内 :
Pc: 是否有眼睛
Llx: 左眼的左边点x
Lly: 左眼的左边点y
Lrx: 左眼的右边点x
Lry: 左眼的右边点y
Rlx: 右眼的左边点x
Rly: 右眼的左边点y
Rrx: 右眼的右边点x
Rry: 右眼的右边点y
目标检测(滑动卷积窗口)
把图片切分成很多个小窗口, 然后对小窗口中的图像进行分类,判断图像中的是否有Car,以及Car的红框的位置。
切分会按照不同的窗口尺寸来切人,确保能够把不同位置的Car都装到窗口里面去。
缺点: 这种判断的方法会需要同时运行很多个窗口的判断,性能会存在一定的问题。
16.滑动卷积窗口的优化实现Sliding Window
要点:
a.把FC层,用Conv层来替代. 用同样规格的filter的卷积来转换,成1*1*channel
b.找到一组源图尺寸,Conv的Filter, MaxPool配置,让最终结果是1*1*Channel
c.对其他大图,采用相同的Filter,Max_pool配置,得到的结果是以源图尺寸为SlidingWindow的结果集合。
d.这种实现方法的好处是能提高效率,确定好sliding window的大小后,一次就能把图片上的所有sliding window全部计算完成
Sliding Window预测过程:
1.训练过程,每个图片定义一个y'的label,包含bouding box的位置,sliding得到n*n*8的矩阵,再SoftMax到Y'
1.预测过程,输入图片,得到Y'的值。
这种结果往往不是特别精确。
Sliding Window
X图片 --> Conv --> Max --> sliding1*1卷积 --> sliding n*n*8 -SoftMax-> Y' 8 n为Sliding Wndow的横向个数。
Grid预测过程:
1.训练过程,引入19*19的Grid,对每个Grid定一个y',包含bouding box的位置定义。训练的结果是是19*19*8的矩阵。
2.预测过程,输入图片,得到19*19*8的结果
准确的原因,综合了19*19次的运算结果。
X图片 --> Conv --> Max --> sliding1*1卷积 --> sliding n*n*8 -SoftMax-> Y' (19*19*8)
label过程中,bouding box的中心所在的Grid,才被标记为有Car和bouding box,非中心不标记。
避免在1个Grid中包含两个Object
17.交并比 IOU,Intercection of Union
用预测出来的bouding box,与实际的bounding box进行比较,取重合部分。重合部分除以预测的部分就是交并比,(IoU ),IoU=1标识预测非常准确,IoU=0表示失败
IoU >= 0.5一般表示预测比较成功。 0.5为经验值,但非必须。
18.预测结果选择No Max Suppression(非极大值抑制)
多个目标物体的选择过程
a.对图片进行predict,由于使用了19*19的Grid,那么很多小Grid可能都会产生结果,标识出有Car.
b.在这些Grid的结果中,pc值最大的,bouding box,标记出来。同时,把和与这个BoudingBox有IoU相交的BoudingBox中IoU>0.5的也去掉(去掉同一物体的重复选取box)
c.在剩下的Grid结果中,再找pc值最大,标记出来,同样也把其他BoundingBox中相对IoU>0.5 去掉。
d.多次循环选择推出条件,Pc必须>0.6,小于0.6的直接忽略
19.单个Grid里面预测多个Object的方法:Anchor Box
单个Grid里面有多个物体的识别方法: 轻微改动,把Y'从原来的8维,变成16维,用于标识2个物体就可以了。
AnchorBox分为横向和竖向两种,因此,Label图片的时候,需要根据不同的内容,选择不同的Anchor Box。 瘦的为Anchor1,胖的为Anchor2.
20.人脸识别系统
Verification:
同时给出图片和身份Id,判断图片是否是该人。1-to-1问题
Recognition: 1对多的问题
通过图片识别出该图片中的人的Id. 比如有100个人的数据,给出任意的图片,识别图片的人id,或者“未识别”。
One-Shot Learning Problem:
一般人脸识别,都只提供了一张图片(用不了深度学习数据太少),而要求是根据一张图片来识别人物。比如公司只有雇员一张图片,系统智能学习一张图片,达到识别的目的。难度较高。
图片相似度计算(Similarity)
输入的图片和数据库中的Id图片,计算相似度,得到相似值。 大于1个阀值的时候,则判断身份识别。
21.Siamese网络:相似度训练网络
判断2个图片相似度的方法,两个图片分别执行相同的Conv层和FC层,得到一组parameter,再求两组parameter的标准差。值越小说明两个图片越相似。
22.Triplet损失
比较优秀的方式来训练Conv的参数
训练集合先分成3组,且配对,再进入训练。
Anchor: 目标图片
Positve: 同一图片
Negative: 不同图片
3个一组进行训练, 计算loss function: f(A)-f(P) - f(A)-f(N) + a
对于数据集来说,找到很多组的3个照片进行训练, 最佳的效果是f(A)-f(P)和f(A)-f(N)很接近。
训练过程:
a.所有图片打label:手工挑选图片分成3组,分Anchor,Positive,Negative
b.每组所有图片计算f(x),conv->pool->fc->fc,得到x1,x2,x3维向量,
c.X1,X2,X3计算出Triplet损失值,之后采用BP方法,AdamOptimizer训练参数
weight_filter_conv1,
bias_conv1,
weight_filter_conv2,
bias_conv2,
weight_filter_fc1,
bias_ fc1
weight_filter_fc2
bias_ fc2
d.三个图片采用相同的weight,bias参数进行训练。每次输入3个图片,BP1次,然后换下一组图片,BP1次,直到loss值比较稳定
Triplet基本上只用来训练参数,用来确定各种weight的取值, 而正式的预测,则需要生成多维向量, 再训练一次二分类。见二分类
23.面部验证与二分类
训练和预测过程:
a. 每组2个图片,定义weight和bias构建ConvNet,最后在FC层以逻辑回归的方式,Sigmoid函数生成y'的值
b. Label图片,如果一组图片同一人,则y'=1,否则为0
c. 训练所有Label的图片,得到所有的weight和bias
d. 预测对输入的2个图片,计算y'>0.5则判断是同一人
技巧: 当weight和bias都确定后,可以提前计算图片库中所有图片的FC向量值,并固化。
当需要识别新图片时,循环雇员的图片库FC向量值,一一计算y'值, 找到最大值,如果最大值小于0.5则显示不识别。
24.基于神经网络的图像风格转换Neural Style Transfer
Content Image: 内容图片
Style Image: 风格图片
Genreated Image: 合成的新图片
深度学习隐藏层图片可视化效果
通过各种方法,把学习过程中的图片可视化展示,用来了解算法所学习到的边界,或者特征。
有专门的论文来描述如何实现
迭代的过程如下:
a.先构建一张目标图,用随机像素
b.建立Lost Function,进行Gradient Desent计算dt(a * J(G) /2G )
c.随机像素图减去dt,然后逐步变成目标图片
d.dt的计算有相应的公式
G=G - a * J(G) /2G
J(G)=a Jconent(C,G) + b Jstyle(S,G)
25.从一维数据到三维数据
一维数据可以用RNN来解决
三维度数据同样也可以用CNN来建模
领取专属 10元无门槛券
私享最新 技术干货