基于YOLOv3的嵌入式实时视频目标检测算法

2020-02-19 15:19:22尹彦卿龚华军王新华
计算机工程 2020年2期
关键词:嵌入式精度深度

尹彦卿,龚华军,王新华

(南京航空航天大学 自动化学院,南京 210000)

0 概述

目标检测是指从场景中区分出不同对象,定位每个对象的边界框并判别其类型的技术。如何实现精确的目标检测是计算机视觉领域一个基础性难题,引起了研究人员的广泛关注。

随着深度学习技术的发展,许多基于卷积神经网络(Convolutional Neural Network,CNN)的目标检测方法都已具备优越的检测性能。例如,特征金字塔网络(Feature Pyramid Network,FPN)算法在coco数据集上的检测精度达到59.1%,但该算法由于网络参数繁多、计算复杂,即使在Titan GPU上,其检测速度也仅能达到6 frame/s,难以实现实时目标检测[1]。

2018年,YOLOv3目标检测算法被提出,它将目标检测视作一个回归问题,通过一个神经网络同时输出目标的位置和类别,在几乎不损失识别精度的前提下,其检测速度明显提升。在Titan-X GPU上,YOLOv3-416网络的运行速度达35 frame/s,可用于实现对视频信息的实时检测[2-4]。

尽管YOLOv3在强大的GPU上具有实时检测性能,但高端GPU价格昂贵、体积巨大,通常仅能在服务器上安装,极大地限制了YOLO算法的应用场景。在智能手机、无人机、无人车等常见的嵌入式设备上,计算资源和内存都非常有限,因此,嵌入式设备上的实时目标检测仍是一大挑战。YOLOv3的研究者还提出了一种tiny-YOLOv3网络,其网络结构简单,可在嵌入式设备上进行实时检测,但其mAP值仅为33.1%,无法兼顾实时性和检测准确度[5]。

本文提出一种基于YOLOv3的嵌入式平台实时视频目标检测算法。该算法运用半精度推理策略,在几乎不损失检测精度的情况下提高检测速度,同时,利用视频目标运动自适应推理策略,降低深度网络推理的运行频率,进一步提高视频目标检测的帧率。结合上述2种策略,在NVIDIA Tegra系列嵌入式GPU平台上实现实时、准确的目标检测[6-7]。

1 YOLOv3网络的半精度推理

1.1 半精度推理的可行性分析

为了保证计算精度,目前主流算法框架的深度网络权值均使用单精度浮点数据类型进行保存。单精度浮点类型在计算机中较为常见,但其在存储时需要4 Byte的空间,且计算复杂度较高。在IEEE 754标准中定义了一种半精度浮点类型[8],其在CUDA编程环境中又称为Half类型。半精度浮点类型需要2 Byte存储空间,其优势在于GPU中的计算硬件可在一个周期内同时完成2个半精度浮点类型的运算,大幅提高计算速度。2种数据类型的比较如表1所示。

表1 单精度与半精度类型的比较

由表1可知,2种数据类型的性能差异主要体现在数值范围与精度上。在数值范围方面,根据本文在coco数据集上的测试结果,YOLOv3网络权值和激活值普遍分布在±20之内,故2种数据类型的数值范围均能满足要求。在精度方面,由于网络训练时反向传播算法需要计算权值的梯度,权值的一点微小变化都会对结果产生较大影响,因此在训练过程中,权值的精度至关重要,只能使用单精度类型储存。在本文算法的网络推理过程中,推理速度是最重要的影响因素,因此,半精度类型权值的精度损失对网络推理结果的影响程度,将直接决定能否使用半精度推理策略进行YOLO网络加速。

将待检测的目标类别数记作C,则YOLO网络对每个检测目标的输出结果为一个五元组(c,x,y,w,h)和一个长度为C的向量(P1,P2,…,PC),其中,Pi表示目标属于第i类的分类概率,c表示目标存在的概率,(x,y,w,h)表示目标的位置和大小,其含义是实际目标框相对于一个固定预设框的位置偏移和长宽比例,而不是目标框的绝对坐标。实际输出目标框相对于预设框的位置关系如图1所示。

图1 实际目标框相对于预设框的位置和大小

令每个网格距离图片左上角的像素距离分别为cx、cy,每个预设框的宽高为pw、ph,σ函数表示将范围在0~1的输入线性映射到网格的实际长宽范围,则物体实际在图像中的位置和大小如下:

σ(x)=32x

bx=σ(x)+cx

by=σ(y)+cy

bw=pwew

bh=pheh

本文在coco数据集上分别进行单精度和半精度推理实验。根据实验结果的统计数据,对于YOLO网络最终输出的激活值,使用半精度类型运算与单精度类型运算的误差在±0.001以内。下面将逐一分析该误差对网络输出变量的影响:

1)目标存在概率c。本文算法以0.5为阈值判断是否存在目标,将低于0.5的值判定为背景。c的取值范围为0~1,因而在绝大多数情况下,该误差不足以影响c相对于阈值的关系,其对判定结果基本没有影响。

2)目标分类概率Pi。算法通过argmax函数选取其中最大值的下标i作为目标分类的结果。Pi的分布范围为0~1,而正确的目标分布概率普遍在0.9以上。因此,该误差不能改变最大值的分布,因而可认为该误差对于目标分类结果几乎没有影响。

3)目标位置(x,y)。经过σ函数线性映射后,目标位置(x,y)的误差在0.032像素以内,而该误差经过指数函数放大后,其对目标大小(w,h)产生的误差也在1像素以内。因此,可认为该误差对于目标定位位置影响较小。

综上所述,使用半精度类型取代单精度类型进行网络权值和激活值的表示,对于网络输出结果基本没有影响,但可以大幅加快推理速度和降低存储要求,便于在嵌入式平台上进行推理。

1.2 TX2平台上半精度推理的实现

需要注意的是,并非所有嵌入式设备均支持半精度浮点类型运算。自Tegra X1以后,NVIDIA的嵌入式GPU平台也支持原生的半精度计算指令,因此,本文选用Tegra系列的最新处理器TX2进行YOLOv3网络半精度推理的实现。TX2处理器的核心板大小仅为5 cm×8 cm,但其能够为深度学习应用提供超过1 Tflops的浮点运算性能,同时功耗低于7.5 W,故适合在视频监控摄像头、无人机、机器人等嵌入式平台上部署应用[9]。

在进行CUDA编程时,需要使用内置的Half 2类型对半精度运算进行加速。Half 2类型为2个半精度类型在显存中的组合,其结构如图2所示。其中,S为符号位,E为阶码,M为尾数。Half 2类型在计算时将2个半精度类型同时输入32位GPU,可在一个周期内同时完成2个半精度浮点类型的运算。

图2 Half 2类型在显存中的存储结构

由于需要2个半精度类型同时运算才能起到加速效果,因此在YOLO网络推理时要尽量保证所有的操作均为内存中相邻两组操作数的计算,避免计算资源的浪费[10]。在嵌入式GPU平台上使用半精度类型进行推理的主要过程如下[11]:

1)读入待检测的图像数据和网络权值数据,送入显存,并在GPU中转换成半精度类型。

2)使用CUDNN提供的卷积运算接口API进行卷积计算,在设置参数时,将数据类型选为半精度类型[12]。

3)进行偏置、正则化等计算。首先将参数在显存中拷贝一份,然后使用Half 2类型进行计算,以达到最大的加速效果。以偏置计算为例,其Half 2类型的快速计算过程如图3所示。

4)在GPU中将计算结果转换成单精度类型,并传回内存中由CPU进行最终处理,然后输出检测结果。

图3 Half 2类型的快速偏置计算

2 视频运动自适应推理

考虑到本文算法主要应用于视频目标检测,目标信息在视频中的相邻帧之间具有连续性,因而并不需要对每一帧图像进行完整的深度网络推理。为进一步提高视频目标检测的速度,本文引入运动自适应推理的策略来判断视频帧是否需要重新进行完整的深度推理[13]。

对于新输入的视频帧,使用三帧差分法进行运动估计[14]。当前帧、上一帧、上上帧的图像分别记为It、It-1、It-2,则三帧差分的结果如下:

Mmovement=(It-It-1)∩(It-1-It-2)

对三帧差分法得到的运动图进行阈值化、形态学处理和滤波后,即可得到图像中的运动区域。对于相对上一帧运动较大的视频帧,需要运行一次完整的深度推理,重新检测图像中的目标位置和分类;对于相对上一帧运动不大的视频帧,则使用粒子滤波来进行视频目标跟踪,并更新之前检测出的目标位置。考虑到粒子滤波器在进行长时间的目标跟踪时容易出现漂移、跟踪失败的情况,设置强制深度推理间隔为m,即在进行m帧的粒子滤波后,对第m+1帧强制使用深度推理重新检测目标位置。每次完成深度推理后,将深度网络的检测结果作为粒子滤波器的初始值,重新初始化粒子滤波器[15-17]。整个过程如图4所示。

图4 视频运动自适应推理流程

在TX2平台上进行测试后发现,GPU加速后的三帧差分法耗时5 ms,对单个目标进行粒子滤波跟踪耗时3 ms,比进行一帧深度推理的耗时要少。当视频中的目标个数较少,例如,将帧差法与粒子滤波的耗时忽略不计时,整个算法运行帧率的上限为深度推理运行帧率的m倍。根据本文的测试结果,m取1~3时较为合适。当m取值较大时,算法的帧率上限有所提升,但其输出对于粒子滤波结果的依赖性较强,准确度有所下降。若视频中的目标个数较多,对目标逐个进行粒子滤波跟踪的耗时增大,在这种情况下,可考虑使用CamShift等相对更快的视频目标跟踪算法降低耗时,进一步改善算法的实时性[18]。

3 实验结果与评估

本文算法的所有评估工作均在NVIDIA TX2嵌入式平台上进行,处理器运行于高性能模式,软件环境为CUDA 9.0、CUDNN 7.1。本文利用coco数据集对不同输入尺度下单精度网络和半精度网络的单帧图片推理性能进行测试。由于coco数据集中全部为静态图像,因此仅启动半精度推理加速策略,视频目标跟踪策略没有明显的效果[19],结果如表2所示。

表2 不同输入尺度下单精度与半精度推理性能的对比

由表2可以看出,在不同的输入尺度下,本文的半精度推理策略相对于其他2种策略有3倍左右的加速效果,同时其mAP值损失不到0.3%,检测精度明显优于tiny-YOLO和单数度YOLOv3实时目标检测算法,使YOLO算法在嵌入式设备上的推理性能大幅提升。

本文选用ILSVRC视频目标检测(VID)数据集对算法的性能进行测试[20]。该数据集包含数千个完全标注的视频片段,每个片段的长度为56帧~458帧。在2段视频中各截取4帧相邻图片,如图5所示。

图5 ILSVRC VID测试序列中的检测结果

在图5中,第1帧与第4帧图片的检测结果由深度网络推理得到,中间2帧图片的检测结果为粒子滤波跟踪得到。可以看出,如果视频画面中的目标运动不太明显,通过粒子滤波能够可靠地跟踪深度网络检测到的目标位置,降低深度推理的运行频率,大幅节省计算量。在完整的ILSVRC VID测试数据集上,本文算法与原始YOLO算法的实验结果对比如表3所示。

表3 ILSVRC VID数据集上的视频目标检测结果对比

从表3可以看出,本文的嵌入式实时视频目标检测算法在深度推理间隔为2时,可通过视频目标运动自适应推理策略将深度推理运行次数减少66%,结合半精度推理策略,可在TX2嵌入式平台上将运行帧率提高至28.2 frame/s,同时mAP值损失很低,检测精度仍与原始YOLOv3网络相当。增大深度推理间隔可得到更高的帧率,但也会导致目标检测精度降低。

考虑到ILSVRC VID数据集中的测试序列长度普遍较短,且在同一个测试序列中出现的目标个数较少,大部分为单个目标面积较大的视频序列,其目标检测难度较低,因此,本文选取一段高速公路监控摄像头拍摄的视频进行复杂场景下的多目标检测实验。从测试视频中截取2帧相邻的画面,检测结果如图6所示。由图6可以看出,在复杂场景下,当视频中出现多个目标且每个目标的面积均较小时,本文算法依然具有良好的检测效果,可以应用于实际工程中。

图6 测试序列中的视频目标检测结果

4 结束语

本文提出一种基于YOLOv3的嵌入式平台实时视频目标检测算法。通过半精度推理策略和视频目标运动自适应推理策略改进原始YOLO算法在嵌入式设备上的性能,提高算法的检测速度。实验结果表明,该算法在NVIDIA TX2嵌入式平台上进行单次推理的速度比原始YOLO算法快3倍以上,其在ILSVRC VID数据集上可实现28.2 frame/s的实时检测,且检测精度与YOLOv3算法几乎相同。下一步将继续优化YOLO算法在嵌入式平台上的部署策略,以实现深度学习目标检测算法在更多设备上的应用。

猜你喜欢
嵌入式精度深度
深度理解一元一次方程
深度观察
深度观察
深度观察
基于DSPIC33F微处理器的采集精度的提高
电子制作(2018年11期)2018-08-04 03:25:38
搭建基于Qt的嵌入式开发平台
嵌入式软PLC在电镀生产流程控制系统中的应用
电镀与环保(2016年3期)2017-01-20 08:15:32
GPS/GLONASS/BDS组合PPP精度分析
改进的Goldschmidt双精度浮点除法器
Altera加入嵌入式视觉联盟