DeepLabV3+:Mobilenetv2的改进以及浅层特征和深层特征的融合

这篇具有很好参考价值的文章主要介绍了DeepLabV3+:Mobilenetv2的改进以及浅层特征和深层特征的融合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Mobilenetv2的改进

浅层特征和深层特征的融合

完整代码

参考资料


Mobilenetv2的改进

在DeeplabV3当中,一般不会5次下采样,可选的有3次下采样和4次下采样。因为要进行五次下采样的话会损失较多的信息。

在这里mobilenetv2会从之前写好的模块中得到,但注意的是,我们在这里获得的特征是[-1],也就是最后的1x1卷积不取,只取循环完后的模型。

down_idx是InvertedResidual进行的次数。

# t, c, n, s
[1, 16, 1, 1], 
[6, 24, 2, 2],    2
[6, 32, 3, 2],    4
[6, 64, 4, 2],    7  
[6, 96, 3, 1],
[6, 160, 3, 2],   14
[6, 320, 1, 1], 

根据下采样的不同,当downsample_factor=8时,进行3次下采样,对倒数两次,步长为2的InvertedResidual进行参数的修改,让步长变为1,膨胀系数为2。

当downsample_factor=16时,进行4次下采样,只需对最后一次进行参数的修改。

import torch
import torch.nn as nn
import torch.nn.functional as F
from functools import partial

from net.mobilenetv2 import mobilenetv2
from net.ASPP import ASPP

class MobileNetV2(nn.Module):
    def __init__(self, downsample_factor=8, pretrained=True):
        super(MobileNetV2, self).__init__()
        
        model           = mobilenetv2(pretrained)
        self.features   = model.features[:-1]

        self.total_idx  = len(self.features)
        self.down_idx   = [2, 4, 7, 14]

        if downsample_factor == 8:
            for i in range(self.down_idx[-2], self.down_idx[-1]):
                self.features[i].apply(
                    partial(self._nostride_dilate, dilate=2)
                )
            for i in range(self.down_idx[-1], self.total_idx):
                self.features[i].apply(
                    partial(self._nostride_dilate, dilate=4)
                )
        elif downsample_factor == 16:
            for i in range(self.down_idx[-1], self.total_idx):
                self.features[i].apply(
                    partial(self._nostride_dilate, dilate=2)
                )
        
    def _nostride_dilate(self, m, dilate):
        classname = m.__class__.__name__
        if classname.find('Conv') != -1:
            if m.stride == (2, 2):
                m.stride = (1, 1)
                if m.kernel_size == (3, 3):
                    m.dilation = (dilate//2, dilate//2)
                    m.padding = (dilate//2, dilate//2)
            else:
                if m.kernel_size == (3, 3):
                    m.dilation = (dilate, dilate)
                    m.padding = (dilate, dilate)

    def forward(self, x):
        low_level_features = self.features[:4](x)
        x = self.features[4:](low_level_features)
        return low_level_features, x

forward当中,会输出两个特征层,一个是浅层特征层,具有浅层的语义信息;另一个是深层特征层,具有深层的语义信息。

浅层特征和深层特征的融合

deeplabv3-plus改进,# 基于语义分割的道路裂缝检测,深度学习,人工智能,pytorch

 具有高语义信息的部分先进行上采样,低语义信息的特征层进行1x1卷积,二者进行特征融合,再进行3x3卷积进行特征提取

self.aspp = ASPP(dim_in=in_channels, dim_out=256, rate=16//downsample_factor)

这一步就是获得那个绿色的特征层;

low_level_features = self.shortcut_conv(low_level_features)

从这里将是对浅层特征的初步处理(1x1卷积);

x = F.interpolate(x, size=(low_level_features.size(2), low_level_features.size(3)), mode='bilinear', align_corners=True)
x = self.cat_conv(torch.cat((x, low_level_features), dim=1))

上采样后进行特征融合,这样我们输入和输出的大小才相同,每一个像素点才能进行预测;

完整代码

# deeplabv3plus.py

import torch
import torch.nn as nn
import torch.nn.functional as F
from functools import partial

from net.xception import xception
from net.mobilenetv2 import mobilenetv2
from net.ASPP import ASPP

class MobileNetV2(nn.Module):
    def __init__(self, downsample_factor=8, pretrained=True):
        super(MobileNetV2, self).__init__()
        
        model           = mobilenetv2(pretrained)
        self.features   = model.features[:-1]

        self.total_idx  = len(self.features)
        self.down_idx   = [2, 4, 7, 14]

        if downsample_factor == 8:
            for i in range(self.down_idx[-2], self.down_idx[-1]):
                self.features[i].apply(
                    partial(self._nostride_dilate, dilate=2)
                )
            for i in range(self.down_idx[-1], self.total_idx):
                self.features[i].apply(
                    partial(self._nostride_dilate, dilate=4)
                )
        elif downsample_factor == 16:
            for i in range(self.down_idx[-1], self.total_idx):
                self.features[i].apply(
                    partial(self._nostride_dilate, dilate=2)
                )
        
    def _nostride_dilate(self, m, dilate):
        classname = m.__class__.__name__
        if classname.find('Conv') != -1:
            if m.stride == (2, 2):
                m.stride = (1, 1)
                if m.kernel_size == (3, 3):
                    m.dilation = (dilate//2, dilate//2)
                    m.padding = (dilate//2, dilate//2)
            else:
                if m.kernel_size == (3, 3):
                    m.dilation = (dilate, dilate)
                    m.padding = (dilate, dilate)

    def forward(self, x):
        low_level_features = self.features[:4](x)
        x = self.features[4:](low_level_features)
        return low_level_features, x

class DeepLab(nn.Module):
    def __init__(self, num_classes, backbone="mobilenet", pretrained=True, downsample_factor=16):
        super(DeepLab, self).__init__()
        if backbone=="xception":
         
            #   获得两个特征层:浅层特征 主干部分    
            self.backbone = xception(downsample_factor=downsample_factor, pretrained=pretrained)
            in_channels = 2048
            low_level_channels = 256
        elif backbone=="mobilenet":

            #   获得两个特征层:浅层特征 主干部分
            self.backbone = MobileNetV2(downsample_factor=downsample_factor, pretrained=pretrained)
            in_channels = 320
            low_level_channels = 24
        else:
            raise ValueError('Unsupported backbone - `{}`, Use mobilenet, xception.'.format(backbone))

        #   ASPP特征提取模块
        #   利用不同膨胀率的膨胀卷积进行特征提取
        self.aspp = ASPP(dim_in=in_channels, dim_out=256, rate=16//downsample_factor)
       
        # 浅层特征边
        self.shortcut_conv = nn.Sequential(
            nn.Conv2d(low_level_channels, 48, 1),
            nn.BatchNorm2d(48),
            nn.ReLU(inplace=True)
        )		

        self.cat_conv = nn.Sequential(
            nn.Conv2d(48+256, 256, kernel_size=(3,3), stride=(1,1), padding=1),
            nn.BatchNorm2d(256),
            nn.ReLU(inplace=True),
            nn.Dropout(0.5),

            nn.Conv2d(256, 256, kernel_size=(3,3), stride=(1,1), padding=1),
            nn.BatchNorm2d(256),
            nn.ReLU(inplace=True),

            nn.Dropout(0.1),
        )
        self.cls_conv = nn.Conv2d(256, num_classes, kernel_size=(1,1), stride=(1,1))

    def forward(self, x):
        H, W = x.size(2), x.size(3)

        # 获得两个特征层,low_level_features: 浅层特征-进行卷积处理
        #                x : 主干部分-利用ASPP结构进行加强特征提取
  
        low_level_features, x = self.backbone(x)
        x = self.aspp(x)
        low_level_features = self.shortcut_conv(low_level_features)

        #   将加强特征边上采样,与浅层特征堆叠后利用卷积进行特征提取
        x = F.interpolate(x, size=(low_level_features.size(2), low_level_features.size(3)), mode='bilinear', align_corners=True)
        x = self.cat_conv(torch.cat((x, low_level_features), dim=1))
        x = self.cls_conv(x)
        x = F.interpolate(x, size=(H, W), mode='bilinear', align_corners=True)
        return x

参考资料

DeepLabV3-/论文精选 at main · Auorui/DeepLabV3- (github.com)

(6条消息) 憨批的语义分割重制版9——Pytorch 搭建自己的DeeplabV3+语义分割平台_Bubbliiiing的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-805206.html

到了这里,关于DeepLabV3+:Mobilenetv2的改进以及浅层特征和深层特征的融合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Docker 部署深度学习 运行deeplabV3

    本文主要介绍docker发展历史,常用的镜像,容器命令。以及部署深度学习环境,运行deeplabV3 项目。 2010年,美国一家公司dotcloud做一些pass的云计算服务,lxc有关的容器技术,他们讲自己的技术(容器化技术)命名为Docker。 刚诞生的时候,没有引起关注,然后2013年,他们讲D

    2024年01月21日
    浏览(40)
  • 第七章 MobileNetv2网络详解

    第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解  第四章 ResNet网络详解  第五章 ResNeXt网络详解  第六章 MobileNetv1网络详解  第七章 MobileNetv2网络详解  第八章 MobileNetv3网络详解  第九章 ShuffleNetv1网络详解  第十章 ShuffleNetv2网络详解  第十一章 EfficientNet

    2024年02月07日
    浏览(54)
  • MobileNetV2原理说明及实践落地

    本文参考: 轻量级网络——MobileNetV2_Clichong的博客-CSDN博客_mobilenetv2 MobileNetV1主要是提出了可分离卷积的概念,大大减少了模型的参数个数,从而缩小了计算量。但是在CenterNet算法中作为BackBone效果并不佳,模型收敛效果不好导致目标检测的准确率不高。 MobileNetV2在MobileNetV1的

    2024年02月08日
    浏览(39)
  • DeepLabV3+:ASPP加强特征提取网络的搭建

    目录 ASPP结构介绍 ASPP在代码中的构建 参考资料 ASPP:Atrous Spatial Pyramid Pooling,空洞空间卷积池化金字塔。 简单理解就是个至尊版池化层,其目的与普通的池化层一致,尽可能地去提取特征。 利用主干特征提取网络,会得到一个浅层特征和一个深层特征,这一篇主要以如何对

    2024年02月16日
    浏览(64)
  • 使用LabVIEW实现 DeepLabv3+ 语义分割含源码

    图像分割可以分为两类:语义分割(Semantic Segmentation)和实例分割(Instance Segmentation),前面已经给大家介绍过两者的区别,并就如何在labview上实现相关模型的部署也给大家做了讲解,今天和大家分享如何使用labview 实现deeplabv3+的语义分割,并就 Pascal VOC2012 (DeepLabv3Plus-Mobi

    2024年02月13日
    浏览(43)
  • 对MODNet 主干网络 MobileNetV2的剪枝探索

    目录 1 引言 1.1 MODNet 原理 1.2 MODNet 模型分析 2 MobileNetV2 剪枝 2.1 剪枝过程 2.2 剪枝结果 2.2.1 网络结构 2.2.2 推理时延 2.3 实验结论 3 模型嵌入 3.1 模型保存与加载 法一:保存整个模型 法二:仅保存模型的参数 小试牛刀 小结 3.2 修改 MobileNetV2 中的 block 阶段一 阶段二 总结 3.2 Mo

    2024年01月22日
    浏览(35)
  • 第三章:DeepLabV3——重新思考用于语义图像分割的扩张卷积

    原问题目:《Rethinking Atrous Convolution for Semantic Image Segmentation》 原文引用:Chen L C, Papandreou G, Schroff F, et al. Rethinking atrous convolution for semantic image segmentation[J]. arXiv preprint arXiv:1706.05587, 2017. 发表时间:2018年1月 原文链接: https://arxiv.org/pdf/1706.05587.pdf%EF%BC%8C%E6%8E%A8%E8%8D%90%E5%9C%A8

    2024年02月16日
    浏览(57)
  • 注意力机制——ECANet及Mobilenetv2模型应用

    一、介绍 ECANet(CVPR 2020)作为一种轻量级的注意力机制,其实也是通道注意力机制的一种实现形式。其论文和开源代码为: 论文地址:https://arxiv.org/abs/1910.03151 代码:https://github.com/BangguWu/ECANet ECA模块,去除了原来SE模块中的全连接层,直接在全局平均池化之后的特征上通过

    2024年02月16日
    浏览(46)
  • MATLAB算法实战应用案例精讲-【自然语言处理】语义分割模型-DeepLabV3

    目录 自然语言处理库 1.Hugging Face Datasets 2.TextHero 3.spaCy 4.Hugging Face Transformers 5.Scattertext 1、DeepLab系列简介

    2024年02月11日
    浏览(59)
  • 基于python+MobileNetV2算法模型实现一个图像识别分类系统

    算法模型介绍 模型使用训练 模型评估 项目扩展 图像识别是计算机视觉领域的重要研究方向,它在人脸识别、物体检测、图像分类等领域有着广泛的应用。随着移动设备的普及和计算资源的限制,设计高效的图像识别算法变得尤为重要。MobileNetV2是谷歌(Google)团队在2018年提

    2024年02月12日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包