用pytorch搭建簡單的語義分割(可訓練自己的數據集)
靈感來源:https://blog.csdn.net/weixin_44791964/article/details/102979289
本博客的搭建的網絡源於這位博主采用的keras框架,不過基於本人電腦配置做了一些網絡層數的改動。部分代碼引用大佬的代碼,其余均為本人原創。
整體文件目錄下排放:
1、編碼器Mobilenet:
這里也有大佬關於Mobilenet的博客Mobilenet的介紹。簡單來說Mobilenet利用深度卷積使得數據量大大減少,有助於配置較低的機器,也可以應用到手機上。
import torch from torch.nn import * from torch.nn.functional import relu6 #第一個卷積塊 class Conv_block(Module): def __init__(self,inplanes,outplanes,strides): super(Conv_block, self).__init__() self.zeropad=ZeroPad2d(padding=1) self.conv=Conv2d(inplanes,outplanes,kernel_size=3,stride=strides,padding=0) self.BN=BatchNorm2d(outplanes,momentum=0.1) # self.relu=ReLU() def forward(self,x): x=self.zeropad(x) x=self.conv(x) x=self.BN(x) # x=self.relu(x) x=relu6(x) return x #除了第一個卷積塊的后面的深度卷積塊 class depthwise_block(Module): def __init__(self,inplanes,outplanes,strides): super(depthwise_block, self).__init__() self.zeropad=ZeroPad2d(padding=1) self.DW=Conv2d(inplanes,inplanes, #深度卷積,輸入和輸出通道一致 kernel_size=3,stride=strides, padding=0,groups=inplanes, #groups=inplanes是實現深度卷積的重點 bias=False) self.BN_1=BatchNorm2d(inplanes,momentum=0.1) self.BN_2=BatchNorm2d(outplanes,momentum=0.1) self.conv=Conv2d(inplanes,outplanes,kernel_size=1,stride=1) # self.relu=ReLU() def forward(self,x): x=self.zeropad(x) x=self.DW(x) x=self.BN_1(x) # x=self.relu(x) x = relu6(x) x=self.conv(x) x=self.BN_2(x) # x=self.relu(x) x=relu6(x) return x class Mobilenet(Module): cfg_filter=[32,64,128,128,256,256] #每個block的inplanes、outplanes cfg_stride=[1,2,1,2,1] #每個block的strides cfg_block=[] #初始化后的block集成一個列表 layer_data=[] #每個block處理后的output def __init__(self): super(Mobilenet, self).__init__() self.conv_block=Conv_block(3