当前位置: 首页 > news >正文

基于Pytorch框架的深度学习MODNet网络精细人像分割系统源码

 第一步:准备数据

人像精细分割数据,可分割出头发丝,为PPM-100开源数据

第二步:搭建模型

MODNet网络结构如图所示,主要包含3个部分:semantic estimation(S分支)、detail prediction(D分支)、semantic-detail fusion(F分支)。

网络结构简单描述一下:

输入一幅图像I,送入三个模块:S、D、F;
S模块:在低分辨率分支进行语义估计,在backbone最后一层输出接上e-ASPP得到语义feature map Sp;
D模块:在高分辨率分支进行细节预测,通过融合来自低分辨率分支的信息得到细节feature map Dp;
F模块:融合来自低分辨率分支和高分辨率分支的信息,得到alpha matte ap;
对S、D、F模块,均使用来自GT的显式监督信息进行监督训练。

第三步:代码

1)损失函数为:L2损失

2)网络代码:

import torch
import torch.nn as nn
import torch.nn.functional as Ffrom .backbones import SUPPORTED_BACKBONES#------------------------------------------------------------------------------
#  MODNet Basic Modules
#------------------------------------------------------------------------------class IBNorm(nn.Module):""" Combine Instance Norm and Batch Norm into One Layer"""def __init__(self, in_channels):super(IBNorm, self).__init__()in_channels = in_channelsself.bnorm_channels = int(in_channels / 2)self.inorm_channels = in_channels - self.bnorm_channelsself.bnorm = nn.BatchNorm2d(self.bnorm_channels, affine=True)self.inorm = nn.InstanceNorm2d(self.inorm_channels, affine=False)def forward(self, x):bn_x = self.bnorm(x[:, :self.bnorm_channels, ...].contiguous())in_x = self.inorm(x[:, self.bnorm_channels:, ...].contiguous())return torch.cat((bn_x, in_x), 1)class Conv2dIBNormRelu(nn.Module):""" Convolution + IBNorm + ReLu"""def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, with_ibn=True, with_relu=True):super(Conv2dIBNormRelu, self).__init__()layers = [nn.Conv2d(in_channels, out_channels, kernel_size, stride=stride, padding=padding, dilation=dilation, groups=groups, bias=bias)]if with_ibn:       layers.append(IBNorm(out_channels))if with_relu:layers.append(nn.ReLU(inplace=True))self.layers = nn.Sequential(*layers)def forward(self, x):return self.layers(x) class SEBlock(nn.Module):""" SE Block Proposed in https://arxiv.org/pdf/1709.01507.pdf """def __init__(self, in_channels, out_channels, reduction=1):super(SEBlock, self).__init__()self.pool = nn.AdaptiveAvgPool2d(1)self.fc = nn.Sequential(nn.Linear(in_channels, int(in_channels // reduction), bias=False),nn.ReLU(inplace=True),nn.Linear(int(in_channels // reduction), out_channels, bias=False),nn.Sigmoid())def forward(self, x):b, c, _, _ = x.size()w = self.pool(x).view(b, c)w = self.fc(w).view(b, c, 1, 1)return x * w.expand_as(x)#------------------------------------------------------------------------------
#  MODNet Branches
#------------------------------------------------------------------------------class LRBranch(nn.Module):""" Low Resolution Branch of MODNet"""def __init__(self, backbone):super(LRBranch, self).__init__()enc_channels = backbone.enc_channelsself.backbone = backboneself.se_block = SEBlock(enc_channels[4], enc_channels[4], reduction=4)self.conv_lr16x = Conv2dIBNormRelu(enc_channels[4], enc_channels[3], 5, stride=1, padding=2)self.conv_lr8x = Conv2dIBNormRelu(enc_channels[3], enc_channels[2], 5, stride=1, padding=2)self.conv_lr = Conv2dIBNormRelu(enc_channels[2], 1, kernel_size=3, stride=2, padding=1, with_ibn=False, with_relu=False)def forward(self, img, inference):enc_features = self.backbone.forward(img)enc2x, enc4x, enc32x = enc_features[0], enc_features[1], enc_features[4]enc32x = self.se_block(enc32x)lr16x = F.interpolate(enc32x, scale_factor=2, mode='bilinear', align_corners=False)lr16x = self.conv_lr16x(lr16x)lr8x = F.interpolate(lr16x, scale_factor=2, mode='bilinear', align_corners=False)lr8x = self.conv_lr8x(lr8x)pred_semantic = Noneif not inference:lr = self.conv_lr(lr8x)pred_semantic = torch.sigmoid(lr)return pred_semantic, lr8x, [enc2x, enc4x] class HRBranch(nn.Module):""" High Resolution Branch of MODNet"""def __init__(self, hr_channels, enc_channels):super(HRBranch, self).__init__()self.tohr_enc2x = Conv2dIBNormRelu(enc_channels[0], hr_channels, 1, stride=1, padding=0)self.conv_enc2x = Conv2dIBNormRelu(hr_channels + 3, hr_channels, 3, stride=2, padding=1)self.tohr_enc4x = Conv2dIBNormRelu(enc_channels[1], hr_channels, 1, stride=1, padding=0)self.conv_enc4x = Conv2dIBNormRelu(2 * hr_channels, 2 * hr_channels, 3, stride=1, padding=1)self.conv_hr4x = nn.Sequential(Conv2dIBNormRelu(3 * hr_channels + 3, 2 * hr_channels, 3, stride=1, padding=1),Conv2dIBNormRelu(2 * hr_channels, 2 * hr_channels, 3, stride=1, padding=1),Conv2dIBNormRelu(2 * hr_channels, hr_channels, 3, stride=1, padding=1),)self.conv_hr2x = nn.Sequential(Conv2dIBNormRelu(2 * hr_channels, 2 * hr_channels, 3, stride=1, padding=1),Conv2dIBNormRelu(2 * hr_channels, hr_channels, 3, stride=1, padding=1),Conv2dIBNormRelu(hr_channels, hr_channels, 3, stride=1, padding=1),Conv2dIBNormRelu(hr_channels, hr_channels, 3, stride=1, padding=1),)self.conv_hr = nn.Sequential(Conv2dIBNormRelu(hr_channels + 3, hr_channels, 3, stride=1, padding=1),Conv2dIBNormRelu(hr_channels, 1, kernel_size=1, stride=1, padding=0, with_ibn=False, with_relu=False),)def forward(self, img, enc2x, enc4x, lr8x, inference):img2x = F.interpolate(img, scale_factor=1/2, mode='bilinear', align_corners=False)img4x = F.interpolate(img, scale_factor=1/4, mode='bilinear', align_corners=False)enc2x = self.tohr_enc2x(enc2x)hr4x = self.conv_enc2x(torch.cat((img2x, enc2x), dim=1))enc4x = self.tohr_enc4x(enc4x)hr4x = self.conv_enc4x(torch.cat((hr4x, enc4x), dim=1))lr4x = F.interpolate(lr8x, scale_factor=2, mode='bilinear', align_corners=False)hr4x = self.conv_hr4x(torch.cat((hr4x, lr4x, img4x), dim=1))hr2x = F.interpolate(hr4x, scale_factor=2, mode='bilinear', align_corners=False)hr2x = self.conv_hr2x(torch.cat((hr2x, enc2x), dim=1))pred_detail = Noneif not inference:hr = F.interpolate(hr2x, scale_factor=2, mode='bilinear', align_corners=False)hr = self.conv_hr(torch.cat((hr, img), dim=1))pred_detail = torch.sigmoid(hr)return pred_detail, hr2xclass FusionBranch(nn.Module):""" Fusion Branch of MODNet"""def __init__(self, hr_channels, enc_channels):super(FusionBranch, self).__init__()self.conv_lr4x = Conv2dIBNormRelu(enc_channels[2], hr_channels, 5, stride=1, padding=2)self.conv_f2x = Conv2dIBNormRelu(2 * hr_channels, hr_channels, 3, stride=1, padding=1)self.conv_f = nn.Sequential(Conv2dIBNormRelu(hr_channels + 3, int(hr_channels / 2), 3, stride=1, padding=1),Conv2dIBNormRelu(int(hr_channels / 2), 1, 1, stride=1, padding=0, with_ibn=False, with_relu=False),)def forward(self, img, lr8x, hr2x):lr4x = F.interpolate(lr8x, scale_factor=2, mode='bilinear', align_corners=False)lr4x = self.conv_lr4x(lr4x)lr2x = F.interpolate(lr4x, scale_factor=2, mode='bilinear', align_corners=False)f2x = self.conv_f2x(torch.cat((lr2x, hr2x), dim=1))f = F.interpolate(f2x, scale_factor=2, mode='bilinear', align_corners=False)f = self.conv_f(torch.cat((f, img), dim=1))pred_matte = torch.sigmoid(f)return pred_matte#------------------------------------------------------------------------------
#  MODNet
#------------------------------------------------------------------------------class MODNet(nn.Module):""" Architecture of MODNet"""def __init__(self, in_channels=3, hr_channels=32, backbone_arch='mobilenetv2', backbone_pretrained=True):super(MODNet, self).__init__()self.in_channels = in_channelsself.hr_channels = hr_channelsself.backbone_arch = backbone_archself.backbone_pretrained = backbone_pretrainedself.backbone = SUPPORTED_BACKBONES[self.backbone_arch](self.in_channels)self.lr_branch = LRBranch(self.backbone)self.hr_branch = HRBranch(self.hr_channels, self.backbone.enc_channels)self.f_branch = FusionBranch(self.hr_channels, self.backbone.enc_channels)for m in self.modules():if isinstance(m, nn.Conv2d):self._init_conv(m)elif isinstance(m, nn.BatchNorm2d) or isinstance(m, nn.InstanceNorm2d):self._init_norm(m)if self.backbone_pretrained:self.backbone.load_pretrained_ckpt()                def forward(self, img, inference):pred_semantic, lr8x, [enc2x, enc4x] = self.lr_branch(img, inference)pred_detail, hr2x = self.hr_branch(img, enc2x, enc4x, lr8x, inference)pred_matte = self.f_branch(img, lr8x, hr2x)return pred_semantic, pred_detail, pred_mattedef freeze_norm(self):norm_types = [nn.BatchNorm2d, nn.InstanceNorm2d]for m in self.modules():for n in norm_types:if isinstance(m, n):m.eval()continuedef _init_conv(self, conv):nn.init.kaiming_uniform_(conv.weight, a=0, mode='fan_in', nonlinearity='relu')if conv.bias is not None:nn.init.constant_(conv.bias, 0)def _init_norm(self, norm):if norm.weight is not None:nn.init.constant_(norm.weight, 1)nn.init.constant_(norm.bias, 0)

第四步:搭建GUI界面

第五步:整个工程的内容

有训练代码和训练好的模型以及训练过程,提供数据,提供GUI界面代码

代码见:基于Pytorch框架的深度学习MODNet网络精细人像分割系统源码

有问题可以私信或者留言,有问必答

e0420b8919fe4c1cb3d1e3dd52176a8a.png

http://www.lryc.cn/news/446106.html

相关文章:

  • Go语言中的并发编程
  • python学习笔记(3)——控制语句
  • 关系数据库设计之Armstrong公理详解
  • 【Geoserver使用】SRS处理选项
  • python里面的单引号和双引号的区别
  • 为什么不要在循环,条件或嵌套函数中调用hooks
  • 将成功请求的数据 放入apipost接口测试工具,发送给后端后,部分符号丢失
  • N诺计算机考研-错题
  • vue3 数字滚动组件封装
  • 如何确保消息只被消费一次:Java实现详解
  • Web3技术在元宇宙中的应用:从区块链到智能合约
  • 关于QSizeGrip在ui界面存在布局的情况下的不显示问题
  • 开始场景的制作+气泡特效的添加
  • 位运算--(二进制中1的个数)
  • 使用Docker和Macvlan驱动程序模拟跨主机跨网段通信
  • RestCloud webservice 流程设计
  • 从入门到精通:QT 100个关键技术关键词
  • 2024年双十一值得入手的好物有哪些?五大性价比拉满闭眼入好物盘点
  • Hbase日常运维
  • 鸿蒙开发的基本技术栈及学习路线
  • 【算法】反向传播算法
  • 外贸非洲市场要如何开发
  • python去除空格join()
  • git push错误:Out of memory, malloc failed (tried toallocate 947912704 bytes)
  • web平台搭建-LAMP(CentOS-7)
  • 2024.9.21 Python与C++的面试八股文整理,类与对象,内存规划,默认函数,虚函数,封装继承多态
  • 2024 vue3入门教程:02 我的第一个vue页面
  • [go] 状态模式
  • uniapp沉浸式导航栏+自定义导航栏组件
  • 光伏仿真:排布设计如何优化用户体验?