边界感知分治:基于扩散模型的无监督阴影去除方案
一、阴影去除痛点
- 有监督方法太费人力:要让 AI 学 “去影子”,得给它看大量 “带影子的图 + 对应的无影子图”,标注成本极高,而且 AI 只会处理它学过的影子场景,遇到新场景(比如夕阳下的长影子)就歇菜;
- 无监督方法效果差:不用标注的方法(比如靠 GAN 生成),要么得找一堆无影子图当参考,要么生成的无影子图会 “瞎编细节”(比如把影子里的地面纹理改成不存在的图案)。
这篇论文提出的BCDiff 模型,就是要解决这两个问题:它不用 “影子 - 无影子” 配对图,只看带影子的图就能去掉影子,还能避免颜色怪、有痕迹的问题。
二、核心思路
1. 区域划分 —— 先搞清楚 “要处理哪类影子”
BCDiff 先把带影子的图分成三部分(如图 2),就像给影子 “画地图”:
- 非影子区:比如阳光直射的地面,这部分不用修,是 AI 的 “参考标准”;
- 影子边缘区(半影):影子和非影子的过渡带,光照变化复杂,但离非影子区近,有参考信息;
- 影子中心区(本影):影子最黑的地方,离非影子区远,没什么参考信息,容易修糊。
为什么要这么分?因为不同区域的 “修复难度” 不一样:边缘区需要精准衔接非影子区,中心区需要还原隐藏的细节,分开处理才能兼顾两边。
2. 扩散模型 —— 用 “自然图像生成能力” 修影子
扩散模型就像 “给模糊图慢慢卸妆”:从一张全是噪声的图开始,一步步去掉噪声,最后生成清晰的图(比如 AI 画图工具 Stable Diffusion 的核心技术)。BCDiff 没有从零训练扩散模型,而是用了一个 “预训练好的扩散模型”(已经学过怎么生成自然图像),省了大量时间。
它用扩散模型的方式很聪明:
- 对非影子区:不瞎改,只加一点点噪声,保留原本的样子(毕竟这是参考标准);
- 对影子区(边缘 + 中心):让扩散模型根据非影子区的光照、颜色,生成和周围一致的无影子内容。比如非影子区地面是浅灰色,扩散模型就不会把影子区生成白色。
为了避免影子区和非影子区光照不一致,BCDiff 还加了个 “光照约束”:让 AI 计算非影子区的平均亮度,再强迫影子区生成的亮度向这个平均值靠拢,比如非影子区亮度是 0.8(0 最暗、1 最亮),影子区就不能生成 0.3 的暗部。
3. 反射率维护 —— 不让细节 “凭空消失”
影子只会让物体 “变暗”,不会改变物体本身的纹理(比如影子里的地砖还是方的,不会变成圆的)。这个 “不变的纹理” 在计算机视觉里叫 “反射率”(物体固有的颜色和结构),BCDiff 专门设计了SIID 模块(影子不变内在分解)来提取反射率,相当于给 AI “记笔记”:
- 先从带影子的图里提取 “反射率图”(比如地砖的纹理、墙面的花纹)和 “光照图”(哪里亮、哪里暗);
- 修复影子时,不管是边缘区还是中心区,都用原始的反射率图当 “模板”,只调整光照 —— 比如影子中心区的地砖纹理,必须和非影子区的地砖纹理一样,只把亮度提上来。
怎么训练 SIID 模块?BCDiff 很巧妙:它给同一张带影子的图 “加戏”—— 在非影子区模拟出 4 种不同的影子(比如有的浅、有的深),让 SIID 学习 “不管影子怎么变,物体纹理(反射率)不变”。这样 SIID 就能精准提取反射率,不会把纹理修歪。
4. 整体流程:三步拼出无影子图
BCDiff 的工作流程就像 “拼乐高”,分三步完成:
- 分区域生成:用扩散模型分别处理非影子区(保留原样)和影子区(生成无影子内容),拼出一张 “初步无影子图”;
- 修细节:用 SIID 模块提取反射率,修正初步图里的错误 —— 比如影子中心区修糊了,就用原始反射率把纹理补回来;
- 迭代优化:重复前两步 250 次(类似画画时反复修改),每次都让图更自然,最后输出最终的无影子图。
三、实验验证
论文用了 ISTD 数据集(1870 张带影子的图)做测试,从 “看效果”“算分数”“查细节” 三个方面验证:
1. 看效果:没有痕迹,颜色自然
- 对比无监督方法:比如 G2R 模型修完后,影子边缘会有一条亮线;BCDiff 修完的图,影子区和非影子区衔接得看不出来,比如树影边缘的地面颜色和非影子区完全一致(如图 5);
- 对比有监督方法:比如 SP+M-Net 模型会把影子区提亮过度,导致地面颜色偏白;BCDiff 的亮度和非影子区一致,更自然(如图 5);
- 视频测试:把 BCDiff 用到视频阴影去除上(比如监控视频里行人的影子),它能稳定去掉影子,不会出现帧与帧之间的颜色跳动(表 3)。
2. 算分数:关键指标都是无监督第一
论文用三个指标打分(分数越优越好):
- PSNR:衡量清晰度,分数越高越清晰;
- SSIM:衡量和真实无影子图的相似度,分数越高越像;
- RMSE:衡量颜色误差,分数越低颜色越一致。
在 ISTD 测试集上,BCDiff 的影子区 PSNR 达到 35.91dB,比最好的无监督方法 G2R(33.58dB)高 2.33dB;全图 RMSE 低至 3.3,仅比有监督方法 SP+M-Net(3.5)差一点点 —— 也就是说,不用标注的 BCDiff,效果快赶上需要标注的方法了(表 1)。
3. 查细节:每个工具都不可或缺
论文做了 “ablation 实验”(去掉某个工具看效果),证明每个工具都有用:
- 去掉扩散模型:只用 SIID 模块,修完的图会有明显的影子边缘痕迹,PSNR 从 32.73dB 降到 31.89dB;
- 去掉反射率维护:影子中心区的纹理会完全糊掉,PSNR 骤降到 26.01dB,相当于 “瞎修”;
- 去掉光照约束:影子区和非影子区亮度差很大,比如非影子区亮、影子区暗,颜色不一致。
四、总结:这篇论文的价值和小缺点
1. 核心贡献:给无监督阴影去除提了新思路
- 第一次用 “预训练扩散模型” 做无监督阴影去除,不用配对标注,大大降低了成本;
- 提出 “分区域处理” 和 “反射率维护”,解决了过去无监督方法 “有痕迹、瞎编细节” 的问题;
- 不仅能处理图片,还能扩展到视频,泛化能力强。
2. 目前的小缺点
- 依赖影子掩码:需要先告诉 AI “哪里是影子”(比如用其他工具生成影子框),如果影子框不准,修图效果会变差;
- 速度慢:修一张 256×256 的图需要 3 秒(用 RTX A5000 显卡),比轻量模型慢,没法实时处理视频;
- 极端场景不行:遇到全图都是深影子的图(比如地下室里的影子),反射率提取会出错,修完还是有点糊。