AutoWare Core Perception模块学习笔记(三):vision_darknet_detect

本节将继续介绍如何在Autoware Core Perception中使用YOLO系列模型进行目标检测,主要内容包括YOLO系列模型原理简介和vision_darknet_detect代码解读。

YOLO系列模型原理简介

YOLO(You Only Look Once)算法[1-3],是一种单阶段(one-stage)、速度快的目标检测模型,其核心思想是将目标检测问题视为一个回归问题处理:以整张图作为网络的输入,直接在输出层回归目标bounding box位置及所属类别。该系列模型共有三个版本(YOLOv1、YOLOv2和YOLOv3),在保持其检测速度快的优点同时,进一步完善模型检测精度方面的不足。

YOLOv1

YOLOv1[1]是该系列模型的开山之作,也是首次应用卷积神经网络将目标检测作为一个回归问题来处理。模型结构图如下图1所示:

图1 YOLOv1模型结构图

网络整体上借鉴了GoogleNet[4]分类网络结构,不同的是在卷积层(Conv.Layer)使用1×1卷积和3×3卷积代替GoogleNet中Inception模块。整个检测网络共有24个卷积层和2个全连接层,其中卷积层用于提取图像特征,全连接层用来预测目标位置及类别概率值。此外,用于卷积层后的最大池化层(Maxpool Layer)的主要作用是学习图像最显著的特征区域,减少冗余特征信息并降低网络的计算量。YOLOv1的检测流程如下:

1. 将输入缩放到固定尺寸(如448×448),并划分为S×S个网格(grid),这里采用7×7大小,而每个网格负责预测中心点落在该grid中的目标。

2. 每个网格为目标预测B个bounding box(这里是2个),其中每个bounding box预测5个值,分别是中心坐标x、y,宽高w、h以及bounding box的置信度confidence(即bounding box与对应目标的ground truth之间的IoU值)。

3. 每个网格还需要预测c个类别概率值(取决于所使用的的数据集,这里使用voc数据集的话c=20,不包括背景类),表示在该网格中目标object属于各个类别的概率。因此,每个网格将预测B×5+c个值(这里是2×5+20=30),这些值将被映射为一个多维向量。

4. 最后YOLOv1将采用非极大值抑制算法(NMS)来对检测结果进行后处理,筛选出最大可能的目标bounding box。NMS算法的大致流程如下:

    (1) 设置一个类别分数(score)阈值,一个IoU阈值;

    (2) 对于每个类别的目标,遍历所有的候选结果,并过滤低于score阈值的候选框;

    (3) 将剩下候选框中最大score对应的候选框取出并添加到输出列表。计算其他候选框与其的IoU。若IoU大于IoU阈值,则将该候选框过滤掉(重叠度高),否则将其加入到输出列表;

    (4) 重复(2)中的步骤,最后输出列表中的候选框即为该类别所预测的bounding box。

此外,YOLOv1中的损失函数包含三个部分:坐标预测损失、置信度预测损失及类别预测损失。如下图2所示:

图2 YOLOv1损失函数

首先,对于坐标预测损失,考虑到不同大小的bounding box对预测偏差的敏感度不同,即小的bounding box对预测偏差敏感度更大。为了均衡不同尺寸bounding box对偏差敏感度差异,对w和h取开方值再求L2损失。当采用voc数据集时,这里取参数coord=5。

其次,对于置信度预测损失,分别考虑含目标(obj)和不含目标(noobj)的情况。某个bounding box的置信度(confidence)定义为:confidence值=该bounding box存在目标的概率p(object) * 该bounding box与该目标ground truth的IoU值。当该bounding box存在目标时p(object)=1,否则p(object)=0。对于一张图片而言,大部分区域是不存在目标的,相应的bounding box的置信度为0,这些boudning box对于梯度更新的贡献更大,将导致网络训练不稳定。为了平衡该问题,这里对不含目标(noobj)的bounding box置信度赋予较小的权重,即采用voc数据集训练时取参数noobj=0.5。

最后,对于类别预测损失,只考虑存在目标的情况,即当bounding box目标置信度不为0时才计算目标的类别预测损失。因此,这里需要先判断是否有object中心落在网格中,若存在则该网格就负责预测并计算object的类别概率损失。

总的来说,作为一个单阶段目标检测器,YOLOv1没有复杂的检测流程,只需要将图片输入到模型就可以回归得到检测结果,因而具有非常快的检测速度,但在目标定位准确度方面相对有限。后续推出的版本则主要是对检测性能方面做进一步的改进。

YOLOv2

YOLOv2[2]是在YOLOv1的基础上,进一步提出的快速而准确的目标检测算法。相比于YOLOv1,YOLOv2提出如下几种改进策略以提升目标定位准确性及召回率:

DarkNet-19 特征提取网络

YOLOv2采用新的特征提取网络DarkNet-19,其网络结构如下图所示,包括19层卷积层和5个max pooling层。卷积层主要采用3×3卷积和1×1卷积,其中1×1卷积用于压缩特征图通道数以降低模型计算量和参数量。每层卷积后使用Batch Normalization(BN)操作,去掉YOLOv1中的dropout层。BN层的引入可以起到正则化的效果,在提升模型收敛速度的同时,防止模型过拟合,改善最后的检测精度。最后模型采用全局平均池化(global average pooling)代替原先的全连接层,以输出预测结果。

图3 YOLOv2特征提取网络DarkNet-19结构参数图

高分辨率的分类器(high resolution classifier)

相比于YOLOv1,YOLOv2将输入图片的分辨率提升至448×448,具体做法为:YOLOv2首先在ImageNet数据集上以448×448输入大小对网络进行微调10轮,让网络适应高分辨率输入。高分辨率的输入能够改善检测器的性能,最后YOLOv2的mAP提升了约4%。

维度聚类(dimension clusters)

YOLOv1中直接在特征图上回归目标的位置和类别信息,不依赖任何的先验知识,这也是导致其检测性能不佳的主要原因。YOLOv2中采用k-means算法对训练集数据中的目标边界框做聚类分析,并选用boxes之间的IoU值作为聚类指标,综合考虑模型复杂度和检测召回率,最终选择5个聚类中心,确定5种不同尺寸的先验框(anchor box),用以辅助目标检测过程。

使用anchor box做预测

YOLOv1中利用全连接层直接对边界框进行预测,这会导致大量空间信息丢失,目标定位不准确。YOLOv2中去掉了全连接层结构,并引入先验框(anchor box)来预测目标边框,同时还去掉一个最大池化层(max pooling)以获得更高分辨率的特征图。具体来说,采用416×416的输入,模型下采样(最大池化)的总步长为32,最后的得到13×13的特征图。然后对13×13大小特征图中的每个网格预测5个anchor box,并对每个anchor box预测目标边界框位置信息、置信度及类别概率值。如此,YOLOv2可以预测13×13×5=845个边界框,在保持mAP基本不变的情况下,召回率显著提升了7%。

直接预测坐标(direct location prediction)

YOLOv2沿用YOLOv1的方法,根据所在网格单元的位置来预测坐标,使得ground truth的值介于0到1之间。网络进一步将得到的预测结果再输入到sigmoid函数中,让输出结果介于0到1之间。记一个网格相对于图片左上角的偏移量为cx和cy,anchor box的宽度和高度为pw和ph,则预测的边界框相对于特征图的中心坐标(bx, by)和宽高(bw, bh)的计算公式如下图4所示:

图4 坐标预测计算示意图

总的来说,YOLOv2结合维度聚类所产生的anchor box,并用于边界框预测和坐标约束计算,使得模型更容易稳定性训练,这种方式将mAP提升了约5%。

细粒度特征(fine-grained feature)

YOLOv2借鉴SSD使用多尺度特征图做检测的思路,提出跳跃(pass through)层将高、低分辨率的特征图结合起来,从而实现多尺度的目标检测。具体做法如下:提取DarkNet-19最后一层max pooling的输入得到26×26×512大小的特征图,再经过1×1×64卷积获得26×26×512大小的特征图。然后经过pass through层处理得到13×13×256大小的特征图(pass through层抽取原特征图每个2×2局部区域组成新的channel,因此原特征图大小降低4倍,而通道数增加4倍。),再与13×13×2014大小的特征图连接得到13×13×1280大小的特征图。最后在这些特征图上做预测。融合了细粒度特征进行目标检测,YOLOv2的性能提升了1%。

多尺度训练(multi-scale training)

由于YOLOv2中使用的DarkNet-19网络结构中只有卷积层和池化层,因此模型对输入的大小是没有限制的。YOLOv2采用多尺度输入的方式训练模型,在性训练过程中每隔10 batches,重新随机选择输入的尺寸。由于DarkNet-19下采样的总步长为32,因此输入尺寸一般选择32的倍数(如320, 352, 384, ......, 608)。采用multi-scale training,模型能够适应不同大小的输入:当采用相对低分辨率输入时,mAP值略有下降但检测速度更快;当采用相对高分辨率输入时,能够得到较高的mAP值但检测速度将有所下降。

总的来说,YOLOv2在YOLOv1的基础上提出一系列的改进策略,在保持检测速度基本不变的同时,显著提升了模型检测性能,特别是目标的召回率。但对于一些密集重叠场景下的目标检测、小目标检测问题,YOLOv2仍无法实现理想的性能。

YOLOv3

YOLOv3[3]在YOLOv2的基础上,进一步对网络结构进行优化,主要包括如下两点:

DarkNet-53

YOLOv2中采用DarkNet-19作为特征提取网络,其中下采样(最大池化)操作将丢失目标细粒度特征,即便网络结构上通过pass through层来融合高、低分辨率特征图,但仍对目标检测的性能有很大影响,特别是对小目标检测。因此,YOLOv3重新设计并提出更强大的DarkNet-53网路,其网络结构如下图5所示:

图5 YOLOv3特征提取网络DarkNet-53结构参数图

这是一个引入残差(residdual)直连结构的特征提取网络,最左侧一列的数字代表残差单元的个数,最右侧的output代表特征图的尺寸。DarkNet-53共有53层卷积结构,每个残差单元中都包含一个1×1卷积和一个3×3卷积,且卷积通道数成倍数关系以降低网络的计算量。此外,DarkNet-53网络中不采用下采样或最大池化操作,即不损失原始输入图片的特征信息,图片的尺寸变换全部通过步长为2的卷积来实现。实验证明DarkNet-53是个兼顾准确率和效率的模型,其识别性能更优于DarkNet-19和ResNet-101模型[5],网络整体浮点数计算量也明显低于性能相近的模型,因此网络可以更快地进行推理计算。这里采用DarkNet-53作为特征提取网络,在保证检测器整体性能高效的同时,学习到更全面、多粒度的特征图信息,这对于检测性能的提升是有很大帮助的。

多尺度预测分支

YOLOv3结构上另一大重要改进是融合不同层特征并采用多尺度预测分支分别针对大、中、小目标进行检测,整体的结构示意图如下图6所示。

图6 YOLOv3多尺度预测分支结构示意图

其中Res代表残差单元的个数,ConvBA表示卷积层+BN层+激活函数的结构。YOLOv3有三个预测分支,分别是第三个残差单元后的卷积输出、第四个残差单元后的卷积输出以及最后的卷积输出,当采用416×416输入时,最后输出的特征图尺寸分别为52×52×256、26×26×512和13×13×1024,对应于大、中和小目标检测。此外,还需要注意的是YOLOv3中借鉴特征金字塔网络FPN[6]的思想将不同分辨率的特征图进行融合。例如,对于26×26×512分支(中等目标),先将DarkNet-53最后输出卷积特征(用于小目标)进行上采样,再将其与第四个残差单元的卷积特征融合用于中等目标检测分支。

除此之外,YOLOv3同样借鉴了YOLOv2中提出的一些策略,如采用k-means聚类得到9个anchor box,每个预测分支分配3种不同尺度的先验框;采用多尺度输入的训练策略;采用sigmoid函数代替softmax函数作为目标分类器等。更多细节可以参见原论文。总的来说,YOLO系列模型最大的优点是检测速度非常快,但检测精度相对不足。随着一系列创新性地网络结构和检测策略的提出,模型的检测性能也得到极大的提升。特别是YOLOv3,能够兼顾目标检测速度和精度,已经成为当前最热门且应用最广泛的单阶段检测器之一。

vision_darknet_detect代码解读

在Autoware平台的Core Perceotion模块中实现了如何利用YOLO系列模型进行图片目标检测的示例,下面将对该部分的代码及所需的环境配置进行详细介绍和解读。

YOLO Darknet环境配置

在开始解读具体代码前, 需要配置YOLO Darknet环境。如上所述,Darknet是YOLO模型提出的特征提取网络,其具体的环境配置可参考模型官网的具体教程[7]。而在Core Perception模块中对Darknet网络进行有关定义,首先进入src/autoware/core_perception/vision_darknet_detect/darknet/cfg,可以看到在配置文件部分包含了coco数据集类别标签文件(coco.names)、voc数据集类别标签文件(voc.names)、以及YOLOv2(yolov2-tiny.cfg、yolov2.cfg)和YOLOv3(yolov3-tiny.cfg、yolov3-voc.cfg、yolov3.cfg)模型配置文件。数据集类别标签文件信息如下图7所示:

图7 coco和voc数据集类别标签信息

对于YOLOv2模型,yolov2-tiny是yolov2模型的‘精简版',二者的配置文件仅在网络层数上存在差异,其他的超参数及网络配置基本一致。下面以yolov2-tiny.cfg文件为例,具体说明模型的关键参数信息,如下图8所示:

图8 yolov2-tiny.cfg配置文件参数信息

同理对于YOLOv3模型,yolov3-tiny是yolov3模型的‘精简版',二者的配置文件仅在网络层数上存在差异,其他的超参数及网络配置基本一致;而yolov3-voc与yolov3之间的差异仅是训练数据集的不同,前者是在voc数据集上训练模型,而后者是默认使用coco数据集。下面以yolov3-tiny.cfg文件为例,具体说明模型的关键参数信息,如下图9所示:

图9 yolov3-tiny.cfg配置文件参数信息(相同的参数信息可参考图8)

此外,在src/autoware/core_perception/vision_darknet_detect/darknet/src中包含了网络结构各部分定义,包括激活函数层(activation_layer.c)批正则化层(batchnorm_layer.c)卷积层(convolutinal_layer.c)等等,这里不一一举例说明,可根据需要进入相应文件查看。随后进入src/autoware/core_perception/vision_darknet_detect/launch,可以看到该部分主要包含YOLOv2(vision_yolov2_detect.launch)和YOLOv3(vision_yolov3_detect.launch)两个模型文件,如下图10所示:

图10 vision_yolov2_detect.launch和vision_yolov3_detect.launch文件信息

vison_yolov3_detect.launch文件为例,其中参数列表部分包含了网络定义文件(network_definition_file)和预训练模型文件(pretrained_model_file)地址,可根据实际需要进行自定义;此外,在节点vision_darknet_detect部分还包括如得分阈值(score_threshold)、非极大值抑制阈值(nms_threshold)、gpu id等参数,而节点visualize_rects中方法定义及参数情况可参见SSD中相关的节点分析。

下面将以YOLOv3模型为例,解析节点vision_darknet_detect中关键方法及有关代码。首先进入src/autoware/core_perception/vision_darknet_detect/src,在vision_darknet_detect_node.cpp文件中找到主函数main()入口,其中包括初始化vision_darknet_detect()方法调用类方法Yolo3DetectorNode()执行Run(),如下图11所示:

图11 vision_darknet_detect_node.cpp文件中main()函数参数信息

Yolo3DetectorNode()方法

首先跳转到src/autoware/core_perception/vision_darknet_detect/src下的vision_darknet_detect.h文件,找到类方法Yolo3DetetorNode()的定义,其中依次声明了ROS中节点信息、类方法Yolo3Detector()、参数类型以及一些重要的函数指针及相关参数信息(如convert_rect_to_image_objrgbgr_image等),如下图12所示:

图12 类方法Yolo3DetectorNode()参数信息

类方法Yolo3Detector()

同样在src/autoware/core_perception/vision_darknet_detect/src/vision_darknet_detect.h中,通过关键参数private和public,对最小置信度(min_confidence)、非极大值抑制阈值(nms_threshold)、网络宽度(get_network_width)、网络高度(get_network_height)等参数进行声明,如下图13所示:

图13 类方法Yolo3Detector()参数信息

而这些参数的使用将在同目录下的vision_darknet_detect.cpp文件中具体说明。,如下图14所示:

图14 类方法Yolo3Detector()参数信息具体说明

convert_to_image_obj()方法

src/autoware/core_perception/vision_darknet_detect/src/vision_darknet_detect.cpp中具体声明了convert_to_image_obj()方法的有关操作及参数信息,如下图15所示。该方法主要是对检测结果中预测矩形框的坐标进行处理,进而根据所使用的的数据集对应类别标签,最后将检测结果发布。

 图15 convert_to_image_obj()方法参数信息

rgbgr_image()方法

src/autoware/core_perception/vision_darknet_detect/src/vision_darknet_detect.cpprgbgr_image()方法主要是对输入图片进行通道变换处理,如下图16所示:

图16 rgbgr_image()方法参数信息

convert_ipl_to_image()方法

该方法主要是当输入图片尺寸与网络输入尺寸不符时,对输入图片进行预处理以便适应网络的输入大小。如下图17所示,首先创建一个opencv类型的图像,大小为网络输入尺寸。;随后当输入图片与网络尺寸不相符时,对图片进行缩放并填充空白区域,以便适应网络输入大小且不丢失图像的真实性;最后对变换后的图像进行归一化处理。

图17 convert_ipl_to_image()方法参数信息

image_callback()方法

如下图18所示,image_callback()方法主要是用于回调图像处理函数,实现对输入图像的预处理并用于网络输入。

图18 image_callback()方法参数信息

config_cb()方法

如下图19所示,config_cb()方法用于读取网络配置文件中参数信息。

图19 config_cb()方法参数信息

read_custom_file()方法

如下图20所示,read_custom_file()方法中定义了文件路径(in_name_path)、字符串类型(str)、文件名(names)等信息,用于获取类方法处理过程中接收的文件名。

图20 read_custom_file()方法参数信息

Run()方法

同样地,在该部分首先通过ROS构造函数声明节点的命名空间,方便后续信息的接收和发布。进而分别定义标准字符变量,用于接收输入图片、网络配置文件和预训练模型文件等。如下图21所示:

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

随后,针对各节点名的判断结果,接收对应的参数值并存储于ROS相应的节点下,并利用网络配置文件、预训练模型文件、文件名、得分阈值、非极大值抑制阈值等参数初始化模型,如下图22所示。

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

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

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

结束语

总的来说,本节内容针对YOLO系列模型在Autoware Core Perception模块中的应用进行介绍,包括YOLO系列模型的算法原理,Darknet环境配置及配置文件解析,以及vison_darknet_detect代码解读。在代码解读部分,对vision_darkent_detect节点代码及重要函数方法进行分析,梳理整体的代码逻辑。

参考文献

[1] Redmon, J., Divvala, S., Girshick, R. and Farhadi, A. You Only Look Once: Unified, Real-time Object Detection[C]. Computer Vision and Pattern Recognition, 2016.

[2] Redmon, J. and Farhadi, A. YOLO9000: Better, Faster and Stronger[C]. Computer Vision and Pattern Reccogntion, 2017.

[3] Redmon, J. and Farhadi, A. YOLOv3: An Incremental Improvement[T]. arXiv PrePrint arXiv:1804.02767.

[4] Szegedy, C., Liu, W., Jia, Y. Q., et al. Going Deeper with Convolutions[C]. Computer Vision and Pattern Recognition, 2015.

[5] He, K. M., Zhang, X. Y., Ren, S. Q., et al. Deep Residual Learning for Image Recognition[C]. Computer Vision and Pattern Recognition, 2016.

[6] Lin, T-Y., Dollar, P., Girshick, R., et al. Feature Pyramid Networks for Object Detecton[C]. Computer Vision and Pattern Recognition, 2017.

[7] https://pjreddie.com/darknet/

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值