转载链接地址:http://lowrank.science/Spectral-Residual/
虽然是第一次读论文第一作者 Xiaodi Hou 的文章,但在此之前,其实早已受过其不小的影响:
Xiaodi Hou 在知乎上的 ID 是Filestorm ,是
神经学、生物学话题的优秀回答者,在看他的论文之前,你可能已经在知乎周刊上看过好几个他的回答了;
Xiaodi Hou还是关于博士生的喜剧电影 ThePhD Movie 的演员之一,出演了那个在舞厅邀请女主跳舞的本科生;
Xiaodi Hou 著名的上海交大生存手册 的作者之一,我人生的一大遗憾就是,是在本科毕业而不是入学时才读到这本小册子;
最让人叹服的是, Xiaodi Hou04年高中毕业才进入上海交大,考虑到 CVPR 一般都是在上一年 11 月份投稿,Hou Xiaodi 投稿这一篇目前引用 2000多次的CVPR 论文时,其实大三上学期开学没多久,包括我在内,多少人这辈子做梦都想发一次 CVPR,Hou 他竟然在大三就完成了。
从题目中就能看出来,论文的目的是做显著性检测的,但这篇论文之所以能被引用这么多次,在于它与传统显著性检测的思路并不一样。
传统方法,如 Itti 模型,检测显著性目标的思路就是抽取目标的显著性特征,如颜色、亮度、纹理,通过综合并分析这些特征,找出图像的显著性区域。但这样做的通用性并不是很好,因为不同类型的目标会有不同的特征,并不能一概而论。
Hou 在本文中另辟蹊径,并不预先假设目标会具有怎样的颜色、亮度、纹理特征,而是来探索背景具有何种特性(pose this problem in an alternative way: to explore the properties of the backgrounds.)将目标看作是引起背景变化的东西,通过估计背景,来做显著性检测。
人类视觉系统的一条基本法则就是会抑制重复性出现的特征,而更关注那些偏离寻常的东西。因此,只有那些意料之外的信号,才会引起我们的注意。
恰巧的是,自然图像的平均傅里叶谱(averaged Fourier spectrum)遵守有名的 1 / f 1/f 1/f 法则,即频率 f f f 对应的傅里叶谱的幅度与其频率成反比,数学公式表示为
E A ( f ) ∝ 1 / f E{\mathcal{A}(f)} \propto 1/f EA(f)∝1/f
其中符号 E ⋅ E{\cdot} E⋅ 表示期望运算。本文方法主要的出发点是,作者洞察到所有的图像傅里叶谱都遵守这个规则,并在论文中给出了 Figure 1,可以看出,单幅图像的 Log Spectrum 与 2277 张图像合成图像的 Log Spectrum 非常相似。
除了 Log Spectrum 的相似性外,作者另外一个非常重要的洞察是平均 Log Spectrum 的局部线性(local linearity)性质,具体如 Figure 3 所示。可以从图中看出,一幅图像的 Log Spectrum 整体的平滑性更差一些,而 100 条 Log Spectrum 平均的结果更平滑一些,具有作者所说的 局部线性(local linearity)。背后的设想是,如果图像中只有纯背景的话,Log Spectrum 应该平滑且具有局部线性才对(100 条 Log Spectrum 相加是为了近似纯背景的 Log Spectrum,而前面讲的 Log Spectrum 的相似性是为了这里对纯背景的近似提供合理性),恰恰是显著目标的出现破坏了 Log Spectrum 的局部线性。
相似性即意味着冗余性(Similarities imply redundancies),既然图像拥有相同的 Log Spectrum ,那这些相似冗余的东西并不会首先引起我们视觉系统的注意。只有那些频谱中的统计奇异点(Statistical singularities)才对应着异常区域,也就是目标可能存在的区域。
那该怎么找出这些统计奇异点(Statistical singularities)呢?理想的状态当然是含有目标时图像的 Log Spectrum 减去同场景但不包含目标时的 Log Spectrum,但实际中拿到同场景的背景图像几乎不可能,我们要做得,就是只从单幅图像(Log Spectrum)中找出显著区域(Log Spectrum 上的 Statistical singularities)。
那能不能从仅有的包含目标的图像的 Log Spectrum 中估计出背景图像的 Log Spectrum 呢?如果估计的好,那我们就可以用上面相减的套路了。显然,这值得一试。作者在文中是采用均值滤波来估计背景图像的 Log Spectrum。采用均值滤波,除了利用图像背景 Log Spectrum 的局部线性这一性质外,还隐含假设了显著目标的 Statistical singularities 对 Log Spectrum 的干扰是零均值。
由此,通过均值滤波,能够获得对背景图像 Log Spectrum 的估计,而原图像的 Log Spectrum 减去估计的背景图像 Log Spectrum 就得到了显著目标对应的 Log Spectrum,也就是本文题目中所说的 Spectral Residual,对这个 Spectral Residual 做傅里叶反变换即可得到显著区域。
在理清了文章的 idea 后,具体方法的内容也就顺理成章了。本文之所以被引用如此之多,我想除了另辟蹊径从背景估计来做显著性检测之外,还有其算法步骤非常简单的缘故。文章所有步骤只有如下 5 步,分别是计算 频谱幅值、相位、Log Spectrum,Spectrum Residual 和显著性图。
MATLAB 代码也非常简单
myFFT = fft2(inImg);
myLogAmplitude = log(abs(myFFT));
myPhase = angle(myFFT);
mySmooth = imfilter(myLogAmplitude, fspecial('average', 3), 'replicate');
mySpectralResidual = myLogAmplitude - mySmooth;
saliencyMap = abs(ifft2(exp(mySpectralResidual + 1i*myPhase))).^2;
SR算法步骤:
1、 将输入的图像 f(x, y) 变换到频域为 F(f) ,它的相位谱与幅度谱分别记为A(u,v) =F(f)和 ∅(u,
v)=angle(F( f)) ,
2、然后对幅度谱做对数变换记为 L(u,v) =log(A(u,v)),对幅度谱L(U,V)通过与局部均值滤波器h(f)
进行卷积操作后获得的幅度谱为A(f)=h(f)*L(f) ,然后使用包含目标的 LOG 幅度谱与平滑之后的A(f)
幅度谱进行相减即得到了幅度谱残差,其公式如下:R(f) = L(f) – A(f);
3、 相位谱带入傅立叶反变换得到原图的显著图 S(x,y),其公式如下: S(f)= F^(-1) [exp(R(f)+i∙∅(f))]
4、 引入高斯平滑后,上面公式可修改为:S(f)= g*〖|F^(-1) [exp(R(f)+i∙∅(f))]|^2