deblurGAN-v2 去模糊深度学习算法。
https://blog.csdn.net/weixin_42784951/article/details/100168882
論文:https://arxiv.org/pdf/1908.03826.pdf
代碼:https://github.com/TAMU-VITA/DeblurGANv2
abstract
我們提出了一個(gè)名為DeblurGAN-v2的端到端的生成對(duì)抗網(wǎng)絡(luò),它對(duì)于去模糊產(chǎn)生了非常好的性能。DeblurGAN-v2基于conditional GAN(帶有兩個(gè)判別器)。我們將特征金字塔網(wǎng)絡(luò)結(jié)構(gòu)作為DeblurGAN-v2生成器的核心構(gòu)建塊。 它可以靈活地與各種backbone配合使用,在性能和效率之間取得平衡。如果使用復(fù)雜的backbone(如Inception-ResNet-v2)可以得到非常好的去模糊效果。同時(shí),若使用輕量的backbone(e.g., MobileNet and its variants) ,DeblurGAN-v2比最接近的競(jìng)爭(zhēng)對(duì)手快10到100倍,同時(shí)保持接近最先進(jìn)的結(jié)果,這意味著可以選擇實(shí)時(shí)視頻去模糊。
Introduction
本文以DeblurGAN的成功為基礎(chǔ),旨在再次大力推動(dòng)基于GAN的運(yùn)動(dòng)去模糊。 我們引入了一個(gè)新的框架DeblurGAN-v2來改進(jìn)DeblurGAN,并且在質(zhì)量效率范圍內(nèi)實(shí)現(xiàn)高度靈活性。 我們的創(chuàng)新總結(jié)如下:
Framework Level : 我們構(gòu)建了一個(gè)用于去模糊的新條件GAN框架。 對(duì)于生成器,我們將特征金字塔網(wǎng)絡(luò)(FPN)(最初用于目標(biāo)檢測(cè))引入到圖像恢復(fù)任務(wù)中。 對(duì)于鑒別器,我們采用 relativistic discriminator ,并且使用最小均方損失在兩個(gè)尺度上分別進(jìn)行評(píng)估。
Backbone Level : 在生成器部分選擇不同的 backbone 會(huì)有不同的去模糊效果。如果想得到最好的去模糊效果,我們使用復(fù)雜的 backbone : Inception-ResNet-v2 。 如果想得到更高的效率 ,我們使用清量的backbone : MobileNet, 并進(jìn)一步創(chuàng)建他的變形:具有深度可分離卷積的 MobileNet-DSC。很明顯后面兩個(gè)具有更快的速度。
Experiment Level : 我們?cè)谌齻€(gè)流行的基準(zhǔn)測(cè)試中展示了非常廣泛的實(shí)驗(yàn),以展示DeblurGANv2實(shí)現(xiàn)的最先進(jìn)(或接近)性能(PSNR,SSIM和感知質(zhì)量)。 在效率方面,DeblurGAN-v2與MobileNet-DSC的速度比DeblurGAN快21倍[21],比[33,45]快100多倍,模型尺寸僅為4 MB,這意味著可能實(shí)現(xiàn) 時(shí)間視頻去模糊。 我們還對(duì)真實(shí)模糊圖像的去模糊質(zhì)量進(jìn)行了主觀研究。 最后,我們展示了我們的模型在一般圖像恢復(fù)中的潛力,因?yàn)樗哂蓄~外的靈活性。
DeblurGAN-v2 Architecture
DeblurGAN-v2 結(jié)構(gòu)如下圖所示,通過對(duì)生成器的訓(xùn)練,可以從一張模糊圖像中恢復(fù)清晰圖像。
Feature Pyramid Deblurring
FPN框架最初用于目標(biāo)檢測(cè)。它生成多個(gè)特征映射層,這些特征映射層編碼不同的語義并包含更好的質(zhì)量信息。 FPN包括自下而上和自上而下的路徑。 自下而上的路徑是用于特征提取的卷積網(wǎng)絡(luò),在從下往上的過程中空間分辨率被下采樣。但是可以提取和壓縮更多的語義特征信息。另一方面,通過自上往下的路徑, FPN可以重建特征信息。自下而上和自上而下通道之間的橫向連接補(bǔ)充了高分辨率細(xì)節(jié)并有助于定位物體。
我們的架構(gòu)由一個(gè)FPN骨干網(wǎng)組成,我們從中獲取五個(gè)不同尺度的最終特征圖作為輸出。這些特征稍后被上采樣到輸入大小的1/4并連接成一個(gè)張量,其包含不同級(jí)別的語義信息。我們?cè)诰W(wǎng)絡(luò)的最后添加一個(gè)上采樣層和一個(gè)卷積層來恢復(fù)清晰圖像和去偽影。我們引入了從輸入到輸出的跳躍連接,以便學(xué)習(xí)重點(diǎn)關(guān)注殘差。
對(duì)應(yīng)代碼分析:
? ? def forward(self, x):
? ? ?? ?
? ? ?? ?### 提取特征層
? ? ? ? map0, map1, map2, map3, map4 = self.fpn(x)
?? ??? ?
?? ??? ?###對(duì)不同的特征上采樣
? ? ? ? map4 = nn.functional.upsample(self.head4(map4), scale_factor=8, mode="nearest")
? ? ? ? map3 = nn.functional.upsample(self.head3(map3), scale_factor=4, mode="nearest")
? ? ? ? map2 = nn.functional.upsample(self.head2(map2), scale_factor=2, mode="nearest")
? ? ? ? map1 = nn.functional.upsample(self.head1(map1), scale_factor=1, mode="nearest")
?? ??? ?
?? ??? ?并接map1- map4
? ? ? ? smoothed = self.smooth(torch.cat([map4, map3, map2, map1], dim=1))
? ? ? ??
? ? ? ? smoothed = nn.functional.upsample(smoothed, scale_factor=2, mode="nearest")
? ? ? ? smoothed = self.smooth2(smoothed + map0)
? ? ? ? smoothed = nn.functional.upsample(smoothed, scale_factor=2, mode="nearest")
? ? ? ? final = self.final(smoothed)
? ? ? ??
? ? ? ? 得到輸出結(jié)果
? ? ? ? res = torch.tanh(final) + x
? ? ? ? return torch.clamp(res, min = -1,max = 1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
首先提取圖片不同尺度的的特征映射:
map0, map1, map2, map3, map4 = self.fpn(x)
1
其中self.fpn(x)對(duì)應(yīng)函數(shù)如下:
? ? def forward(self, x):
? ? ? ? # Bottom-up pathway, from ResNet
? ? ? ? enc0 = self.enc0(x)
? ? ? ? enc1 = self.enc1(enc0) # 256
? ? ? ? enc2 = self.enc2(enc1) # 512
? ? ? ? enc3 = self.enc3(enc2) # 1024
? ? ? ? enc4 = self.enc4(enc3) # 2048
? ? ? ? # Lateral connections
? ? ? ? lateral4 = self.pad(self.lateral4(enc4))
? ? ? ? lateral3 = self.pad(self.lateral3(enc3))
? ? ? ? lateral2 = self.lateral2(enc2)
? ? ? ? lateral1 = self.pad(self.lateral1(enc1))
? ? ? ? lateral0 = self.lateral0(enc0)
? ? ? ? # Top-down pathway
? ? ? ? pad = (1, 2, 1, 2) ?# pad last dim by 1 on each side
? ? ? ? pad1 = (0, 1, 0, 1)
? ? ? ? map4 = lateral4
? ? ? ? map3 = self.td1(lateral3 + nn.functional.upsample(map4, scale_factor=2, mode="nearest"))
? ? ? ? map2 = self.td2(F.pad(lateral2, pad, "reflect") + nn.functional.upsample(map3, scale_factor=2, mode="nearest"))
? ? ? ? map1 = self.td3(lateral1 + nn.functional.upsample(map2, scale_factor=2, mode="nearest"))
? ? ? ? return F.pad(lateral0, pad1, "reflect"), map1, map2, map3, map4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
其中 self.enc0 ------ self.enc4 為首先對(duì)特征進(jìn)行卷積,然后進(jìn)行池化,然后的到不同的特征,如圖:
self.enc0 = self.inception.conv2d_1a
? ? ? ? self.enc1 = nn.Sequential(
? ? ? ? ? ? self.inception.conv2d_2a,
? ? ? ? ? ? self.inception.conv2d_2b,
? ? ? ? ? ? self.inception.maxpool_3a,
? ? ? ? ) # 64
? ? ? ? self.enc2 = nn.Sequential(
? ? ? ? ? ? self.inception.conv2d_3b,
? ? ? ? ? ? self.inception.conv2d_4a,
? ? ? ? ? ? self.inception.maxpool_5a,
? ? ? ? ) ?# 192
? ? ? ? self.enc3 = nn.Sequential(
? ? ? ? ? ? self.inception.mixed_5b,
? ? ? ? ? ? self.inception.repeat,
? ? ? ? ? ? self.inception.mixed_6a,
? ? ? ? ) ? # 1088
? ? ? ? self.enc4 = nn.Sequential(
? ? ? ? ? ? self.inception.repeat_1,
? ? ? ? ? ? self.inception.mixed_7a,
? ? ? ? )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FPN網(wǎng)絡(luò)原理:
我們知道低層的特征語義信息比較少,但是目標(biāo)位置準(zhǔn)確;高層的特征語義信息比較豐富,但是目標(biāo)位置比較粗略。另外雖然也有些算法采用多尺度特征融合的方式,但是一般是采用融合后的特征做預(yù)測(cè), FPN不一樣的地方在于預(yù)測(cè)是在不同特征層獨(dú)立進(jìn)行的。 如上面介紹的那樣, FPN結(jié)構(gòu)經(jīng)過不同次數(shù)的卷積等處理就可以得到不同的特征層信息。
FPN結(jié)構(gòu)對(duì)比:
?a、 圖像金字塔,即將圖像做成不同的scale,然后不同scale的圖像生成對(duì)應(yīng)的不同scale的特征。這種方法的缺點(diǎn)在于增加了時(shí)間成本。有些算法會(huì)在測(cè)試時(shí)候采用圖像金字塔。
?b、 像SPP net,Fast RCNN,Faster RCNN是采用這種方式,即僅采用網(wǎng)絡(luò)最后一層的特征。
?c、 像SSD(Single Shot Detector)采用這種多尺度特征融合的方式,沒有上采樣過程,即從網(wǎng)絡(luò)不同層抽取不同尺度的特征做預(yù)測(cè),這種方式不會(huì)增加額外的計(jì)算量。作者認(rèn)為SSD算法中沒有用到足夠低層的特征(在SSD中,最低層的特征是VGG網(wǎng)絡(luò)的conv4_3),而在作者看來足夠低層的特征對(duì)于檢測(cè)小物體是很有幫助的
?d、FPN結(jié)構(gòu) 頂層特征通過上采樣和低層特征做融合,而且每層都是獨(dú)立預(yù)測(cè)的。
如下圖所示:
上圖(a)中的方法即為常規(guī)的生成一張圖片的多維度特征組合的經(jīng)典方法。即對(duì)某一輸入圖片我們通過壓縮或放大從而形成不同維度的圖片作為模型輸入,使用同一模型對(duì)這些不同維度的圖片分別處理后,最終再將這些分別得到的特征(feature maps)組合起來就得到了我們想要的可反映多維度信息的特征集。此種方法缺點(diǎn)在于需要對(duì)同一圖片在更改維度后輸入處理多次,因此對(duì)計(jì)算機(jī)的算力及內(nèi)存大小都有較高要求。
圖(b)中的方法則只拿單一維度的圖片做為輸入,然后經(jīng)CNN模型處理后,拿最終一層的feature maps作為最終的特征集。顯然此種方法只能得到單一維度的信息。優(yōu)點(diǎn)是計(jì)算簡(jiǎn)單,對(duì)計(jì)算機(jī)算力及內(nèi)存大小都無過高需求。此方法為大多數(shù)R-CNN系列目標(biāo)檢測(cè)方法所用像R-CNN/Fast-RCNN/Faster-RCNN等。因此最終這些模型對(duì)小維度的目標(biāo)檢測(cè)性能不是很好。
圖?中的方法同樣是拿單一維度的圖片做為輸入,不過最終選取用于接下來分類或檢測(cè)任務(wù)時(shí)的特征組合時(shí),此方法不只選用了最后一層的high level feature maps,同樣也會(huì)選用稍靠下的反映圖片low level 信息的feature maps。然后將這些不同層次(反映不同level的圖片信息)的特征簡(jiǎn)單合并起來(一般為concat處理),用于最終的特征組合輸出。此方法可見于SSD當(dāng)中。不過SSD在選取層特征時(shí)都選用了較高層次的網(wǎng)絡(luò)。比如在它以VGG16作為主干網(wǎng)絡(luò)的檢測(cè)模型里面所選用的最低的Convolution的層為Conv4,這樣一些具有更低級(jí)別信息的層特征像Conv2/Conv3就被它給漏掉了,于是它對(duì)更小維度的目標(biāo)檢測(cè)效果就不大好。
圖(d)中的方法同圖?中的方法有些類似,也是拿單一維度的圖片作為輸入,然后它會(huì)選取所有層的特征來處理然后再聯(lián)合起來做為最終的特征輸出組合。(作者在論文中拿Resnet為實(shí)例時(shí)并沒選用Conv1層,那是為了算力及內(nèi)存上的考慮,畢竟Conv1層的size還是比較大的,所包含的特征跟直接的圖片像素信息也過于接近)。另外還對(duì)這些反映不同級(jí)別圖片信息的各層自上向下進(jìn)行了再處理以能更好地組合從而形成較好的特征表達(dá)(詳細(xì)過程會(huì)在下面章節(jié)中進(jìn)一步介紹)。而此方法正是我們本文中要講的FPN CNN特征提取方法。
FPN結(jié)構(gòu)原理:
作者的算法大致結(jié)構(gòu)如下圖: 一個(gè)自底向上的線路,一個(gè)自頂向下的線路,橫向連接(lateral connection)。圖中放大的區(qū)域就是橫向連接,這里1*1的卷積核的主要作用是減少卷積核的個(gè)數(shù),也就是減少了feature map的個(gè)數(shù),并不改變feature map的尺寸大小。
自底向上其實(shí)就是網(wǎng)絡(luò)的前向過程。在前向過程中,feature map的大小在經(jīng)過某些層后會(huì)改變,而在經(jīng)過其他一些層的時(shí)候不會(huì)改變,作者將不改變feature map大小的層歸為一個(gè)stage,因此每次抽取的特征都是每個(gè)stage的最后一個(gè)層輸出,這樣就能構(gòu)成特征金字塔。
自頂向下的過程采用上采樣(upsampling)進(jìn)行,而橫向連接則是將上采樣的結(jié)果和自底向上生成的相同大小的feature map進(jìn)行融合(merge)。在融合之后還會(huì)再采用3*3的卷積核對(duì)每個(gè)融合結(jié)果進(jìn)行卷積,目的是消除上采樣的混疊效應(yīng)(aliasing effect)。并假設(shè)生成的feature map結(jié)果是P2,P3,P4,P5,和原來自底向上的卷積結(jié)果C2,C3,C4,C5一一對(duì)應(yīng)。
https://blog.csdn.net/weixin_42784951/article/details/100168882
總結(jié)
以上是生活随笔為你收集整理的deblurGAN-v2 去模糊深度学习算法。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: select Java Aplicati
- 下一篇: 研究型论文_基于机器学习和深度学习的不平