FCN8s 代码解析


FCN.py


# -×- coding: utf-8 -*-

from __future__ import print_function
import tensorflow as tf
import numpy as np

import TensorflowUtils as utils
import read_MITSceneParsingData as scene_parsing
import datetime
import BatchDatsetReader as dataset
from six.moves import xrange

FLAGS = tf.flags.FLAGS
tf.flags.DEFINE_integer("batch_size", "2", "batch size for training")
tf.flags.DEFINE_string("logs_dir", "logs/", "path to logs directory")
tf.flags.DEFINE_string("data_dir", "Data_zoo/MIT_SceneParsing/", "path to dataset")
tf.flags.DEFINE_float("learning_rate", "1e-4", "Learning rate for Adam Optimizer")
tf.flags.DEFINE_string("model_dir", "Model_zoo/", "Path to vgg model mat")
tf.flags.DEFINE_bool('debug', "False", "Debug mode: True/ False")
tf.flags.DEFINE_string('mode', "train", "Mode train/ test/ visualize")

MODEL_URL = 'http://www.vlfeat.org/matconvnet/models/beta16/imagenet-vgg-verydeep-19.mat'

MAX_ITERATION = int(1e5 + 1)
NUM_OF_CLASSESS = 151
IMAGE_SIZE = 224


## vgg 网络部分, weights 是vgg网络各层的权重集合, image是被预测的图像的向量
def vgg_net(weights, image):

    ## fcn的前五层网络就是vgg网络
    layers = (
        'conv1_1', 'relu1_1', 'conv1_2', 'relu1_2', 'pool1',

        'conv2_1', 'relu2_1', 'conv2_2', 'relu2_2', 'pool2',

        'conv3_1', 'relu3_1', 'conv3_2', 'relu3_2', 'conv3_3',
        'relu3_3', 'conv3_4', 'relu3_4', 'pool3',

        'conv4_1', 'relu4_1', 'conv4_2', 'relu4_2', 'conv4_3',
        'relu4_3', 'conv4_4', 'relu4_4', 'pool4',

        'conv5_1', 'relu5_1', 'conv5_2', 'relu5_2', 'conv5_3',
        'relu5_3', 'conv5_4', 'relu5_4'
    )

    net = {}
    current = image
    for i, name in enumerate(layers):
        kind = name[:4]
        if kind == 'conv':
            kernels, bias = weights[i][0][0][0][0]
            # matconvnet: weights are [width, height, in_channels, out_channels]
            # tensorflow: weights are [height, width, in_channels, out_channels]
            kernels = utils.get_variable(np.transpose(kernels, (1, 0, 2, 3)), name=name + "_w")
            bias = utils.get_variable(bias.reshape(-1), name=name + "_b")
            current = utils.conv2d_basic(current, kernels, bias)
        elif kind == '
  • 11
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
FCN8s(Fully Convolutional Network)是一个经典的语义分割模型,下面是使用PyTorch实现FCN8s代码: ```python import torch import torch.nn as nn import torch.nn.functional as F class FCN8s(nn.Module): def __init__(self, num_classes): super(FCN8s, self).__init__() # conv1 self.conv1_1 = nn.Conv2d(3, 64, kernel_size=3, padding=100) self.relu1_1 = nn.ReLU(inplace=True) self.conv1_2 = nn.Conv2d(64, 64, kernel_size=3, padding=1) self.relu1_2 = nn.ReLU(inplace=True) self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2, ceil_mode=True) # conv2 self.conv2_1 = nn.Conv2d(64, 128, kernel_size=3, padding=1) self.relu2_1 = nn.ReLU(inplace=True) self.conv2_2 = nn.Conv2d(128, 128, kernel_size=3, padding=1) self.relu2_2 = nn.ReLU(inplace=True) self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2, ceil_mode=True) # conv3 self.conv3_1 = nn.Conv2d(128, 256, kernel_size=3, padding=1) self.relu3_1 = nn.ReLU(inplace=True) self.conv3_2 = nn.Conv2d(256, 256, kernel_size=3, padding=1) self.relu3_2 = nn.ReLU(inplace=True) self.conv3_3 = nn.Conv2d(256, 256, kernel_size=3, padding=1) self.relu3_3 = nn.ReLU(inplace=True) self.pool3 = nn.MaxPool2d(kernel_size=2, stride=2, ceil_mode=True) # conv4 self.conv4_1 = nn.Conv2d(256, 512, kernel_size=3, padding=1) self.relu4_1 = nn.ReLU(inplace=True) self.conv4_2 = nn.Conv2d(512, 512, kernel_size=3, padding=1) self.relu4_2 = nn.ReLU(inplace=True) self.conv4_3 = nn.Conv2d(512, 512, kernel_size=3, padding=1) self.relu4_3 = nn.ReLU(inplace=True) self.pool4 = nn.MaxPool2d(kernel_size=2, stride=2, ceil_mode=True) # conv5 self.conv5_1 = nn.Conv2d(512, 512, kernel_size=3, padding=1) self.relu5_1 = nn.ReLU(inplace=True) self.conv5_2 = nn.Conv2d(512, 512, kernel_size=3, padding=1) self.relu5_2 = nn.ReLU(inplace=True) self.conv5_3 = nn.Conv2d(512, 512, kernel_size=3, padding=1) self.relu5_3 = nn.ReLU(inplace=True) self.pool5 = nn.MaxPool2d(kernel_size=2, stride=2, ceil_mode=True) # fc6 self.fc6 = nn.Conv2d(512, 4096, kernel_size=7) self.relu6 = nn.ReLU(inplace=True) self.drop6 = nn.Dropout2d() # fc7 self.fc7 = nn.Conv2d(4096, 4096, kernel_size=1) self.relu7 = nn.ReLU(inplace=True) self.drop7 = nn.Dropout2d() # score_fr self.score_fr = nn.Conv2d(4096, num_classes, kernel_size=1) # upscore2 self.upscore2 = nn.ConvTranspose2d(num_classes, num_classes, kernel_size=4, stride=2, bias=False) self.upscore_pool4 = nn.ConvTranspose2d(512, num_classes, kernel_size=4, stride=2, bias=False) # upscore8 self.upscore8 = nn.ConvTranspose2d(num_classes, num_classes, kernel_size=16, stride=8, bias=False) def forward(self, x): # conv1 x = self.conv1_1(x) x = self.relu1_1(x) x = self.conv1_2(x) x = self.relu1_2(x) x = self.pool1(x) # conv2 x = self.conv2_1(x) x = self.relu2_1(x) x = self.conv2_2(x) x = self.relu2_2(x) x = self.pool2(x) # conv3 x = self.conv3_1(x) x = self.relu3_1(x) x = self.conv3_2(x) x = self.relu3_2(x) x = self.conv3_3(x) x = self.relu3_3(x) x = self.pool3(x) # conv4 x = self.conv4_1(x) x = self.relu4_1(x) x = self.conv4_2(x) x = self.relu4_2(x) x = self.conv4_3(x) x = self.relu4_3(x) pool4 = self.pool4(x) # conv5 x = self.conv5_1(pool4) x = self.relu5_1(x) x = self.conv5_2(x) x = self.relu5_2(x) x = self.conv5_3(x) x = self.relu5_3(x) pool5 = self.pool5(x) # fc6 x = self.fc6(pool5) x = self.relu6(x) x = self.drop6(x) # fc7 x = self.fc7(x) x = self.relu7(x) x = self.drop7(x) # score_fr x = self.score_fr(x) # upscore2 upscore2 = self.upscore2(x) # upscore_pool4 pool4 = 0.01 * self.upscore_pool4(pool4[:, :, 5:5 + upscore2.size()[2], 5:5 + upscore2.size()[3]]) fuse_pool4 = upscore2 + pool4 # upscore8 upscore8 = self.upscore8(fuse_pool4) return upscore8[:, :, 31:31 + x.size()[2], 31:31 + x.size()[3]] ``` 以上就是FCN8s的PyTorch代码实现。需要注意的是,在实现过程中,我们使用了反卷积(ConvTranspose2d)来进行上采样,同时还需要注意输入输出张量的大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值