YOLOv8结合CVPR2024最新图像增强算法!让你的模型无惧风雨【含端到端推理脚本】

本文主要是介绍YOLOv8结合CVPR2024最新图像增强算法!让你的模型无惧风雨【含端到端推理脚本】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

篇博客的算法来自于CVPR2024,代码刚刚开源没几天~

原图去雨去雨+检测

如何有效地探索雨痕的多尺度表示对于图像去雨是很重要的。与现有的基于Transformer的方法相比,这些方法主要依赖于单一尺度的雨痕外观,我们开发了一个端到端的多尺度Transformer,利用各种尺度中潜在有用的特征来促进高质量的图像重建。为了更好地探索空间变化的雨痕的常见退化表示,我们在像素坐标上结合了基于尺度内隐式神经表示和退化输入,采用闭环设计,使得学习到的特征有助于去除雨水并提高模型在复杂场景中的鲁棒性。为了确保来自不同尺度的更丰富的协作表示,我们在我们的多尺度Transformer中嵌入了一个简单而有效的尺度间双向反馈操作,通过进行粗到细和细到粗的信息交流。大量实验证明,我们的方法,命名为NeRD-Rain,在合成和真实世界基准数据集上表现优于最先进的方法。

代码地址:cschenxiang/NeRD-Rain: Bidirectional Multi-Scale Implicit Neural Representations for Image Deraining (CVPR 2024) (github.com)icon-default.png?t=N7T8https://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}
}

这篇关于YOLOv8结合CVPR2024最新图像增强算法!让你的模型无惧风雨【含端到端推理脚本】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/913064

相关文章

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

OpenManus本地部署实战亲测有效完全免费(最新推荐)

《OpenManus本地部署实战亲测有效完全免费(最新推荐)》文章介绍了如何在本地部署OpenManus大语言模型,包括环境搭建、LLM编程接口配置和测试步骤,本文给大家讲解的非常详细,感兴趣的朋友一... 目录1.概况2.环境搭建2.1安装miniconda或者anaconda2.2 LLM编程接口配置2

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization