• (19)语义分割(5)_FCN基于VGG16的实现


    1、主要参考

    (1)基础框架使用了

    https://github.com/WZMIAOMIAO/deep-learning-for-image-processing

    (2)VGG16使用了

    Pytorch搭建FCN网络_金渐层猫的博客-CSDN博客_pytorch 实现fcn

    2、VGGbackbone代码

    2.1原理 

    (1)原理见教程17

    (17)语义分割(2)_FCN的原理_chencaw的博客-CSDN博客

    (2) 

     (3)

     (4)

     2.2 骨干网络

    (1)注意网络的FC6和FC7的输出在实现的时候没有使用Dropout,size也使用了1。

    (2)当然我们也可以安装上图的方法去实现

    1. from torch import nn
    2. from torchvision.models import vgg16
    3. def vgg_block(num_convs, in_channels, out_channels):
    4. blk = []
    5. for i in range(num_convs):
    6. if i == 0:
    7. blk.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1))
    8. else:
    9. blk.append(nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1))
    10. blk.append(nn.ReLU(inplace=True))
    11. blk.append(nn.MaxPool2d(kernel_size=2, stride=2)) # 宽高减半
    12. return blk
    13. class VGG16(nn.Module):
    14. def __init__(self, pretrained=True):
    15. super(VGG16, self).__init__()
    16. features = []
    17. features.extend(vgg_block(2, 3, 64))
    18. features.extend(vgg_block(2, 64, 128))
    19. features.extend(vgg_block(3, 128, 256))
    20. self.index_pool3 = len(features)
    21. features.extend(vgg_block(3, 256, 512))
    22. self.index_pool4 = len(features)
    23. features.extend(vgg_block(3, 512, 512))
    24. self.features = nn.Sequential(*features)
    25. self.conv6 = nn.Conv2d(512, 4096, kernel_size=1)
    26. self.relu = nn.ReLU(inplace=True)
    27. self.conv7 = nn.Conv2d(4096, 4096, kernel_size=1)
    28. # load pretrained params from torchvision.models.vgg16(pretrained=True)
    29. if pretrained:
    30. pretrained_model = vgg16(pretrained=pretrained)
    31. pretrained_params = pretrained_model.state_dict()
    32. keys = list(pretrained_params.keys())
    33. new_dict = {}
    34. for index, key in enumerate(self.features.state_dict().keys()):
    35. new_dict[key] = pretrained_params[keys[index]]
    36. self.features.load_state_dict(new_dict)
    37. def forward(self, x):
    38. pool3 = self.features[:self.index_pool3](x) # 1/8
    39. pool4 = self.features[self.index_pool3:self.index_pool4](pool3) # 1/16
    40. pool5 = self.features[self.index_pool4:](pool4) # 1/32
    41. conv6 = self.relu(self.conv6(pool5)) # 1/32
    42. conv7 = self.relu(self.conv7(conv6)) # 1/32
    43. return pool3, pool4, conv7

    3、FCN-32s的实现

    (1)注意接在了conv7的输出上

    (2)代码实现,注意输入图像的尺寸必须是32 的整数倍

    1. from operator import imod
    2. from src.vgg_backbone import VGG16
    3. import torch.nn as nn
    4. class FCN_32S(nn.Module):
    5. def __init__(self, num_classes, backbone='vgg'):
    6. super(FCN_32S, self).__init__()
    7. if backbone == 'vgg':
    8. self.features = VGG16()
    9. self.scores1 = nn.Conv2d(4096, num_classes, kernel_size=1)
    10. self.relu = nn.ReLU(inplace=True)
    11. self.scores2 = nn.Conv2d(512, num_classes, kernel_size=1)
    12. self.scores3 = nn.Conv2d(256, num_classes, kernel_size=1)
    13. # torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size,
    14. # stride=1, padding=0, output_padding=0,
    15. # groups=1, bias=True, dilation=1, padding_mode='zeros')
    16. #输入图像是32的整数倍,如:224 输入模块前的h = 8 ,w = 8
    17. #公式:h_out=(h−1)×stride[0]−2×padding[0]+dilation[0]×(kernel_size[0]−1)+output_padding[0]+1
    18. # 计算 h_out = (h-1)*stride + kernel
    19. self.upsample_32x = nn.ConvTranspose2d(num_classes, num_classes, kernel_size=32, stride=32)
    20. self.upsample_8x = nn.ConvTranspose2d(num_classes, num_classes, kernel_size=8, stride=8)
    21. self.upsample_4x = nn.ConvTrans
  • 相关阅读:
    C++编译链接
    02【SpringBoot静态处理、错误处理】
    在供应链管理中,如何做好库存分析?库存分析有哪些监控指标?
    强化学习中这种loss图正常吗
    非零基础自学Java (老师:韩顺平) 第8章 面向对象编程(中级部分) 8.4 包
    MCAL实战三(S32K324-NXP EB tresos Port驱动配置详解)
    LeetCode15-三数之和
    V4L2视频驱动框架---meida_device管理模块简述
    【无标题】
    【TSP问题】基于Hopfield神经网络求解旅行商问题附Matlab代码
  • 原文地址:https://blog.csdn.net/chencaw/article/details/127404850