本文为《程序员》原创文章,未经允许不得转载,更多精彩请订阅2017年《程序员》
无人驾驶的感知部分作为计算机视觉的领域范围,也不可避免地成为CNN发挥作用的舞台。本文是无人驾驶技术系列的第八篇,深入介绍CNN(卷积神经网络)在无人驾驶3D感知与物体检测中的应用。
CNN简介
卷积神经网络(Convolutional Neural Network,CNN)是一种适合使用在连续值输入信号上的深度神经网络,比如声音、图像和视频。它的历史可以回溯到1968年,Hubel和Wiesel在动物视觉皮层细胞中发现的对输入图案的方向选择性和平移不变性,这个工作为他们赢得了诺贝尔奖。时间推进到上世纪80年代,随着神经网络研究的深入,研究人员发现对图片输入做卷积操作和生物视觉中的神经元接受局部receptive field内的输入有相似性,那么在神经网络中加上卷积操作也就成了自然的事情。当前的CNN相比通常的深度神经网络(DNN),特点主要包括:
由于CNN在神经网络的结构上针对视觉输入本身特点做的特定设计,所以它是计算机视觉领域使用深度神经网络的不二选择。在2012年,CNN一举打破了ImageNet这个图像识别竞赛的世界纪录之后,计算机视觉领域发生了天翻地覆的变化,各种视觉任务都放弃了传统方法,启用了CNN来构建新的模型。无人驾驶的感知部分作为计算机视觉的领域范围,也不可避免地成为CNN发挥作用的舞台。
无人驾驶双目3D感知
在无人车感知中,对周围环境的3D建模是重中之重。激光雷达能提供高精度的3D点云,但密集的3D信息就需要摄像头的帮助了。人类用两只眼睛获得立体的视觉感受,同样的道理能让双目摄像头提供3D信息。假设两个摄像头间距为B,空间中一点P到两个摄像头所成图像上的偏移(disparity)为d,摄像头的焦距为f,那么我们可以计算P点到摄像头的距离为:
所以为了感知3D环境得到z,需要通过双目摄像头的两张图像I_l和I_r得到d,通常的做法都是基于局部的图片匹配:
由于单个像素的值可能不稳定,所以需要利用周围的像素和平滑性假设d(x,y)≈d(x+α,y+β)(假设α和β都较小),所以求解d变成了一个最小化问题:
这和optical flow任务想要解决的是非常类似的问题,不过是(Il,Ir)变成了(It ,It+1),所以下面将要介绍的算法,两者都适用。
MC-CNN
现在来看看Matching-Cost CNN算法,这个算法使用了一个CNN来计算上式的右侧matchingcost,MC-CNN的网络结构见图1。
图1 MC-CNN的网络结构
这个网络的输入是两个图片的一小块,输出是这两块不匹配的概率,相当于一个cost函数,当两者匹配时为0,不匹配时最大可能为1。通过对一个给定的图片位置搜索可能的d取值,找到最小的CNN输出,就得到了这一点局部的偏移估算。MC-CNN算法接下来做了如下后期处理:
最终算法效果如下:
图2 MC-CNN的算法效果
MC-CNN虽然使用了CNN,但仅限于计算匹配程度,后期的平滑约束和优化都是必不可少的,那有没有可能使用CNN一步到位呢?FlowNet就是这样做的。
FlowNet
为了实现端到端的模型结构,需要用CNN实现特征提取,匹配打分和全局优化等功能。FlowNet采取了encoder-decoder框架,把一个CNN分成了收缩和扩张两个部分。
图3 encoder-decoder的框架
在收缩部分FlowNet提出了两种可能的模型结构:
图4 FlowNetSimple与FlowNetCorr
FlowNet网络收缩部分不仅减少了CNN的计算量,同时起到了在图像平面上聚合信息的作用,这也导致分辨率下降。于是在FlowNet网络扩张部分使用 “up convolution”来提高分辨率,注意这里不仅使用了上一层的低分辨率输出,还使用了网络收缩部分相同尺度的隐层输出,如图5所示。
图5 FlowNet网络扩张
FlowNet算法在常见的公开数据集上都获得了不错的效果,值得一提的是它的速度很快。
无人驾驶物体检测
物体检测技术是无人驾驶感知必不可少的部分。自从2012年CNN在图片分类问题上的突破,物体检测自然是CNN应用的下一个目标,CNN的物体检测算法层出不穷,我们挑选比较有代表性的几个算法做介绍。
Faster R-CNN
CNN在物体识别领域大行其道之前,通常做法类似于DPM(Deformable Parts Model)这样的解决方案:在图像上抽取局部特征的组合作为模板,比如基于图像的空间梯度的HOG特征;为了能够处理形变,遮挡等变化,我们建立一个“弹性”的结构,把这些“刚性”的部分组合起来;最后加上一个分类器判断物体是否出现。这样的算法一般复杂度较高,需要大量经验,而且改进和优化难度较大。CNN的到来改变了一切。
R-CNN系列算法是一个两段式的算法,它把物体识别这个问题分为:
在了解算法的大致架构后,来看看算法的具体实现,这里主要描述R-CNN这一系列算法的最新版:Faster R-CNN,它对应上面两步分为RPN(Region Proposal Network)和Fast R-CNN,接下来分别介绍。
RPN
我们称物体可能所在区域为候选,RPN(Region Proposal Network)的功能是最高效地产生一个候选列表。如图6,RPN选择以CNN为基础,图片通过多个(比如4)卷积层进行特征提取,在最后一个卷积层输出的特征图上使用一个3x3的滚动窗口连接到一个256或者512维的全连接隐层,最后再分支到两个全连接层,一个输出物体类别,一个输出物体的位置大小。为了能够使用不同的物体大小和长宽比,在每一个位置上考虑三个尺度(128x128, 256x256, 512x512)和三个长宽比(1:1, 1:2, 2:1)一共9种组合。这样一个1000x600的图片上考虑了(1000/16) × (600/16) × 9 ≈ 20,000种位置、大小和长宽比的组合,由于使用CNN计算,这一步耗时不多。最后根据空间重叠程度去掉冗余的候选区域,一张图片大约获得2000个左右的物体可能区域。
图6 Region Proposal Network
Fast R-CNN
在候选区域分类阶段,我们使用的是基于全连接的神经网络,如图7的右侧部分:
而左侧的特征提取部分可以重用RPN中的CNN计算结果,大大节约了计算时间,能达到5-17帧每秒的速度。
图7 Fast R-CNN
MS-CNN
虽然Faster R-CNN算法大名鼎鼎,但在物体尺度变化很大的场景,比如无人驾驶,它还有提升的空间,Multi-scale CNN(MS-CNN)正是针对这个问题的尝试。CNN的层级结构由于pooling层的存在自然形成了和不同尺度的一个对应关系。那为什么不把对物体的检测放到CNN的不同层里去呢?这正是MS-CNN的想法。
在选择物体候选区域阶段,MS-CNN使用了图8的网络结构,我们看到如果把CNN网络里的卷积层看成一个大树的“主干”,那么在conv3、conv4和conv5这三个卷积层之后,这个网络都长出了“分支”,每个“分支”都连接了一个检测层,负责一定的尺度范围,这样多个“分支”一起,就能覆盖比较宽的物体尺度范围,达到我们的目的。
在候选区域识别阶段,我们让上一阶段多个检测层的输出特征图分别输入到一个子网络里,这里有几个值得注意的细节:
图8 MS-CNN
总的来说,MS-CNN和Faster R-CNN相比,优势是识别的准确度有很大提高,尤其在物体尺度变化的情况下,比如KITTI数据集里面的行人和自行车。但是Faster R-CNN还是有速度的优势。
图9 MS-CNN
SSD
虽然Faster R-CNN的速度比之前的R-CNN已有很大提高,但还达不到实时的要求。Single Shot Detector(SSD)就是一个能够实时运行,有更佳准确度的算法,最近人气很高。SSD沿用了滑动窗口的思想,通过离散化物体的位置,大小和长宽比,使用CNN高效计算了各种可能的物体情况,从而达到了高速检测物体的目的。
图10 Single Shot Detector
如图10所示,SSD使用了VGG-16网络来做底层的图片特征提取,通过取消生成候选区域,缩放图片缩放和特征图采样的步骤,一步到位判断物体位置和分类,得到了高速的物体检测算法。
在VGG网络的基础上,SSD加入了逐步变小的卷积层,这些不同尺度的卷积层分别使用3x3大小的卷积核进行物体位置偏移和分类的判断,使SSD能够检测到不同大小的物体。
结论
无人驾驶的感知部分作为计算机视觉的领域范围,也不可避免地成为CNN发挥作用的舞台。CNN在无人驾驶中的应用主要包括3D感知与物体检测。在3D感知中使用到的网络包括MC-CNN与FlowNet, 在物体检测中使用到的网络包括Faster R-CNN、 MSCNN与 SSD。本文详细介绍了各种网络的优缺点,希望对各位在选择网络时有帮助。
作者简介:
吴双,原百度研究院硅谷人工智能实验室资深研究科学家,美国研发中心高级架构师。研究方向包括计算机和生物视觉,互联网广告算法和语音识别,曾在NIPS等国际会议中发表文章。
王江,百度研究院硅谷深度学习实验室资深研究科学家。曾在微软和Google研究院实习,他的工作在Google和百度的图像检索系统、人脸识别系统和大规模深度学习中均得到了广泛的应用。
刘少山,PerceptIn联合创始人。加州大学欧文分校计算机博士,研究方向智能感知计算、系统软件、体系结构与异构计算。现在PerceptIn主要专注于SLAM技术及其在智能硬件上的实现与优化。
博客地址:http://blog.yoqi.me/?p=1361
这篇文章还没有评论