百度 PaddlePaddle
…
传统图像识别
语义鸿沟:
- 相似的视觉特征,不同的语义概念。
- 不同的视觉特征,相同的语义概念。
传统识别方法:测量空间 – 特征表示 – 特征空间 – 特征匹配 – 类别空间
早期识别技术:采集图像,采集特征,相似度计算。
采用全局特征提取:颜色,形状,纹理。
特征变换:提高特征表示性能,降维。Manifold Learning/embedding:映射为低维空间下的向量表示,PCA MDS ISOMAP LLE Laplacian Eigenmap等。
索引技术:穷举搜索(效率低),临近搜索(牺牲精度)。KD-Tree LSH。二进制哈希,通过哈希编码特征,快速查找(减少特征存储空间,计算复杂度)。
相关反馈:通过用户反馈学习调整。Explicit Feedback(正负反馈),Implicit Feedback(根据可观察的行为推断用户意图)。
重排序:将接近的结果放到前面。
主要问题:全局特征丢失了图像细节。
中期图形识别:文本,词袋模型,倒排索引。图像,视觉词袋。
特征提取,生成视觉词典,词袋向量,倒排索引,特征提取,查询。
特征提取:局部特征,图像区块向量,特征检测子Harris Dog SURF HarrisAffine,特征描述子Sift glof shape context orb。
向量化:视觉词典生成。用特征向量,聚类(k means,affinity,propagation),找类中心,就是视觉关键词。每个图像可以找到多个视觉关键词直方图,直方图维度=聚类中心的个数,维度值=图像落在聚类中心的特征数量。
索引技术:倒排索引。提取局部描述,在索引中查找关键词。然后排序(tf-idf),对相似的图像投票。
后处理:局部几何验证,弱空间关系验证,乘积量化。提高一致性高的匹配结果,降低一致性低的匹配结果。
人工智能
时期:会推理 – 拥有知识 – 会学习 – 统计学习和神经网络
机器学习:对某个任务T可以从经验E中学习,经过经验E改进,使得任务T的性能有所提升。
一般过程:训练数据,测试数据,训练结果(策略,模型,算法),求函数F的过程。
深度学习:学习人的神经网络,解决机器学习问题。
优势:在特征空间中,由人提取特征变为由深度学习提取。
深度学习
滤波器提取:像素,边缘,特征。
图像识别:建立模型,损失函数(误差最小),参数学习。
建立模型:选择什么样的网络结构,多少层,每层多少神经元。
- 线性函数:f=wa+b,
- 激活函数(非线性)
损失函数:选择常用的损失函数,平方误差,交叉熵
参数学习:梯度下降法,反向传播
模型:
- 前馈神经网络:多隐藏层(多少层,多少结点),输出层(激活函数:softmax,概率)
分类任务要最后接全连接层。
卷积网络
传统全连接结构不够灵活,参数量巨大,不适合二维图形。采用卷积网络,前后层部分连接,权值共享,下采样。卷积网络,就是学习滤波器的值。
建立模型:局部连接,权值共享,下采样。为了减少参数。
局部连接:采用卷积核对图形(上一层)卷积,得到卷积后的结果(下一层)。
权值共享:卷积核的参数固定,为w1到wn。
下采样:缩小宽和高,常用最大值或平均值。
卷积计算后,图像会缩小,新尺寸为:w-c+1
卷积层:input_image * kernel = feature_map
一个卷积层可以有多个卷积核,一个图像产生多个特征图。
经典结构:LeNet-5
损失函数:
目标分类与检测:图像经过卷积池化,再经过卷积提取特征图,之后经过全连接网络。分类损失(交叉熵损失函数),回归损失(平方损失函数)。
一般结构示例:((卷积层+激活层)*2+池化层)*3+全连接层*3
计算机视觉的几种任务:图像分类(为图像赋予语义标签),目标检测(把物体位置标注出来),图像语义分割(精确勾勒出其轮廓和位置),图像实例分割(多物体时,将他们区分出来)
数据集:
- Cifar-10:比MNIST更高级的数据集,彩色的,50000训练+10000测试图片,几十种类别。
- ImageNet:强大的数据集,1281167训练+50000验证+100000测试(不对外公布),1000多个类别。
经典CNN:Hubel&Wiesel -> LeNet -> AlexNet -> NIN,GoogleNet,InceptionV3,V4 & VGG & InceptionV2,BN -> ResetNet
LeNet:使用MNIST数据集,早期用于数字识别。只接受32*32大小图像。
AlexNet:加入激活层。后来被ZF Net改进。接受227*227*3
图像大小。卷积核11*11
,每一层输出:(图像尺寸-卷积核尺寸)/步长+1,如果有padding边界延拓再修改大小。经过几轮,加一个池化,再经过几次,进入全连接。在训练过程中,使用了一些技巧:分组卷积,使用激活函数ReLU(解决梯度消失),DataAugmentation(数据增强,给图像产生噪声,形变,翻转,裁剪,防止过拟合),DropOut(解决过拟合0.5),BatchSize(批训练128),SGD-Momentum(随机梯度下降0.9),LearningRate(学习率0.01),L2 Weight-Dccay(5e-4)
NIN,GoogleNet,InceptionV3,V4:
VGG:
InceptionV2,BN:
ResetNet:
PaddlePaddle 安装
支持Windows,MacOS,Ubuntu,CentOS。
支持Pip,Docker等。
支持CUDA 9,10,CPU版本。
例如:
Windows + pip + Python 3 + CUDA 10 + cuDNN 7.3+
1 | python -m pip install paddlepaddle-gpu==1.7.1.post107 -i https://mirror.baidu.com/pypi/simple |
安装验证
1 | import paddle.fluid |
语法
基本数据类型
目前支持的基本数据类型有:
1 | float16 # 部分操作支持 |
Variable
一般可以认为Variable等价于Tensor。
Variable可分为三种:
模型中的可学习参数:网络权重,偏置等
1 | # 创建可学习参数 |
占位Variable:表示待提供输入的Variable
1 | #定义x的维度为[3,None],其中我们只能确定x的第一的维度为3,第二个维度未知,要在程序执行过程中才能确定 |
常量Variable:常量
1 | data = fluid.layers.fill_constant(shape=[1], value=0, dtype='int64') |
Tensor数据
对于一些batch内样本大小不一样的问题(有的大有的小),Paddle可以通过两种方式解决:
- Padding:修改到同样大小(推荐)
- Lod-Tensor:记录每个样本的大小,以便减少无用的计算量。如果前一个方法不可行,可以用这种方法。
LoD Tensor
Level of Detail Tensor 是Paddle的高级特性,是对Tensor的一种扩充。大部分情况下可以不必关注。
Operator
这里囊括所有对数据的操作,可以到以下模块中使用。但是Operator并不是实时的,而仅仅是提交操作,等待最后统一计算:
1 | import paddle.fluid.layers |
加法运算:
1 | # 定义执行器 |
Program
用于描述整个计算过程。Operator会被按顺序放入Program中。一般有这几种结构:
- 顺序结构
- 条件分支
- 循环
- 动态 RNN
- 静态 RNN
用户完成网络定义后,一段 Paddle 程序中通常存在 2 个 Program。
1 | # 定义模型参数初始化等操作,可以由框架自动生成,使用时无需显式地创建。如果调用修改了参数的默认初始化方式,框架会自动的将相关的修改加入default_startup_program |
Executor
该部分相当于对Program的编译和执行。Executor将Program转换为C++后端的可执行程序FluidProgram
,完成编译操作;Executor再执行编译好的FluidProgram
程序。
动态图机制
可以通过这个机制,无需构建整个图,就可以立即执行结果。这个机制能够方便用户及时调试模型,减少大量用于构建静态图的代码。
使用这一机制,需要在guard上下文环境下:
1 | x = np.ones([2, 2], np.float32) |
疫情数据可视化(爬虫,Pyecharts)
爬取数据
1 | import json |
疫情地图
1 | import json |
1 | import json |
增长曲线
1 | import numpy as np |
手势识别
1 | import os |
车牌识别
1 | #导入需要的包 |