文章DOI:10.1109/ICCV.2017.511
源代码可以在:AODnet-by-pytorch中找到,其中有些代码过期或者命令行有错误,需要完整能跑的可以留言我看到会回复
卷积神经网络CNN建立的图像去雾模型称为 AOD-Net。基于重新制定的大气散射模型设计的。
优点:
- 不用像之前的大多数模型那样分别估计传输矩阵和大气光,可以直接通过一个轻量级的CNN生成除雾后的图像。
- 基于上述设计可以使AOD-Net更容易嵌入到其他深度学习模型中,例如R-CNN
- 在合成和自然模糊图像数据集上的实现结果表明在PSNR,SSIM和视觉效果方面优于现有技术。
最后还引申了一下和R-CNN连接之后在模糊图像上的目标检测性能有了很大的提高。
该篇文章提出了一个新的一体化端到端的卷积神经网络,可以直接重建去雾图像。同时用了3个指标来评测:PSNR、SSIM和主观测量,同时经过和几种已有的先进方法比较之后,证明了AOD-Net的优越性和鲁棒性以及效率。
同时,还首次研究了AOD网络如何通过联合调整管道来提高自然模糊图像上的目标检测和识别性能。
PSNR 峰值信噪比
- 首先是 M S E MSE MSE,给定大小 m × n m \times n m×n的干净图像 I I I和噪声图像 K K K,均方误差 M S E MSE MSE定义为:
M S E = 1 m n ∑ i = 0 m − 1 ∑ j = 0 n − 1 [ I ( i , j ) − K ( i , j ) ] 2 MSE=\frac{1}{mn} \sum_{i=0}^{m-1} \sum_{j=0}^{n-1}[I(i,j)-K(i,j)]^2 MSE=mn1i=0∑m−1j=0∑n−1[I(i,j)−K(i,j)]2- 接着是 P S N R ( d B ) PSNR(dB) PSNR(dB)定义为:
P S N R = 10 ⋅ l o g 10 ( M A X I 2 M S E ) PSNR=10 \cdot{log}_{10}(\frac{MAX_I^2}{MSE}) PSNR=10⋅log10(MSEMAXI2)- 其中 M A X I 2 MAX_I^2 MAXI2是图片可能的最大像素值。如果每个像素都由8位二进制表示,如果每个像素都由8位二进制来表示,那就是255。通常如果像素值由B位二进制来表示,那么 M A X I = 2 B − 1 MAX_I=2^B-1 MAXI=2B−1
- 如果针对是uint8数据,最大像素值位255,针对浮点型数据,最大像素值位1.
- 如果图像位彩色图像,有3中方法可以计算:
- 分别计算 RGB 三个通道的 PSNR,然后取平均值。
- 计算 RGB 三通道的 MSE ,然后再除以 3 。
- 将图片转化为 YCbCr 格式,然后只计算 Y 分量也就是亮度分量的 PSNR。
SSIM结构相似性
S S I M SSIM SSIM公式基于样本 x x x和 y y y之间的三个比较衡量:亮度 (luminance)、对比度 (contrast) 和结构 (structure)。
l ( x , y ) = 2 μ x μ y + c 1 μ x 2 + μ y 2 + c 1 l(x,y)=\frac{2\mu_x\mu_y+c_1}{\mu_x^2+\mu_y^2+c_1} l(x,y)=μx2+μy2+c12μxμy+c1
c ( x , y ) = 2 σ x σ y + c 2 σ x 2 + σ y 2 + c 2 c(x,y)=\frac{2\sigma_x\sigma_y+c_2}{\sigma_x^2+\sigma_y^2+c_2} c(x,y)=σx2+σy2+c22σxσy+c2
s ( x , y ) = σ x y + c 3 σ x σ y + c 3 s(x,y)=\frac{\sigma_{xy}+c_3}{\sigma_x\sigma_y+c_3} s(x,y)=σxσy+c3σxy+c3
一般取 c 3 = c 2 / 2 c_3=c_2/2 c3=c2/2
- μ x \mu_x μx为x的均值
- μ y \mu_y μy为y的均值
- σ x \sigma_x σx为x的方差
- σ y \sigma_y σy为y的方差
- σ x y \sigma_{xy} σxy为x,y的协方差
那么
S S I M ( x , y ) = [ l ( x , y ) α ⋅ c ( x , y ) β ⋅ s ( x , y ) γ ] SSIM(x,y)=[l(x,y)^\alpha\cdot c(x,y)^\beta \cdot s(x,y)^\gamma] SSIM(x,y)=[l(x,y)α⋅c(x,y)β⋅s(x,y)γ]
将 α , β , γ \alpha,\beta,\gamma α,β,γ设为 1,可以得到
S S I M ( x , y ) = ( 2 μ x μ y + c 1 ) ( 2 σ x y + c 2 ) ( μ x 2 + μ x 2 + c 1 ) ( σ x 2 + σ y 2 + c 2 ) SSIM(x,y)=\frac{(2\mu_x\mu_y+c_1)(2\sigma_{xy}+c_2)}{(\mu_x^2+\mu_x^2+c_1)(\sigma_x^2+\sigma_y^2+c_2)} SSIM(x,y)=(μx2+μx2+c1)(σx2+σy2+c2)(2μxμy+c1)(2σxy+c2)
每次计算的时候都从图片上取一个 N × N N\times N N×N的窗口,然后不断滑动窗口进行计算,最后取平均值作为全局的 SSIM。
介绍了雾霾的背景和自己提出的一个AOD-Net网络
大气散射模型
I ( x ) = J ( x ) t ( x ) + A ( 1 − t ( x ) ) I(x)=J(x)t(x)+A(1-t(x)) I(x)=J(x)t(x)+A(1−t(x))
I ( x ) I(x) I(x)即输出的雾霾图像, J ( x ) J(x) J(x)即要恢复的场景亮度或者说是干净图像,剩下即是两个关键参数
A A A是全球大气光, t ( x ) t(x) t(x)是传输矩阵
而 t ( x ) t(x) t(x)定义为: t ( x ) = e − β d ( x ) t(x)=e^{-\beta d(x)} t(x)=e−βd(x)
其中 β \beta β是大气的散射系数, d ( x ) d(x) d(x)是物体和相机之间的距离(distance)
公式更改
在该节中会进行转换大气散射模型,并基于此设计了AOD-Net,然后详细介绍了AOD网络的结构,同时会进行嵌入到其他深度学习模型
基于 I ( x ) = J ( x ) t ( x ) + A ( 1 − t ( x ) ) I(x)=J(x)t(x)+A(1-t(x)) I(x)=J(x)t(x)+A(1−t(x)),转化为
J ( x ) = 1 t ( x ) I ( x ) − A 1 t ( x ) + A J(x)=\frac{1}{t(x)}I(x)-A\frac{1}{t(x)}+A J(x)=t(x)1I(x)−At(x)1+A
同时,之前的方法是分别估计t(x)并通过 J ( x ) = 1 t ( x ) I ( x ) − A 1 t ( x ) + A J(x)=\frac{1}{t(x)}I(x)-A\frac{1}{t(x)}+A J(x)=t(x)1I(x)−At(x)1+A来获得去雾后图像。并不是直接重建误差最小化在 J ( x ) J(x) J(x)上,而是优化 t ( x ) t(x) t(x)的质量,这样间接优化会导致次优解。本文核心思想是将两个参数 t ( x ) t(x) t(x)和 A A A统一成一个公式,即 K ( x ) K(x) K(x),并且直接在图像像素域上最小化重建误差,将 J ( x ) = 1 t ( x ) I ( x ) − A 1 t ( x ) + A J(x)=\frac{1}{t(x)}I(x)-A\frac{1}{t(x)}+A J(x)=t(x)1I(x)−At(x)1+A的公式直接表示为
J ( x ) = K ( x ) I ( x ) − K ( x ) + b J(x)=K(x)I(x)-K(x)+b J(x)=K(x)I(x)−K(x)+b
K ( x ) = 1 t ( x ) ( I ( x ) − A ) + ( A − b ) I ( x ) − 1 K(x)=\frac{\frac{1}{t(x)}(I(x)-A)+(A-b)}{I(x)-1} K(x)=I(x)−1t(x)1(I(x)−A)+(A−b)
用这种方式, 1 t ( x ) \frac{1}{t(x)} t(x)1和 A A A都被整合到 K ( x ) K(x) K(x)中,b作为默认值为1的常数偏差。由于 K ( x ) K(x) K(x)被独立于出 I ( x ) I(x) I(x)后,因此我们的目标是建立一个输入自适应的深度模型,并且最小化输出 J ( x ) J(x) J(x)
网络设计
AOD-Net设计有两部分组成:
- 一个是K-估计模型用5个卷积层取估计K(x)的值
- 接着是一个图像生成模块,该模块是由一个element-wise乘法层和几个element-wise加法层组成用来恢复图像。
- K估计模块是AOD-Net的关键组成,用于估计深度和相对雾霾级别。使用了五个卷积层,通过融合不同大小的滤波器形成多尺度特征。Dehaze-Net使用了不同大小的滤波器进行并行卷积。MSCNN将粗尺度网络特征和细尺度网络的中间层连接起来。
受上述论文的启发,AOD-Net的concat1层将conv1和conv2层的功能连接,concat2层connect conv2 and conv3,而concat3层将conv1,conv2,conv3,conv4连接。同时该文章也尝试了不使用concat操作,得到的结果却比连接的差了许多。同时,AOD-Net每个卷积层都只用了3个过滤器,这是该模型轻量的原因。
大多数的图像恢复深度学习方法都完全包含了最终建模:训练模型来从损坏的图像恢复干净的图像。相比之下,深度学习去雾的模型却不够完善。需要知道,雾霾本质上就是带来非均匀的、依赖信号的噪声,雾霾引起的表面的场景衰减与拍摄到的场景和相机之间的距离相关。与常见的图像退化模型不同,表面和相机之间的物理距离(像素深度)会假设信号独立于噪声,在这种情况下,所有信号都会经历相同的参数化退化过程。前者的恢复模型可以很轻松的建模基于一个静态映射功能,但是不能直接适用于去雾,降噪过程会因为信号而异,回复模型也必须是自适应的- 该模型也可以与其他的计算机视觉高级任务相结合,例如:目标检测和物体识别及视觉语义学等。
其他模型进行对比的一些评估数值
该段是来阐述用该模型于目标检测和物体识别效果,这个还是很有实践意义的,比如在无人驾驶领域,可以去雾后进行物体识别判断距离和一些物体,是否需要避开等。
我的代码上传到Github了,怎么使用如下图展示:
比如说我的路径都是D:\Chrome-Down\AODnet-by-pytorch-master下的:
1.先进入make_dataset文件夹:
cd make_dataset
2.然后打开选取绝对路径,这里需要注意的是复制的路径请记得用/而不是反斜杠\,这一步会生成室内有雾和无雾图片,路径记得先创建好
python create_train.py --nyu {Your NYU Depth V2 path} --dataset {Your trainset path}
python random_select.py --trainroot {Your trainset path} --valroot {Your valset path}
这里报错原因是我生成的数量不够,上面的作为一个示范,生成才10份h5文件。但是注意已经转移过来了到my_test文件夹里面了。
python train.py --dataroot {Your trainset path} --valDataroot {Your valset path} --cuda
5.测试结果
$ python test.py --input_image /test/canyon1.jpg --model /model_pretrained/AOD_net_epoch_relu_10.pth --output_filename /result/canyon1_dehaze.jpg --cuda