PCANet学习笔记

PCANet: A Simple Deep Learning Baseline for Image Classification?

  • PCANet
    • 摘要
    • 1.介绍
    • 2.PCA的结构
      • 2.1 第一步:PCA(做两次,两个阶段)
      • 2.2 第二步:二值哈希
      • 2.3 块直方图
    • 后记

PCANet

IEEE Transactions on Image Processing 2014

摘要

  • 这篇论文提出了一种简单的用于图像分类的深度学习网络,它包含三步骤:1.PCA 2.二值哈希(二进制哈希,binary hashing)3.分块直方图(基于块的直方图,block-wise histograms)
  • 其中,PCA用于学习多级滤波器组(learn multistage filter banks),接着是二值哈希和块直方图(用来索引和池化)。
  • 为了更好的比较和理解,我们提出了PCANet的两个变体,RandNet和LDANet。他们拓扑结构相同,只是RandNet的滤波器是随机的,LDANet的滤波器是从LDA中学习的。

1.介绍

  • 图像分类之所以难度大,是因为同一类物体所展现出的样子千差万别,以及光照、遮挡、错位、变形等等所造成的变化(类内可变性)。

  • 人们为了应对类内可变性,在早些时候使用手工来对要分类的任务内容进行底层特征的提取。比如用于人脸和纹理分类的Gabor特征。以及LBP,和用于对象识别的SIFT和HOG特征。

  • 手工提取特征总有着局限性。不手工来提取特征而是自动从数据中学习特征是新的好方法。目前最典型的方法就是深度神经网络,深度学习的思想是发现多个层次的表示,希望用更高层次的特征来表示更抽象的数据语义,从而更好应对类内可变性。(从变化多端的数据中学习“不变的抽象的高级的”东西。)

  • 但神经网络还得调参,而且它的成功无法被论证,像个黑盒一样。能够在数学上清晰论证的第一个例子是小波散射网络(ScatNet),ScatNet的滤波器是小波算子根本不用去学习。ScatNet的效果很好。

  • 我们在研究ConvNet和ScatNet的区别和联系时就弄出了PCANet。ConvNet里面的滤波器是自适应的(自己学习自己调整),我们给换成了PCA滤波器。非线性层本来是ReLU啥的,我们给换成了最简单的二值量化(哈希)。池化层我们给换成了对刚才变成二值的那些数据进行编码再进行块直方图。这时输出的数据我们就认为是这个PCANet输出的最终特征。

2.PCA的结构

  • 假如我们的训练图片有 N 张,都是 m*n 的。我们设定所有阶段的滤波器都是 k1*k2 的。PCA滤波器需要从输入图片中得到。

2.1 第一步:PCA(做两次,两个阶段)

  • 对于每一个像素,我们都取一个 k1*k2 的patch(重叠也无所谓),一共就是 m*n 个patch。每个patch里的数都要减(小块内的)均值,得到处理后的m*n个patch。然后我们每一张输入图片都这么处理一下,并且把这些patch展平后拼在一起,一共m*n*N个patch。拼在一起之后的尺寸是:
    k1k2*Nmn,它每个patch是展开的,每一列都是一个展开的patch,一共Nmn个列。
    对所有输入图片处理完成后的矩阵X。X1代表一张处理后的输入图片
  • 对X做PCA,按特征值的大小取前L1个特征向量,把这L1个特征向量的每一列(每一列含有k1k2个元素)重排列为一个patch,相当于我们得到了L1个k1*k2的窗口,即L1个滤波器。关于PCA的过程可以参考:https://www.cnblogs.com/zy230530/p/7074215.html
    https://blog.csdn.net/program_developer/article/details/80632779
    L1特征向量
    W即为滤波器
    上面的W即为滤波器。然后就是对每一张图片,都用这L1个窗口做一次卷积。First stage到此结束。
    PCANet学习笔记_第1张图片
    这里一张输入图片卷积生成L1个结果。这是第一阶段。然后第二阶段和第一阶段一样,只不过用的是第一阶段的输入。
    PCANet学习笔记_第2张图片

2.2 第二步:二值哈希

  • 把上面得到的输出二值化,正值赋1,其他赋0。目前,我们手里得到的结果就是L1组被二值化了的图片,每组里有L2张图片。这L2张图片每一处对应的像素点组成了一个长度为L2的向量(由01组成的),把这一个由01组成的向量视为一个二进制编码转换成十进制,一个向量得到一个十进制数字,每一组的L2张图片都变成为1张图片,共L1张图片。
    PCANet学习笔记_第3张图片

2.3 块直方图

  • 在github上找的PCANet的python程序中关于histogram这部分的注释是这么写的:
def histogram(self, binary_images):
    """
    Separate a given image into blocks and calculate a histogram
    in each block.

    Supporse data in a block is in range [0, 3] and the acutual
    values are

    ::

        [0 0 1]
        [2 2 2]
        [2 3 3]

    | If default bins ``[-0.5 0.5 1.5 2.5 3.5]`` applied,
      the histogram will be ``[2 1 4 2]``.
    | If ``n_bins`` is specified, the range of data divided equally.

    | For example, if the data is in range ``[0, 3]`` and ``n_bins = 2``,
    | bins will be ``[-0.5 1.5 3.5]`` and the histogram will be ``[3 6]``.
    """

在直方图中的bins的含义是组距,这里可以百度。直方图所统计的是在该组距内像素的个数。在-0.5到0.5之间,只有两个0,所以统计结果就是2。在0.5到1.5之间,只有1个1,所以统计结果为1。以此类推,得到结果[2 1 4 2]。

  • 这是直方图统计。论文中所描述的具体步骤是:先把这L1个图片中的每一个图片都分为B个块,然后对每一个块都进行直方图统计,然后得到B个直方图统计。再把这B个结果拼接起来,得到这个图片的结果。每个图片都这么做一次,最终拼接出来的结果就是最终得到的特征。
  • 这个分块可以重叠着分也可以不重叠着分。作者的经验是对于人脸图像还是不重叠分块好,对于手写数字、纹理等重叠分块好。此外,直方图提供了一定程度的平移不变性(因为它是统计,与位置之类的无关)
  • 此外,作者实验认为两层的PCA刚刚好,再深了效果不一定好。而且分块分的越大所提供的平移不变性就越好。

后记

  • 论文看到这里还未看完,只是看完了PCANet的实现过程。但因为老师给的改论文任务需要的知识看到这里就够用了,赶时间的关系先暂时只看到这里,以后有时间再继续。
  • 尽管深度学习大行其道,但是一些传统方法也挺有意思,如PCA、SIFT、HOG、BOW、LDA以及小波网络ScatNet,有时间应该了解下。

看论文太不仔细了,看论文要认真首先,第二阶段所使用的用来生成第二阶段L2个滤波器的图片是所有第一阶段的卷积之后的图片,共NL1张。这一点容易被配图误导。
而且生成直方图后拼接那里仔细看维度,2的L2次方bins代表了啥?是分为2的L2次方个小区间,统计在这些小区间里分别都有多少前面encode的decimal数字,每个bins得到一个数字,拼接起来就有2的L2次方个数字。每一个B有2的L2次方,共有L1个B,所以那个维度就出来了。下次看论文要认真不要浮躁。

你可能感兴趣的:(传统图像处理方法)