王 涌,张 琪,张 豪
(1.浙江工业大学计算机科学与技术学院,软件学院,浙江 杭州 310014;2.浙江工业大学奉化智慧经济研究院,浙江 宁波 315500)
自动驾驶技术在近几年中取得了不少进步,但仍远未达到完美。 进行汽车的自动驾驶所需要的检测行人、道路标志和其他车辆等,始终面临一个主要障碍——大雾。 研究雾天能见度检测对于提高自动驾驶能力,保障乘客安全具有重要的意义。 另外,在低能见度情况下,交通事故率也会有显著上升,因此能见度检测对交通管理和决策也具有重要的意义[1]。
目前,能见度检测的主要方法有目测法、光学仪器测量和摄像机测量。 其中,目测法记录黑色标的物目所能及的最远距离,受主观因素影响较大,能见度的准确性不高;光学仪器采集大气柱,并测量大气对光的衰减,其成本较高、实时性较差;现阶段,国内外学者重点研究了图像处理领域中的能见度检测,并提出了很多基于图像的能见度检测方法[2]。 目前图像能见度检测算法主要分为模型驱动和数据驱动两大类。
①模型驱动的方法基于柯西米德定律(Koschmieder’s law),需要结合摄像机的参数标定。首先估计消光系数,并根据图像分割算法等得到可见的最远位置,进一步计算该位置的距离,从而得到能见度。 Hautière 等人[3]通过区域生长定位出能见度检测的目标域,结合摄像机参数的标定和推算,以及雾天条件下亮度的变化规律,计算了最远可视距离,为后来的能见度估计奠定了基础。 郜婧婧等人[4]提出了一种基于亮度对比度和暗原色先验原理的白天道路图像能见度检测方法。 根据霍夫变换直线检测方法提取道路兴趣域,然后根据亮度对比度方法检测人眼可分辨最远像素点,最后基于暗通道先验原理求取目标点的透射率,进而求取图像能见度值。 陈梅[5]通过对霍夫变换进行车道线检测,利用车道延伸的趋势和实际消失点的差距,估计了能见度值。 以上方法都基于模型驱动,但此类方法普遍不可避免地需要摄像机参数的标定,对场景的限制要求高。 李琴等人[6]首先推算了无雾天气下大气的消光系数,并通过暗通道先验估计雾图像透射率、去雾得到清晰图像、估计清晰图像透射率,进一步根据雾图像和清晰图像的透射率比值关系,计算雾图像的消光系数,从而得到能见度。 此方法无需摄像机参数标定,适用场景广泛。
②数据驱动的算法主要通过雾天图像数据集,提取雾图像的特征,进一步利用机器学习的方法进行模型训练,从而达到能见度检测的目的。 Hazar Chaabani[7]选择傅里叶变换幅度值和图像香农熵作为两级特征描述子,放入三级全连接神经网络中训练,得到了不错的效果。 袁非牛等[8]针对特征提取,提出了两阶段的方法,首先将原始图像全局滤波转化为43 个一阶段特征,然后局部滤波,得到301幅二阶段特征图,特征放入SVR 进行训练,得到一个透射率分类器。 随着深度学习的发展,利用深度学习的能见度检测研究也越来越多。 Palvanov 等[9]将图片放入傅里叶过滤器和光谱过滤器,将得到的结果和原始雾图像共同放入VGG16 卷积神经网络,提取特征后进行特征融合,取得了较好的效果。 数据驱动的方法训练需要大量的标注数据集,而雾天能见度数据集的采集较为困难。
综上,模型驱动方法需要外部参数输入,不能单凭一张图片得到能见度;数据驱动的方式需要大量标注数据集。 针对以上问题,本文在李琴[6]的研究基础上,提出一种基于非局部雾线先验[10]的改进能见度检测算法。 He[11]针对暗通道先验去雾具有天空区域过曝,局部性强等特点,改为全局性更强的雾线先验。 利用雾线的特征选择目标的颜色簇,并对颜色簇的最大半径添加调整项,改进透射率估计的准确性。
图片在照相机中的成像基于光学原理,是通过光学传感器将被摄景物的光信息量传递给感光材料实现的,而在光线传导的过程中,不可避免地会受到空气中杂质干扰,雾是其中最主要的干扰物之一。雾是水滴或者冰晶的堆积,并且伴有灰尘粒子,这些粒子会对光造成折射和反射,从而导致物体表面反射的光经过空气传播到达相机时,已经产生了部分衰减。 雾的浓度越大,空气中的微粒就越多,光的衰减程度越高,目标物体反射到照相机或人眼的光就越少,能见度也就相应越低。
1924 年,Koschmieder[12]提出了观测物体时的视源亮度理论:
式中:L是物体的本征亮度,L0是物体的表观亮度,Lf是大气光的亮度,t(x)是透射率,与距离和消光系数有关。
式中:k是大气的消光系数,与大气中雾的浓度相关。d(x)是场景中x的距离。
根据这些研究,Duntley[12]推导出了大气对比度衰减定律:
式中:C表示距离d时的表观对比度,C0表示物体和背景的内在对比度。
当表观对比度C达到一定阈值ε时,认为物体不可见。 国际照明委员会(CIE)将对比度阈值ε=0.05 作为黑色目标物(C0=1)“气象不可见”的阈值。 由此可推导:
由此,就将求解能见度的问题转化为了求解消光系数k的问题。
传统求解消光系数k的方式一般是通过三维坐标变换,结合摄像机参数标定,推导出k和图片中某坐标距离之间的关系来计算,无法单纯通过一张图片来计算消光系数。 李琴等人[6]提出了一种基于比值的求解方法,可以只凭借一张图片,无需其他参数,即可估计消光系数。 该方法假设k0为完全无雾情况下大气(清大气)的消光系数,则k/k0为浊大气与清大气消光系数的比值。 我们可以通过
来计算k,纯净无雾大气的消光系数k0=2.2518×10-5m-1,那么接下来需要计算k/k0。
k/k0可以通过下式计算
则k/k0的求解转化为透射率的求解。t(x)可以通过去雾算法求得。 在李琴的提出的方法中,采用了暗通道先验去雾算法。
根据计算式(1),可以得到雾成像基本模型为
式中:x是像素点,I是观察到的雾图像,J是被观察目标的真实亮度,A是当t=0 时的大气光。t(x)是透射率,与距离有关。 根据文献[11],暗通道先验的基础公式为:
式中:C是{R,G,B}三通道之一。 为了去雾,式(7)可以被转化为:
将式(8)代入式(9)可得:
在已知透射率和光照A的条件下,即可通过式(11)去雾得到清晰图片I0(x,y).
t0是用来避免e-βd(x,y)过于接近0 的。 根据式(10),e-β0d(x,y)可以按照下式(12)计算:
由此我们就得到了计算消光系数所需的全部参数。 观察式(8)我们可以看到,暗通道先验基于局部的通道最小值来获得目标透射率,而在能见度估计场景下,全局性也很重要。 另外,暗通道先验在图片中包含高亮的天空区域时会失效,而户外场景中难免出现大量天空区域。 对于以上问题,接下来采用全局性更强的去雾算法来估计透射率t(x)。
非局部雾线先验的提出者Berman 等[10]将超过25 000 张清晰图片中的所有颜色进行聚类,并且用每个簇的中心点代替原本图片中的像素点,发现图片几乎可以被完美替代。 这就表明了一个现象:清晰图片中相异颜色的数量级远远小于图片中像素的数量。也就是说,清晰图片中的许多颜色相近的像素点,可以被同一颜色替代,而达到相似的视觉效果。
雾线先验去雾算法符合光衰减的物理规律,且具有全局性,故引入非局部雾线先验去雾作为估计透射率的方法。 接下来我们通过非局部雾线先验计算t(x)和t0(x)。 首先根据计算式(7),定义IA为:
平移RGB 坐标系,使大气光A作为原点。 如下式:
将IA转化为球坐标系:
式中:r是球坐标某点半径,θ和φ分别是经纬度。观察计算式(14),对于给定的J(x)和A,场景中不同距离的点的t(x)不同。 而在球坐标中,t(x)只影响半径r(x),不影响θ(x)和φ(x)。 也就是说,在直角坐标系下具有相似RGB 值的点,在球坐标系下具有相似的[θ,φ]。
因此,[θ(x),φ(x)]相似的点,都属于同一条雾线。 将图片中的像素点转化为球坐标,并对其根据[θ(x),φ(x)]进行聚类,则得到了所有点形成的雾线。 接下来,进一步利用这些雾线估计透射率。对于给定的J(x)和A
进而,当t=1 时,对应最大的半径坐标:
结合计算式(17)和计算式(18),得到基于雾线半径的透射率估计:
式中:rmax是雾线上半径最大的像素点。 通过非局部雾线先验,可以求得图片的透射率,进而通过雾成像原理求得去雾后的清晰图像:
在非局部雾线先验中,作者将球坐标下聚类簇的最大半径rmax作为清晰无雾的像素点,然而事实上由于摄像机与图片中每一点都有一定距离,都会受到雾的影响,所以以rmax比完全无雾的像素点半径要小。 我们将计算式(19)调整为
ρ作为清晰度调整的补充常数,根据经验我们将其设置为0.1。
根据前面的推导,为了求解能见度,需要求解k/k0,根据计算式(6),进一步转化为求解ln(t(x))/ln(t0(x)),而前文通过雾线先验可以分别求得雾图像和清晰图像的透射率。 正如前文所述,在雾线先验中t(x)是通过颜色簇聚类得到雾线并通过半径的比值计算得到的。 目标图片中含有多种颜色的像素,就可以被聚类成多个簇,也就组成了多条雾线,可以得到多组透射率的值,那么计算t(x)的重要问题之一就是选择哪条雾线作为透射率计算的依据。
根据计算式(2),透射率的大小受到消光系数k和距离d的影响。 消光系数是一定浓度下雾的固有属性,则在一张图片中不同像素点主要是由于距离的不同而受到雾的影响程度不同。d越大,t(x)越大,像素点的成像受雾的影响越大。 基于以上原因,应该选择像素点分布广泛的颜色簇。
①选择像素点数量尽可能多的雾线。 为此首先取像素点数量前三的雾线作为候选。
②选择雾线上的点分散的簇。 计算透射率t(x)的雾线,应该是较为分散的。 根据计算式(23)计算雾线上点的半径的标准差,保留标准差最大的一条雾线作为目标的雾线,雾线上的像素点覆盖的区域作为ROI。
完整的k/k0的计算如算法1 所示。
本文所设计实验采用Python 语言编程,系统环境为Ubuntu 16.04,硬件环境为i5-9400F,GTX-1660,16GB 内存。 非局部雾线聚类采用KD-Tree,在球坐标系中均匀采样1 000 个点作为聚类中心。
首先,我们在一些户外场景图片数据集上,比较暗通道先验和非局部雾线先验的去雾效果,结果如图1。 首先可以看到由于天空中高亮区域的影响,暗通道去雾的结果普遍偏暗,非局部雾线先验的结果的视觉效果更明亮,天空区域没有过暗的情况。另外由于暗通道先验采用矩形滤波器作为去雾窗口,在几何图形的交界处可以看到明显的白色边缘,而非局部雾线先验在像素粒度去雾,并没有产生白色区域。 所以在户外场景下,非局部雾线先验对透射率的估计效果更好。
图1 非局部雾线先验与暗通道先验的去雾效果对比
在本文方法中,提出了一种基于雾线先验选择能见度检测ROI,估计透射率并进一步计算能见度的方法,对能见度估计的全局性产生一定的影响。方法改进的目标是让ROI 的选择尽可能分布广泛且均匀,并避免选择天空区域或者与摄像机距离几乎相同的颜色簇。 根据图2,可以看到算法在图片中选择了分布均匀广泛的簇。
图2 ROI 选择结果的评价
为了评价提出方法的准确性,接下来将在哥伦比亚气象和照明数据库(WILD)[13]上与李琴[6]所提出的方法进行比较。 WILD 数据集由哥伦比亚大学开源,包含5 个月以上固定户外场景的图像,覆盖了广泛的光照、天气条件和季节等情况,并且提供了真实场景能见度值与图片的对应。 我们从中选择了覆盖0.5 km~ 2.5 km 场景能见度的120 张图片。WILD 的示例图像如图3 所示。
图3 WILD 图像集示例图
表1 展示了分别从0.5 km、1.0 km、1.5 km、2.0 km、2.5 km 场景数据集抽取图片作为输入时,算法计算过程的中间数据,图4 为选择了广泛分布的像素点簇作为ROI 的示意图。
图4 从WILD 数据集中抽样图片输入算法时,选择分布较广泛的区域结果展示
表1 抽样图片输入算法计算的中间数据
实验结果如图5 所示,能见度估计的趋势符合数据集真实值的趋势。 在真实能见度低于1 km 时,估计值与实际值比较接近,误差率在8%以内;2 km以上时误差相对较大,在17%左右,详见表2。
图5 能见度估计算法在WILD 数据集上的表现
表2 不同能见度下的MRE 结果
为了体现所提出方法的准确性,我们将WILD数据集中的图片分为5 类,然后计算了估计能见度V0和真实能见度Vmet之间的平均相对误差(MRE),如计算式(24)。
式中:N是日光图像的数量,表2 中记录了各分类下的MRE 结果。 准确率计算如式(25)。
实验结果表明,该方法能够满足不同级别下大气能见度的估计要求。 与基于暗通道的比值法的误差率比较,我们的方法整体平均准确率提升1%,各阶段准确率曲线如图6,可以看到整体上本文方法的准确率略高于暗通道估计的准确率。
图6 非局部估计准确率与暗通道估计准确率曲线比较
在计算能见度的场景中,核心问题是估算被观测场景的大气消光系数k。 本文在李琴[6]提出的比值法的基础上,为了解决暗通道在估计透射率时受光照影响大,考虑全局性不够等问题,引入了非局部雾线先验作为估计透射率的先验算法。 另外本文方法可以使用含有大量天空区域的户外场景图片,一定程度上解决了暗通道先验受到天空等高亮区域影响的问题。 在此基础上,本文提出了目标域ROI 的选择方法,选择分布较广泛的区域作为能见度计算的目标区域,经验证选择的目标区域较合理;另外改进了颜色簇最大半径的选择方式。 实验证明,我们的算法能够应用在户外场景下估计能见度,在日光自然雾场景中准确率相比基于暗通道先验的比值法提升了1%。