本系列博客包括6个专栏,分别为:《自动驾驶技术概览》、《自动驾驶汽车平台技术基础》、《自动驾驶汽车定位技术》、《自动驾驶汽车环境感知》、《自动驾驶汽车决策与控制》、《自动驾驶系统设计及应用》,笔者不是自动驾驶领域的专家,只是一个在探索自动驾驶路上的小白,此系列丛书尚未阅读完,也是边阅读边总结边思考,欢迎各位小伙伴,各位大牛们在评论区给出建议,帮笔者这个小白挑出错误,谢谢!
此专栏是关于《自动驾驶汽车环境感知》书籍的笔记。
1.无人驾驶与计算机视觉
1.1 概述
- 根据美国汽车工程师协会(Society of Automotive Engineers,SAE)定义,智能汽车驾驶自动化分为:一级为辅助驾驶,二级为部分自动驾驶,三级为有条件自动驾驶,四级为高度自动驾驶,五级为安全自动驾驶;
- 无人驾驶汽车的关键技术主要包括:环境感知、路径规划、定位导航、运动控制等;
- 环境感知是利用传感器技术对车辆周围环境数据进行采集,获取车辆行驶周围环境信息,并对数据进行处理和分析,为规划和决策系统提供支持;
- 计算机视觉(Computer Vision,CV)是一门用计算机模拟生物视觉的学科,让计算机代替人眼实现对目标的识别、分类、跟踪和场景理解;
- 周围环境中的物体在可见光照射下,在人眼的视网膜上形成图像,由感光细胞转换成神经脉冲信号,经神经纤维传入大脑皮层进行处理与理解;视觉,不仅指对光信号的感受,包括了对视觉信息的获取、传输、处理、存储与理解全过程;
1.2 边缘检测
边缘检测与微分计算:
- 边缘检测目的:标识数字图像中亮度变换明显的点;图像属性中的显著变化通常反映了属性的重要事件和变化;这些包括:深度上的不连续,表面方向不连续,物质属性变化和场景照明变化;
- 对于二维图像来说,边缘一般发生在一阶微分的最大值处或二阶微分的过零点处;设二维图像信号为f(x,y)f(x,y)f(x,y),f(x,y)f(x,y)f(x,y)表示像素点的位置,则一阶导数为:g=∇f(x,y)=(∂f∂x,∂f∂y)Tg=\nabla{f(x,y)}=(\frac{\partial{f}}{\partial{x}},\frac{\partial{f}}{\partial{y}})^Tg=∇f(x,y)=(∂x∂f,∂y∂f)T
对于二阶导数,一般采用各向同性的二阶微分算子,即拉普拉斯算子:
∇2f(x,y)=∂2f∂x2+∂2f∂y2\nabla^2f(x,y)=\frac{\partial^2f}{\partial{x^2}}+\frac{\partial^2f}{\partial{y^2}}∇2f(x,y)=∂x2∂2f+∂y2∂2f
由于实际信号经常出现噪声,因此在实际处理中,一般先进行去噪,噪声信号一般是高频信号,可以通过对其进行平滑滤波,去除噪声;平滑滤波器表示为h(x,y)h(x,y)h(x,y),滤波过程实际是在空域上的一个卷积运算,如下:f(x,y)⊗h(x,y)f(x,y)\otimes{h(x,y)}f(x,y)⊗h(x,y)
将一阶和二阶微分操作和滤波去噪过程结合,利用卷积操作性质,可以得到如下:
f(x,y)′⊗h(x,y)=(f(x,y)⊗h(x,y))′=f(x,y)⊗h(x,y)′f(x,y)′′⊗h(x,y)=(f(x,y)⊗h(x,y))′′=f(x,y)⊗h(x,y)′′f(x,y)'\otimes{h(x,y)}=(f(x,y)\otimes{h(x,y)})'=f(x,y)\otimes{h(x,y)'}\\ f(x,y)''\otimes{h(x,y)}=(f(x,y)\otimes{h(x,y)})''=f(x,y)\otimes{h(x,y)}''f(x,y)′⊗h(x,y)=(f(x,y)⊗h(x,y))′=f(x,y)⊗h(x,y)′f(x,y)′′⊗h(x,y)=(f(x,y)⊗h(x,y))′′=f(x,y)⊗h(x,y)′′
先求出平滑滤波器的一阶微分和二阶微分,后和图像本身做一次卷积操作;
平滑滤波器一般选择高斯滤波器,其表示为:
h(x,y)=12πσ2e−(x2+y2)/2σ2(1) h(x,y)=\frac{1}{2\pi\sigma^2}e^{{-(x^2+y^2)}/{2\sigma^2}}\tag{1} h(x,y)=2πσ21e−(x2+y2)/2σ2(1)
dh(x,y)dx=−12πσe−y2/2σ2x2πσ3e−x2/2σ2(2) \frac{dh(x,y)}{dx}=\frac{-1}{2\pi\sigma}e^{-y^2/2\sigma^2}\frac{x}{\sqrt{2\pi}\sigma^3}e^{-x^2/2\sigma^2}\tag{2} dxdh(x,y)=2πσ−1e−y2/2σ22πσ3xe−x2/2σ2(2)
dh(x,y)dy=−12πσe−x2/2σ2x2πσ3e−y2/2σ2(3) \frac{dh(x,y)}{dy}=\frac{-1}{2\pi\sigma}e^{-x^2/2\sigma^2}\frac{x}{\sqrt{2\pi}\sigma^3}e^{-y^2/2\sigma^2}\tag{3} dydh(x,y)=2πσ−1e−x2/2σ22πσ3xe−y2/2σ2(3)
∇2h(x,y)=12πσ4(x2+y2σ2−2)e−(x2+y2)/2σ2(4) \nabla^2h(x,y)=\frac{1}{2\pi\sigma^4}(\frac{x^2+y^2}{\sigma^2}-2)e^{-(x^2+y^2)/2\sigma^2}\tag{4} ∇2h(x,y)=2πσ41(σ2x2+y2−2)e−(x2+y2)/2σ2(4)
离散信号的差分滤波:
- 存储于计算机内的信号为离散信号,离散卷积运算可以看作算子运算,将下述窗口算子沿信号移动,在每一点滤波后的值等于窗口内信号的加权平均;
- 常用的微分操作的算子:Robert算子、Prewitt算子、Sobel算子、拉普拉斯算子;
上图简介:
图1:分别为两个45°方向的一阶差分滤波器,称为Robert算子;用它们对图像滤波,可计算沿两个45°方向的一阶差分;
图2:左边为y方向一阶差分与x方向的平滑滤波,右边为x方向一阶差分与y方向的平滑滤波;
图3:Sobel算子和图2类似,平滑部分的权值有所差异;
图4:二阶差分滤波器,该算子不包含平滑滤波器;
1.3 图像分割
定义:
- 图像分割:把图像分成若干个特定的、具有独特性质的区域,并提取感兴趣目标的技术和过程;
- 利用图像分割技术,可以有效将前景和背景信息分离,并可以进一步分离出物体信息;
- 现有的图像分割方法:基于阈值的分割方法、基于区域的分割方法、基于边缘检测的分割方法、基于深度模型的分割方法;
常用分割方法:
-
基于阈值分割
- 阈值分割基本原理:通过设定不同的特征阈值,把图像像素点分为具有不同灰度级的目标区域和背景区域的若干类;
- 阈值分割适用于目标和背景占据不同灰度级范围的图像;
- 阈值确定后,将阈值与像素点的灰度值比较及对各像素的分割并行进行;
- 常用的阈值选择方法:
- 利用图像灰度直方图的峰谷法、最小误差法、基于过渡区法;
- 利用像素点空间位置信息的变化阈值法;
- 结合连通信息的阈值方法;
- 最大相关性原则选择阈值和最大熵原则自动阈值法;
-
基于区域的分割方法
基于区域的分割方法:以直接寻找区域为基础的分割技术,有两种基本形式:一种是区域生长,从单个像素出发,逐步合并并形成所需要的分割区域;另一种是区域分裂合并,从全局出发,逐步切割至所需的分割区域;- 区域生长
- 基本思想:将具有相似性质的像素集合起来构成区域;
- 具体:先对每个需要分割的区域找一个种子像素点作为生长的起点,然后将种子像素点周围领域中与种子像素有相同或相似性质的像素合并到种子像素所在的区域;将这些新像素当作新的种子像素继续以上过程,直到再没有满足条件的像素可被包括进来,这样就生成一个区域;
- 特点:
- 计算简单,对于较均匀的连通目标有较好的分割效果;
- 但需要人为选取种子,对噪声较敏感,可能会导致区域内有空洞;
- 区域生长是一种串行算法,当目标较大时分割速度较慢,因此在算法设计时应尽量提高运行效率;
- 区域分裂合并
- 区域分裂合并:从整个图像出发,不断分裂得到各个子区域,然后把前景区域合并,得到前景目标,继而实现目标的提取;
- 区域分裂合并的假设:对于一幅图像,前景区域是由一些相互连通的像素组成,如果把一幅图像分裂得到像素级,那么就可以判定该像素是否为前景像素;当所有像素点或子区域完成判断后,把前景区域或像素合并得到前景目标;
- 区域生长
-
基于边缘检测的分割方法
- 边缘检测分割:通过检测包含不同区域的边缘来解决分割问题;
- 通常不同的区域之间的边缘上像素灰度值的变化比较剧烈,这是边缘检测得以实现的主要假设之一;
- 边缘检测一般利用图像一阶导数的极大值或二阶导数的过零点信息来提供判断边缘点的基本依据;
- 常用的一阶导数算子:Robert算子、Prewitt算子、Sobel算子,二阶导数算子:拉普拉斯算子;
- 特点:
- 边缘定位准确、运算速度快;
- 单纯的边缘检测不能保证边缘的连续性和封闭性;
- 边缘检测方法在高细节区存在大量的碎边缘,难以形成一个大区域,但有不宜将高细节区分为小碎片;
1.4 神经网络与深度学习
神经网络的几次浪潮:
- 第一波浪潮:称为控制论,主要从线性模型出发,输出和输入是简单的线性关系;线性模型无法学习异或函数;
- 第二波浪潮:伴随一个被称为联结主义或并行分布处理潮流;联结主义中心思想:当网络将大量简单的计算单元连接在一起时,可以实现智能行为;在这期间,机器学习的其他领域取得很大进步,包括:核方法和图模型在很多重要任务上实现很好的效果;
- 第三波浪潮:Geoffrey Hinton表明,名为深度信念网络的神经网络可以使用一种称为贪婪逐层预训练的策略来有效地训练;第三波浪潮开始着眼于新的无监督学习技术和深度模型在小数据集的泛化能力;
1.5 深度学习与传统学习
典型的模式识别包括:数据预处理、特征提取、特征转换和预测识别;
- 数据预处理:包括去除噪声,文本分类中去除停用词等;
- 特征提取:从原始数据中提取一些有效的特征;如:图像分类中,提取边缘、尺度不变特征变换(Scale Invariant Feature Transform,SIFT)等;
- 特征转换:对特征进行一定的加工,如:降维或升维;降维包括:特征抽取(feature extrraction)和特征选择(feature selection);常用的特征转换方法:主成分分析(Principal Components Analysis,PCA)、线性判别分析(Linear Discriminant Analysis,LDA)等;
- 预测识别:学习一个函数进行预测;
- 浅层学习不涉及特征学习,其特征主要靠人工经验或特征转换方法来抽取;
- 深度学习中,一般将特征提取和预测识别结合在一个模型中,将特征提取用多层特征学习或表示学习替代;
- 要提高表示能力,关键是构建具有一定深度的多层次特征表示;一个深层结构的优点:可以增加特征的重用性,从而指数级地增加表示能力;
1.6 计算机视觉在自动驾驶中的应用
- 使用双目视觉系统获取场景中的深度信息。无人驾驶中可借助双目视觉系统帮助探索可行行驶区域和目标障碍物;
- 对点云数据的检测。利用机器视觉技术,可从点云数据中得到物体的种类、位置等信息;
- 运动估计。通过一段视频来估计每一个像素的运动方向和运动速度,可在自动驾驶中帮助估计车身的运动;
- 对物体的检测、识别与追踪。通过深度学习的方法,可以检测在行驶途中遇到的物体,如:行人、地上的标志、交通信号灯及旁边的车辆等;
- 场景分割。主要包括:道路线检测;在道路线检测下把场景每一个像素加上标签;
- 同步地图构建和自身定位。同步地图构建和自身定位即SLAM(Simultaneous Localization and Mapping)技术;