暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

⌈ 传知代码 ⌋ 如何穿透模糊,还原图片真实面貌

原创 Dream-Y.ocean 2024-08-13
111

💛前情提要💛

本文是传知代码平台中的相关前沿知识与技术的分享~

接下来我们即将进入一个全新的空间,对技术有一个全新的视角~

本文所涉及所有资源均在传知代码平台可获取

以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦!!!

以下内容干货满满,跟上步伐吧~


📌导航小助手📌


💡本章重点

  • 如何穿透模糊,还原图片真实面貌

🍞一. 图像清晰化的魔法棒

图像去模糊,如同施展了一场视觉的魔法,将原本朦胧、不清晰的图像画面逐渐变得清晰锐利。这项技术利用先进的算法和强大的计算能力,深入图像的本质,分析并恢复因拍摄条件不佳、传输损失或人为处理等原因导致的模糊细节。随着处理过程的推进,图像中的线条和轮廓逐渐鲜明,色彩层次更加丰富,原本难以辨识的信息也变得一目了然。图像去模糊不仅提升了视觉体验,更在多个领域发挥着重要作用,如法律取证、医学影像分析、安全监控等,确保关键信息的准确传递与验证。

下面两张图片左图是模糊图片,右图是对应的清晰图片,可以看出在视觉效果上差别还是挺大的。

在这里插入图片描述

那么如何将一个模糊图片恢复成一个较清晰的图片呢?

下面以2022年的cvpr上的一篇图像恢复的文章Restormer: Efficient Transformer for High-Resolution Image Restoration来详细介绍如何把给定的源码跑通,并且动手使用demo恢复自己想恢复的模糊图像。


🍞二. 论文背景

对于传统 CNN 中,其基本操作是“卷积”,卷积操作为 CNN 提供了局部连接和平移不变性的特性,这些特性为 CNN 带来了效率和泛化性,但它们也产生了两个主要问题:

  • 无序列表卷积算子的感受野有限,无法对长距离像素依赖性进行建模;

  • 无序列表卷积滤波器在推理时具有静态权重,不能灵活地适应输入内容。

为了解决上述缺点,一种更强大和动态的替代方案是自注意力 (SA) 机制,它通过所有其他位置的加权和来计算给定像素的输出特征。在本文中,作者提出了一种用于图像复原的高效 Transformer,它能够对全局连接进行建模,并且仍然适用于大图像。作者从自注意力(SA)、前馈网络(FN)对 transformer 进行改进,并使用一种渐进性学习策略来训练模型。


🍞三.论文思路

引入多 Dconv 头转置注意力(multi-Dconv head transposed attention,MDTA)块来代替具有线性复杂性的普通多头 SA。它跨特征维度而不是空间维度应用 SA,即,MDTA 不是显式建模成对像素交互,而是计算跨特征通道的交叉协方差,以从(关键和查询投影)输入特征获取注意力图。所提出的 MDTA 块的一个重要特征是特征协方差计算之前的局部上下文混合。这是通过使用 1×1 卷积的跨通道上下文的像素级聚合和使用有效的深度卷积(depthwise convolution)的局部上下文的通道级聚合来实现的。这种策略提供了两个关键优势。首先,它强调空间局部上下文,并在通道中引入卷积运算的互补强度。其次,它确保在计算基于协方差的注意力图时隐式建模像素之间的上下文全局关系。

使用门控机制重新制定常规 FN 的第一个线性变换层,以改善通过网络的信息流。 该门控层被设计为两个线性投影层的逐元素乘积,其中一个被 GELU 非线性激活。所提出的门控 Dconv FN (GDFN) 也基于局部内容混合(与 MDTA 模块类似)来同样强调空间上下文。GDFN 中的门控机制控制着哪些互补特征应该向前流动,并允许网络层次结构中后续的层专门关注更精细的图像属性,从而产生高质量的输出。

这篇文章的主要贡献总结如下:

  1. 提出了一种用于高分辨率图像多尺度局部-全局表示学习的编码器-解码器Transformer,该编码器-解码器Transformer无需将高分辨率图像分解成局部窗口,从而利用远程图像上下文;

  2. 提出了一种能够聚合局部和非局部像素交互的多Dconv头转置注意力( MDTA )模块,该模块足以处理高分辨率图像;

  3. 提出了一种新的门控Dconv前馈网络( GDFN ),该网络执行受控的特征转换,即抑制信息量较小的特征,仅允许有用的信息通过网络层次结构进一步传递。


🍞四.模型介绍

算法框图

在这里插入图片描述

上图Transformer模块的核心模块是:( a )多Dconv头转置注意力( Multi-Dconv Head Transpose Attention,MDTA ),它执行跨通道而不是空间维度的查询关键特征交互;( b )门控Dconv前馈网络( Gated-Dconv Feeding Network,GDFN ),它执行受控的特征变换,即允许有用信息进一步传播。
多Dconv头转置注意力(Multi-Dconv Head Transpose Attention,MDTA)

与一般 Transformer 不同的是,论文在自注意力模板进行 token 计算时不是常见的 卷积操作,而是利用深度卷积操作,首先利用 11 卷积升维,再使用 33 分组卷积将特征分为三块,最后进行经典的自注意力计算。

在这里插入图片描述

多头注意力模块的核心代码:

## Multi-DConv Head Transposed Self-Attention (MDTA) class Attention(nn.Module): def __init__(self, dim, num_heads, bias): super(Attention, self).__init__() self.num_heads = num_heads self.temperature = nn.Parameter(torch.ones(num_heads, 1, 1)) #深度卷积dconv代替普通conv self.qkv = nn.Conv2d(dim, dim*3, kernel_size=1, bias=bias) self.qkv_dwconv = nn.Conv2d(dim*3, dim*3, kernel_size=3, stride=1, padding=1, groups=dim*3, bias=bias) self.project_out = nn.Conv2d(dim, dim, kernel_size=1, bias=bias) def forward(self, x): b,c,h,w = x.shape qkv = self.qkv_dwconv(self.qkv(x)) q,k,v = qkv.chunk(3, dim=1) q = rearrange(q, 'b (head c) h w -> b head c (h w)', head=self.num_heads) k = rearrange(k, 'b (head c) h w -> b head c (h w)', head=self.num_heads) v = rearrange(v, 'b (head c) h w -> b head c (h w)', head=self.num_heads) q = torch.nn.functional.normalize(q, dim=-1) k = torch.nn.functional.normalize(k, dim=-1) attn = (q @ k.transpose(-2, -1)) * self.temperature attn = attn.softmax(dim=-1) out = (attn @ v) out = rearrange(out, 'b head c (h w) -> b (head c) h w', head=self.num_heads, h=h, w=w) out = self.project_out(out) return out
  • 门控Dconv前馈网络(Gated-Dconv Feeding Network,GDFN)

作者提出了双路门控网络来取代 FFN,分别进行 11 升维,再利用 33 分组卷积提取特征,随后使用 GELU 激活函数门控,最后 1*1 卷积降维输出。

在这里插入图片描述

门控前反馈网络的核心代码:

## Gated-Dconv Feed-Forward Network (GDFN) class FeedForward(nn.Module): def __init__(self, dim, ffn_expansion_factor, bias): super(FeedForward, self).__init__() hidden_features = int(dim*ffn_expansion_factor) self.project_in = nn.Conv2d(dim, hidden_features*2, kernel_size=1, bias=bias) self.dwconv = nn.Conv2d(hidden_features*2, hidden_features*2, kernel_size=3, stride=1, padding=1, groups=hidden_features*2, bias=bias) self.project_out = nn.Conv2d(hidden_features, dim, kernel_size=1, bias=bias) def forward(self, x): x = self.project_in(x) x1, x2 = self.dwconv(x).chunk(2, dim=1) x = F.gelu(x1) * x2 x = self.project_out(x) return x

使用深度卷积dconv代替传统卷积conv原理(下图是我自己查阅和整理后所绘制的深度卷积如何代替传统卷积的图片)

在这里插入图片描述


🫓总结

综上,我们基本了解了“一项全新的技术啦” 🍭 ~~

恭喜你的内功又双叒叕得到了提高!!!

感谢你们的阅读😆

后续还会继续更新💓,欢迎持续关注📌哟~

💫如果有错误❌,欢迎指正呀💫

✨如果觉得收获满满,可以点点赞👍支持一下哟~✨

【传知科技 – 了解更多新知识】

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论