计算机视觉目标检测研究札记

摘要: 写一篇小结,记录目标检测算法近期的学习笔记。


目标检测中的Anchor与感受野

摘要: Anchor的设置对于目标检测来说作用的重要性不言而喻,本文主要整理了相关技巧和背后的逻辑原理解读,不断更新完善。


图像数据标注工具推荐-CVAT

摘要: 从事深度学习研究开始,尝试过很多不同类型,不同功能的数据标注工具,尤其是图像标注工具,包括自己写的简单工具,都不能很好的满足任务的需求,近期突然使用了CVAT,感觉似乎可能成为未来工具包中的常备系列,写此一文,记录使用过程。


从头训练一个图像分类器

Test Picture

摘要: 本文记录了利用fast.ai快速构建一个图像识别(图像分类器)的方法。


Batch-Normalization(批量归一化)

BN不得不了解的深度学习技术~

摘要: 借重读论文的机会,重新整理一下Batch Normalization的关键技术。


深度学习实践方法论

Test Picture

摘要: 深度学习实践的方法论是一套靠经验而非算法总结的行之有效的指导,后续随着研究深入将不断更新补充相关内容。


Thinking Stats

Pandas技巧


Feature_Visualization_in_NN

features

摘要:


经典网络归纳: ResNet

Test Picture

摘要: 作为深度卷积神经网络的里程碑式的作品,ResNet为卷积网络往更深层次扩展指明了方向,本文结合相关论文总结一下ResNet中创造性的想法。


Backpropagation in Neural Network

摘要: 反向传播毋庸置疑是整个神经网络的精髓,正是由于它的提出标志着深度神经网络的训练在有限算力基础上成为可能,但反向传播本身的原理同样值得品读和思考。

本文主要总结神经网络中反向传播算法的推导流程并挖掘一些深层次的原理。反向传播算法在1970年就已经提出,直到1986年 David Rumelhart, Geoffrey Hinton, and Ronald Williams在一篇论文中对其实现的分析才得以普及。

1. 表达式的定义

  • $w_{jk}^l$ 代表第l−1层第k个神经元,与第l层第j个神经元之间的权重(注意j与k的顺序);
  • $b_j^l$ 代表第l层中第j个神经元的偏移;
  • $a_j^l$ 代表第l层中第j个神经元的激活函数值;
  • $L$ 代表神经网络的总层数;
  • $J(W,b)$ 简写为$J$ 代表神经网络的代价函数;

假设我们有$m$ 个训练样本${(x^{(1)},y^{(1)}),…, (x^{(m)},y^{(m)})}$ ,对于每个训练样本$(x,y)$ 定义代价函数为:

对于$m$个训练样本,总的代价函数为:

根据神经网络层与层之间关系的定义,我们有如下表达式(向量形式):

其中

利用梯度下降法进行目标优化使用的主要梯度更新公式:

因为神经网络的复杂性导致$\frac{\partial J}{\partial w^l}$ 无法直接计算或者计算代价太大(每个权重的计算都需要进行一次前向传播),反向传播的目的在于提供一种更加高效的手段,完成上述梯度的更新操作。

2. 反向传播的直观理解

反向传播是用于理解改变网络中的任一权重如何影响网络代价函数的过程。假设神经网络中某个权重$w_{jk}^l$

产生了轻微的扰动误差 $\Delta w_{jk}^l$ ,扰动误差导致该神经元的输出产生误差 $\Delta z_j^l$ ,这个扰动将使对应的神经元$a_j^l$ 产生一个扰动误差 $\Delta a_j^l$ ,该误差将逐步向后层传递,直至达到输出层,并最终影响代价函数,生成一个代价误差 $\Delta J = \frac{\partial J}{\partial z_j^l}\Delta z_j^l$ 。我们可以给出如下式子来为通过误差近似计算梯度提供方向:

其中,$\delta_j^l$ 可以定义为$l$层第$j$个神经元上的误差。

我们先从计算最后一层误差$\delta_j^L$ 开始,

公式E1(向量形式):

证明

现在把问题转变为如何利用反向传播由后往前逐步计算误差$\delta_j^l$ ,为计算不同层之间误差之间的关系,利用链式法则给出如下推理过程:

公式E2

有了以上误差的反向传播计算方法,我们可以利用计算的误差计算权重的梯度如下:

公式E3

公式E4

其中公式(4)也可以写成:

证明:

另一种求解方式

如何我们令$\delta_j^l =\frac{\partial J}{\partial a_j^l}$ 也可以按照上述过程类似的方法推到出相关公式

3. 反向传播算法的计算流程

  1. 输入$x$,令$a^1=z^1=x$;
  2. 前向传播: 对于每层$l=2,3,…,L$计算$z^l$和$a^l$;
  3. 根据公式E1计算输出误差:$\delta^L = \nabla_a J \odot \sigma’(z^L)$ ;
  4. 反向传播:对于每层$l=L-1,L-2,…,2$ 利用公式E2计算误差:$\delta^l = ((w^{l+1})^T \delta^{l+1}) \odot \sigma’(z^l)$ ;
  5. 利用公式E3E4计算参数梯度;
  6. 更新权重

参考

  1. CS231n讲义:Backpropagation, Intuitions
  2. Neural Networks and Deep Learning
  3. Machine Learning Cousera Course

物体识别技术之Faster R-CNN

摘要: 2015年提出的Faster R-CNN架构在基于机器视觉的物体识别领域占据重要的地位,从R-CNN到fast R-CNN再到faster R-CNN,乃至后续的Mask-R-CNN形成了一条完整的两步识别的物体识别技术生态。

概述

物体识别技术一直是机器视觉中业务场景最丰富,关注度最高的一个类别。将花几期来分别对主流的物体识别技术如Faster RCNN,SSD,YOLO,Mask-RCNN进行整理和分析,并利用实践的方式进行强化。

在R-CNN,Fast R-CNN,Faster R-CNN中,物体识别被分为两个步骤实现(与SSD、YOLO的主要差异):候选区域选择和基于深度网络的物体识别。

传统的物体识别算法

传统的物体识别技术采用的滑动窗口+图像金字塔+分类器的算法,可以参见前述博文在基于机器视觉技术的品牌LOGO检测中做的实际测试,原理易于理解,但效率较低,很难达到实时处理的需求:

  1. 速度慢,效率低:需要利用滑动窗口遍历图像的不同位置;
  2. 受图像畸变影响严重:由于CNN的输入必须是固定大小的图像,所以限制了检测目标的长宽比例,比如这种方法不能同时检测矮胖对象和长瘦对象;
  3. 错误率高,没法识别图像的全局特征,每个窗口只能看到局部特征,所以检测精度也受到了比较大的影响。

物体识别精度的衡量指标

  • IoU(Intersection over Union)

    IoU

  • mAP(Mean Average Precision)

    • 所有分类的IoU均值;

参考论文

  1. R-CNN: Rich feature hierarchies for accurate object detection and semantic segmentation
  2. Faster R-CNN

R-CNN

论文: Rich feature hierarchies for accurate object detection and semantic segmentation,2013,Girshick

问题:解决目标检测网络

R-CNN的实现包括如下图所示的4个主要步骤:

  1. 接受输入图像;
  2. 利用Selective Search算法从图像中抽取大约2000个候选区域;
  3. 对每个候选区域利用预训练的CNN进行特征抽取(迁移学习);
  4. 对每个特征抽取区域利用线性SVM进行分类

R-CNN

论文的主要贡献:

  1. 使用Selective Search替代了特征金字塔和滑动窗口实现的兴趣区域选择,提升了效率;
  2. 利用预训练的神经网络进行特征提取替代了手工特征如HOG的特征提取方法,正是由于CNN学习的特征具备的鲁棒性大大提供了系统的泛化性能

仍然存在的问题:

  1. 识别慢,效率低;
  2. 不是一个端到端的解决方案

Selective Search算法

论文:Selective Search for Object Recognition,2012,J.R.R.Uijings

之前很多算法都是基于蛮力搜索(Exhaustive Search),对整张图片进行扫描,或者是采用动态窗口的方法,这种方法耗时严重,操作麻烦。J.R.R提出的选择性搜索的方法,在识别前期在整张图片中生成1~3K个proposal的方法,再对每个proposal进行处理。

Selective Search [4], one of the most popular methods, greedily merges superpixels based on engineered low-level features.

缺点:效率低,计算量大,使用1个CPU处理一张图片,需要2s1

Fast R-CNN

问题提出:解决端到端训练的问题,提出了Region of Interest(ROI)Pooling

跟R-CNN中使用深度CNN的方式不同,Fast R-CNN中首先将CNN应用到整个图像中进行特征提取,利用一个固定窗口在抽取特征上滑动,分别进行分类预测和回归预测。Fast R-CNN的主要处理流程包括:

  1. 输入图像和标定的识别框信息;
  2. 利用深度卷积神经网络抽取图像特征;
  3. 利用ROI pooling获取ROI特征向量;
  4. 利用两个全联通层进行分类和回归预测

Fast RCNN

端到端的训练过程源于提出了多任务损失函数,将分类问题和回归问题整合在一起,打通了梯度的更新路径,下图描述了Fast R-CNN的训练和测试过程:

fast R-CNN 训练与测试

缺点:仍然没有摆脱Selective Search算法在推理阶段进行候选区域生成。

Faster R-CNN

论文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks, 2015, Shaoqing Ren, Kaiming He, Ross Girshick, Jian Sun

实现:Github上作者提供的Python实现

商业实现:Pinterests2

问题提出:在基于候选区域选择的CNN(region-based CNN)物体识别网络中,候选区域选择的效率成为了整个系统的瓶颈;Faster R-CNN中提出了Region Proposal Netwrok与物体识别网络共享网络参数(替代了Fast R-CNN中的Selective Search算法),降低了候选区域选择的时间代价。

  • 基础网络(Base Network):特征抽取(迁移学习),抽取的特征将同时应用于RPN和RoIP阶段
  • RPN:候选区域选择(利用了网络的Attention机制),用于发掘图像中潜在的可能存在物体的区域
  • RoIP:兴趣区域特征提取
  • R-CNN:分类预测和候选框回归

fasterrcnn-architecture.b9035cba

使用一块GPU,性能大概在7-10 FPS

基础网络

基础网络的主要作用是利用迁移学习完成原始图像的特征抽取,在论文中使用了 在ImageNet预训练的ZFVGG来完成这一任务。当然根据物体识别任务的不同应用场景可以在模型精度和推理时间上进行折中选择 MobileNet, ResNet-152, DenseNet

文献中,Faster R-CNN的基础网络在使用VGG作为特征提取网络时,使用conv5/conv5_1层的输出特征;

目前ResNet在很多情况下已经替代了VGG16作为特征提取网络;

为了保证网络是全卷积神经网络架构,需要把全连接层剔除,保证可以输入任意维度的输入图像

base-network

Anchor Box

替代传统算法的特征金字塔或filter金字塔

一张图像中被识别目标形状大小各异,这也是在原始算法中加入特征金子塔来对原始图像进行多个维度特征变换的原因。

Anchor Box也是为了解决上述问题,我们可以不改变图像的形状,通过改变预测每个区域物体的“窗口”来框出不同大小的物体。首先在原始图像中均匀的选取一些Anchor Box中心点,然后在每个中心点上预制多个Anchor Box。

anchors-centers.141181d6

在Faster R-CNN是使用3个不同形状(1:1, 1:2,2:1)和3个不同大小(128x128,256x256,512x512,按照原图尺寸生成)进行组合共计3x3=9种不同的Anchor box。

使用VGG16做特征提取的情况下,一张输入图片总共可以刻画为512个窗口区域,生成512x(4+2)x9个输出参数。

anchors-progress.119e1e92

由于直接预测bouding box难以实现,作者将问题转变为预测预测值与真实值之间的偏移,将问题转变为四个偏移值的预测问题。

Region Proposal Network(RPN)

RPN的主要目的是对每个区域是否可能有物体进行打分,基于打分值决定是否进行下一步的分类任务。在基础网络抽取的特征图上使用一个3x3的滑动窗口(512个卷积核),每个滑动窗口的中心点位置为上述Achor Box的中心点区域,在每个滑动窗口区域,将得到两个1x1卷积网络输出,分别为2k的前景/背景预测(该区域是否存在可被预测物体,分类问题)以及4k的位置信息预测(回归问题),四个值分别是

k是Anchor Box的数目

我们将从候选区域中选择打分较高的前N个进行下一轮分析,如果物体打分足够高,下一步将进行非极大抑制和区域选择,如果打分值很低将抛弃这些区域

rpn-conv-layers.63c5bf86

目标和损失函数

The RPN does two different type of predictions: the binary classification and the bounding box regression adjustment.

For training, we take all the anchors and put them into two different categories. Those that overlap a ground-truth object with an Intersection over Union (IoU) bigger than 0.5 are considered “foreground” and those that don’t overlap any ground truth object or have less than 0.1 IoU with ground-truth objects are considered “background”.

其中分类的损失函数为:

$p_i$为第$i$个参考框是物体的预测概率值,$p_i^*$为实际值,如果anchor是物体的话该值为1,否则为0。

回归损失函数为:

其中R为smooth L1平滑方程:

$t_i$与 $ t_i^ $ 分别对应四个偏差值。$ t_i $ 是预测框与anchor之间的偏差,$ t_i^ $ 是ground truth与anchor之间的偏差

参数选择

参数选择与其说是一个技术活倒不如认为是一个经验活,是通过大量实践验证出来的最佳实践,所以有必要分析整理每篇文章对参数选择和优化的技巧。

  • 非极大抑制的IoU阈值一般使用0.6
  • 论文中关于候选区域选择了N=2000,但一般而言比这个小的数目也能取得不错的效果,比如50,100 …

Region of Interest(ROI)Pooling

ROI阶段的主要作用为使用矩阵操作(Array Slicing)从特征图中捕获N个兴趣区域,并降采样到7x7xD的尺寸,服务于接下来的全联同网络。

roi

Region-based CNN

使用两个不同的全联通网络(Fully-Connected Network,FC):

  • A fully-connected layer with N+1units where N is the total number of classes and that extra one is for the background class.
  • A fully-connected layer with 4N units. We want to have a regression prediction, thus we need $\Delta{center{x}}$, $\Delta{center{y}}$, $\Delta{width}$, $\Delta{height}$ for each of the N possible classes.

rcnn-architecture.6732b9bd

在这个步骤中同样由两个损失函数构成:Categorical cross-entropy分类损失和Smooth L1回归损失

网络训练

  • 实验表明:联合训练(使用weighted sum)优于单独训练两个网络;
    • 将每个阶段的4个损失函数(其中RPN阶段2个,R-CNN阶段2个)组合在一起,并赋不同的权重,分类损失需要获得比回归损失更多的权重;
    • 使用L2正则损失
  • 是否单独训练基础网络取悦于目标与预训练网络的差异,这个跟迁移学习类似;
  • 使用带动量的随机梯度下降(SGD with momentum),其中monmentum=0.9,初始学习率lr=0.001, 50k步之后,lr调整为0.0001

实践时间

数据集:LISA交通标志数据库

  • 下载地址:http://cvrr.ucsd.edu/LISA/lisa-traffic-sign-dataset.html
  • 47 US sign types
  • 7855 annotations on 6610 frames.
  • Sign sizes from 6x6 to 167x168 pixels.
  • Images obtained from different cameras. Image sizes vary from 640x480 to 1024x522 pixels.
  • Some images in color and some in grayscale.
  • Full version of the dataset includes videos for all annotated signs.
  • Each sign is annotated with sign type, position, size, occluded (yes/no), on side road (yes/no).
  • All annotations are save in plain text .csv-files.
  • ~7.7GB大小

参考

1. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks, 2015, Shaoqing Ren, Kaiming He, Ross Girshick, Jian Sun
2. D. Kislyuk, Y. Liu, D. Liu, E. Tzeng, and Y. Jing, “Human curation and convnets: Powering item-to-item recommendations on pinterest,” arXiv:1511.04003, 2015.
3. Faster R-CNN: Down the rabbit hole of modern object detection

深度学习基础之优化算法

合适优化算法的选择有助于提升训练效率和收敛的速度,本文对常用的优化算法进行总结。在这章中将归纳SGD、RMSprop、Adam等的基础原理。优化算法的优劣来自于对相关算法的熟悉程度。


神经网络之感知机(Perceptron)

感知机于1957年由Rosenblatt等人提出,是神经网络和支持向量机的基础。


深度学习基础之正则化

明确任务目标和评价准则对于模型的设计及优化至关重要,本文将总结常用的相关方法和模型性能评价准则。为了简化,本文将主要针对回归问题和分类问题分别予以归纳,其它问题可采取类似的方法及手段。


深度学习基础之目标及评估

明确任务目标和评价准则对于模型的设计及优化至关重要,本文将总结常用的相关方法和模型性能评价准则。为了简化,本文将主要针对回归问题和分类问题分别予以归纳,其它问题可采取类似的方法及手段。


深度学习基础之模型压缩

深度学习中模型压缩关键技术总结。

深度学习基础篇将从几个不同的层面来总结在过去一段时间对于深度学习关键技术的理解,通过知识体系的归纳了解知识体系的不足,提升对核心技术点的认识。所有系列文章将在未来一段时间内容随着掌握了解的深入迭代更新。目前主要希望对如下几个领域进行归纳汇总:

  1. 问题定义
  2. 目标及评估
  3. 数据准备与预处理
  4. 激活函数的归纳及总结
  5. 优化算法的归纳及总结
  6. 正则化与泛化性能
  7. 模型压缩
  8. 数据扩充

为了增加深度学习模型的容量,往往包含了大量的待训练参数和模型规模,以VGG-16为例,参数数目为1亿3千万,占用空间500MB,如果利用VGG-16进行一次图片识别任务,需要进行309亿次的浮点运算(FLOPs)。如此大的模型体积和对算力的依赖,为深度学习模型迁移到嵌入式设备或者利用CPU进行推理带来了很大的难度,为此通过合理的模型压缩技术在保证模型性能没有明显下降的情况下降低模型体积和参数数目成为一个热点的研究问题。

同时,研究发现深度神经网络面临严峻的过参数化问题,需要注意的是,这种冗余在模型训练阶段是十分必要的。因为深度神经网络面临的是一个极其复杂的非凸优化问题,对于现有的基于梯度下降的优化算法而言,这种参数上的冗余保证了网络能够收敛到一个比较好的最优值。因而在一定程度上,网络越深,参数越多,模型越复杂,其最终的效果也往往越好。

按照压缩过程对网络结构的破坏程度,我们将模型压缩技术分为“前端压缩”与“后端压缩”两部分。所谓“前端压缩”,是指不改变原网络结构的压缩技术,主要包括知识蒸馏、紧凑的模型结构设计以及滤波器层面的剪枝等;而“后端压缩”则包括低秩近似、未加限制的剪枝、参数量化以及二值网络等,其目标在于尽可能地减少模型大小,因而会对原始网络结构造成极大程度的改造。其中,由于“前端压缩”未改变原有的网络结构,仅仅只是在原模型的基础上减少了网络的层数或者滤波器的个数,其最终的模型可完美适配现有的深度学习库。相比之下,“后端压缩”为了追求极致的压缩比,不得不对原有的网络结构进行改造,如对参数进行量化表示等,而这样的改造往往是不可逆的。同时,为了获得理想的压缩效果,必须开发相配套的运行库,甚至是专门的硬件设备,其最终的结果往往是一种压缩技术对应于一套运行库,从而带来了巨大的维护成本。

剪枝与稀疏约束

知识蒸馏

参数量化

二值网络

参考

  1. 《解析卷积神经网络—深度学习实践手册》
  2. Keras文档

深度学习基础之数据准备与预处理

由于人工智能面向的应用和场景的多样性,导致需要分析的数据无论是从维度还是格式上都存在巨大差异,数据准备阶段需要解决数据的数值化、归一化、特征工程等共性的问题。

深度学习基础篇将从几个不同的层面来总结在过去一段时间对于深度学习关键技术的理解,通过知识体系的归纳了解知识体系的不足,提升对核心技术点的认识。所有系列文章将在未来一段时间内容随着掌握了解的深入迭代更新。目前主要希望对如下几个领域进行归纳汇总:

  1. 问题定义
  2. 目标及评估
  3. 数据准备与预处理
  4. 激活函数的归纳及总结
  5. 优化算法的归纳及总结
  6. 正则化与泛化性能
  7. 模型压缩
  8. 数据扩充

由于人工智能面向的应用和场景的多样性,导致需要分析的数据无论是从维度还是格式上都存在巨大差异,数据准备阶段需要解决数据的数值化、归一化、特征工程等共性的问题。

深度学习的端到端学习能力并不意味着在实际的业务处理中把原始数据直接丢进网络模型,与传统的机器学习技术类似必要的数据预处理工作无论是对于提升模型的收敛效率还是提升模型的训练质量都具备十分重要的意义。

数值化

由于神经网络的输入限定为数值数据,所以对于字符串数据、文本数据、类别数据,在导入网络模型之前需要进行数值化处理,转换为数值数据。其中类别数据可以采用one-hot编码等方式进行编码。

数据归一化

数据归一化是属于预处理阶段经常采用的一种手段。虽然这里有一系列可行的方法,但是这一步通常是根据数据的具体情况而明确选择的。特征归一化常用的方法包含如下几种:

  • 简单缩放
  • 逐样本均值消减(也称为移除直流分量)
  • 特征标准化(使数据集中所有特征都具有零均值和单位方差)

简单缩放

在简单缩放中,我们的目的是通过对数据的每一个维度的值进行重新调节(这些维度可能是相互独立的),使得最终的数据向量落在 [0,1]或[ − 1,1] 的区间内(根据数据情况而定)。这对后续的处理十分重要,因为很多默认参数(如 PCA-白化中的 epsilon)都假定数据已被缩放到合理区间。

例子:在处理自然图像时,我们获得的像素值在 [0,255] 区间中,常用的处理是将这些像素值除以 255,使它们缩放到 [0,1] 中.

逐样本均值消减

如果你的数据是平稳的(即数据每一个维度的统计都服从相同分布),那么你可以考虑在每个样本上减去数据的统计平均值(逐样本计算)。

例子:对于图像,这种归一化可以移除图像的平均亮度值 (intensity)。很多情况下我们对图像的照度并不感兴趣,而更多地关注其内容,这时对每个数据点移除像素的均值是有意义的。注意:虽然该方法广泛地应用于图像,但在处理彩色图像时需要格外小心,具体来说,是因为不同色彩通道中的像素并不都存在平稳特性。

特征标准化

特征标准化指的是(独立地)使得数据的每一个维度具有零均值和单位方差。这是归一化中最常见的方法并被广泛地使用(例如,在使用支持向量机(SVM)时,特征标准化常被建议用作预处理的一部分)。在实际应用中,特征标准化的具体做法是:首先计算每一个维度上数据的均值(使用全体数据计算),之后在每一个维度上都减去该均值。下一步便是在数据的每一维度上除以该维度上数据的标准差。

例子:处理音频数据时,常用 Mel 倒频系数 MFCCs 来表征数据。然而MFCC特征的第一个分量(表示直流分量)数值太大,常常会掩盖其他分量。这种情况下,为了平衡各个分量的影响,通常对特征的每个分量独立地使用标准化处理。

原理: 在每个样本中减去数据的统计平均值,可以移除数据的共同部分,凸显个体差异。

注意:

数据归一化中采取的统计平均值和均方差值都来源于训练数据,由于理论上不应该从验证集和测试集中获取信息,所以对于验证集和测试集的处理也使用训练集的结果。

标准流程

在这一部分中,我们将介绍几种在一些数据集上有良好表现的预处理标准流程.

自然灰度图像

灰度图像具有平稳特性,我们通常在第一步对每个数据样本分别做均值消减(即减去直流分量),然后采用 PCA/ZCA 白化处理,其中的 epsilon 要足够大以达到低通滤波的效果。

彩色图像

对于彩色图像,色彩通道间并不存在平稳特性。因此我们通常首先对数据进行特征缩放(使像素值位于 [0,1] 区间),然后使用足够大的 epsilon 来做 PCA/ZCA。注意在进行 PCA 变换前需要对特征进行分量均值归零化。

音频 (MFCC/频谱图)

对于音频数据 (MFCC 和频谱图),每一维度的取值范围(方差)不同。例如 MFCC 的第一分量是直流分量,通常其幅度远大于其他分量,尤其当特征中包含时域导数 (temporal derivatives) 时(这是音频处理中的常用方法)更是如此。因此,对这类数据的预处理通常从简单的数据标准化开始(即使得数据的每一维度均值为零、方差为 1),然后进行 PCA/ZCA 白化(使用合适的 epsilon)。

MNIST 手写数字

MNIST 数据集的像素值在 [0,255] 区间中。我们首先将其缩放到 [0,1] 区间。实际上,进行逐样本均值消去也有助于特征学习。注:也可选择以对 MNIST 进行 PCA/ZCA 白化,但这在实践中不常用。

图像预处理

Mean Subtraction

data normalization

目的:减少不同图片受光照变化的影响。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import cv2

class MeanPreprocessor:
def __init__(self, rMean, gMean, bMean):
# store the Red, Green, and Blue channel averages across a
# training set
self.rMean = rMean
self.gMean = gMean
self.bMean = bMean

def preprocess(self, image):
# split the image into its respective Red, Green, and Blue
# channels
(B, G, R) = cv2.split(image.astype("float32"))

# subtract the means for each channel
R -= self.rMean
G -= self.gMean
B -= self.bMean

# merge the channels back together and return the image
return cv2.merge([B, G, R])

Patch Extraction

从原始图像中随机采样MxN的区域,当原始图像的稀疏度较高时可以采用该方法。

降低过拟合的概率

256x256 ===> 227x227

1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn.feature_extraction.image import extract_patches_2d

class PatchPreprocessor:
def __init__(self, width, height):
# store the target width and height of the image
self.width = width
self.height = height

def preprocess(self, image):
# extract a random crop from the image with the target width
# and height
return extract_patches_2d(image, (self.height, self.width),
max_patches=1)[0]

Cropping(Over-Sampling)

使用扣取方法可以从原始图像的四个角+中心位置进行扣取,实验证明该方法可以提升1-2个百分比的分类精度;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import numpy as np
import cv2

class CropPreprocessor:
def __init__(self, width, height, horiz=True, inter=cv2.INTER_AREA):
# store the target image width, height, whether or not
# horizontal flips should be included, along with the
# interpolation method used when resizing
self.width = width
self.height = height
self.horiz = horiz
self.inter = inter

def preprocess(self, image):
# initialize the list of crops
crops = []

# grab the width and height of the image then use these
# dimensions to define the corners of the image based
(h, w) = image.shape[:2]
coords = [
[0, 0, self.width, self.height],
[w - self.width, 0, w, self.height],
[w - self.width, h - self.height, w, h],
[0, h - self.height, self.width, h]]

# compute the center crop of the image as well
dW = int(0.5 * (w - self.width))
dH = int(0.5 * (h - self.height))
coords.append([dW, dH, w - dW, h - dH])

# loop over the coordinates, extract each of the crops,
# and resize each of them to a fixed size
for (startX, startY, endX, endY) in coords:
crop = image[startY:endY, startX:endX]
crop = cv2.resize(crop, (self.width, self.height),
interpolation=self.inter)
crops.append(crop)

# check to see if the horizontal flips should be taken
if self.horiz:
# compute the horizontal mirror flips for each crop
mirrors = [cv2.flip(c, 1) for c in crops]
crops.extend(mirrors)

# return the set of crops
return np.array(crops)

Keras中的数据预处理功能

http://keras-cn.readthedocs.io/en/latest/preprocessing/sequence/

A. 设置随机种子

1
np.random.seed(1337)  # for reproducibility

B. 输入数据维度规格化,这里每个样本只是size为784的一维数组。

1
X_train = X_train.reshape(60000, 784)

将类别标签转换为one-hot encoding, 这一步对多分类是必须的

1
one_hot_labels  = keras.utils.np_utils.to_categorical(labels, num_classes=10)

C. 输入数据类型转换,数值归一化

1
2
X_train = X_train.astype('float32')
X_train /= 255

序列预处理

文本预处理

图片预处理

样本数据序列化为HDF5文件

目的:减少多次IO读取的延时

参考

  1. 《解析卷积神经网络—深度学习实践手册》
  2. Keras文档
  3. http://deeplearning.stanford.edu/wiki/index.php/%E6%95%B0%E6%8D%AE%E9%A2%84%E5%A4%84%E7%90%86
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×