篇博客的算法来自于CVPR2024,代码刚刚开源没几天~
原图 | 去雨 | 去雨+检测 |
---|---|---|
如何有效地探索雨痕的多尺度表示对于图像去雨是很重要的。与现有的基于Transformer的方法相比,这些方法主要依赖于单一尺度的雨痕外观,我们开发了一个端到端的多尺度Transformer,利用各种尺度中潜在有用的特征来促进高质量的图像重建。为了更好地探索空间变化的雨痕的常见退化表示,我们在像素坐标上结合了基于尺度内隐式神经表示和退化输入,采用闭环设计,使得学习到的特征有助于去除雨水并提高模型在复杂场景中的鲁棒性。为了确保来自不同尺度的更丰富的协作表示,我们在我们的多尺度Transformer中嵌入了一个简单而有效的尺度间双向反馈操作,通过进行粗到细和细到粗的信息交流。大量实验证明,我们的方法,命名为NeRD-Rain,在合成和真实世界基准数据集上表现优于最先进的方法。
代码地址:cschenxiang/NeRD-Rain: Bidirectional Multi-Scale Implicit Neural Representations for Image Deraining (CVPR 2024) (github.com)https://github.com/cschenxiang/NeRD-Rain
论文地址:2404.01547.pdf (arxiv.org)
论文简介
相关工作
近年来,由于大量深度卷积神经网络(CNN)的发展,图像去雨的研究取得了显著进展。然而,作为 CNN 中的基本操作,卷积是空间不变的,并且具有有限的感受野,不能有效地模拟清晰图像的空间变异特性和非局部结构。此外,仅仅增加网络深度以获得更大的感受野并不总是能够带来更好的性能。为了缓解这个问题,最近的几种方法利用变压器来解决单图像去雨,因为变压器可以模拟非局部信息以更好地恢复图像。尽管这些方法的性能比大多数基于 CNN 的方法更好,但它们大多在固定图像尺度(即单输入单输出架构)上探索特征表示,而忽略了其他尺度可能有用的信息。由于在较粗的图像尺度下雨效果显著减少,探索多尺度表示将有助于去除雨水。
在本文中,我们开发了一种有效的双向多尺度Transformer,采用隐式神经表示来更好地探索多尺度信息并建模复杂的雨滴。考虑到雨滴效应在不同的图像尺度上变化,我们构建了多个不等Transformer分支,每个分支用于学习图像去雨的尺度特定特征。受到隐式神经表示(INR)最近取得的成功启发,能够将图像编码为连续函数,我们进一步在相邻分支之间加入了INR,以从不同的降质输入中学习共同的雨降解表示,使得学习到的特征对复杂和随机的雨滴具有鲁棒性。为了便于在各种尺度上表示雨的外观,我们在INR中采用了两种不同的基于坐标的多层感知器(MLP)(即一个粗糙特征网格和一个细粒度特征网格),以适应复杂的雨特征。此外,为了提高INR的建模能力,我们提出了一种尺度内共享编码器,形成一个闭环框架。请注意,上述两种表示类型(即, 尺度特定和通用的雨滴) 能够互补。
论文贡献
主要贡献总结如下:
- 我们设计了一种有效的多尺度 Transformer,以利用多尺度雨信息生成高质量的去雨结果。
- 我们引入了隐式神经表示来更好地学习常见的雨降解特征,并展示它可以帮助促进去雨并增强在复杂场景中去雨模型的鲁棒性。
- 我们将简单而有效的双向反馈传播操作集成到我们的多尺度 Transformer 中,以实现跨尺度更好的特征交互。
- 对合成和真实世界基准的实验结果表明,我们的方法在性能上表现优于最先进的方法。
为了更好地探索多尺度信息和建模复杂的雨水条纹,我们精心开发了一种有效的双向多尺度 Transformer,采用隐式神经表示(称为 NeRD-Rain),包括一个尺度内 INR 分支和一个尺度间双向分支。前者从多样的多雨图像中学习潜在的退化表示,而后者实现了不同尺度之间更丰富的协作表示。
算法效果
YOLOv8 结合NeRD去雨算法
具体的算法流程如下所示:
大家最好拉到和v8项目同级路径位置:
git clone https://github.com/cschenxiang/NeRD-Rain.git
pip install -r requirements.txt
cd pytorch-gradual-warmup-lr
python setup.py install
cd ..
然后在NeRD-Rain文件夹下新建一个NeRD_v8.py文件,将代码放进去。
完整的代码和权重我都放到了群文件【NeRD_v8_去雨.zip】
部分NeRD_v8.py
def process_image(input_image, weights_path, win_size=256, gpu_device="0"):# 设置GPU设备os.environ["CUDA_VISIBLE_DEVICES"] = gpu_devicetorch.cuda.set_device(int(gpu_device))# 加载模型model_restoration = mynet()utils.load_checkpoint(model_restoration, weights_path)model_restoration.cuda()model_restoration = nn.DataParallel(model_restoration)model_restoration.eval()# 处理图像with torch.no_grad():input_image = input_image.cuda()_, _, Hx, Wx = input_image.shapeinput_re, batch_list = window_partitionx(input_image, win_size)restored = model_restoration(input_re)restored = window_reversex(restored[0], win_size, Hx, Wx, batch_list)restored = torch.clamp(restored, 0, 1)restored = restored.permute(0, 2, 3, 1).cpu().detach().numpy()restored_img = img_as_ubyte(restored[0]) # 假设直接处理的批量大小为1return restored_img
代码里面需要注意的就是 sys.path 这里,这里务必写成你v8项目的绝对路径,以确保可以找到这个项目包。
import syssys.path.append("/Github/YOLOv8-Magic/ultralytics-8.1.0")
运行我的代码后就能看到检测结果了
引用
@InProceedings{NeRD-Rain,author={Chen, Xiang and Pan, Jinshan and Dong, Jiangxin}, title={Bidirectional Multi-Scale Implicit Neural Representations for Image Deraining},booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},month={June},year={2024}
}