2016-09-29 22:00:45 acmwwy 阅读数 1105

概要

证明了残差网络更容易训练,而且网络更深的时候能够取得更高的准确率。在ImageNet数据集上我们使用152层的残差网络并取得了3.57%的错误率。

简介

深度网络一直存在梯度消散的问题,但最近这个问题已经被normalized initialization和batch normalization很大程度的解决了。另一个问题是网络效果变差,当网络深度增加的时候,准确率反而比层数低的网络要差,但它并不是因为Overfitting变差的,因为即使在训练集上,更深的网络的Train error比浅网络的Train error还要高。为什么会这样,论文没有很好的解释,只是说也许很难对更深的网络进行优化:如果对一个网络不断的加Layer,每一层新的Layer都是恒等变换,那么按理说新的网络最优的结果至少和旧的网络一样好甚至更好。但实验发现通过训练连达到旧网络的效果都很难
更深不一定更好
为了解决的这个问题,我们提出了深度残差网络,作者的观察是:与其让网络优化出我们想要的层与层间的参数(比如至少是恒等变换),不如我们直接让这些层去优化一个残差网络。优化一个残差网络要比优化原来的网络更容易。一个比较正式的描述是:假设H(x)是最优的参数,我们让网络是优化另一个参数F(X) = H(X) - X。这样,最坏情况下,假设是恒等变换,比起训练出恒等变换,训练出F(X)=0要简单得多。 这个方法的好处是它没有增加需要训练的参数个数,也没有增加训练的计算量,而且容易实现。
这里写图片描述

深度残差学习

残差网络模块可以包括许多个Layer,关键的地方是在模块输入和输出之间加一条恒等映射的边。在Figure2的例子中,它包含了两层Layer,F(x) = W2*Relu(W1*x)。模块中的层数一般是2到3层,如果模块中只有一层,它变成了一个线性模型,没有任何优势。如果输入和输出的维度不一样,我们需要用线性映射( linear projection)来解决这个问题。y = F(x, {Wi}) + Ws*x我们同时发现残差也能用在多卷积层中,只是要每个channel分别进行相加。

实验的网络结构

这里写图片描述

实现细节

  • The image is resized with its shorter side randomly sampled in [256; 480] for scale augmentation
  • A 224 * 224 crop is randomly sampled from an image or its horizontal flip, with the per-pixel mean subtracted
  • Use standard color augmentation
  • Batch normalization right after each convolution and before activation
  • use SGD with a mini-batch size of 256
  • the learning rate starts from 0.1 and is divided by 10 when the error plateaus
  • the models are trained for up to 60*10^4 iterations
  • use a weight decay of 0.0001 and a momentum of 0.9
  • No dropout
  • In testing, standard 10-crop testing.
  • average scores at multiple scales (images are resized such that the shorter side is in {224 ; 256 ; 384 ; 480 ; 640}

实验结果

这里写图片描述

2016-11-25 17:08:40 oMengLiShuiXiang1234 阅读数 41627

主要做了基于深度学习的图像识别与检测的研究,下面是一些整理内容

1、深度学习的优势


(1)从统计,计算的角度看,DL特别适合处理大数据

       a、用较为复杂的模型降低模型偏差

       b、用大数据提升统计估计的准确度

       c、用可扩展的梯度下降算法求解大规模优化问题

这个大数据是除了数量上的大,还有更重要的是维度的大,很多算法本身是无法处理高纬度数据的,例如Kernel学习机相关的算法, 虽然理论上是先将数据向高维空间映射,然后在高维空间进行线性的求解,实际上在处理的时候还是回到原空间处理。传统的BP算法针对高维的数据也是效果不佳。

 

CNN等为什么对图像领域更加有效,因为其不但关注了全局特征,更是利用了图像识别领域非常重要的局部特征,应该是将局部特征抽取的算法融入到了神经网络中。图像本身的局部数据存在关联性,而这种局部关联性的特征是其他算法无法提取的。深度学习很重要的是对全局和局部特征的综合把握


(2)深度学习不是一个黑箱系统。它像概率模型一样,提供一套丰富的、基于联接主义的建模语言。利用这套语言系统,我们可以表达数据内在的丰富关系和结构。比如用卷积处理图像中的二维空间结构,用递归神经网络(Recurrent Neural Network)处理自然语言等数据中的时序结构


(3)深度学习几乎是唯一的端到端的学习系统

它直接作用于原始数据,自动逐层进行特征学习,整个过程直接优化目标函数。


2、深度学习在图像识别中的发展趋势


(1)模型层次不断加深

       2012Alex 获得ImageNet 冠军,其所用的AlexNet5个卷积层 3个pool层 和2个全连接层

       2014年获得ImageNet的GoogleNet,使用了59个卷积层,16个pool层和2个全连接层。

       2016年微软的ResNet深度残差网络,用了152层的架构


(2)模型结构日趋复杂

       传统的卷积神经网络都是简单的 conv-pool-FC

       后来NIN 用mlpconv 代替传统的 conv层(mlp 实际上是卷积加传统的多层感知器 )。这样做一方面降低过拟合程度提高模型的推广能力,另一方面为大规模并行训练提供非常有利的条件


(3)海量的标注数据和适当的数据扰动

       DL需要大量的数据,现有的图像数据不能满足需求,结合图像数据的特点,通过平移、水平翻转、旋转、缩放等数据扰动方式可以产生更多的有效数据,普遍提高识别模型的推广能力。


3、如何应用深度学习


(1)  将ImageNet上训练得到的模型作为起点,利用目标训练集和反向传播对其进行继续训练,将模型适应到特定的应用

(2)  如果目标训练集不够大,可以将底层的网络参数固定,沿用ImageNet上的训练集结果,只对上层进行更新。

(3)  直接采用ImageNet上训练得到的模型,把最高的隐含层的输出作为特征表达,代替常用的手工设计的特征。

 

4、卷积神经网络


(1)什么是卷积神经网络

     

 卷积神经网络是一种为了处理二维输入数据而特殊设计的多层人工神经网络。网络中的每层都由多个二维平面组成,而每个平面由多个独立的神经元组成。相邻两层的神经元之间互相连接。

A、       卷积特征提取(局部连接,权值共享

从图像中随机选取一小块局域作为训练样本,从该样本中学习到一些特征,然后将这些特征作为滤波器,与原始整个图像作卷积运算,从而得到原始图像中任意位置上的不同特征的激活值(见动图)


B、       池化

通过将卷积层提取的特征输入至分类器中进行训练,可以实现输出最终的分类结果。理论上可以直接输出,然而这将需要非常大的计算开销,特别是对于大尺寸高分辨率图像

由于图像具有一种“静态性”的属性,在图像的一个局部区域得到的特征极有可能在另一个局部区域同样适用。因此,对图像的一个局部区域中不同位置的特征进行聚合统计操作,这种操作统称为池化


(2)卷积神经网络的发展


A、 1990年,LeCun等在研究手写体数字识别问题时,首先提出来使用梯度反向传播算法训练的卷积神经网络模型,并在MNIST手写数字数据集上表现出了好的性能。

B、 2012年ImageNet比赛中 AlexKrizhevsky等提出的AlexNet首次将深度学习应用到大规模图像分类,并获得了冠军。

AlexNet用了5层卷积层和3层全连接层,最后用softmax进行分类。

改进点:

a、       采用dropout训练策略,在训练过程中将输入层和中间层的一些神经元随机置零。这模拟了噪声对输入数据的各种干扰使一些神经元对一些视觉模式产生漏检的情况。使得训练过程收敛过慢,但得到的网络模型更加鲁棒。

b、       采用ReLU(修正线性单元)作为激励函数,降低了计算的复杂度

c、        通过对训练样本镜像映射和加入随机平移扰动,产生了更多的训练样本,减少了过拟合

C、 2013 ImageNet的获胜队伍Clarifai 提出了卷积神经网络的可视化方法,运用反卷积网络对AlexNet的每个卷积层进行可视化,以此来分析每一层所学习到的特征从而加深了对于卷积神经网络为什么能在图像分类上取得好的效果的理解,并据此改进了该模型。


D、 2014 ImageNet Google团队


网络有22 层,受到赫布学习规则的启发,同时基于多尺度处理的方法对卷积神经网络作出改进。该文基于Network in Network思想提出了Inception模块。Inception 模块的结构如图所示,它的主要思想是想办法找出图像的最优局部稀疏结构,并将其近似地用稠密组件替代。这样做一方面可以实现有效的降维,从而能够在计算资源同等的情况下增加网络的宽度与深度;另一方面也可以减少需要训练的参数,从而减轻过拟合问题,提高模型的推广能力。


E、 2015年微软亚洲研究院所提出的152层的深度残差网络以绝对的优势获得图像检测、图像分类和图像定位3个项目的冠军

 

5、物体检测

(1)物体分类与检测的难点与挑战

物体分类与检测是视觉研究中的基本问题,也是一个非常具有挑战性的问题.物体分类与检测的难点与挑战在本文中分为3个层次:实例层次、类别

层次和语义层次,如图所示

 

 

 

a)       实例层次

针对单个物体实例而言,通常由于图像采集过程中光照条件、拍摄视角、距离的不同、物体自身的非刚体形变以及其他物体的部分遮挡,使得物体实例的表观特征产生很大的变化,给视觉识别算法带来了极大的困难

b)       类别层次

困难与挑战通常来自3个方面,

类内差大,也即属于同一类的物体表观特征差别比较大,其原因有前面提到的各种实例层次的变化,但这里更强调的是类内不同实例的差别,例如图(a)所示

类间模糊性,即不同类的物体实例具有一定的相似性,如图(b)背景的干扰在实际场景下,物体不可能出现在一个非常干净的背景下,往往相反,背景可能是非常复杂的、对我们感兴趣的物体存在干扰的,这使得识别问题的难度大大增加

c)        语义层次.

困难和挑战与图像的视觉语义相关,这个层次的困难往往非常难处理,特别是对现在的计算机视觉理论水平而言,一个典型的问题称为多重稳定性.如图(C)左边既可以看成是两个面对面的人,也可以看成是一个燃烧的蜡烛;右边则同时可以解释为兔子或者小鸭.同样的图像,不同的解释,这既与人的观察视角、关注点等物理条件有关,也与人的性格、经历等有关,而这恰恰是视觉识别系统难以处理的部分



(2)物体检测的发展(详细算法介绍见后续)

       较有影响力的工作包括:

A、       RCNN (2013)

B、       Fast RCNN

C、       Faster RCNN

D、      R-FCN

E、       YOLO

F、       SSD


 

参考文献


【1】  基于深度学习的图像识别进展:百度的若干实践 (2015 百度公司)

【2】  图像识别中的深度学习 (2015 香港中文大学 王晓刚)

【3】  图像无图分类与检测算法综述 (2014 中国科学院自动化研究所模式识别国家重点实验室智能感知与计算研究中心)

【4】  深度卷积神经网络在计算机视觉中的应用研究综述 (2016 上海交通大学)

【5】  Rich feature hierarchies foraccurate object detection and semantic segmentation (2014)

【6】  Fast R-CNN (2015)

【7】  Faster R-CNN :Towards Real-Time Object Detection with Region Proposal Networks (2016)

【8】  Detection(网址上面描述各种检测算法)

2017-08-02 20:31:23 DaVinciL 阅读数 5264

OpenCV是一个十分强大的视觉库,tensorflow也提供了十分强大的图片处理函数,下面是一个简单的例子来说明使用tensorflow和opencv两个工具进行深度学习程序的设计。

首先是使用的原始图片:

这里写图片描述

import tensorflow as tf
import cv2

# 这里定义一个tensorflow读取的图片格式转换为opencv读取的图片格式的函数
# 请注意:
# 在tensorflow中,一个像素点的颜色顺序是R,G,B。
# 在opencv中,一个像素点的颜色顺序是B,G,R。
# 因此,我们循环遍历每一个像素点,将第0位的颜色和第2位的颜色数值换一下即可。
# 第一个参数name:将要显示的窗口名称。
# 第二个参数image:储存图片信息的一个tensor。
def cv2Show(name="", image=None):
    # 获取矩阵信息
    np = image.eval()
    # 获取行数列数
    row, col = len(np),len(np[1])

    # 两重循环遍历
    for i in range(row):
        for j in range(col):
            # 交换数值
            tmp = np[i][j][0]
            np[i][j][0] = np[i][j][2]
            np[i][j][2] = tmp

    # 显示图片
    cv2.imshow(name,np)
    pass

# tensorflow会话
with tf.Session() as sess:
    # 以二进制的方式读取图片。
    image_raw_data = tf.gfile.FastGFile("bus.jpg", "rb").read()

    # 按照jpeg的格式解码图片。
    image_data = tf.image.decode_jpeg(image_raw_data)

    # 显示原图片。
    cv2Show("Read by Tensorflow+Dispalyed by Opencv",image_data)

    # opencv读取同一张图片。
    img = cv2.imread("bus.jpg")

    # opencv显示图片。
    cv2.imshow("Read by Opencv+Displayed by Opencv",img)

    # 重新调整大小。
    # resize_images(images,size,method=ResizeMethod.BILINEAR,align_corners=False)'
    # 参数如下:
    # images:需要调整的图片,通常是一个tensor
    # size:调整之后的大小,一般是一个长度为2的list
    # method:调整大小使用的方法,这里我们使用最近邻居法。
    # align_corner:是否对齐四角。
    resized = tf.image.resize_images(image_data,[300,300],method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)

    # 显示图片。
    cv2Show("Resized:Nearest Neighbor",resized)

    # 调整大小,采用切割或者填充的方式。
    # 如果原始图像的尺寸大于目标图像,那么这个函数会自动切割原始图像中的居中的部分。
    # 如果原始图像的尺寸小于目标图像,那么这个函数会自动在原始图像的周围采用全0填充。
    # resize_image_with_crop_or_pad(image, target_height, target_width)
    # image:待调整的图像。
    # target_height:目标图像的高度。
    # target_width:目标图像的宽度。
    cropped = tf.image.resize_image_with_crop_or_pad(image_data,300,300)
    cv2Show("After being cropped",cropped)

    padded = tf.image.resize_image_with_crop_or_pad(image_data,600,900)
    cv2Show("After being padded",padded)

    # 通过比例调整图像大小。
    # central_crop(image, central_fraction)
    # image:待调整的图像。
    # central_fraction:比例,是一个(0,1]之间的数字,表示需要调整的比例。这里我们选择的比例是0.5,即50%。
    central_cropped = tf.image.central_crop(image_data,0.5)
    cv2Show("After being central-cropped",central_cropped)

    cv2.waitKey()

使用的函数功能,参数等信息在代码中均已写明。

下面的表格实在使用调整大小的函数时常常需要使用的Method取值。

Method 图像大小的调整算法
0 双线性插值法 tf.image.ResizeMethod.BILINEAR
1 最近邻居法 tf.image.ResizeMethod.NEAREST_NEIGHBOR
2 双三次插值法 tf.image.ResizeMethod.BICUBIC
3 面积插值法 tf.image.ResizeMethod.AREA

下面是程序的运行截图:

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

没有更多推荐了,返回首页