1、FCN_TensorFlow——VGG16_FCN8s构造代码分析

本文基于Marvin Teichmann的KittiSeg代码,详细分析了如何将全连接的VGG16模型转换为FCN8s,用于语义分割任务。通过将全连接层替换为卷积层,实现像素级的稠密预测,以产生热点图。FCN8s的结构特点和优势在图像分割中得到体现。
摘要由CSDN通过智能技术生成

首先,感谢Marvin Teichmann分享的KittiSeg代码,源码见其GitHub主页

先贴一张全连接的VGG16模型,如图1:

                               

图 1

1、全卷积神经网络(FCN)是在图1的基础上,将全连接层改为卷积替代并将其用于语义分割上,详情见论文《Fully Convolutional Networks for Semantic Segmentation》


图 2 将全连接层修改为卷积层使得分类网络的输出变为一个热点图


图 3 全卷积网络可以有效的进行像素级任务的稠密预测,例如语义分割


图 4 黑线32s;虚线16s;点线8s

2、VGG16_FCN8s代码如下

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import logging
from math import ceil
import sys

import numpy as np
import tensorflow as tf

VGG_MEAN = [103.939, 116.779, 123.68]


class FCN8VGG:

    def __init__(self, vgg16_npy_path=None):
        if vgg16_npy_path is None:
            path = sys.modules[self.__class__.__module__].__file__
            # print path
            path = os.path.abspath(os.path.join(path, os.pardir))
            # print path
            path = os.path.join(path, "vgg16.npy")
            vgg16_npy_path = path
            logging.info("Load npy file from '%s'.", vgg16_npy_path)
        if not os.path.isfile(vgg16_npy_path):
            logging.error(("File '%s' not found. Download it from "
                           "ftp://mi.eng.cam.ac.uk/pub/mttt2/"
                           "models/vgg16.npy"), vgg16_npy_path)
            sys.exit(1)

        self.data_dict = np.load(vgg16_npy_path, encoding='latin1').item()
        self.wd = 5e-4
        print("npy file loaded")

    def build(self, rgb, train=False, num_classes=20, random_init_fc8=False,
              debug=False, use_dilated=False):
        """
        Build the VGG model using loaded weights
        Parameters
        ----------
        rgb: image batch tensor
            Image in rgb shap. Scaled to Intervall [0, 255]
        train: bool
            Whether to build train or inference graph
        num_classes: int
            How many classes should be predicted (by fc8)
        random_init_fc8 : bool
            Whether to initialize fc8 layer randomly.
            Finetuning is required in this case.
        debug: bool
            Whether to print additional Debug Information.
        """
        # Convert RGB to BGR

        with tf.name_scope('Processing'):

            red, green, blue = tf.split(rgb, 3, 3)
            # assert red.get_shape().as_list()[1:] == [224, 224, 1]
            # assert green.get_shape().as_list()[1:] == [224, 224, 1]
            # assert blue.get_shape().as_list()[1:] == [224, 224, 1]
            bgr = tf.concat([
                blue - VGG_MEAN[0],
                green - VGG_MEAN[1],
                red - VGG_MEAN[2],
            ], 3)

            if debug:
                bgr = tf.Print(bgr, [tf.shape(bgr)],
                               message='Shape of input image: ',
                               summarize=4, first_n=1)

        self.conv1_1 = self._conv_layer(bgr, "conv1_1")
        self.conv1_2 = self._conv_layer(self.conv1_1, "conv1_2&
FCN (全卷积网络) 结合 VGG16 模型是一种深度学习图像分割的常见方法。VGG16 是一个预训练的深度卷积神经网络模型,而 FCN 则将传统的分类层替换为全卷积层,以便生成每个像素的类别概率。 在 PyTorch 中实现 FCN_vgg16代码通常包括以下几个步骤: 1. **加载预训练的 VGG16 模型**: 使用 `torchvision.models.vgg16(pretrained=True)` 加载预训练的 VGG16 网络,`pretrained=True` 表示模型包含了 ImageNet 数据集上训练好的权重。 ```python import torchvision.models as models vgg = models.vgg16(pretrained=True) ``` 2. **替换最后一层为全连接层**: 将 VGG16 的完全连接层替换为全卷积层,这通常是通过去掉一些层并添加新的全卷积层和上采样层来完成的。例如,可以使用 `nn.ConvTranspose2d` 和 `nn.Sequential`。 ```python from torch import nn def replace_classifier(vgg): vgg.classifier = nn.Sequential( nn.Conv2d(512, 4096, kernel_size=7, stride=1, padding=0, bias=False), nn.ReLU(True), nn.Conv2d(4096, 4096, kernel_size=1, stride=1, padding=0, bias=False), nn.ReLU(True), nn.ConvTranspose2d(4096, 1024, kernel_size=4, stride=2, padding=1, bias=False), nn.ReLU(True), nn.ConvTranspose2d(1024, num_classes, kernel_size=16, stride=8, padding=0, bias=False) ) replace_classifier(vgg) ``` 3. **处理输入和输出大小**: 根据实际应用调整输入图片尺寸,并可能对输出进行后处理,如使用 SoftMax 函数获取类别概率。 ```python input_height = input_width = ... # 根据需要设置 x = vgg(torch.zeros(1, 3, input_height, input_width)) out = out[:, :, :output_height, :output_width] # 可能需要裁剪返回的输出到原图尺寸 ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值