位置: IT常识 - 正文

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

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

目录

Mobilenetv2的改进

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

完整代码

参考资料


Mobilenetv2的改进

推荐整理分享DeepLabV3+: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。

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

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

import torchimport torch.nn as nnimport torch.nn.functional as Ffrom functools import partialfrom net.mobilenetv2 import mobilenetv2from net.ASPP import ASPPclass 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当中,会输出两个特征层,一个是浅层特征层,具有浅层的语义信息;另一个是深层特征层,具有深层的语义信息。

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

 具有高语义信息的部分先进行上采样,低语义信息的特征层进行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.pyimport torchimport torch.nn as nnimport torch.nn.functional as Ffrom functools import partialfrom net.xception import xceptionfrom net.mobilenetv2 import mobilenetv2from net.ASPP import ASPPclass 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, xclass 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.jiuchutong.com/zhishi/290684.html 转载请保留说明!

上一篇:解决RTX 3090 with CUDA capability sm_86 is not compatible with the current PyTorch installation.(解决脱发的8个方法)

下一篇:在妈妈身旁玩耍的北极熊宝宝们,加拿大曼尼托巴省 (© Andre Gilden/Minden Pictures)(在妈妈身边的说说)

  • 生产设备保险费会计分录
  • 关于美容院的会计如何做账
  • 无形资产多摊销了怎么办
  • 赔偿损失费用发票怎么开
  • 坏账准备贷方核算内容
  • 股息红利所得如何缴纳个人所得税
  • 销售企业资金风险点有哪些呢
  • 售后回租利息和租金区别
  • 支付货款订金入什么科目核算与会计分录
  • 货款打了未收到发票但是公司倒闭了怎么办?
  • 办公室租赁合同需要交那些税?
  • 服务类的企业发票税率
  • 苗木增值税发票税率
  • 建筑材料发票备注栏没写工程名称和工程地点能用吗
  • 增值税发票和电子发票都可以报销吗
  • 简易征收发票认证了之后怎么处理
  • 财政性资金是不含税的吗
  • 社保公积金代缴
  • win10自动关机方法
  • 批量删除 超链接
  • 电子税务局变更办税人员怎么操作
  • 科普笔记本电脑怎样
  • 其他应付款不用付了怎么做分录
  • 不动产增值税怎么算
  • 货款形式返还
  • 转让股权企业所得税怎么计算
  • 公司员工培训后的收获和感想
  • 户外广告位怎么收费
  • macOS 11 Big Sur 开发者预览版 Beta 8推送
  • 补提去年的所得税费用是怎么做分录?
  • 价税款均未支付
  • 新税法减免项目
  • 非货币性资产交换补价大于25%的会计处理
  • php验证源码
  • 其他债权投资和持有至到期投资的区别
  • php gd gd2
  • handsome主题破解
  • 长期借款的主要成本包括
  • 补缴税款账务处理
  • sqlserver存储过程声明变量
  • 循环语句例题及解析
  • 企业收入总额是营业额吗
  • 预包装的标签有哪几种
  • 外贸会计账务处理实务
  • 养老保险减免退税政策
  • 外汇是先入帐还是先申报
  • 汇算清缴后取得上一年发票
  • 超过保质期放冰箱还能吃吗
  • 主营业务成本工资计提吗
  • 软件开发公司账一定按项目做吗
  • 设备租赁公司如何赚钱最快
  • 收到投资款应该填制什么凭证
  • 出售固定资产如何缴纳增值税
  • 未开票收入如何记账
  • 公司提前扣员工保险合法吗
  • 发货单票据格式
  • windows7 ie
  • csinject.exe是什么程序的进程 csinject进程是安全的吗
  • Linux操作系统网络及主机名配置
  • 前端获取http状态码400的返回值实例
  • 关于node.js中的模块化规范
  • vim安装ycm
  • python到底怎么学
  • js单线程多线程
  • js中的正则表达式的例子
  • javascript中常见的数据类型有哪些?
  • 黑马程序员c++语言讲义
  • unity 1
  • vue组件精讲
  • python常用操作运算符
  • xml文件的数据如何读取
  • Metaio in Unity3d 教学--- 二. 创建自己的Application
  • jquery easyui从零开始学pdf
  • javascript简明教程
  • 普通话的对话
  • animate如何拖动图片
  • 申报税务登记日期怎么填
  • 个人所得税缴纳怎么申报流程
  • 广东省电子税务局app
  • 买车没有按时交车怎么办
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设