AutoWare Core Perception模块学习笔记(二):vision_ssd_detect

继上节对image_processor部分代码进行解析,本节将针对自动驾驶感知中图像目标检测问题,介绍如何在Autoware Core Perception中使用SSD模型进行目标检测,主要内容包括SSD模型原理简介vision_ssd_detect代码解读。

SSD 模型原理简介

SSD (Single Shot MultiBox Detector)算法[1],是一种单阶段(one-stage),且能够较好地兼顾检测精度与检测速度的目标检测模型,其结构图如下图1所示:

图1 SSD 模型结构图

首先采用VGG16做基础特征提取模型(backbone),并将VGG16的全连接层fc6和fc7转换成3×3卷积层Conv6和1×1卷积层Conv7,同时将池化层pool5由原来的stride=2的2×2变成stride=1的3×3大小。然后,移除dropout层和fc8层,并新增一系列卷积层,在检测数据集上做微调。此外,提取VGG16中的Conv4_3层以及后面新增的卷积层Conv7,Conv8_2,Conv9_2,Conv10_2,Conv11_2 共6个特征图,其大小分别(38,38),(19,19),(10,10),(5,5),(3,3),(1,1),并根据不同特征图设置的先验框数量进一步融合跨层的特征信息,以便缓解高层语义特征信息丢失及小目标检测无力等问题。

在检测算法方面,SSD模型进一步设计了一系列创新的方法,如先验框的设计,目标匹配策略、目标损失函数的选择等。

先验框设计:随着特征图大小降低,先验框的大小呈线性增加。如下式,其中

   其中sk表示先验框大小相对于图片的比例,smin和 smax分别表示比例的最小值和最大值,在论文中分别去0.2和0.9。对于第一个特征图,其先验框的尺度比例一般设置为smin/2=0.1,那么尺度为300×0.1=30 。而对于后面的特征图,先验框尺度按照上面公式线性增加,但是先将尺度比例先扩大100倍,此时增长步长为[(smax×100)-(smin×100)]/(m-1)=17,这样各个特征图的sk为20、37、54、71、88,将这些比例除以100,然后再乘以图片大小,可以得到各个特征图的尺度为60、111、162、213、264。

对于先验框的长宽比,选取{1, 2, 3, 1/2, 1/3}。根据特定的长宽比,按公式

  计算先验框的宽度和高度,这里的sk均代表先验框的实际尺寸。值得注意的是,原论文中模型实现时对于Conv4_3、Conv10_2和Conv11_2都仅适用4个先验框。由于每个先验框都会用于预测一个边界框,所以对于SSD300(以300×300图像大小为输入)一共可以预测38×38×4+19×19×6+10×10×6+5×5×6+3×3×4+1×1×4=8732个边界框。

目标匹配策略:在训练过程中,首先需要确定图片中目标ground truth与哪个先验框匹配。SSD算法中提出新颖的目标匹配策略,主要分为两个步骤:

(1) 对于图片中每个目标ground truth,找到与其IOU最大的先验框进行匹配。如此,能够保证每个ground truth 一定有相匹配的先验框。通常,与ground truth相匹配的先验框称为正样本。若一个先验框没有与任何ground truth匹配,那么称其为负样本。

(2) 为了缓解目标匹配过程中正负样本严重失衡问题,当某个ground truth的 IOU 大于某个阈值时 (一般是0.5),SSD令未匹配的先验框与该ground truth匹配,这意味着某个ground truth可能会与多个先验框匹配;但是,反之则不行,即一个先验框只能匹配一个ground truth。如果多个ground truth与某个先验框IOU大于阈值,那么先验框只会与IOU最大的那个ground truth匹配。

目标损失函数:基于MultiBox[2]的目标函数,SSD模型中将其扩展为多目标检测问题。总体的目标损失函数如下: 其中N表示所匹配的先验框总数,Lconf和Lloc分别代表目标置信度和定位损失。

置信度损失Lconf是多类别Softmax函数,具体如下所示:c代表类别置信度。

定位损失Lloc是预测框(l)和ground truth(g)之间的Smooth L1损失,具体如下所示:(cx, cy, w, h) 分别表示先验框的中心点坐标及宽高值。

除了模型结构和检测算法创新外,SSD模型在训练阶段还采用多种数据扩增策略,包括水平翻转、随机裁剪、颜色扭曲等;并在测试阶段通过非极大值抑制方法(NMS)进一步缓解样本不均衡问题。最后,在VOC2007、VOC2012和COCO数据集上,SSD都能取得非常先进的检测性能,特别是对小目标的检测表现相较于其他单阶段检测器(one-stage detector)有很大的提升。有关模型更多的细节可以参见原论文。

vision_ssd_detect 代码解读

在Autoware平台的Core Perception模块中实现了如何利用SSD模型进行图片目标检测的示例,下面将对该部分的代码及所需的环境配置进行详细介绍和解读。首先进入src/autoware/core_perception/vision_ssd_detect/launch/vision_ssd_detect.launch文件,可以看到这部分主要包含vision_ssd_detectvisualize_rects两个节点,如下图2所示:

图2 vision_ssd_detect.launch文件信息

这里还需注意的是在argument list中定义了网络配置文件(network_definition_file)和预训练模型文件(pretrained_model_file)地址,可以根据实际需要进行自定义。

SSD Caffe环境配置

在开始代码解读前,首先需要配置SSD Caffe环境。Caffe[3]是一个开源的深度学习框架,专注于计算机视觉的应用研究。配置SSD Caffe环境主要包括以下几个步骤:

(1) 进入Caffe官网,进行ubuntu系统的Caffe预编译过程。值得注意的是,ubuntu系统对Caffe框架支持较好,对CPU和GPU两个版本的Caffe都有很好的兼容性。

(2) 将SSD Caffe项目克隆到本地,并根据项目要求进行预编译。

% git clone -b ssd https://github.com/weiliu89/caffe.git ssdcaffe
% cd ssdcaffe
% git checkout 4817bf8b4200b35ada8ed0dc378dceaf38c539e4

(3) 编译Caffe

make && make distribute

(4) (可选) 从SSD Caffe项目中下载预训练模型(https://github.com/weiliu89/caffe/tree/ssd),或也可以选择自己训练好的模型。

(5) 一旦编译完成,在终端(terminal)中运行

% roslaunch vision_ssd_detect vision_ssd_detect network_definition_file:=/PATH/TO/deploy.prototxt pretrained_model_file:=/PATH/TO/model.caffemodel

特别注意的是,需要将这里network_definition_file和pretrained_model_file与src/autoware/core_perception/vision_ssd_detect/launch/vision_ssd_detect.launch中相应的地址保持一致。这样,就可以完成SSD Caffe的环境配置,以便在Autoware Core Perception模块中使用。

vision_ssd_detect节点

src/autoware/core_perception/vision_ssd_detect/src/vison_ssd_detect_node.cpp中定义了SSD检测算法的主要操作细节。首先,找到main()函数入口,其中对SSD算法参数进行初始化,调用类方法ROSSSDApp(),并执行run(),如下图3所示:

图3 vision_ssd_detect_node.cpp中main()函数参数信息

类方法ROSSSDApp()

在类ROSSSDApp方法中,首先申明了一些ROS接收节点、命名空间节点以及opencv中图像像素参数,如下图4所示,并定义置信度得分阈值、GPU id号、是否使用GPU、目标类别等参数。

图4 类方法ROSSSDApp()的参数信息

convert_to_detected_object()方法

在类方法ROSSSDApp()中声明了convert_to_detected_object()方法,如下图5所示,该方法主要对检测结果进行转换和信息发布:当目标置信度得分大于相应阈值时,获取目标类别标签、目标置信度得分、目标颜色通道值、预测矩形框的坐标值等信息,并利用src/autoware/core_perception/vision_ssd_detect/include/rect_class_score.hGetClassString函数所定义的类别标签的序号关系获取对应的类别,并通过autoware_msgsout_message发布检测结果。

图5 convert_rect_to_detected_object()方法参数信息

image_callbacck()方法

image_callback()方法中,定义了输入图片的预处理操作,如下图6所示,其功能包括转换图片格式、调用SSD算法进行目标检测、发布检测结果等。

 图6 image_callback()方法参数信息

Run()方法

首先,申明了public方法以便外部函数也能够访问Run()指针中的操作。如下图7所示,通过ROS构造函数声明节点的命名空间,方便后续信息的接收和发布。进而分别定义标准字符变量,用于接收输入图片、网络配置文件和预训练模型文件等。

图7 Run()方法变量声明信息

随后,针对各节点名的判断结果,接收对应的参数值并存储于ROS相应的节点下,如下图8所示,并将网络配置文件、预训练模型文件、像素均值等参数赋予头文件中事先定义好的SSDDetector类方法,以初始化模型。

图8 Run()方法节点名参数信息

最后,利用advertise()subscriber()实现信息的发布和接收。其中,advertise方法能够回调一个publisher对象,并通过对象的publish()函数发布信息。

图9 Run()方法节点信息收发参数

visualize_rects节点

src/autoware/core_perception/visualization/detected_objects_visualizer/src/visualize_rects_main.cpp是visualize_rects节点的主函数入口。如下图10所示,main()主函数下同样包含参数初始化调用类方法VisualizeRects以及spin()节点等操作。

图10 visualize_rects_main.cpp中main()函数参数信息

类方法VisualizeRects()

src/autoware/core_perception/visualization/detected_objects_visualizer/include/visualize_rects.h下定义类方法VisualizeRects。如下图11所示,除了常规地声明ROS命名空间和信息收发节点、标准变量等操作外,这里进一步定义SyncedDetectionCallback()方法IsObjectValid()方法以及ObjectsToRects()方法

图11 类方法VisualizeRects()参数信息

SyncedDetectionCallback()方法

src/autoware/core_perception/visualization/detected_objects_visualizer/src/visualize_rects.cpp中对SyncedDetectionCall()方法进行具体化。如下图12所示,该方法主要是利用ObjectToRects()方法,在图片上画出目标的区域并将检测的结果(目标坐标位置、类别信息等)发布。

图12 SyncedDetectionCallback()方法参数信息

ObjectToRects()方法

同样,在src/autoware/core_perception/visualization/detected_objects_visualizer/src/visualize_rects.cpp中对ObjectToRects()方法进行具体化。如下图13所示,首先对图片进行复制,以便后续绘制目标矩形框。接着利用IsObjectValid()方法判断目标的有效性,并进行一以下操作:确定矩形框的中心坐标、宽度、高度、目标类别标签等信息,并设置所要添加的文字字体、尺寸等参数。最后,在先前复制的图片上绘制目标矩形框,并添加必要的信息。

图13 ObjectToReccts()方法参数信息

IsObjectValid()方法

最后,在src/autoware/core_perception/visualization/detected_objects_visualizer/src/visualize_rects.cpp中通过IsObjectValid()方法简单判断目标是否有效,即通过目标尺寸的正负形来确定,如下图14所示。 

图14 IsObjectValid()方法参数信息

结束语

总的来说,本节内容主要是SSD算法在Autoware Core Perception模块中的应用。在简单了解SSD算法的核心原理后,配置SSD Caffe环境,并下载相应的网络配置文件和预训练模型。随后,在Core Perception模块的vision_ssd_detect中,主要是通过vision_ssd_detect节点和visualize_rects节点来实现模型调用、目标检测及矩形框绘制。最后,通过ROS收发节点实现信息互传和方法执行。

参考文献

[1] Liu, W., Anguelov, D., Erhan, D., et al. SSD: Single Shot MultiBox Detector[C]. European Conference on Computer Vision, 2016.

[2] Erhan,D., Szegedy, C., Toshev, A., Angueov, D. Scalable Object Detection Using Deep Neural Networks[C]. IEEE Computer Vision and Pattern Recognition, 2014

[3] http://caffe.berkeleyvision.org/install_apt.html

发布了35 篇原创文章 · 获赞 34 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/linchunmian/article/details/105434589