ADAS传感器之摄像头(之十一)-----车载摄像头图像识别主流算法

关键字 :EeasyADAS亿智

前面章节阐述了摄像头内部的工作原理,一系列的图像效果的处理,包括白平衡、畸变校正、色彩还原等一系列图像的处理,如果我们是做一台手机基本上到这里就结束了,处理完就给到显示屏做显示,但是这里的图像需要给到CPU主机做自动驾驶,涉及到自动驾驶的视觉技术,视觉技术需要解决的是“摄像头拍到的是什么物体。

摄像头拍到的图像,需要机器识别能读懂是什么物体,需要进行后续图像分割、物体分类、目标跟踪、世界模型、多传感器融合、在线标定、视觉SLAM、ISP 等一系列步骤进行匹配与深度学习,其核心环节在于物体识别与匹配,或者运用AI 自监督学习来达到感知分析物体的目的,需要解决的是“我拍到的东西是什么”的问题。



图像分隔技术:

数字图像处理是一个跨学科的领域,尽管其发展历史不长,但由于图像处理在军事、遥感、气象等大型应用中有不断增长的需求,并且心理学、生理学、计算机科学等诸多领域的学者们以数字图像为基础研究视觉感知,因此,针对图像处理和分析问题的新方法层出不穷,逐渐形成了自己的科学体系。

图像分割是图像分析的第一步,是计算机视觉的基础,是图像理解的重要组成部分,同时也是图像处理中最困难的问题之一。所谓图像分割是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域,简单的说就是在一副图像中,把目标从背景中分离出来。这里属于图像算法中的万里长征第一步,也是最重要的一步。


基于深度学习的图像分割
目前,受到广泛关注的深度学习也应用于图像分割问题中。神经网络是深度学习中的重要方法,基于神经网络的图像分割方法的基本思想是通过训练多层感知机来得到线性决策函数,然后用决策函数对像素进行分类来达到分割的目的。这种方法需要大量的训练数据。神经网络存在巨量的连接,容易引入空间信息,能较好地解决图像中的噪声和不均匀问题。


首先要了解什么是神经网络,什么是深度学习。

百度百科中对深度学习的定义是深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能(AI, Artificial Intelligence)。这个定义太大了,反而让人有点不懂,简答来说,深度学习就是通过多层神经网络上运用各种机器学习算法学习样本数据的内在规律和表示层次,从而实现各种任务的算法集合。各种任务都是啥,有:数据挖掘,计算机视觉,语音识别,自然语言处理等。

 可能有人会问那么深度学习,机器学习还有人工智能的关系是怎么样的呢?在这个博客中有详细介绍:一篇文章看懂人工智能、机器学习和深度学习,我们这里直接拿出结论:

  •   AI:让机器展现出人类智力
  •  机器学习:抵达AI目标的一条路径
  •  深度学习:实现机器学习的技术

    深度学习从大类上可以归入神经网络,不过在具体实现上有许多变化,并不像大家听到的一样,觉得这两个概念其实是同一个东西:

   从广义上说深度学习的网络结构也是多层神经网络的一种。更简单来说,多层神经网络 做的步骤是:特征映射到值。特征是 人工 挑选。深度学习 做的步骤是 信号->特征->值。特征是由 网络自己 选择。

深度学习的核心是 特征学习,旨在通过分层网络获取分层次的特征信息,从而解决以往需要人工设计特征的重要难题。深度学习是一个框架,包含多个重要算法:

  • Convolutional Neural Networks(CNN)卷积神经网络
  • AutoEncoder自动编码器
  • Sparse Coding稀疏编码
  • Restricted Boltzmann Machine(RBM)限制波尔兹曼机
  • Deep Belief Networks(DBN)深度信念网络
  • Recurrent neural Network(RNN)多层反馈循环神经网络神经网络

对不同的任务(图像,语音,文本),需要选用不同的网络模型才能达到更好的效果。

此外,最近几年 增强学习(Reinforcement Learning) 与深度学习的结合也创造了许多了不起的成果,AlphaGo就是其中之一。

人类视觉原理

深度学习的许多研究成果,离不开对大脑认知原理的研究,尤其是视觉原理的研究。

   1981 年的诺贝尔医学奖,颁发给了 David Hubel(出生于加拿大的美国神经生物学家) 和TorstenWiesel,以及 Roger Sperry。前两位的主要贡献,是“发现了视觉系统的信息处理”——可视皮层是分级的。如下图所示:


    进而通过大量试验研究,发现了人类的视觉原理,具体如下:从原始信号 摄入 开始(瞳孔摄入像素 Pixels),接着做 初步处理(大脑皮层某些细胞发现边缘和方向),然后 抽象(大脑判定,眼前的物体的形状,是圆形的),然后 进一步抽象(大脑进一步判定该物体是只气球)。

 下面是人脑进行人脸识别的一个示例。如下图所示:


 
   总的来说,人的视觉系统的信息处理是 分级 的。从低级的V1区 提取边缘特征,再到V2区的 形状或者目标的部分 等,再到更高层,整个目标、目标的行为 等。也就是说高层的特征是低层特征的组合,从低层到高层的特征表示越来越抽象,越来越能表现语义或者意图。而抽象层面越高,存在的可能猜测就越少,就越利于分类。

 对于不同的物体,人类视觉也是通过这样 逐层分级,来进行认知的。如下图所示:


     那么可以很自然的想到:可以不可以模仿人类大脑的这个特点,构造多层的神经网络,较低层的识别初级的图像特征,若干底层特征组成更上一层特征,最终通过多个层级的组合,最终在顶层做出分类呢?答案是肯定的,这也是许多深度学习算法(包括CNN)的灵感来源。

神经网络

首先什么是神经网络呢?神经网络也指的是 人工神经网络(Artificial Neural Networks,简称ANNs),是一种模仿生物神经网络行为特征的算法数学模型,由 神经元、节点与节点之间的连接(突触) 所构成,如下图所示:



    每个神经网络单元抽象出来的数学模型如下,也叫 感知器,它接收多个输入,产生一个输出,这就好比是神经末梢感受各种外部环境的变化(外部刺激),然后产生电信号,以便于转导到神经细胞(又叫神经元)。如下图所示:


    单个的感知器就构成了一个简单的模型,但在现实世界中,实际的决策模型则要复杂得多,往往是由多个感知器组成的多层网络,如下图所示,这也是经典的神经网络模型,由 输入层、隐含层、输出层 构成。如下图所示:


 人工神经网络可以映射任意复杂的非线性关系,具有很强的鲁棒性、记忆能力、自学习等能力,在分类、预测、模式识别等方面有着广泛的应用。



                                                       具体在图像分隔中的神经网络算法:

具体原理如下:

  通过下采样+上采样:Convlution + Deconvlution/Resize结合多尺度特征融合:特征逐点相加/特征channel维度拼接像素级别的segbement map:对每一个像素点进行判断类别。

 网络结构的选择将直接影响图像分割效果,常见的网络结构包括:VGG、FCN、Deconvnet、SegNet、Mask-RCNN。Image Segmentation(图像分割)网络结构比较





在图像分割的发展过程中,按照目的不同,逐渐从普通分割发展到语义分割,再从语义分割发展到实例分割:

 1、普通分割将不同分属不同物体的像素区域分开。如前景与后景分割开,狗的区域与猫的区域与背景分割开。

 2、语义分割在普通分割的基础上,分类出每一块区域的语义(即这块区域是什么物体)。如把画面中的所有物体都指出它们各自的类别。

 3、实例分割在语义分割的基础上,给每个物体编号。如这个是该画面中的汽车A,那个是画面中的汽车B。

 实例分割是目前最具挑战的任务之一,下面将主要对基于Mask R-CNN的主流图像分割方法和实例分割新方法Deep Snake进行介绍。

 图像分割技术发展至今,Mask R-CNN  的Pipeline几乎是目前做instance segmentation的大多数工作参考的方案。



Mask R-CNN将Object Detection与Semantic Segmentation合在了一起做。它的特点主要有以下几点:

 第一,神经网络有了多个通道输出。Mask R-CNN使用类似Faster R-CNN的框架,Faster R-CNN的输出是物体的bounding box和类别,而Mask R-CNN则多了一个通道,用来预测物体的语义分割图。也就是说神经网络同时学习两项任务,可以互相得到反馈,训练模型参数权重。

 第二,在语义分割中使用Binary Mask。原来的语义分割预测类别需要使用0 1 2 3 4等数字代表各个类别。在Mask R-CNN中,检测分支会预测类别。这时候分割只需要用0 1预测这个物体的形状面具就行了。

 第三,Mask R-CNN基本的pipeline是先检测物体矩形框,然后在矩形框中做逐像素分割。并且提出了RoiAlign用来替换Faster R-CNN中的RoiPooling。RoiPooling的思想是将输入图像中任意一块区域对应到神经网络特征图中的对应区域。RoiPooling使用了化整的近似来寻找对应区域,导致对应关系与实际情况有偏移。这个偏移在分类任务中可以容忍,但对于精细度更高的分割则影响较大。为了解决这个问题,RoiAlign不再使用化整操作,而是使用线性插值来寻找更精准的对应区域。效果就是可以得到更好地对应。实验也证明了效果不错。

 但是这样的处理方式其实有一些局限性,也是今天本文主要介绍的Deep Snake在处理实例分割时擅长解决的问题:

 1、在Mask R-CNN矩形框中做逐像素分割会受限于矩形框的准确度。

       如果矩形框精度差,如覆盖到一部分物体,那就算框中的分割精度做的再高,也无法得到正确的instance mask。

 2、逐像素分割在生产和后续计算中计算量巨大

     因为逐像素分割计算量大,所以网络一般将矩形框区域downsample为28x28的网格,然后进行分割,之后再把分割结果upsample到原图大小。这个upsample根据Mask R-CNN论文里的统计是有15ms的,比较费时。另一个问题是,在28x28网格上做分割会损失精度。即使28x28的网格上的分割结果完全正确,upsample到原图的mask仍然是很粗糙的。

 3、逐像素分割不适用于一些物体

     比如细胞和文本,因此不适合OCR(光学字符识别)。

Deep Snake

   针对主流图像分割方法在实例分割中面对的问题,Deep Snake考虑到逐像素分割有诸多限制,因此选择用contour来表示物体的形状。contour是一组有序的点,而且是首尾相连的。比如图片中猫的边缘就是一个contour。



  与稠密像素相比contour的两大优势

 1、计算量远远小于稠密像素,参数量也比较少。

 这样使得实例的分割的速度上限更高,也能更廉价地使用分割结果。这里举个例子就是跟踪任务。现在跟踪任务主要还是使用box做跟踪,用物体的像素点做跟踪任务计算量会很大。如果把像素点换成用contour做跟踪任务就会好很多。因此contour也更适用于细胞、文字这些物体的分割。

 2、传统的图像分割领域一直都有用contour做分割。

    有一个很经典的论文是Snakes:Active contour models. [2]。而本文中介绍的方法DeepSnake,顾名思义其实就是用深度学习的方法实现了传统Snake。传统Snake做图像分割的时候要求先给定一个初始的 contour。这个contour大概围绕着目标物体。

Deep Snake的优化

   传统Snake的一个很大问题是他的目标函数和最优化都是人工设定的,对数据的噪声比较敏感,容易收敛到局部最优点。为了解决这个问题,Deep Snake用深度学习来做这个优化过程。

    contour是一组有序的、首尾相连的点,可以看作一个cycle graph。这种cycle graph每个节点的邻居节点为2,顺序固定,所以可以定义卷积核。论文引入Circular convolution来处理contour,下图是Circular convolution的示例图:

1、Blue nodes 代表定义在contour的 输入特征值

2、Yellow nodes 代表卷积核,Green nodes为卷积输出,circular convolution为


    和传统Snake类似,给定一个初始 contour,基于图片的特征图,给contour的每个节点提取一个特征值,得到一个定义在contour上的特征。然后用Circular convolution构成的网络进行contour上的特征工程,最后映射为指向物体轮廓的补偿,用于变形contour。

 传统的Snake要求有一个比较准确的初始化 contour才能比变形得比较好,所以初始化contour对后续的变形十分关键。

    受到ExtremeNet的影响,作者用物体extreme points来构造初始contour。物体的extreme point是物体在图片中最上边、最左边、最下边和最右边的点。在每个点上延伸出一条线段,然后将线段连接起来,得到一个八边形,把这个八边形作为initial contour。

Pipeline for instance segmentation
1、通过预测extreme point来得到initial contour,然后将initial contour变形为物体边缘:

2、用detector检测得到一个矩形框,将矩形框四条边的中点连接起来,就得到一个菱形contour。通过Deep Snake来处理这个轮廓,从而得到extreme point。用extreme point构造Octagon contour,然后用Deep Snake来处理这个contour,从而得到物体轮廓。

  

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★博文作者未开放评论功能