AI科技大本营|Python 还能实现图片去雾?FFA 去雾算法、暗通道去雾算法用起来! | 附代码( 二 )


nn.Sigmoid
)
def forward( self, x):
y = self.avg_pool(x)
y = self.ca(y)
returnx * y
classBlock(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
returnres
classGroup(nn.Module):
def __init__( self, conv, dim, kernel_size, blocks):
super(Group, self).__init__
modules = [ Block(conv, dim, kernel_size) for_ inrange(blocks)]
modules.append(conv(dim, dim, kernel_size))
self.gp = nn.Sequential(*modules)
【AI科技大本营|Python 还能实现图片去雾?FFA 去雾算法、暗通道去雾算法用起来! | 附代码】def forward( self, x):
res = self.gp(x)
res += x
returnres
classFFA(nn.Module):
def __init__( self,gps,blocks,conv=default_conv):
super(FFA, self).__init__
self.gps=gps
self.dim= 64
kernel_size= 3
pre_process = [conv( 3, self.dim, kernel_size)]
assert self.gps== 3
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( 1),
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, 3, 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= 1))
w=w.view( -1, self.gps, self.dim)[:,:,:,None,None]
out=w[:, 0,::]*res1+w[:, 1,::]*res2+w[:, 2,::]*res3
out= self.palayer( out)
x= self.post( out)
returnx + x1
使用
pythonmain.py --net= 'ffa'--crop --crop_size= 240--blocks= 19--gps= 3--bs= 2--lr= 0. 0001--trainset= 'its_train'--testset= 'its_test'--steps= 500000--eval_step= 5000
命令实现模型的训练功能 。
使用
pythontest.py --task= 'its or ots'--test_imgs= 'test_imgs'
来测试模型效果:
最终得到效果如下:
AI科技大本营|Python 还能实现图片去雾?FFA 去雾算法、暗通道去雾算法用起来! | 附代码
本文插图

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


推荐阅读