2015-11-20 17:16:17 yaoqiang2011 阅读数 48058

作者: 寒小阳
时间:2015年11月。
出处:http://blog.csdn.net/han_xiaoyang/article/details/49949535
声明:版权所有,转载请注明出处,谢谢

1. 图像分类问题

这是人每天自然而然会做的事情,普通到大部分时候,我们都感知不到我们在完成一个个这样的任务。早晨起床洗漱,你要看看洗漱台一堆东西中哪个是杯子,哪个是你的牙刷;吃早餐的时候你要分辨食物和碗碟…
抽象一下,对于一张输入的图片,要判定它属于给定的一些标签/类别中的哪一个。看似很简单的一个问题,这么多年却一直是计算机视觉的一个核心问题,应用场景也很多。它的重要性还体现在,其实其他的一些计算机视觉的问题(比如说物体定位和识别、图像内容分割等)都可以基于它去完成。

咱们举个例子从机器学习的角度描述一下这个问题^_^

计算机拿到一张图片(如下图所示),然后需要给出它对应{猫,狗,帽子,杯子}4类的概率。人类是灰常牛逼的生物,我们一瞥就知道这货是猫。然而对计算机而言,他们是没办法像人一样『看』到整张图片的。对它而言,这是一个3维的大矩阵,包含248*400个像素点,每个像素点又有红绿蓝(RGB)3个颜色通道的值,每个值在0(黑)-255(白)之间,计算机就需要根据这248*400*3=297600个数值去判定这货是『猫』

猫图像=>矩阵

1.1 图像识别的难点

图像识别看似很直接。但实际上包含很多挑战,人类可是经过数亿年的进化才获得如此强大的大脑,对于各种物体有着精准的视觉理解力。总体而言,我们想『教』会计算机去认识一类图,会有下面这样一些困难:

  • 视角不同,每个事物旋转或者侧视最后的构图都完全不同
  • 尺寸大小不统一,相同内容的图片也可大可小
  • 变形,很多东西处于特殊的情形下,会有特殊的摆放和形状
  • 光影等干扰/幻象
  • 背景干扰
  • 同类内的差异(比如椅子有靠椅/吧椅/餐椅/躺椅…)

图像面临的挑战

1.2 识别的途径

首先,大家想想就知道,这个算法并不像『对一个数组排序』或者『求有向图的最短路径』,我们没办法提前制定一个流程和规则去解决。定义『猫』这种动物本身就是一件很难的事情了,更不要说去定义一只猫在图像上的固定表现形式。所以我们寄希望于机器学习,使用『Data-driven approach/数据驱动法』来做做尝试。简单说来,就是对于每个类别,我们都找一定量的图片数据,『喂』给计算机,让它自己去『学习和总结』每一类的图片的特点。对了,这个过程和小盆友学习新鲜事物是一样一样的。『喂』给计算机学习的图片数据就和下图的猫/狗/杯子/帽子一样:

Data-driven approach

1.3 机器学习解决图像分类的流程/Pipeline

整体的流程和普通机器学习完全一致,简单说来,也就下面三步:

  • 输入:我们的给定K个类别的N张图片,作为计算机学习的训练集
  • 学习:让计算机逐张图片地『观察』和『学习』
  • 评估:就像我们上学学了东西要考试检测一样,我们也得考考计算机学得如何,于是我们给定一些计算机不知道类别的图片让它判别,然后再比对我们已知的正确答案。

2. 最近邻分类器(Nearest Neighbor Classifier)

先从简单的方法开始说,先提一提最近邻分类器/Nearest Neighbor Classifier,不过事先申明,它和深度学习中的卷积神经网/Convolutional Neural Networks其实一点关系都没有,我们只是从基础到前沿一点一点推进,最近邻是图像识别一个相对简单和基础的实现方式。

2.1 CIFAR-10

CIFAR-10是一个非常常用的图像分类数据集。数据集包含60000张32*32像素的小图片,每张图片都有一个类别标注(总共有10类),分成了50000张的训练集和10000张的测试集。如下是一些图片示例:

CIFAR-10例子

上图中左边是十个类别和对应的一些示例图片,右边是给定一张图片后,根据像素距离计算出来的,最近的10张图片。

2.2 基于最近邻的简单图像类别判定

假如现在用CIFAR-10数据集做训练集,判断一张未知的图片属于CIFAR-10中的哪一类,应该怎么做呢。一个很直观的想法就是,既然我们现在有每个像素点的值,那我们就根据输入图片的这些值,计算和训练集中的图片距离,找最近的图片的类别,作为它的类别,不就行了吗。

恩,想法很直接,这就是『最近邻』的思想。偷偷说一句,这种直接的做法在图像识别中,其实效果并不是特别好。比如上图是按照这个思想找的最近邻,其实只有3个图片的最近邻是正确的类目。

即使这样,作为最基础的方法,还是得掌握,我们来简单实现一下吧。我们需要一个图像距离评定准则,比如最简单的方式就是,比对两个图像像素向量之间的l1距离(也叫曼哈顿距离/cityblock距离),公式如下:

d1(I1,I2)=pIp1Ip2

其实就是计算了所有像素点之间的差值,然后做了加法,直观的理解如下图:

矩阵的l1距离

我们先把数据集读进内存:

#! /usr/bin/env python
#coding=utf-8
import os
import sys
import numpy as np

def load_CIFAR_batch(filename):
    """
    cifar-10数据集是分batch存储的,这是载入单个batch

    @参数 filename: cifar文件名
    @r返回值: X, Y: cifar batch中的 data 和 labels
    """

    with open(filename, 'r') as f:
        datadict=pickle.load(f)

        X=datadict['data']
        Y=datadict['labels']

        X=X.reshape(10000, 3, 32, 32).transpose(0,2,3,1).astype("float")
        Y=np.array(Y)

        return X, Y


def load_CIFAR10(ROOT):
    """
    读取载入整个 CIFAR-10 数据集

    @参数 ROOT: 根目录名
    @return: X_train, Y_train: 训练集 data 和 labels
             X_test, Y_test: 测试集 data 和 labels
    """

    xs=[]
    ys=[]

    for b in range(1,6):
        f=os.path.join(ROOT, "data_batch_%d" % (b, ))
        X, Y=load_CIFAR_batch(f)
        xs.append(X)
        ys.append(Y)

    X_train=np.concatenate(xs)
    Y_train=np.concatenate(ys)

    del X, Y

    X_test, Y_test=load_CIFAR_batch(os.path.join(ROOT, "test_batch"))

    return X_train, Y_train, X_test, Y_test

# 载入训练和测试数据集
X_train, Y_train, X_test, Y_test = load_CIFAR10('data/cifar10/') 
# 把32*32*3的多维数组展平
Xtr_rows = X_train.reshape(X_train.shape[0], 32 * 32 * 3) # Xtr_rows : 50000 x 3072
Xte_rows = X_test.reshape(X_test.shape[0], 32 * 32 * 3) # Xte_rows : 10000 x 3072

下面我们实现最近邻的思路:

class NearestNeighbor:
  def __init__(self):
    pass

  def train(self, X, y):
    """ 
    这个地方的训练其实就是把所有的已有图片读取进来 -_-||
    """
    # the nearest neighbor classifier simply remembers all the training data
    self.Xtr = X
    self.ytr = y

  def predict(self, X):
    """ 
    所谓的预测过程其实就是扫描所有训练集中的图片,计算距离,取最小的距离对应图片的类目
    """
    num_test = X.shape[0]
    # 要保证维度一致哦
    Ypred = np.zeros(num_test, dtype = self.ytr.dtype)

    # 把训练集扫一遍 -_-||
    for i in xrange(num_test):
      # 计算l1距离,并找到最近的图片
      distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)
      min_index = np.argmin(distances) # 取最近图片的下标
      Ypred[i] = self.ytr[min_index] # 记录下label

    return Ypred

nn = NearestNeighbor() # 初始化一个最近邻对象
nn.train(Xtr_rows, Y_train) # 训练...其实就是读取训练集
Yte_predict = nn.predict(Xte_rows) # 预测
# 比对标准答案,计算准确率
print 'accuracy: %f' % ( np.mean(Yte_predict == Y_test) )

最近邻的思想在CIFAR上得到的准确度为38.6%,我们知道10各类别,我们随机猜测的话准确率差不多是1/10=10%,所以说还是有识别效果的,但是显然这距离人的识别准确率(94%)实在是低太多了,不那么实用。

2.3 关于最近邻的距离准则

我们这里用的距离准则是l1距离,实际上除掉l1距离,我们还有很多其他的距离准则。

  • 比如说l2距离(也就是大家熟知的欧氏距离)的计算准则如下:

d2(I1,I2)=p(Ip1Ip2)2

  • 比如余弦距离计算准则如下:

1I1I2||I1||||I2||

更多的距离准则可以参见scipy相关计算页面.

3. K最近邻分类器(K Nearest Neighbor Classifier)

这是对最近邻的思想的一个调整。其实我们在使用最近邻分类器分类,扫描CIFAR训练集的时候,会发现,有时候不一定距离最近的和当前图片是同类,但是最近的一些里有很多和当前图片是同类。所以我们自然而然想到,把最近邻扩展为最近的N个临近点,然后统计一下这些点的类目分布,取最多的那个类目作为自己的类别。

恩,这就是KNN的思想。

KNN其实是一种特别常用的分类算法。但是有个问题,我们的K值应该取多少呢。换句话说,我们找多少邻居来投票,比较靠谱呢?

3.1 交叉验证与参数选择

在现在的场景下,假如我们确定使用KNN来完成图片类别识别问题。我们发现有一些参数是肯定会影响最后的识别结果的,比如:

  • 距离的选择(l1,l2,cos等等)
  • 近邻个数K的取值。

每组参数下其实都能产生一个新的model,所以这可以视为一个模型选择/model selection问题。而对于模型选择问题,最常用的办法就是在交叉验证集上实验。

数据总量就那么多,如果我们在test data上做模型参数选择,又用它做效果评估,显然不是那么合理(因为我们的模型参数很有可能是在test data上过拟合的,不能很公正地评估结果)。所以我们通常会把训练数据分为两个部分,一大部分作为训练用,另外一部分就是所谓的cross validation数据集,用来进行模型参数选择的。比如说我们有50000训练图片,我们可以把它分为49000的训练集和1000的交叉验证集。

# 假定已经有Xtr_rows, Ytr, Xte_rows, Yte了,其中Xtr_rows为50000*3072 矩阵
Xval_rows = Xtr_rows[:1000, :] # 构建1000的交叉验证集
Yval = Ytr[:1000]
Xtr_rows = Xtr_rows[1000:, :] # 保留49000的训练集
Ytr = Ytr[1000:]

# 设置一些k值,用于试验
validation_accuracies = []
for k in [1, 3, 5, 7, 10, 20, 50, 100]:

  # 初始化对象
  nn = NearestNeighbor()
  nn.train(Xtr_rows, Ytr)
  # 修改一下predict函数,接受 k 作为参数
  Yval_predict = nn.predict(Xval_rows, k = k)
  acc = np.mean(Yval_predict == Yval)
  print 'accuracy: %f' % (acc,)

  # 输出结果
  validation_accuracies.append((k, acc))

这里提一个在很多地方会看到的概念,叫做k-fold cross-validation,意思其实就是把原始数据分成k份,轮流使用其中k-1份作为训练数据,而剩余的1份作为交叉验证数据(因此其实对于k-fold cross-validation我们会得到k个accuracy)。以下是5-fold cross-validation的一个示例:

k-fold 交叉验证

以下是我们使用5-fold cross-validation,取不同的k值时,得到的accuracy曲线(补充一下,因为是5-fold cross-validation,所以在每个k值上有5个取值,我们取其均值作为此时的准确度)

5-fold 交叉验证

可以看出大概在k=7左右有最佳的准确度。

3.2 最近邻方法的优缺点

K最近邻的优点大家都看出来了,思路非常简单清晰,而且完全不需要训练…不过也正因为如此,最后的predict过程非常耗时,因为要和全部训练集中的图片比对一遍。

实际应用中,我们其实更加关心实施predict所消耗的时间,如果有一个图像识别app返回结果要半小时一小时,你一定第一时间把它卸了。我们反倒不那么在乎训练时长,训练时间稍微长一点没关系,只要最后应用的时候识别速度快效果好,就很赞。后面会提到的深度神经网络就是这样,深度神经网络解决图像问题时训练是一个相对耗时间的过程,但是识别的过程非常快。

另外,不得不多说一句的是,优化计算K最近邻时间问题,实际上依旧到现在都是一个非常热门的问题。Approximate Nearest Neighbor (ANN)算法是牺牲掉一小部分的准确度,而提高很大程度的速度,能比较快地找到近似的K最近邻,现在已经有很多这样的库,比如说FLANN.

最后,我们用一张图来说明一下,用图片像素级别的距离来实现图像类别识别,有其不足之处,我们用一个叫做t-SNE的技术把CIFAR-10的所有图片按两个维度平铺出来,靠得越近的图片表示其像素级别的距离越接近。然而我们瞄一眼,发现,其实靠得最近的并不一定是同类别的。

像素级别图像距离排列

其实观察一下,你就会发现,像素级别接近的图片,在整张图的颜色分布上,有很大的共性,然而在图像内容上,有时候也只能无奈地呵呵嗒,毕竟颜色分布相同的不同物体也是非常多的。

参考资料与原文

cs231n 图像分类与KNN

2017-11-26 04:06:56 Wayne2019 阅读数 6593

主要总结一下最近看的几篇场景分类文献,顺便总结场景、物体和事件分类的关系。
[1] ILSVRC 2015 Scene Classi cation Challenge.冠军,主要贡献是Relay Backpropagation和Class-aware Sampling。比赛结果如下图:
这里写图片描述

[2] 16年场景分类的冠军海康威视。比较有特色的地方是Supervised Data Augmentation,label smoothing (LS) via prior label distribution,Train and Test in Harmony。比赛结果如下:
这里写图片描述

[3]senet, ILSVRC 2017 classification冠军。在比赛中使用了label smoothing,且在最后几次训练中冻结了BN层。不多说了,在places365的结果如下:
这里写图片描述

之前一直从细粒度图像分类[15]的角度思考场景的类间相似性和类内差异性。而且针对图像细粒度分类的技术确实在场景分类上观察到了效果的提升,如bilinear[12-13],有理由相信进化版kernel pooling[14]也应该有效,虽然原文没有做这方面的实验。具体可参考之前的博文。但是实际上细粒度图像分类和场景分类既有联系又有区别,比如我们可以尝试思考细粒度物体分类和细粒度场景分类这样的概念。在场景分类中,场景是物体,空间布局,背景和它们之间的关联关系综合而成,是十分抽象的概念。另外场景的类间相似性和类内差异性也不等同于细粒度中的情形,其中可能涉及到空间布局,尺度和物体的种类等等。而且场景还存在标签的主观性和歧义性。幸运的是已经有人针对这些问题进行了探索,下面主要看针对场景分类这些难点的一些工作。

[4] 这篇文章很有意思,指出ImageNet-CNNs和Places-CNNs有不同的适用scale。在场景数据集和物体数据集中物体的大小分布和数量分布都有显著的差别,见下图:
这里写图片描述
可见物体分类数据集中物体尺寸较大,且数量很少。ImageNet-CNNs和Places-CNNs在不同尺度的表现如下:
这里写图片描述
文章提出的多尺度架构如下:
这里写图片描述

[5-9] [5-6]分别是[7-9]这三篇系列工作的中英文概述,整个系列非常有启发性。整个动机作者在[5]解释的很清楚,这里不班门弄斧了。

[10] 同样来自上述课题组,将物体和场景分类中学习到的特征迁移到事件分类上。文章指出相比于物体和场景,事件更为抽象。

[11] 这篇文章还是关注场景中的物体信息,尤其是不同场景中存在的同样物体,主要是希望增强图像表示的区分能力。通过统计物体在场景数据集中的共现规律来选择区分性强的物体而丢弃区分性差的物体。

references

  1. Shen L, Lin Z, Huang Q. Relay backpropagation for effective learning of deep convolutional neural networks[C]//European conference on computer vision. Springer International Publishing, 2016: 467-482.
  2. Towards Good Practices for Recognition & Detection - ImageNet
  3. Hu J, Shen L, Sun G. Squeeze-and-Excitation Networks[J]. arXiv preprint arXiv:1709.01507, 2017.
  4. Herranz L, Jiang S, Li X. Scene recognition with CNNs: objects, scales and dataset bias[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016: 571-579.
  5. 乔宇:深度模型让机器理解场景|VALSE2017之十一
  6. Good Practice on Deep Scene Classification
  7. Guo S, Huang W, Wang L, et al. Locally supervised deep hybrid model for scene recognition[J]. IEEE Transactions on Image Processing, 2017, 26(2): 808-820.
  8. Wang Z, Wang L, Wang Y, et al. Weakly supervised patchnets: Describing and aggregating local patches for scene recognition[J]. IEEE Transactions on Image Processing, 2017, 26(4): 2028-2041.
  9. Wang L, Guo S, Huang W, et al. Knowledge guided disambiguation for large-scale scene classification with multi-resolution CNNs[J]. IEEE Transactions on Image Processing, 2017, 26(4): 2055-2068.
  10. Wang L, Wang Z, Qiao Y, et al. Transferring Deep Object and Scene Representations for Event Recognition in Still Images[J]. International Journal of Computer Vision, 2017: 1-20.
  11. Cheng X, Lu J, Feng J, et al. Scene recognition with objectness[J]. Pattern Recognition, 2018, 74: 474-487.
  12. Bilinear CNNs for Fine-grained Visual Recognition
  13. Gao Y, Beijbom O, Zhang N, et al. Compact bilinear pooling[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016: 317-326.
  14. Cui Y, Zhou F, Wang J, et al. Kernel pooling for convolutional neural networks[C]//Computer Vision and Pattern Recognition (CVPR). 2017.
  15. Fully Convolutional Attention Networks for Fine-Grained Recognition
2018-09-10 18:00:20 qq_34807908 阅读数 3691

计算机视觉四大基本任务(分类、定位、检测、分割)

深度学习目前已成为发展最快、最令人兴奋的机器学习领域之一,许多卓有建树的论文已经发表,而且已有很多高质量的开源深度学习框架可供使用。然而,论文通常非常简明扼要并假设读者已对深度学习有相当的理解,这使得初学者经常卡在一些概念的理解上,读论文似懂非懂,十分吃力。另一方面,即使有了简单易用的深度学习框架,如果对深度学习常见概念和基本思路不了解,面对现实任务时不知道如何设计、诊断、及调试网络,最终仍会束手无策。本系列文章旨在直观系统地梳理深度学习各领域常见概念与基本思想,使读者对深度学习的重要概念与思想有一直观理解,做到“知其然,又知其所以然”,从而降低后续理解论文及实际应用的难度。本系列文章力图用简练的语言加以描述,避免数学公式和繁杂细节。本文是该系列文章中的第二篇,旨在介绍深度学习在计算机视觉领域四大基本任务中的应用,包括分类(图a)、定位、检测(图b)、语义分割(图c)、和实例分割(图d)。后续文章将关注深度学习在计算机视觉领域的其他任务的应用,以及自然语言处理和语音识别。


计算机视觉(computer vision)简介

计算机视觉旨在识别和理解图像/视频中的内容。其诞生于1966年MIT AI Group的”the summer vision project”。当时,人工智能其他分支的研究已经有一些初步成果。由于人类可以很轻易地进行视觉认知,MIT的教授们希望通过一个暑期项目解决计算机视觉问题。当然,计算机视觉没有被一个暑期内解决,但计算机视觉经过50余年发展已成为一个十分活跃的研究领域。如今,互联网上超过70%的数据是图像/视频,全世界的监控摄像头数目已超过人口数,每天有超过八亿小时的监控视频数据生成。如此大的数据量亟待自动化的视觉理解与分析技术。

计算机视觉的难点在于语义鸿沟。这个现象不仅出现在计算机视觉领域,Moravec悖论发现,高级的推理只需要非常少的计算资源,而低级的对外界的感知却需要极大的计算资源。要让计算机如成人般地下棋是相对容易的,但是要让电脑有如一岁小孩般的感知和行动能力却是相当困难甚至是不可能的。

语义鸿沟(semantic gap) 人类可以轻松地从图像中识别出目标,而计算机看到的图像只是一组0到255之间的整数。

计算机视觉任务的其他困难 拍摄视角变化、目标占据图像的比例变化、光照变化、背景融合、目标形变、遮挡等。

计算机视觉的顶级会议和期刊 顶级会议有CVPR、ICCV、和ECCV,此外ICLR也有不少计算机视觉论文。顶级期刊有IJCV和TPAMI。由于计算机视觉领域发展十分迅速,不论身处学术界或产业界,通过阅读顶级会议和期刊论文了解计算机视觉的最近研究成果都十分必要。


卷积神经网络(convolutional neural networks, CNN)

经典的多层感知机由一系列全连接层组成,卷积神经网络中除全连接层外,还有卷积层和汇合(pooling)层。

(1) 卷积层

为什么要用卷积层 输入图像通常很维数很高,例如,1,000×1,000大小的彩色图像对应于三百万维特征。因此,继续沿用多层感知机中的全连接层会导致庞大的参数量。大参数量需要繁重的计算,而更重要的是,大参数量会有更高的过拟合风险。卷积是局部连接、共享参数版的全连接层。这两个特性使参数量大大降低。卷积层中的权值通常被成为滤波器(filter)或卷积核(convolution kernel)。

局部连接 在全连接层中,每个输出通过权值(weight)和所有输入相连。而在视觉识别中,关键性的图像特征、边缘、角点等只占据了整张图像的一小部分,图像中相距很远的两个像素之间有相互影响的可能性很小。因此,在卷积层中,每个输出神经元在通道方向保持全连接,而在空间方向上只和一小部分输入神经元相连。

共享参数 如果一组权值可以在图像中某个区域提取出有效的表示,那么它们也能在图像的另外区域中提取出有效的表示。也就是说,如果一个模式(pattern)出现在图像中的某个区域,那么它们也可以出现在图像中的其他任何区域。因此,卷积层不同空间位置的神经元共享权值,用于发现图像中不同空间位置的模式。共享参数是深度学习一个重要的思想,其在减少网络参数的同时仍然能保持很高的网络容量(capacity)。卷积层在空间方向共享参数,而循环神经网络(recurrent neural networks)在时间方向共享参数。

卷积层的作用 通过卷积,我们可以捕获图像的局部信息。通过多层卷积层堆叠,各层提取到特征逐渐由边缘、纹理、方向等低层级特征过度到文字、车轮、人脸等高层级特征。

卷积层中的卷积和数学教材中的卷积是什么关系 基本没有关系。卷积层中的卷积实质是输入和权值的互相关(cross-correlation)函数,而不是数学教材中的卷积。

描述卷积的四个量 一个卷积层的配置由如下四个量确定1. 滤波器个数。使用一个滤波器对输入进行卷积会得到一个二维的特征图(feature map)。我们可以用时使用多个滤波器对输入进行卷积,以得到多个特征图。2. 感受野(receptive field) F,即滤波器空间局部连接大小3. 零填补(zero-padding) P随着卷积的进行,图像大小将缩小,图像边缘的信息将逐渐丢失。因此,在卷积前,我们在图像上下左右填补一些0,使得我们可以控制输出特征图的大小。4. 步长(stride) S滤波器在输入每移动S个位置计算一个输出神经元。

卷积输入输出的大小关系 假设输入高和宽为HW,输出高和宽为H‘和W‘, 则H‘=(H-F+2P)/S+1, W‘=(W-F+2P)/S+1. 当S=1时,通过设定P=(F-1)/2, 可以保证输入输出空间大小相同。例如,3*3的卷积需要填补一个像素使得输入输出空间大小不变。

应该使用多大的滤波器 尽量使用小的滤波器,如3×3卷积。通过堆叠多层3×3卷积,可以取得与大滤波器相同的感受野,例如三层3×3卷积等效于一层7×7卷积的感受野。但使用小滤波器有以下两点好处。1. 更少的参数量。假设通道数为D,三层3×3卷积的参数量为3×(D×D×3×3)=27D^2, 而一层7×7卷积的参数量为D×D×7×7=49D^2。2. 更多非线性。由于每层卷积层后都有非线性激活函数,三层3×3卷积一共经过三次非线性激活函数,而一层7×7卷积只经过一次。

1×1卷积 旨在对每个空间位置的D维向量做一个相同的线性变换。通常用于增加非线性,或降维,这相当于在通道数方向上进行了压缩。1×1卷积是减少网络计算量和参数的重要方式。

全连接层的卷积层等效 由于全连接层和卷积层都是做点乘,这两种操作可以相互等效。全连接层的卷积层等效只需要设定好卷积层的四个量:滤波器个数等于原全连接层输出神经元个数、感受野等于输入的空间大小、没有零填补、步长为1。

为什么要将全连接层等效为卷积层 全连接层只能处理固定大小的输入,而卷积层可以处理任意大小输入。假设训练图像大小是224×224,而当测试图像大小是256×256。如果不进行全连接层的卷积层等效,我们需要从测试图像中裁剪出多个224×224区域分别前馈网络。而进行卷积层等效后,我们只需要将256×256输入前馈网络一次,即可达到多次前馈224×224区域的效果。

卷积结果的两种视角 卷积结果是一个D×H×W的三维张量。其可以被认为是有D个通道,每个通道是一个二维的特征图,从输入中捕获了某种特定的特征。也可以被认为是有H×W个空间位置,每个空间位置是一个D维的描述向量,描述了对应感受野的图像局部区域的语义特征。

卷积结果的分布式表示 卷积结果的各通道之间不是独立的。卷积结果的各通道的神经元和语义概念之间是一个“多对多”的映射。即,每个语义概念由多个通道神经元一起表示,而每个神经元又同时参与到多个语义概念中去。并且,神经元响应是稀疏的,即大部分的神经元输出为0。

卷积操作的实现 有如下几种基本思路。1. 快速傅里叶变换(FFT)。通过变换到频域,卷积运算将变为普通矩阵乘法。实际中,当滤波器尺寸大时效果好,而对于通常使用的1×1和3×3卷积,加速不明显。2. im2col (image to column)。im2col将与每个输出神经元相连的局部输入区域展成一个列向量,并将所有得到的向量拼接成一个矩阵。这样卷积运算可以用矩阵乘法实现。im2col的优点是可以利用矩阵乘法的高效实现,而弊端是会占用很大存储,因为输入元素会在生成的矩阵中多次出现。此外,Strassen矩阵乘法和Winograd也常被使用。现有的计算库如MKL和cuDNN,会根据滤波器大小选择合适的算法。

(2) 汇合层

汇合层 根据特征图上的局部统计信息进行下采样,在保留有用信息的同时减少特征图的大小。和卷积层不同的是,汇合层不包含需要学习的参数。最大汇合(max-pooling)在一个局部区域选最大值作为输出,而平均汇合(average pooling)计算一个局部区域的均值作为输出。局部区域汇合中最大汇合使用更多,而全局平均汇合(global average pooling)是更常用的全局汇合方法。

汇合层的作用 汇合层主要有以下三点作用。1. 增加特征平移不变性。汇合可以提高网络对微小位移的容忍能力。2. 减小特征图大小。汇合层对空间局部区域进行下采样,使下一层需要的参数量和计算量减少,并降低过拟合风险。3. 最大汇合可以带来非线性。这是目前最大汇合更常用的原因之一。近年来,有人使用步长为2的卷积层代替汇合层。而在生成式模型中,有研究发现,不使用汇合层会使网络更容易训练。


图像分类(image classification)

给定一张输入图像,图像分类任务旨在判断该图像所属类别。

(1) 图像分类常用数据集

以下是几种常用分类数据集,难度依次递增。rodrigob.github.io/are_列举了各算法在各数据集上的性能排名。

MNIST 60k训练图像、10k测试图像、10个类别、图像大小1×28×28、内容是0-9手写数字。

CIFAR-10 50k训练图像、10k测试图像、10个类别、图像大小3×32×32。

CIFAR-100 50k训练图像、10k测试图像、100个类别、图像大小3×32×32。

ImageNet 1.2M训练图像、50k验证图像、1k个类别。2017年及之前,每年会举行基于ImageNet数据集的ILSVRC竞赛,这相当于计算机视觉界奥林匹克。

(2) 图像分类经典网络结构

基本架构 我们用conv代表卷积层、bn代表批量归一层、pool代表汇合层。最常见的网络结构顺序是conv -> bn -> relu -> pool,其中卷积层用于提取特征、汇合层用于减少空间大小。随着网络深度的进行,图像的空间大小将越来越小,而通道数会越来越大。

针对你的任务,如何设计网络? 当面对你的实际任务时,如果你的目标是解决该任务而不是发明新算法,那么不要试图自己设计全新的网络结构,也不要试图从零复现现有的网络结构。找已经公开的实现和预训练模型进行微调。去掉最后一个全连接层和对应softmax,加上对应你任务的全连接层和softmax,再固定住前面的层,只训练你加的部分。如果你的训练数据比较多,那么可以多微调几层,甚至微调所有层。

LeNet-5 60k参数。网络基本架构为:conv1 (6) -> pool1 -> conv2 (16) -> pool2 -> fc3 (120) -> fc4 (84) -> fc5 (10) -> softmax。括号中的数字代表通道数,网络名称中有5表示它有5层conv/fc层。当时,LeNet-5被成功用于ATM以对支票中的手写数字进行识别。LeNet取名源自其作者姓LeCun。

AlexNet 60M参数,ILSVRC 2012的冠军网络。网络基本架构为:conv1 (96) -> pool1 -> conv2 (256) -> pool2 -> conv3 (384) -> conv4 (384) -> conv5 (256) -> pool5 -> fc6 (4096) -> fc7 (4096) -> fc8 (1000) -> softmax。AlexNet有着和LeNet-5相似网络结构,但更深、有更多参数。conv1使用11×11的滤波器、步长为4使空间大小迅速减小(227×227 -> 55×55)。AlexNet的关键点是:(1). 使用了ReLU激活函数,使之有更好的梯度特性、训练更快。(2). 使用了随机失活(dropout)。(3). 大量使用数据扩充技术。AlexNet的意义在于它以高出第二名10%的性能取得了当年ILSVRC竞赛的冠军,这使人们意识到卷机神经网络的优势。此外,AlexNet也使人们意识到可以利用GPU加速卷积神经网络训练。AlexNet取名源自其作者名Alex。

VGG-16/VGG-19 138M参数,ILSVRC 2014的亚军网络。VGG-16的基本架构为:conv1^2 (64) -> pool1 -> conv2^2 (128) -> pool2 -> conv3^3 (256) -> pool3 -> conv4^3 (512) -> pool4 -> conv5^3 (512) -> pool5 -> fc6 (4096) -> fc7 (4096) -> fc8 (1000) -> softmax。 ^3代表重复3次。VGG网络的关键点是:(1). 结构简单,只有3×3卷积和2×2汇合两种配置,并且重复堆叠相同的模块组合。卷积层不改变空间大小,每经过一次汇合层,空间大小减半。(2). 参数量大,而且大部分的参数集中在全连接层中。网络名称中有16表示它有16层conv/fc层。(3). 合适的网络初始化和使用批量归一(batch normalization)层对训练深层网络很重要。VGG-19结构类似于VGG-16,有略好于VGG-16的性能,但VGG-19需要消耗更大的资源,因此实际中VGG-16使用得更多。由于VGG-16网络结构十分简单,并且很适合迁移学习,因此至今VGG-16仍在广泛使用。VGG-16和VGG-19取名源自作者所处研究组名(Visual Geometry Group)。

GoogLeNet 5M参数,ILSVRC 2014的冠军网络。GoogLeNet试图回答在设计网络时究竟应该选多大尺寸的卷积、或者应该选汇合层。其提出了Inception模块,同时用1×1、3×3、5×5卷积和3×3汇合,并保留所有结果。网络基本架构为:conv1 (64) -> pool1 -> conv2^2 (64, 192) -> pool2 -> inc3 (256, 480) -> pool3 -> inc4^5 (512, 512, 512, 528, 832) -> pool4 -> inc5^2 (832, 1024) -> pool5 -> fc (1000)。GoogLeNet的关键点是:(1). 多分支分别处理,并级联结果。(2). 为了降低计算量,用了1×1卷积降维。GoogLeNet使用了全局平均汇合替代全连接层,使网络参数大幅减少。GoogLeNet取名源自作者所处单位(Google),其中L大写是为了向LeNet致敬,而Inception的名字来源于盗梦空间中的”we need to go deeper”梗。

Inception v3/v4 在GoogLeNet的基础上进一步降低参数。其和GoogLeNet有相似的Inception模块,但将7×7和5×5卷积分解成若干等效3×3卷积,并在网络中后部分把3×3卷积分解为1×3和3×1卷积。这使得在相似的网络参数下网络可以部署到42层。此外,Inception v3使用了批量归一层。Inception v3是GoogLeNet计算量的2.5倍,而错误率较后者下降了3%。Inception v4在Inception模块基础上结合了residual模块(见下文),进一步降低了0.4%的错误率。

ResNet ILSVRC 2015的冠军网络。ResNet旨在解决网络加深后训练难度增大的现象。其提出了residual模块,包含两个3×3卷积和一个短路连接(左图)。短路连接可以有效缓解反向传播时由于深度过深导致的梯度消失现象,这使得网络加深之后性能不会变差。短路连接是深度学习又一重要思想,除计算机视觉外,短路连接也被用到了机器翻译、语音识别/合成领域。此外,具有短路连接的ResNet可以看作是许多不同深度而共享参数的网络的集成,网络数目随层数指数增加。ResNet的关键点是:(1). 使用短路连接,使训练深层网络更容易,并且重复堆叠相同的模块组合。(2). ResNet大量使用了批量归一层。(3). 对于很深的网络(超过50层),ResNet使用了更高效的瓶颈(bottleneck)结构(右图)。ResNet在ImageNet上取得了超过人的准确率。

下图对比了上述几种网络结构。

preResNet ResNet的改进。preResNet整了residual模块中各层的顺序。相比经典residual模块(a),(b)将BN共享会更加影响信息的短路传播,使网络更难训练、性能也更差;(c)直接将ReLU移到BN后会使该分支的输出始终非负,使网络表示能力下降;(d)将ReLU提前解决了(e)的非负问题,但ReLU无法享受BN的效果;(e)将ReLU和BN都提前解决了(d)的问题。preResNet的短路连接(e)能更加直接的传递信息,进而取得了比ResNet更好的性能。

ResNeXt ResNet的另一改进。传统的方法通常是靠加深或加宽网络来提升性能,但计算开销也会随之增加。ResNeXt旨在不改变模型复杂度的情况下提升性能。受精简而高效的Inception模块启发,ResNeXt将ResNet中非短路那一分支变为多个分支。和Inception不同的是,每个分支的结构都相同。ResNeXt的关键点是:(1). 沿用ResNet的短路连接,并且重复堆叠相同的模块组合。(2). 多分支分别处理。(3). 使用1×1卷积降低计算量。其综合了ResNet和Inception的优点。此外,ResNeXt巧妙地利用分组卷积进行实现。ResNeXt发现,增加分支数是比加深或加宽更有效地提升网络性能的方式。ResNeXt的命名旨在说明这是下一代(next)的ResNet。

随机深度 ResNet的改进。旨在缓解梯度消失和加速训练。类似于随机失活(dropout),其以一定概率随机将residual模块失活。失活的模块直接由短路分支输出,而不经过有参数的分支。在测试时,前馈经过全部模块。随机深度说明residual模块是有信息冗余的。

DenseNet 其目的也是避免梯度消失。和residual模块不同,dense模块中任意两层之间均有短路连接。也就是说,每一层的输入通过级联(concatenation)包含了之前所有层的结果,即包含由低到高所有层次的特征。和之前方法不同的是,DenseNet中卷积层的滤波器数很少。DenseNet只用ResNet一半的参数即可达到ResNet的性能。实现方面,作者在大会报告指出,直接将输出级联会占用很大GPU存储。后来,通过共享存储,可以在相同的GPU存储资源下训练更深的DenseNet。但由于有些中间结果需要重复计算,该实现会增加训练时间。

SENet ILSVRC 2017的冠军网络。SENet通过额外的分支(gap-fc-fc-sigm)来得到每个通道的[0, 1]权重,自适应地校正原各通道激活值响应。以提升有用的通道响应并抑制对当前任务用处不大的通道响应。


目标定位(object localization)

在图像分类的基础上,我们还想知道图像中的目标具体在图像的什么位置,通常是以包围盒的(bounding box)形式。

基本思路 多任务学习,网络带有两个输出分支。一个分支用于做图像分类,即全连接+softmax判断目标类别,和单纯图像分类区别在于这里还另外需要一个“背景”类。另一个分支用于判断目标位置,即完成回归任务输出四个数字标记包围盒位置(例如中心点横纵坐标和包围盒长宽),该分支输出结果只有在分类分支判断不为“背景”时才使用。

人体位姿定位/人脸定位 目标定位的思路也可以用于人体位姿定位或人脸定位。这两者都需要我们对一系列的人体关节或人脸关键点进行回归。

弱监督定位 由于目标定位是相对比较简单的任务,近期的研究热点是在只有标记信息的条件下进行目标定位。其基本思路是从卷积结果中找到一些较高响应的显著性区域,认为这个区域对应图像中的目标。


目标检测(object detection)

在目标定位中,通常只有一个或固定数目的目标,而目标检测更一般化,其图像中出现的目标种类和数目都不定。因此,目标检测是比目标定位更具挑战性的任务。

(1) 目标检测常用数据集

PASCAL VOC 包含20个类别。通常是用VOC07和VOC12的trainval并集作为训练,用VOC07的测试集作为测试。

MS COCO COCO比VOC更困难。COCO包含80k训练图像、40k验证图像、和20k没有公开标记的测试图像(test-dev),80个类别,平均每张图7.2个目标。通常是用80k训练和35k验证图像的并集作为训练,其余5k图像作为验证,20k测试图像用于线上测试。

mAP (mean average precision) 目标检测中的常用评价指标,计算方法如下。当预测的包围盒和真实包围盒的交并比大于某一阈值(通常为0.5),则认为该预测正确。对每个类别,我们画出它的查准率-查全率(precision-recall)曲线,平均准确率是曲线下的面积。之后再对所有类别的平均准确率求平均,即可得到mAP,其取值为[0, 100%]。

交并比(intersection over union, IoU) 算法预测的包围盒和真实包围盒交集的面积除以这两个包围盒并集的面积,取值为[0, 1]。交并比度量了算法预测的包围盒和真实包围盒的接近程度,交并比越大,两个包围盒的重叠程度越高。

(2) 基于候选区域的目标检测算法

基本思路 使用不同大小的窗口在图像上滑动,在每个区域,对窗口内的区域进行目标定位。即,将每个窗口内的区域前馈网络,其分类分支用于判断该区域的类别,回归分支用于输出包围盒。基于滑动窗的目标检测动机是,尽管原图中可能包含多个目标,但滑动窗对应的图像局部区域内通常只会有一个目标(或没有)。因此,我们可以沿用目标定位的思路对窗口内区域逐个进行处理。但是,由于该方法要把图像所有区域都滑动一遍,而且滑动窗大小不一,这会带来很大的计算开销。

R-CNN 先利用一些非深度学习的类别无关的无监督方法,在图像中找到一些可能包含目标的候选区域。之后,对每个候选区域前馈网络,进行目标定位,即两分支(分类+回归)输出。其中,我们仍然需要回归分支的原因是,候选区域只是对包含目标区域的一个粗略的估计,我们需要有监督地利用回归分支得到更精确的包围盒预测结果。R-CNN的重要性在于当时目标检测已接近瓶颈期,而R-CNN利于在ImageNet预训练模型微调的方法一举将VOC上mAP由35.1%提升至53.7%,确定了深度学习下目标检测的基本思路。一个有趣之处是R-CNN论文开篇第一句只有两个词”Features matter.” 这点明了深度学习方法的核心。

候选区域(region proposal) 候选区域生成算法通常基于图像的颜色、纹理、面积、位置等合并相似的像素,最终可以得到一系列的候选矩阵区域。这些算法,如selective search或EdgeBoxes,通常只需要几秒的CPU时间,而且,一个典型的候选区域数目是2k,相比于用滑动窗把图像所有区域都滑动一遍,基于候选区域的方法十分高效。另一方面,这些候选区域生成算法的查准率(precision)一般,但查全率(recall)通常比较高,这使得我们不容易遗漏图像中的目标。

Fast R-CNN R-CNN的弊端是需要多次前馈网络,这使得R-CNN的运行效率不高,预测一张图像需要47秒。Fast R-CNN同样基于候选区域进行目标检测,但受SPPNet启发,在Fast R-CNN中,不同候选区域的卷积特征提取部分是共享的。也就是说,我们先将整副图像前馈网络,并提取conv5卷积特征。之后,基于候选区域生成算法的结果在卷积特征上进行采样,这一步称为兴趣区域汇合。最后,对每个候选区域,进行目标定位,即两分支(分类+回归)输出。

兴趣区域汇合(region of interest pooling, RoI pooling) 兴趣区域汇合旨在由任意大小的候选区域对应的局部卷积特征提取得到固定大小的特征,这是因为下一步的两分支网络由于有全连接层,需要其输入大小固定。其做法是,先将候选区域投影到卷积特征上,再把对应的卷积特征区域空间上划分成固定数目的网格(数目根据下一步网络希望的输入大小确定,例如VGGNet需要7×7的网格),最后在每个小的网格区域内进行最大汇合,以得到固定大小的汇合结果。和经典最大汇合一致,每个通道的兴趣区域汇合是独立的。

Faster R-CNN Fast R-CNN测试时每张图像前馈网络只需0.2秒,但瓶颈在于提取候选区域需要2秒。Faster R-CNN不再使用现有的无监督候选区域生成算法,而利用候选区域网络从conv5特征中产生候选区域,并且将候选区域网络集成到整个网络中端到端训练。Faster R-CNN的测试时间是0.2秒,接近实时。后来有研究发现,通过使用更少的候选区域,可以在性能损失不大的条件下进一步提速。

候选区域网络(region proposal networks, RPN) 在卷积特征上的通过两层卷积(3×3和1×1卷积),输出两个分支。其中,一个分支用于判断每个锚盒是否包含了目标,另一个分支对每个锚盒输出候选区域的4个坐标。候选区域网络实际上延续了基于滑动窗进行目标定位的思路,不同之处在于候选区域网络在卷积特征而不是在原图上进行滑动。由于卷积特征的空间大小很小而感受野很大,即使使用3×3的滑动窗,也能对应于很大的原图区域。Faster R-CNN实际使用了3组大小(128×128、256×256、512×512)、3组长宽比(1:1、1:2、2:1),共计9个锚盒,这里锚盒的大小已经超过conv5特征感受野的大小。对一张1000×600的图像,可以得到20k个锚盒。

为什么要使用锚盒(anchor box) 锚盒是预先定义形状和大小的包围盒。使用锚盒的原因包括:(1). 图像中的候选区域大小和长宽比不同,直接回归比对锚盒坐标修正训练起来更困难。(2). conv5特征感受野很大,很可能该感受野内包含了不止一个目标,使用多个锚盒可以同时对感受野内出现的多个目标进行预测。(3). 使用锚盒也可以认为这是向神经网络引入先验知识的一种方式。我们可以根据数据中包围盒通常出现的形状和大小设定一组锚盒。锚盒之间是独立的,不同的锚盒对应不同的目标,比如高瘦的锚盒对应于人,而矮胖的锚盒对应于车辆。

R-FCN Faster R-CNN在RoI pooling之后,需要对每个候选区域单独进行两分支预测。R-FCN旨在使几乎所有的计算共享,以进一步加快速度。由于图像分类任务不关心目标具体在图像的位置,网络具有平移不变性。但目标检测中由于要回归出目标的位置,所以网络输出应当受目标平移的影响。为了缓和这两者的矛盾,R-FCN显式地给予深度卷积特征各通道以位置关系。在RoI汇合时,先将候选区域划分成3×3的网格,之后将不同网格对应于候选卷积特征的不同通道,最后每个网格分别进行平均汇合。R-FCN同样采用了两分支(分类+回归)输出。

小结 基于候选区域的目标检测算法通常需要两步:第一步是从图像中提取深度特征,第二步是对每个候选区域进行定位(包括分类和回归)。其中,第一步是图像级别计算,一张图像只需要前馈该部分网络一次,而第二步是区域级别计算,每个候选区域都分别需要前馈该部分网络一次。因此,第二步占用了整体主要的计算开销。R-CNN, Fast R-CNN, Faster R-CNN, R-FCN这些算法的演进思路是逐渐提高网络中图像级别计算的比例,同时降低区域级别计算的比例。R-CNN中几乎所有的计算都是区域级别计算,而R-FCN中几乎所有的计算都是图像级别计算。

(3) 基于直接回归的目标检测算法

基本思路 基于候选区域的方法由于有两步操作,虽然检测性能比较好,但速度上离实时仍有一些差距。基于直接回归的方法不需要候选区域,直接输出分类/回归结果。这类方法由于图像只需前馈网络一次,速度通常更快,可以达到实时。

YOLO 将图像划分成7×7的网格,其中图像中的真实目标被其划分到目标中心所在的网格及其最接近的锚盒。对每个网格区域,网络需要预测:每个锚盒包含目标的概率(不包含目标时应为0,否则为锚盒和真实包围盒的IoU)、每个锚盒的4个坐标、该网格的类别概率分布。每个锚盒的类别概率分布等于每个锚盒包含目标的概率乘以该网格的类别概率分布。相比基于候选区域的方法,YOLO需要预测包含目标的概率的原因是,图像中大部分的区域不包含目标,而训练时只有目标存在时才对坐标和类别概率分布进行更新。YOLO的优点在于:(1). 基于候选区域的方法的感受野是图像中的局部区域,而YOLO可以利用整张图像的信息。(2). 有更好的泛化能力。YOLO的局限在于:(1). 不能很好处理网格中目标数超过预设固定值,或网格中有多个目标同时属于一个锚盒的情况。(2). 对小目标的检测能力不够好。(3). 对不常见长宽比的包围盒的检测能力不强。(4). 计算损失时没有考虑包围盒大小。大的包围盒中的小偏移和小的包围盒中的小偏移应有不同的影响。

SSD 相比YOLO,SSD在卷积特征后加了若干卷积层以减小特征空间大小,并通过综合多层卷积层的检测结果以检测不同大小的目标。此外,类似于Faster R-CNN的RPN,SSD使用3×3卷积取代了YOLO中的全连接层,以对不同大小和长宽比的锚盒来进行分类/回归。SSD取得了比YOLO更快,接近Faster R-CNN的检测性能。后来有研究发现,相比其他方法,SSD受基础模型性能的影响相对较小。

FPN 之前的方法都是取高层卷积特征。但由于高层特征会损失一些细节信息,FPN融合多层特征,以综合高层、低分辨率、强语义信息和低层、高分辨率、弱语义信息来增强网络对小目标的处理能力。此外,和通常用多层融合的结果做预测的方法不同,FPN在不同层独立进行预测。FPN既可以与基于候选区域的方法结合,也可以与基于直接回归的方法结合。FPN在和Faster R-CNN结合后,在基本不增加原有模型计算量的情况下,大幅提高对小目标的检测性能。

RetinaNet RetinaNet认为,基于直接回归的方法性能通常不如基于候选区域方法的原因是,前者会面临极端的类别不平衡现象。基于候选区域的方法可以通过候选区域过滤掉大部分的背景区域,但基于直接回归的方法需要直接面对类别不平衡。因此,RetinaNet通过改进经典的交叉熵损失以降低对已经分的很好的样例的损失值,提出了焦点(focal)损失函数,以使模型训练时更加关注到困难的样例上。RetinaNet取得了接近基于直接回归方法的速度,和超过基于候选区域的方法的性能。

(4) 目标检测常用技巧

非最大抑制(non-max suppression, NMS) 目标检测可能会出现的一个问题是,模型会对同一目标做出多次预测,得到多个包围盒。NMS旨在保留最接近真实包围盒的那一个预测结果,而抑制其他的预测结果。NMS的做法是,首先,对每个类别,NMS先统计每个预测结果输出的属于该类别概率,并将预测结果按该概率由高至低排序。其次,NMS认为对应概率很小的预测结果并没有找到目标,所以将其抑制。然后,NMS在剩余的预测结果中,找到对应概率最大的预测结果,将其输出,并抑制和该包围盒有很大重叠(如IoU大于0.3)的其他包围盒。重复上一步,直到所有的预测结果均被处理。

在线困难样例挖掘(online hard example mining, OHEM) 目标检测的另一个问题是类别不平衡,图像中大部分的区域是不包含目标的,而只有小部分区域包含目标。此外,不同目标的检测难度也有很大差异,绝大部分的目标很容易被检测到,而有一小部分目标却十分困难。OHEM和Boosting的思路类似,其根据损失值将所有候选区域进行排序,并选择损失值最高的一部分候选区域进行优化,使网络更关注于图像中更困难的目标。此外,为了避免选到相互重叠很大的候选区域,OHEM对候选区域根据损失值进行NMS。

在对数空间回归 回归相比分类优化难度大了很多。\ell_2 损失对异常值比较敏感,由于有平方,异常值会有大的损失值,同时会有很大的梯度,使训练时很容易发生梯度爆炸。而 \ell_1 损失的梯度不连续。在对数空间中,由于数值的动态范围小了很多,回归训练起来也会容易很多。此外,也有人用平滑的 \ell_1 损失进行优化。预先将回归目标规范化也会有助于训练。


语义分割(semantic segmentation)

语义分割是目标检测更进阶的任务,目标检测只需要框出每个目标的包围盒,语义分割需要进一步判断图像中哪些像素属于哪个目标。

(1) 语义分割常用数据集

PASCAL VOC 2012 1.5k训练图像,1.5k验证图像,20个类别(包含背景)。

MS COCO COCO比VOC更困难。有83k训练图像,41k验证图像,80k测试图像,80个类别。

(2) 语义分割基本思路

基本思路 逐像素进行图像分类。我们将整张图像输入网络,使输出的空间大小和输入一致,通道数等于类别数,分别代表了各空间位置属于各类别的概率,即可以逐像素地进行分类。

全卷积网络+反卷积网络 为使得输出具有三维结构,全卷积网络中没有全连接层,只有卷积层和汇合层。但是随着卷积和汇合的进行,图像通道数越来越大,而空间大小越来越小。要想使输出和输入有相同的空间大小,全卷积网络需要使用反卷积和反汇合来增大空间大小。

反卷积(deconvolution)/转置卷积(transpose convolution) 标准卷积的滤波器在输入图像中进行滑动,每次和输入图像局部区域点乘得到一个输出,而反卷积的滤波器在输出图像中进行滑动,每个由一个输入神经元乘以滤波器得到一个输出局部区域。反卷积的前向过程和卷积的反向过程完成的是相同的数学运算。和标准卷积的滤波器一样,反卷积的滤波器也是从数据中学到的。

反最大汇合(max-unpooling) 通常全卷积网络是对称的结构,在最大汇合时需要记下最大值所处局部区域位置,在对应反最大汇合时将对应位置输出置为输入,其余位置补零。反最大汇合可以弥补最大汇合时丢失的空间信息。反最大汇合的前向过程和最大汇合的反向过程完成的是相同的数学运算。

(3) 语义分割常用技巧

扩张卷积(dilated convolution) 经常用于分割任务以增大有效感受野的一个技巧。标准卷积操作中每个输出神经元对应的输入局部区域是连续的,而扩张卷积对应的输入局部区域在空间位置上不连续。扩张卷积向标准卷积运算中引入了一个新的超参数扩张量(dilation),用于描述输入局部区域在空间位置上的间距。当扩张量为1时,扩张卷积退化为标准卷积。扩张卷积可以在参数量不变的情况下有效提高感受野。例如,当有多层3×3标准卷积堆叠时,第l 层卷积(l 从1开始)的输出神经元的感受野为2l +1。与之相比,当有多层3×3扩张卷积堆叠,其中第l 层卷积的扩张量为2^{l-1}时,第l 层卷积的输出神经元的感受野为2^{l +1}-1。感受野越大,神经元能利用的相关信息越多。和经典计算机视觉手工特征相比,大的感受野是深度学习方法能取得优异性能的重要原因之一。

条件随机场(conditional random field, CRF) 条件随机场是一种概率图模型,常被用于微修全卷积网络的输出结果,使细节信息更好。其动机是距离相近的像素、或像素值相近的像素更可能属于相同的类别。此外,有研究工作用循环神经网络(recurrent neural networks)近似条件随机场。条件随机场的另一弊端是会考虑两两像素之间的关系,这使其运行效率不高。

利用低层信息 综合利用低层结果可以弥补随着网络加深丢失的细节和边缘信息,利用方式可以是加和(如FCN)或沿通道方向拼接(如U-net),后者效果通常会更好一些。


实例分割(instance segmentation)

语义分割不区分属于相同类别的不同实例。例如,当图像中有多只猫时,语义分割会将两只猫整体的所有像素预测为“猫”这个类别。与此不同的是,实例分割需要区分出哪些像素属于第一只猫、哪些像素属于第二只猫。

基本思路 目标检测+语义分割。先用目标检测方法将图像中的不同实例框出,再用语义分割方法在不同包围盒内进行逐像素标记。

Mask R-CNN 用FPN进行目标检测,并通过添加额外分支进行语义分割(额外分割分支和原检测分支不共享参数),即Mask R-CNN有三个输出分支(分类、坐标回归、和分割)。此外,Mask R-CNN的其他改进有:(1). 改进了RoI汇合,通过双线性差值使候选区域和卷积特征的对齐不因量化而损失信息。(2). 在分割时,Mask R-CNN将判断类别和输出模板(mask)这两个任务解耦合,用sigmoid配合对率(logistic)损失函数对每个类别的模板单独处理,取得了比经典分割方法用softmax让所有类别一起竞争更好的效果。


致谢

感谢

指出的一处笔误。


参考文献

  1. V. Badrinarayanan, et al. SegNet: A deep convolutional encoder-decoder architecture for image segmentation. TPAMI, 2017.
  2. Y. Bengio, et al. Representation learning: A review and new perspectives. TPAMI, 2013.
  3. L.-C. Chen, et al. SegNet: A deep convolutional encoder-decoder architecture for image segmentation. PAMI, 2017.
  4. S. Chetlur, et al. cuDNN: Efficient primitives for deep learning. arXiv: 1410.0759, 2014.
  5. J. Cong, and B. Xiao. Minimizing computation in convolutional neural networks. ICANN, 2014.
  6. J. Dai, et al. R-FCN: Object detection via region-based fully convolutional networks. NIPS, 2016.
  7. A. Garcia-Garcia, et al. A review on deep learning techniques applied to semantic segmentation. arXiv: 1704.06857, 2017.
  8. R. Girshick, et al. Rich feature hierarchies for accurate object detection and semantic segmentation. CVPR, 2014.
  9. R. Girshick. Fast R-CNN. ICCV, 2015.
  10. K. He, et al. Spatial pyramid pooling in deep convolutional networks for visual recognition. ECCV, 2014.
  11. K. He, et al. Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification. ICCV, 2015.
  12. K. He, et al. Deep residual learning for image recognition. CVPR, 2016.
  13. K. He, et al. Identity mappings in deep residual networks. ECCV, 2016.
  14. K. He, et al. Mask R-CNN. ICCV, 2017.
  15. J. Hu, et al. Squeeze-and-excitation networks. CVPR, 2018.
  16. G. Huang, et al. Deep networks with stochastic depth. ECCV, 2016.
  17. G. Huang, et al. Densely connected convolutional networks. CVPR, 2017.
  18. J. Huang, et al. Speed/Accuracy trade-offs for modern convolutional object detectors. CVPR, 2017.
  19. A. Krizhevsky, and G. Hinton. Learning multiple layers of features from tiny images. Technical Report, 2009.
  20. A. Krizhevsky, et al. ImageNet classification with deep convolutional neural networks. NIPS, 2012.
  21. A. Lavin, and S. Gray. Fast algorithms for convolutional neural networks. CVPR, 2016.
  22. Y. LeCun, et al. Gradient-based learning applied to document recognition. Proceedings of the IEEE, 1998.
  23. M. Lin, et al. Network in network. ICLR, 2014.
  24. T.-Y. Lin, et al. Microsoft COCO: Common objects in context. ECCV, 2014.
  25. T.-Y. Lin, et al. Feature pyramid networks for object detection. CVPR, 2017.
  26. T.-Y. Lin, et al. Focal loss for dense object detection. ICCV, 2017.
  27. W. Liu, et al. SSD: Single shot multibox detector. ECCV, 2016.
  28. J. Long, et al. Fully convolutional networks for semantic segmentation. CVPR, 2015.
  29. H. Noh, et al. Learning deconvolution network for semantic segmentation. ICCV, 2015.
  30. G. Pleiss, et al. Memory-efficient implementation of DenseNets. arXiv: 1707.06990, 2017.
  31. J. Redmon, et al. You only look once: Unified, real-time object detection. CVPR, 2016.
  32. S. Ren, et al. Faster R-CNN: Towards real-time object detection with region proposal networks. NIPS, 2015.
  33. S. Ren, et al. Object detection networks on convolutional feature maps. TPAMI, 2017.
  34. O. Ronneberger, et al. U-net: Convolutional networks for biomedical image segmentation. MICCAI, 2015.
  35. O. Russakovsky, et al. ImageNet large scale visual recognition challenge. IJCV, 2015.
  36. P. Sermanet, et al. OverFeat: Integrated recognition, localization, and detection using convolutional networks. ICLR, 2014.
  37. A. Shrivastava, et al. Training region-based object detectors with online hard example mining. CVPR, 2016.
  38. K. Simonyan, and A. Zisserman. Very deep convolutional networks for large-scale image recognition. ICLR, 2015.
  39. J. T. Springenberg, et al. Striving for simplicity: The all convolutional net. ICLR Workshop, 2015.
  40. V. Sze, et al. Efficient processing of deep neural networks: A tutorial and survey. Proceedings of IEEE, 2017.
  41. C. Szegedy, et al. Going deep with convolutions. CVPR, 2015.
  42. C. Szegedy, et al. Rethinking the Inception architecture for computer vision. CVPR, 2016.
  43. C. Szegedy, et al. Inception v4, Inception-ResNet and the impact of residual connections on learning. AAAI, 2017.
  44. A. Toshev, and C. Szegedy. DeepPose: Human pose estimation via deep neural networks. CVPR, 2014.
  45. A. Veit, et al. Residual networks behave like ensembles of relatively shallow networks. NIPS, 2016.
  46. S. Xie, et al. Aggregated residual transformations for deep neural networks. CVPR, 2017.
  47. F. Yu, and V. Koltun. Multi-scale context aggregation by dilated convolutions. ICLR, 2016.
  48. M. D. Zeiler, and R. Fergus. Visualizing and understanding convolutional networks. ECCV, 2014.
  49. S. Zheng, et al. Conditional random fields as recurrent neural networks. ICCV, 2015.

2018-09-11 21:30:46 q1079338373 阅读数 971

给定一张输入图像,图像分类的任务是判断该图像属于哪类, 如果是多任务分类, 可以用于分类该图像包含哪个类别。

深度学习作为机器学习中非常重要的分支, 在图像领域中应用非常广泛.
在图像分类任务中, 通常采用卷积层(CNN)提取特征, 加上全连接层进行分类, 目前最常见的基于CNN的模型有以下几种:

1: LeNet。

卷积网络的第一个成功应用是由Yann LeCun于1990年代开发的。其中最着名的是LeNet架构,用于读取邮政编码,数字等。
这里写图片描述

2: AlexNet。

该推广卷积网络计算机视觉中的第一部作品是AlexNet,由亚历克斯·克里维斯基,伊利亚·萨茨基弗和吉奥夫·欣顿发展。AlexNet在2012年被提交给ImageNet ILSVRC挑战,明显优于第二名(与亚军相比,前5名错误为16%,26%的错误)。该网络与LeNet具有非常相似的体系结构,但是更深入,更大和更具特色的卷积层叠在彼此之上(以前通常只有一个CONV层紧随着一个POOL层)。
这里写图片描述

3: ZFNet。

ILSVRC 2013获奖者是Matthew Zeiler和Rob Fergus的卷积网络。它被称为ZFNet(Zeiler&Fergus Net的缩写)。通过调整架构超参数,特别是通过扩展中间卷积层的大小,使第一层的步幅和过滤器尺寸更小,这是对AlexNet的改进。
这里写图片描述

4: GoogleNet。

ILSVRC 2014获奖者是Szegedy等人的卷积网络。来自Google。其主要贡献是开发一个初始模块,大大减少了网络中的参数数量(4M,与AlexNet的60M相比)。此外,本文使用ConvNet顶部的“平均池”而不是“完全连接”层,从而消除了大量似乎并不重要的参数。
这里写图片描述

5: VGGNet。

VGG是Visual Geometry Group, Department of Engineering Science, University of Oxford的缩写。他们组参加ILSVRC 2014时候组名叫VGG,所以提交的那种网络结构也叫VGG,或者叫VGGNet。VGG和GoogleNet同在2014年参赛,图像分类任务中GoogLeNet第一,VGG第二,它们都是重要的网络结构。

各种VGG的网络结构如下: 它的主要贡献在于表明网络的深度是良好性能的关键组成部分。他们最终的最佳网络包含16个CONV / FC层,并且吸引人的是,具有非常均匀的架构,从始至终只能执行3x3卷积和2x2池。VGGNet的缺点是评估和使用更多的内存和参数(140M)是更昂贵的。这些参数中的大多数都在第一个全连接层中,因此发现可以在不降低性能的情况下去掉一些全连接层.
这里写图片描述

6: ResNet。

Kaiming He等人开发的残留网络 是ILSVRC 2015的获胜者。它具有特殊的跳过连接和批量归一化的大量使用。该架构在网络末端也缺少完全连接的层。ResNets目前是迄今为止最先进的卷积神经网络模型.
这里写图片描述

以上就是最常用的卷积神经网络模型了.
现在github上有以上网络模型的实现, 并有在各种大型图像数据集,如imagenet中的训练的权重可供下载, 然后用于提取特征或微调. 当然自己也可以使用模型重新训练权重, 当然自己也可以写网络模型.深度学习框架中, tensorflow非常主流, 但是它构建模型的代码较为麻烦, 每一层的权重还要指定shape; keras框架是对tensorflow的常用功能进行了封装, 所以写网络结构特别简单; 至于pytorch听说写网络结构也很简单, 暂时没用过, 不多说.

2018-05-28 12:30:35 qq_16761599 阅读数 1354

一、经典任务

计算机视觉领域中和目标有关的经典任务有三种:分类、检测和分割。其中分类是为了告诉你「是什么」,后面两个任务的目标是为了告诉你「在哪里」,而分割任务将在像素级别上回答这个问题。


二、几种专业名词的含义

目标检测,搜索系统感兴趣的目标区域;

目标跟踪,捕获感兴趣区域的运动轨迹;

目标分类,將被跟踪目标分为人,汽车或其他移动物体;

目标行为识别,对跟踪目标进行行为识别。

立体视觉匹配,是一种从平面图像中恢复深度信息的技术。

光流,是指图像灰度模式的表面运动,是三维运动场在二维图像平面上的投影。

场景流,是空间中场景运动形成的三维运动场。两者在视频跟踪与监控,自主机器人导航,三维视频压缩与显示等领域有着广泛的应用。

三、KITTI数据集(非常重要)

对于KITTI数据集,该数据集用于评测立体图像(stereo),光流(optical flow),视觉测距(visual odometry),3D物体检测(object detection)和3D跟踪(tracking)等计算机视觉技术在车载环境下的性能。

四、几种深度学习算法含义

FCNN:全卷积网络:并行,迭代

CNN:FCNN基础上加入空间结构参数共享

RNN:FCNN基础上加入时间结构参数共享

五、论文汇总总结

       1、机器学习,深度学习在图像,语音等富媒体的分类和识别上取得了非常好的效果,所以各大研究机构和公司都投入了大量的人力做相关的研究和开发。值得我们学习。

       2、光流法,场景流法,立体视觉匹配对于视频处理有至关重要的功能。

       3、KITTI官网上有大量关于光流,场景流和立体视觉匹配算法以及对比,我们可以借鉴并加以引用。

六、论文以及源码常用网站

CVPR2017 http://openaccess.thecvf.com/CVPR2017.py

ICCV2017 http://openaccess.thecvf.com/ICCV2017.py

KITTI算法 http://www.cvlibs.net/datasets/kitti/eval_scene_flow.php

七、几个搜源码的国内网站:

1、http://blog.sina.com.cn/s/blog_72d206b7010105v5.html

2https://ymcn.org/search.php?keyword=%E5%85%89%E6%B5%81%E5%9C%BA&cateid=0&sort=&sortby=&sm=0&os=0&platform=0&language=0&file=0&page=4

3、http://www.tk4479.net/yf0811240333/article/details/42076677

4、http://blog.sciencenet.cn/blog-4099-638485.html

5、https://lmb.informatik.uni-freiburg.de/resources/binaries/

八、有关人工智能比较好的开源社区

极市 http://cvmart.net/community

机器之心 https://www.jiqizhixin.com/

https://zhuanlan.zhihu.com/jiqizhixin

无痛的机器学习 https://zhuanlan.zhihu.com/hsmyy

深度学习整理笔记系列 http://blog.csdn.net/zouxy09/article/details/8775360

廖雪峰Python教程:

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000

光流法:http://blog.csdn.net/zouxy09/article/details/8683859

http://blog.csdn.net/crzy_sparrow/article/details/7407604

http://bbs.elecfans.com/jishu_485979_1_1.html

场景流:http://www.doc88.com/p-2344567483739.html

http://paopaorobot.org/2017/04/30/%E7%AC%AC%E5%9B%9B%E5%8D%81%E4%B8%80%E8%AF%BE%EF%BC%9A%E8%A7%86%E8%A7%89%E5%9C%BA%E6%99%AF%E6%B5%81-%E9%99%88%E9%BE%99/

http://www.rosclub.cn/post-963.html