附代码 Deeplab V2(附迁移学习代码)_deeplabv2代码-程序员宅基地

技术标签: 语义分割  代码  计算机视觉  深度学习  pytorch  论文  

DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs 论文解读

V1链接:https://blog.csdn.net/weixin_44543648/article/details/122576853
V3链接:https://blog.csdn.net/weixin_44543648/article/details/122829741
论文链接:https://arxiv.org/pdf/1606.00915.pdf
代码链接:https://github.com/dontLoveBugs/Deeplab_pytorch

V2目标解决的问题和部分内容与V1相似,具体不过多叙述,可以看上面链接。

主要内容:

  • 采用了空洞卷积,即卷积层设置dilation > 1。空洞卷积优势如下,上面为普通卷积,下面为空洞卷积。
    在这里插入图片描述
  • 使用ASPP进行多尺度下融合特征,实际应用中,即设置不同dilation进行多尺度输出再相加。多尺度融合过程如下
    在这里插入图片描述
  • 使用CRF进行边界的精确化。
  • 使用Resnet作为backbone。

代码:

ASPP module

class ASPP_module(nn.Module):
    def __init__(self, inplanes, planes, rate):
        super(ASPP_module, self).__init__()
        if rate == 1:
            kernel_size = 1
            padding = 0
        else:
            kernel_size = 3
            padding = rate
        self.atrous_convolution = nn.Conv2d(inplanes, planes, kernel_size=kernel_size,
                                            stride=1, padding=padding, dilation=rate, bias=False)
        self.bn = nn.BatchNorm2d(planes)
        self.relu = nn.ReLU()

        self._init_weight()

    def forward(self, x):
        x = self.atrous_convolution(x)
        x = self.bn(x)

        return self.relu(x)

    def _init_weight(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                torch.nn.init.kaiming_normal_(m.weight)
            elif isinstance(m, nn.BatchNorm2d):
                m.weight.data.fill_(1)
                m.bias.data.zero_()

网络结构


from torch.utils import model_zoo

from network.base.resnet import *
from network.base.oprations import *


class DeeplabV2(ResNet):
    def __init__(self, n_class, block, layers, pyramids):
        print("Constructing DeepLabv2 model...")
        print("Number of classes: {}".format(n_class))
        super(DeeplabV2, self).__init__()

        self.inplanes = 64

        self.conv1 = nn.Conv2d(3, self.inplanes, kernel_size=7, stride=2, padding=3, bias=False)
        self.bn1 = nn.BatchNorm2d(self.inplanes, affine=True)
        self.relu = nn.ReLU(inplace=True)
        self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1, ceil_mode=True)  # change

        self.layer1 = self._make_layer(block, 64, layers[0])
        self.layer2 = self._make_layer(block, 128, layers[1], stride=2)
        self.layer3 = self._make_layer(block, 256, layers[2], stride=1, rate=2)
        self.layer4 = self._make_layer(block, 512, layers[3], stride=1, rate=4)

        self.aspp1 = ASPP_module(2048, n_class, pyramids[0])
        self.aspp2 = ASPP_module(2048, n_class, pyramids[1])
        self.aspp3 = ASPP_module(2048, n_class, pyramids[2])
        self.aspp4 = ASPP_module(2048, n_class, pyramids[3])

        self.init_weight()

    def forward(self, input):
        x = self.conv1(input)
        x = self.bn1(x)
        x = self.relu(x)
        x = self.maxpool(x)

        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = self.layer4(x)

        x1 = self.aspp1(x)
        x2 = self.aspp2(x)
        x3 = self.aspp3(x)
        x4 = self.aspp4(x)

        x = x1 + x2 + x3 + x4

        x = F.upsample(x, size=input.size()[2:], mode='bilinear', align_corners=True)
        return x

    def get_1x_lr_params(self):
        b = [self.conv1, self.bn1, self.layer1, self.layer2, self.layer3, self.layer4]
        for i in range(len(b)):
            for k in b[i].parameters():
                if k.requires_grad:
                    yield k

    def get_10x_lr_params(self):
        b = [self.aspp1, self.aspp2, self.aspp3, self.aspp4]
        for j in range(len(b)):
            for k in b[j].parameters():
                if k.requires_grad:
                    yield k

    def freeze_bn(self):
        for m in self.modules():
            if isinstance(m, nn.BatchNorm2d):
                m.eval()

    def freeze_backbone_bn(self):
        self.bn1.eval()

        for m in self.layer1:
            if isinstance(m, nn.BatchNorm2d):
                m.eval()

        for m in self.layer2:
            if isinstance(m, nn.BatchNorm2d):
                m.eval()

        for m in self.layer3:
            if isinstance(m, nn.BatchNorm2d):
                m.eval()

        for m in self.layer4:
            if isinstance(m, nn.BatchNorm2d):
                m.eval()


def resnet101(n_class, pretrained=True):

    model = DeeplabV2(n_class=n_class, block=Bottleneck, layers=[3, 4, 23, 3], pyramids=[6, 12, 18, 24])

    if pretrained:
        pretrain_dict = model_zoo.load_url(model_urls['resnet101'])
        model_dict = {
    }
        state_dict = model.state_dict()
        for k, v in pretrain_dict.items():
            if k in state_dict:
                model_dict[k] = v
        state_dict.update(model_dict)
        model.load_state_dict(state_dict)

    return model


if __name__ == '__main__':
    model = resnet101(n_class=21, pretrained=True)

    img = torch.randn(4, 3, 513, 513)

    with torch.no_grad():
        output = model.forward(img)

    print(output.size())

迁移学习代码

import torch
import torch.nn as nn
import torchvision.models as models
from torchvision.models.resnet import Bottleneck,BasicBlock

class Asppmodule(nn.Module):
    def __init__(self, inchannels, ouchannels, rate):
        super(Asppmodule, self).__init__()

        if rate == 1:
            kernel_size = 1
            padding = 0
        else:
            kernel_size = 3
            padding = rate

        self.conv = nn.Sequential(
            nn.Conv2d(inchannels,ouchannels,kernel_size,1,padding,dilation=rate),
            nn.BatchNorm2d(ouchannels),
            nn.ReLU(inplace=True)
        )
    def forward(self,x):
        return self.conv(x)


class DeepLab_V2(nn.Module):
    def __init__(self,inchannels,classes):
        super(DeepLab_V2, self).__init__()
        resnet = models.resnet50(pretrained=True,replace_stride_with_dilation=[False, True, True])
        self.backbone = models._utils.IntermediateLayerGetter(resnet,{
    "layer4": "out"})


        rate = [6,8,12,24]
        self.aspp = Asppmodule
        self.aspp1 = self.aspp(2048,classes,rate[0])
        self.aspp2 = self.aspp(2048, classes, rate[1])
        self.aspp3 = self.aspp(2048, classes, rate[2])
        self.aspp4 = self.aspp(2048, classes, rate[3])


    def forward(self,x):
        x = self.backbone(x)['out']
        x = self.aspp1(x)+self.aspp2(x)+self.aspp3(x)+self.aspp4(x)
        return x

if __name__ == '__main__':
    input = torch.empty(1,3,224,224)
    m = DeepLab_V2(3,10)
    out = m(input)
    print(out)




















版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44543648/article/details/122599976

智能推荐

this关键字 转(孤傲苍狼)_孤傲苍狼 是谁 csdn博主-程序员宅基地

文章浏览阅读250次。this是一个引用,它指向自身的这个对象。看内存分析图:  假设我们在堆内存new了一个对象,在这个对象里面你想象着他有一个引用this,this指向这个对象自己,所以这就是this,这个new出来的对象名字是什么,我们不知道,不知道也没关系,因为这并不影响这个对象在内存里面的存在,这个对象只要在内存中存在,他就一定有一个引用this。看下面的例子分析:ortant;" >ortant;" r_孤傲苍狼 是谁 csdn博主

ESP32驱动AD7705_ad7705 esp32-程序员宅基地

文章浏览阅读2.1k次,点赞2次,收藏12次。ESP32 系列文章1、利用mesh ble_mesh_provisioner和 onoff_server建立网络传输温湿度以及pm2.5等数据2、esp-idf v4.0 smartconfig wifi配置信息保存在nvs_flash,实现掉电重新启动直接连入wifi(已完成)3、idf v4.0 调试esp-aliyun-master 生成对应的 NVS 分区一、概述TM7705 使用SPI串行通信协议,使用十分方便快捷.并且兼容 2.7~3.3V 或 4.75~5.25V 单电源。可以直接_ad7705 esp32

odoo12中tree视图表头文字横向显示一行的方法_odoo12 横向滚动条-程序员宅基地

文章浏览阅读1k次。1.在odoo系统的addons模块中,找到web模块,进入路径为在E:\PycharmProjects\odoo-12.0\addons\web\static\src\scss\list_view.scss文件中添加一行white-space: nowrap**注意:**添加代码后会给网页加了横向滚动条,建议再给页面加固定表头。..._odoo12 横向滚动条

数据库系统原理———两段锁协议、死锁练习题_两段锁协议例题-程序员宅基地

文章浏览阅读9.2k次,点赞13次,收藏56次。一、题目描述14.考虑T和T2两个事务。T1: R(A); R(B);B=A+ B; W(B)T2: R(B); R(A);A=A+ B; W(A)(1)改写T和T2, 增加加锁操作和解锁操作,并要求遵循两阶段封锁协议。(2)说明T和T2的执行是否会引起死锁,给出T和T2的一个调度并说明之。二、问题解答(1)如下表所示T1T2Slock AR(A)Slock BR(B)Xlock BB=A+BW(B)Unlock B_两段锁协议例题

tp5保留搜索条件 自增字段自减字段值_tp5 加一 减一-程序员宅基地

文章浏览阅读3k次。{$Request.param.name}_tp5 加一 减一

UE4这些扰人的坑_unreal reflectionprobe-程序员宅基地

文章浏览阅读1.3w次,点赞2次,收藏30次。日本网站4Gamer曾刊登一篇文章,分享了使用UE4在图像渲染中会遇到的难点以及解决方法,分享人是该引擎的开发商Epic Games日本分公司的高级工程师篠山範明。在研讨会上,篠山首先展示了UE4的整体流程图,随后他对和流程图上各功能板块有关的技术进行了介绍。绘制物体缓冲的“Base Pass”时要注意的问题我们先来把整个流程分为不同的单元,在各个单元里进行深入解读。首先从_unreal reflectionprobe

随便推点

rose怎么画业务流程图_子流程图怎么画(流程图中的子流程)-程序员宅基地

文章浏览阅读1w次。子流程图怎么画(流程图中的子流程)2020-05-24 14:24:53共10个回答你好,流程图的绘制贵哦城还是很简单的,下面将方法和你说下打开画图工具,点击页面中央【立即体验】进入类型选择界面,点击左上角【新建文件】选择【流程图】进入子线绘制界面;进入界面之后,我们能看到里面有很多的工具,这些在绘制的过程汇总都是可以使用的,点击左侧【基础图形】直接用鼠标将图形拖曳至右边画布需要的位置即可双击文本..._如何在主流程图中画子流程图

FreeRTOS的任务挂起和恢复_freertos 任务允许自己挂起自己么?-程序员宅基地

文章浏览阅读4.6k次,点赞3次,收藏10次。FreeRTOS的任务挂起和恢复很简单,分为两种情况,一种是普通的挂起恢复,一种是在终端中恢复:普通的挂起和恢复:普通挂起:调用:vTaskSuspend(TaskHandle_t xTaskToSuspend);函数;参数为:需要挂起的任务的任务句柄,如果在任务自身中挂起自身,参数可直接写为“NULL””普通恢复:调用:vTaskResume(TaskHandle_t xTaskTo..._freertos 任务允许自己挂起自己么?

Spline算法:输入几个点,输出一条曲线的点。_tk::spline-程序员宅基地

文章浏览阅读4.1k次。/* * spline.h * * simple cubic spline interpolation library without external * dependencies * * --------------------------------------------------------------------- * Copyright (C) 2011, 2014 _tk::spline

Failed to process makespec for platform 'linux-arm-gnueabi-g++'-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏3次。你好!这里是风筝的博客,欢迎和我一起交流。最近移植QT到arm板子上,发现一些问题,记录一下:在ubuntu上交叉编译QT时执行./config之后发现错误: Failed to process makespec for platform 'linux-arm-gnueabi-g++'也就是配置QT时候出现 Failed to process makespec for platfor..._failed to process makespec for platform 'linux-arm-gnueabi-g++

bootstrap中如何使div上下、垂直居中_bootstrap 上下居中-程序员宅基地

文章浏览阅读1.4w次。使用bootstrap布局,如何使div在指定区域上下、垂直居中并适应各个屏幕?在垂直方向,可以设置需要居中的div定位为absolute,指定距离top距离50%。水平方向可以指定div的宽度col-lg- ,然后进行对应的偏移。html页面:<div class="container-fluid" > <div class="login-form co..._bootstrap 上下居中

数学建模与实验线性规划习题3.4-1_数学建模某鸡场有1000只鸡的答案-程序员宅基地

文章浏览阅读2.7k次,点赞3次,收藏15次。问题描述:数学建模某鸡场有1000只鸡,用动物饲料和谷物混合喂养。每天每只鸡平均食混合饲料0.5KG,其中动物饲料所占比例不能少于20%。动物饲料每千克0.30元,谷物饲料每千克0.18元,饲料公司每周仅保证供应谷物饲料6000KG,问饲料怎样混合,才能使成本最低?设:每天混合x1千克动物饲料,x2千克谷物饲料,z为成本目标函数:minz=0.3x1+0.18x2约束:[1 1][x1..._数学建模某鸡场有1000只鸡的答案

推荐文章

热门文章

相关标签