自动驾驶系统在发展过程中对感知视觉产生了更多的依赖,主要体现在要求配置的传感器能够产生更大分辨率图像,以便在理解图像的时候能够识别出更多小目标或者容易在常规识别中被大家所忽视的目标。那么有个问题就来了,高分辨率图像也就意味着对图像处理芯片的高要求,这个过程不仅涉及其AI算力(NPU资源),也包括逻辑算力(CPU资源)。
当前很多自动驾驶公司已在着力研发自己的自动驾驶感知算法,算法评价力度主要倾向于如下几个重要的方面:
(资料图片)
1)如何利用合理的图像缩放算法对视频图像合理的缩放(通常又称之为Resize算法),以便为后续神经网络处理提供便利?
2)如何通过合理的规划算法在原图中裁剪(Crop)出远距离目标并进行有效的缩放后处理。该过程可以弥补Resize算法缩放过程中可能造成的远距离小目标丢失问题。
如下图中显示了一种典型的Resize+Crop的视频图像处理方式。其中,原始图像通过两条网络分别进行处理。网络1主要进行Crop操作:聚焦于远距离目标,可提供精确的目标位置。网络2主要进行Resize操作:着力于近距离目标检测。两条网络中检测的结果通过一定的算法进行融合后可以实现对整个图像的有效处理。
其上两个过程通常是在整个自动驾驶数据闭环过程中进行的,开发前期会进行有效的数据采集、清洗、处理等。其中最重要的是如何选择可靠的算法模型对图像进行合理的Resize和Crop。
本文将针对如上两种经典的图像处理算法进行详细解析,并根据解析内容说明如何在后期自动驾驶系统设计中尽最大可能的设置相应的测试用例用于评测其开发算法有效性和可靠性。
0 1
智驾域视频感知中的卷积神经网络
近年来卷积神经网络在自动驾驶视频图像处理过程中取得了长足的发展,其算法中最终的就是提升被训练任务的准确性和高效性。在基于卷积神经网络的应用过程中,图像Resize是必不可少的一个步骤。可以说,图像大小对被训练的任务的准确性和高效识别会产生较大的影响。比如,当前使用的800万像素的摄像机拍摄的高分辨率图像,由于网络模型输入一般没有这么大,像Yolo系列目标检测的网络模型输入大小一般为608x608/512x512 。在其输入图像的大小被调整到一个相对较小的空间分辨率(例如,1920X1080)再进行训练和推理时,往往可以很大程度的减少卷积神经网络中的运算复杂度。
如上图的右侧,红色的输入层代表输入图像,它的宽度和高度就是图像的宽度和高度,它的深度是3(代表了红、绿、蓝3种颜色通道),与红色相邻的蓝色部分是经过卷积和池化之后的激活值(也可以看做是神经元),后面是接着的卷积池化层。可以看出图像分辨率越高,其图像处理的神经元数越多。但在处理高维度图像输入时,让每个神经元都与前一层中的所有神经元进行全连接是不现实的。可以看出,当输入图像分辨率越低,其对应的宽度和高度就越小,这样在卷积池化层里的神经元感受野尺寸(其实就是滤波器的空间尺寸)就越小,这也有利于我们对整个图像的加速处理。
0 2
智驾视频图像处理中的Resize算法解析
如前所述,我们研究的重点是如何将那么大的尺寸图像通过预处理输入到神经网络模型进行有效处理呢?这就需要应用合适的Resize算法。
一般结构化图像缩放裁减Resize包括三个层级:首先是依据滤波器通道剪裁占 40%;其次是依据滤波器三维子单元剪裁占 30% ,随机剪裁占 20%;在满足裁减率的同时需要保证无明显性能损失,剪裁后的稀疏结构和MAC阵列吻合,以便利用稀疏加速。可以说好的Resize方法是提升网络引擎性能,降低功耗的主要因素。
Resize作为图像预处理的一个经典算法步骤,在进行预处理时对图像resize时方法会存在较大的不同。
第一种,采用的是直接resize,就是不保证原始图像长宽比直接对图像进行缩放(缩放类型包括不等比例缩放和等比例缩放两种)。当然,如果在网络模型训练时,所有的训练素材都是直接拉伸到网路的输入尺寸(不保持宽高比例),那么模型推理时也应该如此。一些算法应用框架对细节封装得很好,对原始图像进行Resize的过程被隐藏起来,具体Resize的方式也不得而知。当发现模型集成后的准确性下降严重,就有可能是模型框架对图像Resize的方式跟前期模型训练时不一致导致的。
第二种,通过一些有效的线性或非线性插值算法来实现。Resize操作方法十分丰富,大家最常见应该就是darknet版本的仿射变换函数letterbox仿射变换操作,其处理过程就是计算宽高缩放比例,选择较小的那个缩放系数。比如,针对输入图像大小为3840*2160 Pixels时,选择的图像匹配模板缩放尺寸是640*480,当对其长和宽都除以原始图像的尺寸后,可以得到0.17和0.22两个缩放系数,选择小的缩放系数0.17对图像进行缩放即可。
这里对于图像处理的Resize核心无问题无非有如下几个问题:图像Resize过程,应该选择什么样的插值方式;图像Resize前后,是否应该保持宽高比例一致?图像内容变形是否对模型效果有影响?
对于第一个问题,其实两种方式均可,前提是要保证模型训练和模型推理时的操作方式一致。训练时会对短边进行填充从而保证长宽比,其中保持宽高比例的做法一般是用增加padding的方式,然后用固定颜色填充,这样可以基本保证图像画面中部的内容不变形。随后需要进行合理的Resize处理,通常一般推荐使用直接拉伸的方式去做图像Resize,原因是增加padding填充后会对网络带来一定噪音,影响模型准确性。
至于Resize的插值方法选择,一般有最近邻、双线性、双三次、基于像素区域关系、兰索斯插值等;其各自的实现原理及优缺点如下图:
算法 | 最近邻 | 线性插值 | 双三次 | 兰索斯 | 像素区域 |
实现原理 | 用近距离采样点作为最近的像素采样点的灰度值 | 用双线性方式计算采样点周围的4个点,计算其灰度值 | 根据采样点的周围16个像素点的双线性关系及像素变化率,计算出采样的灰度值 | 在x,y方向分别对相邻的八个点进行插值,也就是计算加权和,傅里叶变换有关的三角函数方法 | 使用像素区域关系进行重采样,图像放大时类似双线性插值,缩放时类似于最近邻插值 |
优缺点分析 | ü 出现锯齿现象 ü 未考虑周围像素 ü 速度最快 | ü 可避免锯齿现象 ü 未考虑周围像素 ü 速度较快 | ü 可避免锯齿现象 ü 已考虑周围像素 ü 速度一般 | ü 可避免锯齿现象 ü 已考虑周围像素 ü 速度较慢 | ü 可避免锯齿现象 ü 已考虑周围像素 ü 速度最慢 |
实际上,如上这些调整器image resizer如果应用不删在某种程度上其执行结果上有可能会限制训练网络的任务性能。可以采用可被学习的调整器代替典型的线性调整器,从而大大提高其自身处理性能。虽然经典的调整器通常会具备更好的小图像感知质量(即对人类识别图片更加友好),可学习的调整器不一定会具备更好的视觉质量,但能够提高CV任务的性能。
0 3
智驾视 频图像处理中的Crop算法解析
图像处理中的Crop算法又叫图像分割或图像裁减。自动驾驶中对于拍摄的高分辨率图像识别中很有必要把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标,这一过程是后续目标检测的关键。有利于基于目标几何和统计特征的图像分割,在真正的图像裁减中很多时候需要做到将目标的分割和识别合二为一,从而有效的定位目标,确定目标位置及大小。
对于高阶自动驾驶系统传感器所拍摄的高清晰度图像而言,其所处理的物体在不同的角度,不同的距离具有不同的形态(甚至有些远距离目标的形态特征已经非常微弱了),所以准确检测目标的难度是非常高的。传统的目标检测算法是从图像中通过滑动窗口的方法取得候选区域,然后在候选区域通过分类算法判断是否是所需要的目标。也有根据物体的形态纹理等特征获得候选区域的方法,包括selective search等一系列方法。当然不可否认,这些方法在一定程度上能够满足应用的需要。然而针对自动驾驶这一高分辨率高帧率的图像识别而言,这些算法却显得比较苍白。一则选取何种窗口函数对于大分辨率图像处理都是需要进行遍历处理的,就是你并不知道要检测的目标大小是什么规模,所以你要设置不同大小和比例的窗口去滑动,而且还要选取合适的步长。但是这样会产生很多的子区域,并且都要经过分类器去做预测,这需要很大的计算量,所以你的分类器不能太复杂,因为要保证速度。这可能无法做到很高的实时性。另外,对于选取窗口函数如果选择不得当则可能导致漏检和误检这两种情况。
那么如何对高分辨率大图的自动驾驶系统设置好的图像裁减方案呢?常见的方法包括基于阈值的分割方案、基于区域生长的分割方案、基于边缘的分割方案以及基于图的分割方法,重点是建立背景与感兴趣区域的分割模型。比如我们在利用前视摄像头探测的道路信息时,通常需要重点考虑本车道前方目标信息。首先,通过根据车辆自动驾驶期间通常行驶在本车道的情况,采用宽视摄像头(通常FOV为120°)对自车行驶在本车道内的状态信息进行实时探测反馈。其次,利用窄视/远视摄像头(通常为30°FOV)就可以很好地将本车道前方很远的小目标进行识别,识别的结果一般具备单一性原则(即车道与感兴趣的目标),那么这时候通过常见的Crop算法进行分层级处理了。
Crop算法运算原则就是通过目标像素值与背景区域的差异,就可以对其周边像素区域进行滑动窗口(比如3x3标准窗口)遍历,这样就可以大大减少遍历范围,从而可以很好的提取出该车道中感兴趣的前景(比如车辆、锥桶、落石及其他异形物等)。
当然我们也不得不注意到一种常见的CornerCase,那就是如果我们的车辆在行驶过程中可能出现的变道场景。那么这种识别方法就有其一定的固有缺陷,因为在对原图使用滑动窗口进行目标定位时,由于预先定义的搜索范围一般是限定在本车道内,因此可能存在误检的情况。另外,即便不考虑换道,针对弯道这一特殊场景来说,如果没有结合车辆轨迹预瞄,也很可能出现在在Crop过程中,将别车道的车辆定位为本车道车辆目标进行处理的情况。
0 4
执行算法效率分析
接下来的关注点是对于使用Resize+Crop到底提升相关算法能力上的能产生多大的效果呢?我们主要从理论算力、硬件利用率和NET的带宽影响SOC的实测算力进行分析。
1、理论算力
• 根据神经网络Net卷积层的乘法运算累加得出
• 卷积层中的每次乘加(MAC)一般算成两个OPS
• 卷积运算量占神经网络Net的90%以上
• 其它辅助运算或其它层的运算需求可以忽略不计
2、硬件利用率
• 计算公式参照如下进行
• 考虑其它运算层,硬件实际利用率可能要高一些
3、SOC的实测算力
• 考虑图像精度、模型架构和网络拓扑
• 神经网络的剪枝、量化和压缩
• 神经网络图的分割通常需要将中间结果写回到DDR
• 优化设计需要减小神经网络对带宽的影响
0 5
总结
自动驾驶系统的研究在视觉方面已经不仅仅局限于一些中低分辨率图像了,特别是对于一些极端场景来说往往还涉及更多的大分辨率图像的处理。这一点上就极其消耗其SOC的AI算力。当然,尽管近年来卷积神经网络很大地促进了计算机视觉的发展,其神经网络加速能力也取得了长足的进步。
但一个重要方面却很少被关注:那就是大图像如何进行快速且有效的处理,被处理的图像将如何影响其被训练的模型。本文重点研究议题就是如何在有限的算力资源下布局更多更大的图像信息,且在不损失检测视频中有用信息的前提下更好的将图像处理时间和复杂度降下来。整个感知算法来说实际是涉及精简压缩检测的分支运算,这个过程可以大量减少后处理的运算量。
关键词: