本系列博客包括6个专栏,分别为:《自动驾驶技术概览》、《自动驾驶汽车平台技术基础》、《自动驾驶汽车定位技术》、《自动驾驶汽车环境感知》、《自动驾驶汽车决策与控制》、《自动驾驶系统设计及应用》,笔者不是自动驾驶领域的专家,只是一个在探索自动驾驶路上的小白,此系列丛书尚未阅读完,也是边阅读边总结边思考,欢迎各位小伙伴,各位大牛们在评论区给出建议,帮笔者这个小白挑出错误,谢谢!
此专栏是关于《自动驾驶汽车环境感知》书籍的笔记
1.障碍物检测
1.1 环境感知与识别概述
- 环境感知对象主要包括:行驶路径、周边物体、驾驶状态、驾驶环境;
- 行驶路径包括:结构化道路和非结构化道路;
- 结构化道路包括:车道线、道路边缘、道路隔离物、恶劣路况的识别;
- 非结构化道路包括:可行驶路径的确认和前方路面环境的识别;
- 周边物体包括:车辆、行人、地面上可能影响车辆通过性、安全性的其他各种移动或静止障碍物的识别及各种交通标志的识别;
- 环境感知与识别传感器系统通常采用摄像头、激光雷达、毫米波雷达等多种传感器来感知环境;
- 摄像头和激光雷达:可用于进行车道线检测;
- 摄像头可完成对红绿灯的识别;
- 摄像头可通过深度学习把障碍物进行细致分类,激光雷达能把障碍物分大类,激光雷达能完成对物体距离的准确定位;
- 毫米波雷达完成障碍物运动速度、方位等识别;
1.2 障碍物检测之基于图像检测
障碍物检测技术包括:
- 基于图像的障碍物检测;
- 基于激光雷达的障碍物检测;
- 基于视觉和激光雷达融合的障碍物检测;
基于图像的障碍物检测算法大致分为:一阶段检测算法和二阶段检测算法;
一阶段检测算法:YOLO和SSD;
二阶段检测算法:RCNN;
1.2.1 基于二维图像的障碍物检测
-
YOLO系列障碍物检测
YOLO(You Only Look Once)是将物体检测作为回归问题求解的一种一阶段检测算法;
YOLO基于一个单独的端到端网络,完成从原始图像的输入到物体位置和类别的输出;
YOLO与RCNN、Fast RCNN、Faster RCNN区别:- YOLO训练和检测均是在一个单独网络进行,没有显式求取区域候选框的过程;RCNN/Fast RCNN采用分离的模块(独立于网络之外的选择性搜索方法)求取候选框(可能包含物体的矩形区域),训练过程分为多个模块进行;Faster RCNN使用RPN(Region Proposal Network)卷积网络替代RCNN/Fast RCNN的选择性搜索模块,将RPN集成到Fast RCNN检测网络中,得到一个统一的检测网络;
- YOLO输入图像经过一个推理,得到图像中所有物体的位置和其所属类别及相应的置信概率;RCNN/Fast RCNN/Faster RCNN将检测结果分为两部分求解:物体类别(分类问题)和物体位置(标注框(bounding box));
YOLO系列障碍物检测核心思想:
-
网络定义
- YOLO检测网络包括:24个卷积层和2个全连接层;
- 卷积层:用来提取图像特征;
- 全连接层:用来预测图像位置和类别概率;
-
输出表达(representation)定义
- YOLO将输入图像分成S×S个格子,每个格子负责检测"落入"该格子的物体;
- 若某个物体的中心位置的坐标落入到某个格子,那么这个格子负责检测出这个物体;
- 每个格子输出B个标注框信息,及C个物体属于某种类别的概率信息;
- 标注框信息包含5个数据值:
x
、
y
、
w
、
h
、
c
o
n
f
i
d
e
n
c
e
x、y、w、h、confidence
x、y、w、h、confidence;
- x 、 y x、y x、y:表示当前格子预测得到的物体的标注框的中心位置的坐标;
- w 、 h w、h w、h:表示标注框的宽度和高度;实际训练过程中, w 、 h w、h w、h的值使用图像的宽度和高度进行归一化到 [ 0 , 1 ] [0,1] [0,1]区间内; x 、 y x、y x、y是标注框中心位置相对于当前格子位置的偏移值,并归一化到 [ 0 , 1 ] [0,1] [0,1];
-
c
o
n
f
i
d
e
n
c
e
confidence
confidence:反映当前标注框是否包含物体及物体位置的准确性,计算方式:
c
o
n
f
i
d
e
n
c
e
=
P
(
o
b
j
e
c
t
)
confidence=P(object)
confidence=P(object)
若标注框包含物体,则 P ( o b j e c t ) = 1 P(object)=1 P(object)=1,否则 P ( o b j e c t ) = 0 P(object)=0 P(object)=0;
- YOLO网络的全连接层输出维度S×S×(B×5+C);
- IOU(Intersection Over Union)为预测标注框与物体真实区域的交集面积(以像素为单位,用真实区域的像素面积归一化到[0,1]区间);
- 由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率;
- 每个格子可以预测B个标注框,但最终只选择IOU最高的标注框作为物体检测输出,即每个格子最多只预测出一个物体;当物体占画面比例较小,每个格子包含多个物体,但只能检测出其中一个;
-
损失(loss)函数定义
YOLO使用均方和误差作为loss函数来优化模型参数,即网络输出的S×S×(B×5+C)维向量与真实图像的对应S×S×(B×5+C)维向量的均方和误差;
l o s s = ∑ i = 0 s 2 c o o r d E r r o r + i o u E r r o r + c l a s s E r r o r loss=\sum^{s^2}_{i=0}coordError+iouError+classError loss=i=0∑s2coordError+iouError+classError
其中:
c o o r d E r r o r coordError coordError:预测数据与标定数据之间的坐标误差;
i o u E r r o r iouError iouError:IOU误差;
c l a s s E r r o r classError classError:分类误差;YOLO对loss的计算进行了修正:
- 位置相关误差(坐标、IOU)与分类误差对网络loss的贡献值不同,YOLO在计算loss时,使用 λ c o o r d = 5 \lambda_{coord}=5 λcoord=5修正 c o o r d E r r o r coordError coordError;
- 计算IOU误差时,包含物体的格子与不包含物体的格子,二者的IOU误差对网络loss的贡献值不同;YOLO使用 λ n o o b j = 0.5 \lambda_{noobj}=0.5 λnoobj=0.5修正 i o u E r r o r iouError iouError;
- 对于相等的误差值,大物体误差对检测的影响应小于小物体误差对检测的影响;YOLO将物体大小的信息项 ( w 和 h ) (w和h) (w和h)进行求平方根来改进这个问题;
-
SSD障碍物检测
SSD(Single Shot Multibox Detector)是一种单一阶段检测算法,只需要用到图像一次,无须先产生候选框再进行分类和回归,直接在图像中不同位置进行边界框的采样,使用卷积层进行特征提取后直接进行分类和回归;SSD检测的主要设计理念:
-
使用不同尺度下的特征图进行检测
SSD通过提取不同尺度下的特征图来做检测,SSD使用了6种不同尺寸的特征图来进行检测;在卷积神经网络中,较低层级的特征图尺寸较大,在这种特征图上的候选框在原图上覆盖范围较小;较高层级的特征图的尺寸较小,候选框在原图上的覆盖范围大;如下图2所示。 -
采用卷积层做检测
SSD直接采用卷积对不同特征图进行特征提取;如图1所示,对于尺寸为 m × n m\times{n} m×n,维数为 p p p的特征图,SSD使用 3 × 3 × p 3×3×p 3×3×p的卷积核来进行卷积;输出:一种为用于分类的置信度分数;一种是用于回归的位移量; -
采用不同尺度和纵横比的候选框
SSD在每个单元格设置不同尺度和纵横比的默认框,对于一个尺寸为 m × n m\times{n} m×n的特征图,假定每个单元格有 k k k个默认框,则该特征图有 m × n × k m\times{n}\times{k} m×n×k个默认框;如图2,每个单元格设定有4种不同尺寸的默认框,则该图网络有 38 × 38 × 4 + 19 × 19 × 6 + 10 × 10 × 6 + 5 × 5 × 6 + 5 × 5 × 6 + 3 × 3 × 4 + 1 × 1 × 4 = 8732 38\times{38}\times{4}+19\times{19}\times{6}+10\times{10}\times{6}+5\times{5}\times{6}+5\times{5}\times{6}+3\times{3}\times{4}+1\times{1}\times{4}=8732 38×38×4+19×19×6+10×10×6+5×5×6+5×5×6+3×3×4+1×1×4=8732个默认框;对于每个默认框,SSD的预测值:分类的置信度和边界框的回归值。
1. 分类:SSD把背景单独作为一类,在VOC数据集上,SSD的每个默认框会输出21类置信度,其中20类为VOC的目标种类;
2. 边界框的回归值:预测真实边界框 g g g相对于默认框 d d d的中心 ( c x , c y ) (cx,cy) (cx,cy)和宽 ( w ) (w) (w)、高 ( h ) (h) (h)的转换量,预测值的真实值的计算方式: g ^ c x = ( g c x − d c x ) / d w , g ^ c y = ( g c y − d c y ) / d h \hat{g}^{cx}=(g^{cx}-d^{cx})/d^w,\hat{g}^{cy}=(g^{cy}-d^{cy})/d^h g^cx=(gcx−dcx)/dw,g^cy=(gcy−dcy)/dh g ^ w = log ( g w d w ) , g ^ h = log ( g h d h ) \hat{g}^w=\log(\frac{g^w}{d^w}),\hat{g}^h=\log(\frac{g^h}{d^h}) g^w=log(dwgw),g^h=log(dhgh)
假定数据集有 c c c种目标,则每个默认框需要预测 c + 1 c+1 c+1个类别概率和 4 4 4个坐标相关的转换量; -
损失函数定义
SSD的损失函数由位置误差(localization loss,loc)和置信度误差(confidence loss,conf)组成;令 x i j p = { 1 , 0 } x^p_{ij}=\{1,0\} xijp={1,0}表示第 i i i个默认框是否与第 j j j个真实框匹配, N N N为匹配的默认框总数, c c c为类别置信度预测值, g g g为真实边界框, l l l为预测框,总的损失函数为: L ( x , c , l , g ) = 1 N ( L c o n f ( x , c ) + α L l o c ( x , l , g ) ) L(x,c,l,g)=\frac{1}{N}(L_{conf}(x,c)+\alpha{L_{loc}(x,l,g)}) L(x,c,l,g)=N1(Lconf(x,c)+αLloc(x,l,g))
位置误差 L l o c L_{loc} Lloc,采用Smooth L1 loss(平滑的L1损失): L l o c ( x , l , g ) = ∑ i ∈ P o s N ∑ m ∈ ( c x , c y , w , h ) x i j k s m o o t h L 1 ( l i m − g ^ j m ) L_{loc}(x,l,g)=\sum^N_{i\in{Pos} }\sum_{m\in{(cx,cy,w,h)}}x^k_{ij}smooth_{L1}(l^m_i-\hat{g}^m_j) Lloc(x,l,g)=i∈Pos∑Nm∈(cx,cy,w,h)∑xijksmoothL1(lim−g^jm)
置信度误差 L c o n f L_{conf} Lconf,采用softmax loss: L c o n f ( x , c ) = − ∑ i ∈ P o s N x i j p log ( c ^ i p ) − ∑ i ∈ N e g log ( c ^ i p ) L_{conf}(x,c)=-\sum^N_{i\in{Pos}}x^p_{ij}\log(\hat{c}^p_i)-\sum_{i\in{Neg}}\log(\hat{c}^p_i) Lconf(x,c)=−i∈Pos∑Nxijplog(c^ip)−i∈Neg∑log(c^ip) c ^ i p = exp ( c i p ) ∑ p exp ( c i p ) \hat{c}^p_i=\frac{\exp(c^p_i)}{\sum_p\exp(c^p_i)} c^ip=∑pexp(cip)exp(cip)
总误差函数的权重系数 α \alpha α通过交叉验证设置。
-
-
Faster RCNN障碍物检测
介绍:Faster RCNN由Ross B. Girshick等人在2016年提出,是一种二阶段检测算法;Faster RCNN将体征提取模块、候选框生成模块、边框回归和目标分类模块整合到一个网络,综合性能大大提高。
- 特征提取模块
Faster RCNN特征提取网络使用VGG16,是一个通过反复堆叠3×3卷积和2×2最大值池化的16层网络;输入图像大小是3×224×224,输出特征是51×39×256; - 候选框生成模块(RPN)
Faster RCNN使用Region Proposal Networks(RPN)生成检测框; - 边框回归和目标分类模块
通过RPN得到候选框后,使用ROI pooling将每个候选框对应的特征转换成7×7的大小;将每个候选框的特征输入到边框回归和目标分类模块,得到每个候选框的类别,类别数 n + 1 n+1 n+1, n n n是障碍物类别,1是背景;
在Faster RCNN中的两个损失:分类损失和标注框回归损失;
分类损失:简单的交叉熵;
标注框回归损失:平滑的L1损失;
s m o o t h L 1 ( x ) = { 0.5 x 2 × 1 / σ 2 ∣ x ∣ < ( 1 / σ 2 ) ∣ x ∣ − 0.5 其 他 smooth_{L1}(x)= \begin{cases} 0.5x^2\times{1/\sigma^2}&|x|<(1/\sigma^2) \\ |x|-0.5& 其他 \end{cases} smoothL1(x)={0.5x2×1/σ2∣x∣−0.5∣x∣<(1/σ2)其他
- 特征提取模块