fcn网络结构代码_FCN实现2-模型结构及实现
生活随笔
收集整理的這篇文章主要介紹了
fcn网络结构代码_FCN实现2-模型结构及实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
完整項目見
https://github.com/luoshiyong/LSY_semantic_segmentation/tree/main/FCN_VOC12?github.com1.數據集
voc2012獲取見https://blog.csdn.net/luoshiyong123/article/details/111197039
2.FCN網絡結構
3.FCN特點
(1)摒棄了傳統卷積網絡最后的全連接層,使用全卷積代替,原文中卷積部分采用的VGG16(去掉全連接層)效果最好。
(2)使用反卷積恢復圖像原來尺寸,可以接受任意大小的輸入圖像,而不用要求所有的訓練圖像和測試圖像具有同樣的尺寸。
(3) 得到的結果還是不夠精細。進行8倍上采樣雖然比32倍的效果好了很多,但是上采樣的結果還是比較模糊和平滑,對圖像中的細節不敏感,沒有充分考慮像素與像素之間的關系,忽略了在通常的基于像素分類的分割方法中使用的空間規整(spatial regularization)步驟,缺乏空間一致性。
4.FCN的pytorch實現
notice:論文中明確說過FCN32s和FCN16s效果不好,這里僅使用效果最好的1/8融合特征圖上采樣,即FCN8s
這里提取特征網絡使用vgg16_bn(vgg16加了bn層),以下為代碼實現(每一步都有注釋)。
以大小為(356,480,3)的圖片輸入為例
#定義模型 class fcn(nn.Module):def __init__(self, num_classes):super(fcn, self).__init__()#vgg各階段 self.stage1 = pretrained_net.features[:7] # vgg第一段,得到1/2特征圖self.stage2 = pretrained_net.features[7:14] # 第二段,1/4self.stage3 = pretrained_net.features[14:24] # 第三段,1/8self.stage4 = pretrained_net.features[24:34] # 第四段,1/16self.stage5 = pretrained_net.features[34:] # 第五段,1/32#1卷積核self.scores1 = nn.Conv2d(512, num_classes, 1) self.scores2 = nn.Conv2d(512, num_classes, 1)self.scores3 = nn.Conv2d(128, num_classes, 1)self.conv_trans1 = nn.Conv2d(512,256,1)self.conv_trans2 = nn.Conv2d(256,num_classes,1)#反卷積上采樣self.upsample_8x = nn.ConvTranspose2d(num_classes, num_classes, 16, 8, 4, bias=False)self.upsample_8x.weight.data = bilinear_kernel(num_classes, num_classes, 16) # 使用雙線性 kernelself.upsample_2x_1 = nn.ConvTranspose2d(512, num_classes, 4, 2, 1, bias=False) self.upsample_2x_1.weight.data = bilinear.kernal(512,512,4)self.upsample_2x_2 = nn.ConvTranspose2d(256, 256, 4, 2, 1, bias=False) self.upsample_2x_2.weight.data = bilinear_kernel(256, 256, 4) # 使用雙線性 kerneldef forward(self, x):#輸入尺寸(356,480,3)x = self.stage1(x) #(176,240,64)x = self.stage2(x) #(88,120,128)x = self.stage3(x) #(44,60,256)s3 = x #保存1/8特征圖x = self.stage4(x) #(22,30,512)s4 = x # #保存1/16特征圖x = self.stage5(x) #(11,15,512)s5 = x # 保存1/32特征圖score1 = self.scores1(s5) #(11,15,21)s5經過32倍上采樣過后通過scores1可得到FCN32s,此處未定義32倍上采樣s5_x2 = self.upsample_2x_1(s5) #(22,30,512)add1 = s5_x2 + s4 #(22,30,512)score2 = self.scores2(add1) #(22,30,21)add1 = self.conv_trans1(add1) #(22,30,256)轉換通道add1 = self.upsample_2x_2(add1) #(44,60,256)add2 = add1 + s3 #(44,60,256)add2 = self.conv_trans2(add2) #(44,60,21)score3 = self.upsample_8x(add2) #(356,480,21)return score3總結
以上是生活随笔為你收集整理的fcn网络结构代码_FCN实现2-模型结构及实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1一9数字行书写法_EduOffice数
- 下一篇: 三阶魔方还原步骤图_研究人员开发的AI成