Python 还能实现图片去雾?FFA 去雾算法、暗通道去雾算法用起来!

您所在的位置:网站首页 去除雾气的 Python 还能实现图片去雾?FFA 去雾算法、暗通道去雾算法用起来!

Python 还能实现图片去雾?FFA 去雾算法、暗通道去雾算法用起来!

2023-12-03 22:44| 来源: 网络整理| 查看: 265

在过去的几十年中,单图像去雾作为基本的低级视觉任务已引起了计算机视觉社区和人工智能公司的越来越多的关注。其中最为典型的便是北大&北航提出FFA-Net去雾新网络和何凯明博士提出的暗通道去雾算法,现所有源码已开源。其论文链接:https://arxiv.org/abs/1911.07559。 而今天我们就将针对这两个项目进行实践。其中得到的去雾效果如下:

作者 | 李秋键

责编 | 晋兆雨

实验前的准备

首先我们使用的python版本是3.6.5所用到的模块如下:

Pytorch模块用来模型训练和网络层建立;其底层和Torch框架一样,但是使用Python重新写了很多内容,不仅更加灵活,支持动态图,而且提供了Python接口。不仅能够实现强大的GPU加速,同时还支持动态神经网络。

numpy模块用来进行数值运算处理矩阵运算;

OpenCV用来读取图片和图像处理;

os模块用来读取数据集等本地文件操作。

FFA去雾算法

其代码结构如下图可见:

FFA-Net体系结构包含三个关键组件:

1.考虑到不同的通道特征包含完全不同的加权信息并且不同图像像素上的雾度分布不均匀,一种新颖的特征注意(FA)模块将通道注意与像素注意机制结合在一起。FA不平等地对待不同的特征和像素,这在处理不同类型的信息时提供了额外的灵活性,从而扩展了CNN的表示能力。

2.基本的块结构包括本地残差学习和功能注意,本地残差学习允许较不重要的信息(例如薄雾区域或低频)通过多个本地残差连接被绕开,让主网络体系结构专注于更有效的信息。

3.基于注意力的不同级别特征融合(FFA)结构,可从特征注意(FA)模块中自适应学习特征权重,从而为重要特征赋予更多权重。这种结构还可以保留浅层信息,并将其传递到深层。

实验结果表明,提出的FFANet在数量和质量上都大大超过了现有的单图像去雾方法,从而将SOTS室内测试数据集上最佳的PSNR度量从30.23db提高到35.77db。

其中训练FFA模型的部分代码如下:

def default_conv(in_channels, out_channels, kernel_size, bias=True): return nn.Conv2d(in_channels, out_channels, kernel_size,padding=(kernel_size//2), bias=bias) class PALayer(nn.Module): def __init__(self, channel): super(PALayer, self).__init__() self.pa = nn.Sequential( nn.Conv2d(channel, channel // 8, 1, padding=0, bias=True), nn.ReLU(inplace=True), nn.Conv2d(channel // 8, 1, 1, padding=0, bias=True), nn.Sigmoid() ) def forward(self, x): y = self.pa(x) return x * y class CALayer(nn.Module): def __init__(self, channel): super(CALayer, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d() self.ca = nn.Sequential( nn.Conv2d(channel, channel // 8, 1, padding=0, bias=True), nn.ReLU(inplace=True), nn.Conv2d(channel // 8, channel, 1, padding=0, bias=True), nn.Sigmoid() ) def forward(self, x): y = self.avg_pool(x) y = self.ca(y) return x * y class Block(nn.Module): def __init__(self, conv, dim, kernel_size,): super(Block, self).__init__() self.conv1=conv(dim, dim, kernel_size, bias=True) self.act1=nn.ReLU(inplace=True) self.conv2=conv(dim,dim,kernel_size,bias=True) self.calayer=CALayer(dim) self.palayer=PALayer(dim) def forward(self, x): res=self.act1(self.conv1(x)) res=res+x res=self.conv2(res) res=self.calayer(res) res=self.palayer(res) res += x return res class Group(nn.Module): def __init__(self, conv, dim, kernel_size, blocks): super(Group, self).__init__() modules = [ Block(conv, dim, kernel_size) for _ in range(blocks)] modules.append(conv(dim, dim, kernel_size)) self.gp = nn.Sequential(*modules) def forward(self, x): res = self.gp(x) res += x return res class FFA(nn.Module): def __init__(self,gps,blocks,conv=default_conv): super(FFA, self).__init__() self.gps=gps self.dim= kernel_size= pre_process = [conv(, self.dim, kernel_size)] assert self.gps== self.g1= Group(conv, self.dim, kernel_size,blocks=blocks) self.g2= Group(conv, self.dim, kernel_size,blocks=blocks) self.g3= Group(conv, self.dim, kernel_size,blocks=blocks) self.ca=nn.Sequential(*[ nn.AdaptiveAvgPool2d(), nn.Conv2d(self.dim*self.gps,self.dim//16,1,padding=0), nn.ReLU(inplace=True), nn.Conv2d(self.dim//16, self.dim*self.gps, 1, padding=0, bias=True), nn.Sigmoid() ]) self.palayer=PALayer(self.dim) post_precess = [ conv(self.dim, self.dim, kernel_size), conv(self.dim, , kernel_size)] self.pre = nn.Sequential(*pre_process) self.post = nn.Sequential(*post_precess) def forward(self, x1): x = self.pre(x1) res1=self.g1(x) res2=self.g2(res1) res3=self.g3(res2) w=self.ca(torch.cat([res1,res2,res3],dim=)) w=w.view(-1,self.gps,self.dim)[:,:,:,None,None] out=w[:,,::]*res1+w[:,,::]*res2+w[:,,::]*res3 out=self.palayer(out) x=self.post(out) return x + x1

使用

python main.py --net='ffa' --crop --crop_size= --blocks=--gps= --bs= --lr=. --trainset='its_train' --testset='its_test' --steps=--eval_step=

命令实现模型的训练功能。

使用

python test.py --task='its or ots' --test_imgs='test_imgs'

来测试模型效果:

最终得到效果如下:

暗通道去雾算法搭建

何恺明的暗通道先验(dark channel prior)去雾算法是CV界去雾领域很有名的算法,关于该算法的论文"Single Image Haze Removal Using DarkChannel Prior"一举获得2009年CVPR最佳论文。作者统计了大量的无雾图像,发现一条规律:每一幅图像的每一个像素的RGB三个颜色通道中,总有一个通道的灰度值很低。基于这个几乎可以视作是定理的先验知识,作者提出暗通道先验的去雾算法。

对于任意一幅输入图像,定义其暗通道的数学表达式为:

文章中介绍的方法是软抠图的方法,此方法过程复杂,速度缓慢,因此采用导向滤波对传输函数进行滤波。导向滤波的原理此处不再赘述,其伪代码为:

1、滤波函数:

定义最小值滤波函数:

def zmMinFilterGray(src, r=): '''if r


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3