Posts Tagged ‘Machine Learning’

RCNN、Fast RCNN和Faster RCNN的个人理解

June 1st, 2017

最近在使用Keras对我定义的目标进行训练和目标检测,目前最火的目标检测框架就是Faster RCNN了,Faster RCNN克服了他的前辈RCNN和Fast RCNN固有的一些问题,提升了检测速度,使得在视频领域的目标检测成为可能。

RCNN算法这里简单提一下:

  • 区域提名:通过Selective Search从原始图片提取2000个左右区域候选框;
  • 区域大小归一化:把所有侯选框缩放成固定大小(原文采用227×227)
  • 特征提取:通过CNN网络,提取特征;
  • 分类与回归:在特征层的基础上添加两个全连接层,再用SVM分类来做识别,用线性回归来微调边框位置与大小,其中每个类别单独训练一个边框回归器。

RCNN最大弊端就是拥有太多的候选框,这个导致每个候选框都要分别通过CNN提取特征,计算量依然很大,其中有不少其实是重复计算,最终这个也使得目标识别非常慢

Fast RCNN是RCNN的改进版,借鉴了SPP-Net中对于提取到的卷积层特征的处理,即提出去掉了原始图像上对于ROI区域的crop/warp等操作(也就是把所有的候选框都做归一化),换成了在提取到的卷积特征上的空间金字塔池化层(Spatial Pyramid Pooling,SPP)。因此无论图片大小如何,无论图像向量唯独如何,经过Spatial Pyramid Pooling操作,提取出来的提取出来的维度数据都是一致的,这样就可以统一送至全连接层了。

ROI操作(Spatial Pyramid Pooling,SPP):

通过上图可以看到feature map 经过SPP层被分割成了16个256d+4个256d+1个256d的ROI 特征向量。因此在Fast RCNN中输入的候选框可大可小,然后根据得到的候选框区域投影到整幅图片的特征向量层。

总的Fast RCNN步骤如下:

  • 特征提取:以整张图片为输入利用CNN得到图片的特征层;
  • 区域提名:通过Selective Search等方法从原始图片提取区域候选框,并把这些候选框一一投影到最后的特征层;
  • 区域归一化:针对特征层上的每个区域候选框进行RoI Pooling操作,得到固定大小的特征表示
  • 分类与回归:然后再通过两个全连接层,分别用softmax多分类做目标识别,用回归模型进行边框位置与大小微调。

Faster RCNN在Fast RCNN的基础上更进一部,不再使用Selective Search等方法获取候选框,而是利用RPN(Region Proposal Networks)网络来计算候选框。RPN以一张任意大小的图片为输入,输出一批矩形区域提名,每个区域对应一个目标分数和位置信息。当然RPN和Fast RCNN共用基础的图片特征。

RPN会产生K个Anchor Box,而每个Anchor Box都包括2K个score和4K个坐标点,socre就是这个区域的评分,有多大概率是这个东西?4K就是矩形的是个坐标位置。然后将这些Anchor Box和整幅图的特征向量结合起来(就是Feature Map ——> ROI Feature的操作,就是上面Fast RCNN步骤三,最后产生固定大小的特征表示),得到的固定大小的特征表示可以进行对应区域的classification,分类这个区域是不是那个物体,然后用 k 个回归模型(各自对应不同的Anchor Box)微调候选框位置与大小,最后进行目标真正的分类,判断这个目标是什么东西。

总的步骤:

  • 特征提取:同Fast R-CNN,以整张图片为输入,利用CNN得到图片的特征层;
  • 区域提名:在最终的卷积特征层上利用 k 个不同的矩形框(Anchor Box)进行提名, k 一般取9;
  • 分类与回归:对每个Anchor Box对应的区域进行object/non-object二分类,并用 k 个回归模型(各自对应不同的Anchor Box)微调候选框位置与大小,最后进行目标分类。

Faster RCNN得到区域提名以后,后续操作和Fast RCNN一模一样!事实上只需关注RPN即可,如下图流程(忽略前后的不同….):

梳理了整个算法脉络大白话就是:目标检测分为两大部分:1)区域提名 2)特征回归分类。每个部分都是各大算法进化过来的。

参考文献

[1] R. Girshick, J. Donahue, T. Darrell, J. Malik. Rich feature hierarchies for accurate object detection and semantic segmentation. ImageNet Large-Scale Visual Recognition Challenge workshop, ICCV, 2013.

[2] R. Girshick, J. Donahue, T. Darrell, J. Malik. Rich feature hierarchies for accurate object detection and semantic segmentation. IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2014.

[3] R. Girshick, J. Donahue, T. Darrell, J. Malik. Region-Based Convolutional Networks for Accurate Object Detection and Segmentation. IEEE Transactions on Pattern Analysis and Machine Intelligence, May. 2015.

[4] K. He, X. Zhang, S. Ren, and J. Sun. Spatial pyramid pooling in deep convolutional networks for visual recognition. In ECCV. 2014.

[5] S. Ren, K. He, R. Girshick, J. Sun. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks. Advances in Neural Information Processing Systems 28 (NIPS), 2015.

CNN参数小结

May 11th, 2017

CNN(Convolutional Neural Networks)是当下最火的一种神经网络,主要用来识别图像。CNN由三部分组成:Convolutional Layer, Pooling Layer 和 Fully-Connected Layer,卷积层和池化都是CNN特有的,全连接层是传统的神经网络。

整个网络流程就是 [INPUT – CONV – RELU – POOL – FC],其中CONV-RELU-POOL可以添加很多层,如图所示

举个例子:

  • 输入的数据都是28x28x1的图像,意思就是长宽都是28的pixel,并且是单通道图像。
  • 卷积层中,神经元与输入层中的一个局部区域相连,每个神经元都计算自己与输入层相连的小块区域与自己权重的内积。卷积层会计算所有神经元的输出。如果我们使用25个filter[3x3x25],每个filter是得到的输出数据体的维度就是[26x26x25]。
  • ReLU层将会逐个元素地进行激活函数操作,比如使用以0为阈值的max(0,x)作为激活函数。该层对数据尺寸没有改变,还是[26x26x25]。
  • 汇聚层在在空间维度(宽度和高度)上进行降采样(downsampling)操作,其实也就是POOL层[2×2],数据尺寸变为[13x13x25]。
  • 然后可以再次进行卷积、ReLU和Pool。
  • 全连接层将会计算分类评分,数据尺寸变为[1x1x10],其中10个数字对应的就是CIFAR-10中10个类别的分类评分值,全连接层与常规神经网络一样,其中每个神经元都与前一层中所有神经元相连接。

最开始卷积的维度变化让我很头疼,看了好久才理解。总结下面公式:

  • 输入数据体的尺寸为W1 * H1 * D1
  • 4个参数:
    filter的数量K
    filter的空间尺寸F
    步长stride S
    零填充数量(the amount of zero padding)P
  • 输出数据体的尺寸为W2 * H2 * D2 ,其中:
    W2=(W1-F+2P)/S+1
    H2=(H1-F+2P)/S+1 (宽度和高度的计算方法相同)
    D2=K
    由于参数共享,每个滤波器包含F * F *D1个权重,卷积层一共有F * F * D1  K个权重和K个偏置。

每进行一次卷积,图像的深度就增加一倍,深度与filter的数量K紧密相关!

常见的设置是F=3,S=1,P=1,零填充数量就是为了让输入图像长宽变为偶数(其实就是在图像外围填充0),例如是32、64、128等,而使用S=1的步长,是因为使得空间维度的降采样全部由Pooling层负责,卷积层只负责对输入数据体的深度进行变换。

使用这些参数需要考虑到内存的占用率,比如使用64个尺寸为3×3的滤波器对【224x224x3】的图像进行卷积,零填充为1,步长为1,那么得到的激活数据体尺寸是[224x224x64]。这个数量就是一千万的数据特征,或者就是72MB的内存!

第二次池化后,使用Flatten,压扁这个数据集合,建立二层全连接网络,第一层神经元数100,第二层为10。

 

 

参考:

http://cs231n.github.io/convolutional-networks/

http://cs231n.stanford.edu/syllabus.html

http://cs.stanford.edu/people/karpathy/convnetjs/demo/cifar10.html

How to elaborate and train a Neural Network

March 31st, 2017

Elaborate a Neural Network

First, pick a network architecture; choose the layout of your neural network, including how many hidden units in each layer and how many layers in total you want to have.

  • Number of input units = dimension of features x(i)

  • Number of output units = number of classes

  • Number of hidden units per layer = usually more the better (must balance with cost of computation as it increases with more hidden units)

  • Defaults: 1 hidden layer. If you have more than 1 hidden layer, then it is recommended that you have the same number of units in every hidden layer.

构建 Neural Network 首先要明确要创建几个隐藏层,每个隐藏层有多少个参数。

首先输入单元个数就是输入的特征数,输出的个数就是分类的个数,每个隐藏层中单元的个数是多少?

通常意义上,隐藏层中单元的个数越多,这个分类效果越好,但是需要权衡计算与特征数的关系。默认情况,一个神经网络会存在一个隐藏层,当多余一个隐藏层的情况下,每层拥有的单元个数相同。

Training a Neural Network

  • Randomly initialize the weights
  • Implement forward propagation to get hΘ(x(i)) for any x(i)
  • Implement the cost function
  • Implement backpropagation to compute partial derivatives
  • Use gradient checking to confirm that your backpropagation works. Then disable gradient checking.
  • Use gradient descent or a built-in optimization function to minimize the cost function with the weights in theta.

输入的特征的权重是随机指定的(如果全部输入的权重都为一个常数,那么输入到隐藏层的值就是相同的,那么导致hΘ(x(i))也是相同的,导致symmetry。不同的初始权重就是为了Symmetry Breaking)。

实现前馈传播算法,计算出每层的x(i),实现代价函数,通过反向传播算法计算每个Θ的偏导,然后通过梯度检查测试反向传播算法是否成功,然后将梯度检查disable掉(梯度检查计算复杂度太高)。

最后使用梯度下降找到最小的代价函数值和Θ。这个就是需要的特征集。

参考:

http://blog.csdn.net/jinlianjingd/article/details/50767743

https://www.coursera.org/learn/machine-learning/supplement/Uskwd/putting-it-together