SRCNN通過三個卷積層來完成對圖像的超分,也就是特征提取俱箱、特征映射和圖像重建国瓮。
但是其輸入需要預(yù)先插值為目標(biāo)尺寸,在速度上有一定的缺陷狞谱,難以應(yīng)用到實時的研究中乃摹,因此Dong等人(SRCNN的第一作者)又改進(jìn)了SRCNN,于是有了FSRCNN跟衅,其中的F代表Fast孵睬。
原文摘要
As a successful deep model applied in image super-resolution
(SR), the Super-Resolution Convolutional Neural Network (SRCNN)
has demonstrated superior performance to the previous hand-
crafted models either in speed and restoration quality. However, the high
computational cost still hinders it from practical usage that demands
real-time performance (24 fps). In this paper, we aim at accelerating the
current SRCNN, and propose a compact hourglass-shape CNN struc-
ture for faster and better SR. We re-design the SRCNN structure mainly
in three aspects. First, we introduce a deconvolution layer at the end
of the network, then the mapping is learned directly from the original
low-resolution image (without interpolation) to the high-resolution one.
Second, we reformulate the mapping layer by shrinking the input feature
dimension before mapping and expanding back afterwards. Third, we
adopt smaller filter sizes but more mapping layers. The proposed model
achieves a speed up of more than 40 times with even superior restora-
tion quality. Further, we present the parameter settings that can achieve
real-time performance on a generic CPU while still maintaining good
performance. A corresponding transfer strategy is also proposed for fast
training and testing across different upscaling factors.
其新的網(wǎng)絡(luò)架構(gòu)為:
對于原來的SRCNN,其改進(jìn)主要有:
- 在網(wǎng)絡(luò)的最后加上了一個deconvolution層伶跷,也就是用來上采樣掰读,這樣子輸入的圖像就不用先進(jìn)行插值操作了秘狞,可以直接輸入LR圖像,然后得到HR圖像蹈集;
- 對于中間的特征映射層烁试,采用先收縮特征維,然后再展開的方式來進(jìn)行拢肆;
- 用更小的卷積核减响、更多的特征映射層;
- 激活函數(shù)使用帶參數(shù)的ReLU善榛,也就是PReLU辩蛋;
模型代碼
之前講過呻畸,用Pytorch寫代碼就是搭積木移盆,看著網(wǎng)絡(luò)結(jié)構(gòu)一點點寫就好,下面這行圖更清晰點(來自參考鏈接【2】):
其結(jié)構(gòu)就像是一個沙漏伤为,整體上是對稱的咒循,兩端比較粗,中間比較細(xì)绞愚。
Interestingly, the new structure looks like an hourglass, which is symmetri-
cal on the whole, thick at the ends, and thin in the middle.
class FSRCNN(nn.Module):
def __init__(self, inchannels):
super(FSRCNN, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(in_channels=inchannels, out_channels=64, kernel_size=5, stride=1, padding=2, padding_mode='replicate'),
nn.PReLU()
)
self.shrinking = nn.Sequential(
nn.Conv2d(in_channels=64,out_channels=32,kernel_size=1, stride=1, padding=0, padding_mode='replicate'),
nn.PReLU()
)
self.mapping = nn.Sequential(
nn.Conv2d(in_channels=32, out_channels=32, kernel_size=3, stride =1, padding=1, padding_mode='replicate'),
nn.Conv2d(in_channels=32, out_channels=32, kernel_size=3, stride =1, padding=1, padding_mode='replicate'),
nn.Conv2d(in_channels=32, out_channels=32, kernel_size=3, stride =1, padding=1, padding_mode='replicate'),
nn.Conv2d(in_channels=32, out_channels=32, kernel_size=3, stride =1, padding=1, padding_mode='replicate'),
nn.PReLU()
)
self.expanding = nn.Sequential(
nn.Conv2d(in_channels=32, out_channels=64, kernel_size=1, stride=1, padding=0),
nn.PReLU()
)
self.deconv = nn.Sequential(
nn.ConvTranspose2d(in_channels=64, out_channels=inchannels, kernel_size=9, stride=3, padding=4, padding_mode='replicate')
)
def forward(self, x):
x = self.features(x)
x = self.shrinking(x)
x = self.mapping(x)
x = self.expanding(x)
x = self.deconv(x)
return x
代碼解釋
整體上來說叙甸,F(xiàn)SRCNN就是分為上面5個部分:
- features
用于從原始的LR圖像中提取特征,對于圖像的特征來說位衩,一般都是通過卷積來提取的裆蒸。這里注意一個敏感參數(shù)(原文說的是sensitive variable,我理解就是可以根據(jù)自己需求改變的參數(shù))就是filter的個數(shù)糖驴,也就是這一層卷積輸出的channel數(shù)量僚祷。 - shrinking
這一部分的作用按照原作者說的意思就是減少計算量,個人覺得就是壓縮特征的緯度贮缕,比如上面我的代碼中通過這一層把64維的特征壓縮到32緯辙谜,自然減少了計算量。 - mapping
這一層準(zhǔn)確的說叫做非線性映射感昼,Non-linear Mapping装哆,就是通過卷卷卷,對特征進(jìn)行非線性變換定嗓。按照作者的說法蜕琴,這一部分是對模型結(jié)果來說最重要的一部分。后面出文說這個宵溅。 - expanding
這一層就是把上面壓縮的特征維還原凌简。 - deconvolution
反卷積,這一層就是把上面經(jīng)過處理的特征還原成HR圖像层玲。
小總結(jié)
- 模型里面有幾個參數(shù)是可以自己根據(jù)自己的研究改變的号醉,包括:
- 特征圖的數(shù)量:就是第一個卷積層輸出的channel數(shù)
- 壓縮的特征維度:從上面的特征維壓縮到多少維反症?
- 非線性映射層的數(shù)量:就是在mapping那一個模塊要有幾個卷積層(注意這里不改變channel數(shù))
- 反卷積的倍數(shù):就是要將圖像放大多少倍
- 整個模型前面四個模塊總體上扮演了從低分LR圖像中提取特征的角色,然后最后一個模塊才是對圖像進(jìn)行上采樣畔派,可以根據(jù)自己不同的上采樣倍數(shù)需求進(jìn)行修改最后一個模塊铅碍,所以作者說比較好進(jìn)行遷移學(xué)習(xí)。
- 原作者說padding的方式對最后的結(jié)果微乎其微线椰,所以根據(jù)卷積核的大小都進(jìn)行了相應(yīng)的0填充胞谈,但是個人覺得這一步可以自己根據(jù)自己的研究來調(diào)整padding的方式,尤其是比較關(guān)注像元值的話憨愉。
- 為了訓(xùn)練更快烦绳,原作者還用了2步訓(xùn)練法,就是先用91-image dataset訓(xùn)練配紫,等收斂了(satureated径密?)之后再加入General-100數(shù)據(jù)集進(jìn)行fine-tuning。
- 對于卷積層使用的lr=10e-3躺孝,最后的反卷積層是lr=10e-4享扔。
- 上面代碼用的幾個參數(shù)(sensitive variable)跟原文不一致。
思考
- 所謂的特征提取植袍,到底提取了什么惧眠?
- 所謂的非線性映射,到底做了啥于个?
存疑與注意點
- 原文中的結(jié)構(gòu)中非線性映射層是說的應(yīng)該是m個conv層后面跟上一個激活函數(shù)PReLU氛魁,不過我看網(wǎng)絡(luò)上很多人寫的都是每一個conv層后面都跟上一個PReLU,這個區(qū)別待試驗厅篓。秀存。。
- 最后一個反卷積層的參數(shù)要自己根據(jù)輸出的倍數(shù)仔細(xì)算一下贷笛。
參考
【1】DONG C, LOY C C, TANG X. Accelerating the Super-Resolution Convolutional Neural Network[C]//Computer Vision – ECCV 2016.Springer International Publishing,2016:391-407. 10.1007/978-3-319-46475-6_25.
【2】https://towardsdatascience.com/review-fsrcnn-super-resolution-80ca2ee14da4
【3】https://github.com/Lornatang/FSRCNN-PyTorch
本文由mdnice多平臺發(fā)布