谈谈 CDP (Contrast Detection Probability)

背景

众所周知,在传统图像处理领域,不同的处理任务都有各自的一套评价标准,比如降噪任务中的 PSNR 和 SSIM,自动白平衡中的角度差,颜色还原中的色差,等等。但是,当我们把应用场景切换到 CV 领域后,照搬这套传统的图像质量评价(Image Quality Assessment, IQA)体系来评价一个成像系统的性能,很有可能无法得到客观、公正的结果。

举个例子,在目标检测任务中,假设一个检测模型的训练样本全部来自于一台 360P 的古董监控摄像头,那么在部署这个模型时,即使喂给它一张 4K HDR 图像,其检测精度往往可能还不如另一张同样来自这个 360P 摄像头的图像——并不是说 4K HDR 图像的质量不好,但是在当前这一场景下,它与已经训练好的数据驱动的 deep learning 模型并不适配。因此,在 CV 任务的场景下,当一张图像的观察主体从人眼+人脑的组合切换为某个 DL 模型时,我们有必要对原有的图像质量评价体系进行重新定义。

在针对 CV 任务提出的 IQA 方案(以下称为 CV-IQA)中,用户注重的不再是解析度、信噪比、颜色准确性这些面向人眼的图像质量指标,而是会更加关注于物理世界中的信号在数字域中的可复现性(Reproducibility)和复现可靠性(Reproduction Reliability)。

以下图为例,左边是一块限速牌在物理世界中真实的亮度分布(用单位面积辐射出的光子数表示),右边是使用某台相机拍摄下的该限速牌的图像。由于任何光学系统和半导体器件都存在一些固有缺陷,因此在最终的图像中,限速牌各个部分的对比度,或者说信号的可观测差异,要比物理世界中的真实限速牌差得多。

左:真实亮度;右:图像中的像素值

差得多,那么究竟差了多少呢?我们试图从传统 IQA 指标中去寻找一个能够表征这种差异程度的指标:PSNR?量纲都对不上,PSNR 肯定没法计算,而且实际环境下这两张图也很难实现像素级的对齐;对比度?右边这张图像里有那么多的像素,要计算谁和谁之间的对比度?想了一圈发现,在这种实验设置下,传统指标似乎总是差了那么一点意思。

什么是 CDP

CDP(Contrast Detection Probability)指标是 IEEE P2020 小组(Automotive Image Quality Working Group)针对自动驾驶场景提出的一套 CV-IQA 方案,旨在克服传统 IQA 方案(如 IEEE Std 1858、EMVA1288、ISO 12233)用于车载影像质量评价时存在的一些缺陷。

用一句话概括 CDP 存在的意义:CDP 表征了成像系统对物理世界辐射信号差异复现能力(原文:CDP is a metric to describe the performance of an imaging system to reproduce contrasts in the physical scenes)。

划两个重点:

第一,在 CV 任务中,我们希望成像系统能够重点关注物理信号间的差异,而非信号本身的绝对大小。例如对于物理世界里亮度为 $(500\mathrm{cd/m^2}, 600\mathrm{cd/m^2})$ 的两个物体,我们关心的是在最终的输出图像中这两个物体能否进行区分,而并不关心具体的灰度值大小,它们可以是 $(200, 255)$,也可以是 $(50, 64)$。这一点很好理解,因为一旦这两个物体在图像中无法区分,其梯度便退化为零,基于特征提取的 CV 模型自然无法从中提取出任何差异化信息,不管是分类还是检测还是分割任务,统统歇菜。

第二,CDP 考量的是成像系统能否对信号差异进行准确复现。所谓准确复现,即是说物理世界里一组信号之间的差异有多大,在最终输出图像中,这个差异应该还是有多大。信号的差异在经过成像系统前后需要维持在一个相同的水平,既不能放大,也不能减小。还是上面那个例子,假如我们用 Weber 对比度作为计算信号差异的指标,那么物理世界中这两个信号之间的差异为 $K_{\mathrm{world}}=(\frac{600}{500}-1)=0.2$。如果有两个成像系统 A 和 B,在它们的输出图像 $\mathcal{I}_A$ 和 $\mathcal{I}_B$ 中,这两个物体的灰度值分别为 $(200, 255)$ 和 $(55, 64)$,那么有:

\begin{equation*} K_{A}=(\frac{255}{200}-1)=0.275\,,\quad K_{B}=(\frac{64}{50}-1)=0.28\,, \end{equation*}

这时我们就说成像系统 A 有着更好的信号差异复现能力,因为 0.275 相比 0.28 更接近物理世界中的真实对比度值——0.2。

从直觉上来说,我们往往会希望成像系统能够把真实世界中的信号差异进行一定程度的放大,比如 ISP 里的边缘增强、对比度增强等模块,都是为了突出和强调信号间的差异。但是在 CV 的语境下,我们希望成像系统能够尽量做到信息(即信号差异)的忠实还原,因此 B 系统虽然对信号差异进行了放大,但是其 CDP 指标却要低于 A 系统。这个例子也直观体现了 CV-IQA 与传统 IQA 之间的设计思想差异。

铺垫了这么长,那么为什么 CDP 这个指标可以针对自动驾驶场景下(或者说得更泛一点,大部分 CV 场景下)成像系统的质量进行评价呢?我个人的理解是,图像不同区域之间信号的可分辨性(distinguishability)是 CV 模型执行正确计算的必要条件,因此可以用 CDP 来衡量一个成像系统对物理世界中信号的检测能力的上限——如果一个成像系统的 CDP 很高,其检测能力未必很好,但是如果 CDP 很低,其检测能力一定不好。换句话说,CDP 并不是一个万能的 CV-IQA 方案,它只是为我们提供了一个相对客观的评价维度,同时补足了传统 IQA 中存在的一些短板。

技术细节

这一节重点介绍 CDP 这个指标究竟如何对成像系统的质量进行定量评价,以及给定一台相机,我们要如何计算出最终的 CDP 结果。

继续沿用上节中的例子。

假设物理世界中有两块亮度分别为 $500\mathrm{cd/m^2}$ 和 $600\mathrm{cd/m^2}$ 的理想漫反射平面:

上一节中我们已经计算出了它们之间的 Weber 对比度为 $K_\mathrm{world}=0.2$。同时,使用它们的亮度平均值 $\frac{500+600}{2}=550\mathrm{cd/m^2}$ 作为这一组信号的物理亮度 $L$。

现在我们使用一台相机分别去拍摄这两块平面,假设得到这样两幅图像:

从两张图像中各自随机抽取一个像素,如下红色小方框所示。不妨假设它们在图像中的灰度值分别为160和206。

CDP 要求我们在计算这两个像素的对比度之前,先把它们从图像灰度值域(digital-number domain)映射回物理亮度域(luminance domain)。显然,这时候我们并不清楚160和206的灰度值到底对应多少 $\mathrm{cd/m^2}$ 的物理亮度值,因此在执行这步操作之前,我们需要为当前成像系统构建一个输出 $\rightarrow$ 输入的反映射函数(inverse system function)。

P2020 中并没有明确说明如何构建这个反映射函数,我个人采用的方法是,先在横坐标为物理亮度、纵坐标为灰度值的平面内绘制出输入 $\rightarrow$ 输出曲线(即我们平时说的系统响应曲线),然后把当前要计算的灰度值作为 $y$ 坐标,用 bilinear 插值的方式计算出它在曲线中对应的 $x$ 坐标,以此作为该像素对应的物理亮度值。

输入 $\rightarrow$ 输出曲线的绘制可以预先通过标定实验来完成。我们假设当前相机的灰度值与物理亮度之间满足如下近似于 Gamma 曲线的关系:

对于160和206的灰度值,我们在这条曲线上可以内插出其对应的物理亮度大约为 $505\mathrm{cd/m^2}$ 和 $640\mathrm{cd/m^2}$。换句话说,对于这台相机,digital-number domain 中的160 (206) 数值,大约对应到 luminance domain 中的 $505\ (640)\mathrm{cd/m^2}$:

有了 luminance domain 中的一组亮度值之后,我们可以计算它们的 Weber 对比度:

\begin{equation*} K=\left(\frac{640}{505}-1\right)\approx{}0.267 \end{equation*}

除了可以按照如上两个红色小方框进行像素选取之外,我们一共有 $M\times{}N$ 种方式从两个 RoI 中各自选取一个像素构成一组 pixel-pair,其中 $M$ 和 $N$ 分别代表两个 RoI 中的像素数。如果我们对这 $M\times{}N$ 组 pixel-pair 都计算一次 Weber 对比度,则可以得到一个关于对比度的分布直方图。

两个平面在图像中的 RoI 都是 $32\times{}32$ 的正方形($M=N=32^2=1,024$),因此我们一共可以得到 $1,024\times{}1,024\,\approx{}10^{6}$ 个对比度值,它们构成的直方图如下所示:

对这个直方图进行归一化,我们就得到了一组 RoI-pair 之间的对比度概率分布函数 $p(K)$:

(到此终于解释了为什么 CDP 中的那个 P 是 probability……)

在这个例子中,物理世界里两个平面之间的信号差异为 $K_\mathrm{world}=0.2$,而由于噪声以及非线性的存在,在成像系统记录下的信号中,它们之间的差异不再是一个具体的数值,而是一组关于对比度的概率分布函数 $p(\cdot)$

在正式给出 CDP 的计算公式之前,需要先引入置信度的概念。

回想一下上文中我们对 CDP 的定义:CDP 用来衡量成像系统对物理信号差异的复现准确性。对于 $K_\mathrm{world}=0.2$ 的输入信号,理想情况下,我们当然希望成像系统能够分毫不差地复现出这个对比度数值,这时上图中的概率分布理应是一个落在 $K=0.2$ 处的 Dirac 函数。然而在实际系统中,$p(\cdot)$ 必然有一定的带宽,我们也会适当地放松对「准确复现」这一概念的定义,即,对于成像系统复现出的一组信号,只要它们的对比度落在 $\left[K_\mathrm{world}(1-\epsilon), \ K_\mathrm{world}(1+\epsilon)\right]$ 区间之内,我们就将其视为一次「准确复现」。这个 $\epsilon$,正是一个预设的置信度值。

回到上面的例子中,假设我们设定 $\epsilon=10\%$,这时对于任意一组 pixel-pair,只要它们的对比度位于 $[0.18,\ 0.22]$ 区间之内,我们都认为这组 pixel-pair 成功地对物理对比度进行了准确复现。在上面的概率分布函数中画出0.18和0.22所在的位置,其包围的区域与 $p(\cdot)$ 取交集得到的面积,相对于 $p(\cdot)$ 与 $K$ 轴包围的面积之比,即为最终的 CDP 值:

\begin{equation*} \mathrm{CDP}(K_\mathrm{world};\,L, \epsilon) = \frac{\displaystyle\int_{K_\mathrm{world}(1-\epsilon)}^{K_\mathrm{world}(1+\epsilon)}\ p(K)\,\mathrm{d}K}{\displaystyle\int_{-\infty}^{+\infty}\ p(K)\,\mathrm{d}K} \end{equation*}
阴影面积除以整个红色曲线下面积即为 CDP 值

根据上图阴影部分占整个曲线下面积(AUC)的比例,CDP 值大约在 30% 左右。

我们注意到公式中的 $\mathrm{CDP}$ 是一个关于 $L$ 的函数,这是因为,这一计算结果仅对平均亮度 $L=\mathrm{550cd/m^2}$ 的一组输入信号成立,当任一平面的物理亮度发生改变时(这时两个平面的平均亮度也会改变),我们又需要重新构建一次 $p(\cdot)$,再计算一个新的 CDP 值。

对于上面的例子,我们使用如下定义对系统的信号复现能力进行描述:

给定 10% 的置信度($\epsilon=0.1$),在 $550\mathrm{cd/m^2}$ 的亮度水平下,当前成像系统有 30% 的概率准确复现出物理世界中对比度为 $K_\mathrm{world}=0.2$ 的一组信号。

相比于传统的 IQA 指标,CDP 在对成像系统的性能进行评价时把外界的信息也作为了自变量之一,从而实现了被测系统输入(辐射信号)与输出(数字信号)之间的互动。

计算示例

让我们来看一个具体的示例。

假设有216个不同物理亮度的色块,它们当中最亮亮度约为 $5\times{}10^4\mathrm{cd/m^2}$,最暗的约为 $7.5\times{}10^{-2}\mathrm{cd/m^2}$,按下图所示排布。(这一排布方式参考了 Image Engineering 的 DTS 仪器

现在我们使用一个基于长中短曝光三帧合成的 HDR 相机对这个场景进行拍摄,得到如下 RAW 图像(实际是 16bit RAW,这里为了能够正常在屏幕上显示所以做了一个16bit $\rightarrow$ 8bit 的线性压缩):

使用 DOL-HDR 技术的相机在特定的亮度拼接区域会出现明显的 SNR drop,在这个例子中如果我们把图像右上角进行放大,可以看到某些色块对应的噪声强度明显大于其他色块:

SNR drop 的存在导致某些亮色块的噪声反而高于暗色块的噪声,例如第4行第3列色块 VS 第4行第4列色块

我们把图像中每个色块单独提取出来并计算其平均灰度值(这张图里每个色块大约占 $40\times{}40$ 个像素),可以得到216个不同的灰度值。把色块的物理亮度值作为横坐标,把图像灰度值作为纵坐标,可以绘制出这个相机的响应曲线(这是一个仿真的相机,实际相机的曲线当然不可能这么规整 😳 ):

有了响应曲线,就可以使用上一节提到的插值的方法来构建图像灰度值域到物理亮度域的反映射函数。

我们每次从这216个色块中任意选取两个色块作为一组 RoI-pair,然后按照上一节的方法可以计算得到一个 CDP 值。对于216个色块,一共可以不重复地选出 $C_{216}^{\,2}=23,220$ 组 RoI-pairs,因此最终一共将得到23,220个 CDP 值,以及23,220个物理对比度 $K_\mathrm{world}$。

在实际的应用中,我们通常只关心某些物理对比度 $K_\mathrm{world}$ 下的 CDP 情况,因此通常只会对这23,220组 RoI-pairs 中满足 $K^\ast (1-\delta)\le{}K_\mathrm{world}\le{}K^\ast(1+\delta)$ 的那些个 pairs 进行 CDP 的计算,其中 $K^\ast$ 表示用户指定的目标对比度,$\delta$ 是一个允许的 tolerance,一般取0.1即可。

为什么不直接筛选出满足 $K_\mathrm{world}=K^\ast$ 的 RoI-pairs,而是要设定一个容限 $\delta\,$?这是因为在有限个 RoI-pairs 当中,通常很难找到恰好等于目标对比度的 RoI-pairs,因此需要适当放宽一些筛选条件以确保获得足够数量的有效样本。

在这一节的例子中,当我们指定目标对比度 $K^\ast=0.2$、$\delta=0.1$ 时,一共可以得到291对满足 $0.18\le{}K_\mathrm{world}\le{}0.22$ 的 RoI-pairs。如果我们把这291个 CDP 值绘制出来,并以物理亮度 $L$ 作为横坐标,可以得到这么一个分布情况:

物理亮度越低时相机的信噪比越低,因此低亮度场景下的 CDP 值要明显低于高亮度场景。换句话说,实际亮度越低,相机越难对真实的信号差异进行准确复现

这张图完整表征了被测相机对于指定的目标对比度(0.2),在不同环境亮度下对物理信号进行准确复现的能力

类似地,我们还可以绘制出 $K^\ast=0.06$、$K^\ast=0.1$ 以及 $K^\ast=0.3$ 下的 CDP 分布情况(这三个数值是 Image Engineering 推荐的目标对比度值):

当目标对比度减小时,CDP 的分布也逐渐下降,这表明了真实世界中信号的差异越小,成像系统越难进行准确的复现。此外,对于 $K^\ast=0.06$ 和 $K^\ast=0.1$ 的两种情况,CDP 的散点分布在 $L=300\mathrm{cd/m^2}$ 和 $L=4000\mathrm{cd/m^2}$ 附近出现了两个明显的低谷,这对应了 DOL-HDR 相机的两处 SNR drop(这张图左上角的图注里 $C$ 应改为 $K^\ast$,我懒得重新作图了)

考虑到一个成像系统往往需要在不同的场景下工作,因此在使用 CDP 对成像系统的性能进行评价时,一般都会给出某个(或某几个)目标对比度下 CDP 关于物理亮度的散点分布,而不是固定一档亮度下的单个 CDP 数值。这一背景也导致了 CDP 无法以一个简单指标的形式向用户进行交付,同时也不容易对两个系统的性能差异进行定量比较(P2020 小组并没有提到如何评判两组 $L-\mathrm{CDP}$ 散点图之间孰优孰劣),这也许也是导致 CDP 始终没有得到普遍应用的原因之一吧。

Reference

  • Geese M, Seger U, and Paolillo A, Detection Probabilities: Performance Prediction for Sensors of Autonomous Vehicles. 2018
  • Artmann U, Geese M, Gäde M, Contrast Detection Probability – Implementation and Use Cases. 2019
  • Imatest Documentation: Contrast Detection Probability. https://www.imatest.com/docs/cdp/
  • ISO 12232:2019 Photography — Digital still cameras — Determination of exposure index, ISO speed ratings, standard output sensitivity, and recommended exposure index.
  • Robin B. Jenkin, Comparison of Detectability Index and Contrast Detection Probability. 2019
  • Lukas Ebbert, Implementierung von CDP: Entwicklung eines Programmiercodes in Python zur Untersuchung und Messung von CDP bei Fahrerassistenzkameras. 2018

About the author

Jueqin

本作品以 CC BY-NC-ND 许可协议进行发布。

如果您认为文章对您有用的话,不妨请我喝一杯咖啡?

4 comments

  • 您好,请问文章中提到的输出 ->输入曲线的图像灰度值域具体指的是raw域的像素值还是过完ISP的灰度值,我看下面的Luminance-Pixel Value的图中,有的pixel value是0-255(8bit?), 有的是0-60000+(16bit raw?)。另外那张0-60000+的图,如果是raw数据的话,相机响应曲线为什么是这个形状? 我理解raw数据和luminance应该是线性的? 谢谢!

    • 都可以,看你怎么定义想要评估的成像系统了,如果只想评估 lens+sensor,那就用 raw 域数据,如果希望评估 lens+sensor+ISP,那就用 RGB 域数据。
      那个0~60000+的是我拿来举例的数据,比如有一些车载的 sensor,线性数据是24bit的,所以会用非线性函数映射到16bit,那么最大值就是65535了。

  • 您好,对于一个灰度图来讲,其物理亮度值还需要映射到灰度值吗?是否可以直接利用灰度图的灰度值直接计算cdp呢?