百度飞桨PaddlePaddle图像分割七日打卡营 class4 deeplab实现
百度飞桨PaddlePaddle图像分割七日打卡营 class4 deeplab实现
- deeplab.py
import numpy as np
import paddle.fluid as fluid
from paddle.fluid.dygraph import to_variable
from paddle.fluid.dygraph import Layer
from paddle.fluid.dygraph import Conv2D
from paddle.fluid.dygraph import BatchNorm
from paddle.fluid.dygraph import Dropout
from resnet_multi_grid import ResNet50class ASPPPooling(Layer):# TODO:def __init__(self, num_channels, num_filters):super(ASPPPooling, self).__init__()self.features = fluid.dygraph.Sequential(Conv2D(num_channels, num_filters, 1),BatchNorm(num_filters, act='relu'))def forward(self, inputs):n,c,h,w = inputs.shapex = fluid.layers.adaptive_pool2d(inputs, 1)x = self.features(x)x =fluid.layers.interpolate(x, (h, w), align_corners=False)return xclass ASPPConv(fluid.dygraph.Sequential):# TODO:def __init__(self, num_channels, num_filters, dilation):super(ASPPConv, self).__init__(Conv2D(num_channels, num_filters, filter_size=3, padding=dilation, dilation=dilation),BatchNorm(num_filters, act='relu'))class ASPPModule(Layer):# TODO: def __init__(self, num_channels, num_filters, rates):super(ASPPModule, self).__init__()self.features = []self.features.append(fluid.dygraph.Sequential(Conv2D(num_channels, num_filters, 1),BatchNorm(num_filters, act='relu')))self.features.append(ASPPPooling(num_channels, num_filters))for r in rates:self.features.append(ASPPConv(num_channels, num_filters, r))self.project = fluid.dygraph.Sequential(Conv2D(num_filters*(2+len(rates)), num_filters, 1),BatchNorm(num_filters, act='relu'))def forward(self, inputs):res = []for op in self.features:res.append(op(inputs))x = fluid.layers.concat(res, axis=1)x = self.project(x)return xclass DeepLabHead(fluid.dygraph.Sequential):def __init__(self, num_channels, num_classes):super(DeepLabHead, self).__init__(ASPPModule(num_channels, 256, [12, 24, 36]),Conv2D(256, 256, 3, padding=1),BatchNorm(256, act='relu'),Conv2D(256, num_classes, 1))class DeepLab(Layer):# TODO:def __init__(self, num_classes=59):super(DeepLab, self).__init__()resnet = ResNet50(pretrained=False, duplicate_blocks=True)self.layer0 = fluid.dygraph.Sequential(resnet.conv,resnet.pool2d_max)self.layer1 = resnet.layer1self.layer2 = resnet.layer2self.layer3 = resnet.layer3self.layer4 = resnet.layer4# multigridself.layer5 = resnet.layer5self.layer6 = resnet.layer6self.layer7 = resnet.layer7feature_dim = 2048self.classifier = DeepLabHead(feature_dim, num_classes)def forward(self, inputs):n, c, h, w = inputs.shapex = self.layer0(inputs)x = self.layer1(x)x = self.layer2(x)x = self.layer3(x)x = self.layer4(x)x = self.layer5(x)x = self.layer6(x)x = self.layer7(x)x = self.classifier(x)x = fluid.layers.interpolate(x, (h,w), align_corners=False)return xdef main():with fluid.dygraph.guard():x_data = np.random.rand(2, 3, 512, 512).astype(np.float32)x = to_variable(x_data)model = DeepLab(num_classes=59)model.eval()pred = model(x)print(pred.shape)if __name__ == '__main__':main()
- resnet_multi_grid.py
import numpy as np
import paddle.fluid as fluid
from paddle.fluid.dygraph import to_variable
from paddle.fluid.dygraph import Conv2D
from paddle.fluid.dygraph import BatchNorm
from paddle.fluid.dygraph import Pool2D
from paddle.fluid.dygraph import Linearmodel_path = {'ResNet18': './resnet18','ResNet34': './resnet34','ResNet50': './resnet50','ResNet101': './resnet101','ResNet152': './resnet152'}class ConvBNLayer(fluid.dygraph.Layer):def __init__(self,num_channels,num_filters,filter_size,stride=1,groups=1,act=None,dilation=1,padding=None,name=None):super(ConvBNLayer, self).__init__(name)if padding is None:padding = (filter_size-1)//2else:padding=paddingself.conv = Conv2D(num_channels=num_channels,num_filters=num_filters,filter_size=filter_size,stride=stride,padding=padding,groups=groups,act=None,dilation=dilation,bias_attr=False)self.bn = BatchNorm(num_filters, act=act)def forward(self, inputs):y = self.conv(inputs)y = self.bn(y)return yclass BasicBlock(fluid.dygraph.Layer):expansion = 1 # expand ratio for last conv output channel in each blockdef __init__(self,num_channels,num_filters,stride=1,shortcut=True,name=None):super(BasicBlock, self).__init__(name)self.conv0 = ConvBNLayer(num_channels=num_channels,num_filters=num_filters,filter_size=3,stride=stride,act='relu',name=name)self.conv1 = ConvBNLayer(num_channels=num_filters,num_filters=num_filters,filter_size=3,act=None,name=name)if not shortcut:self.short = ConvBNLayer(num_channels=num_channels,num_filters=num_filters,filter_size=1,stride=stride,act=None,name=name)self.shortcut = shortcutdef forward(self, inputs):conv0 = self.conv0(inputs)conv1 = self.conv1(conv0)if self.shortcut:short = inputselse:short = self.short(inputs)y = fluid.layers.elementwise_add(x=short, y=conv1, act='relu')return yclass BottleneckBlock(fluid.dygraph.Layer):expansion = 4def __init__(self,num_channels,num_filters,stride=1,shortcut=True,dilation=1,padding=None,name=None):super(BottleneckBlock, self).__init__(name)self.conv0 = ConvBNLayer(num_channels=num_channels,num_filters=num_filters,filter_size=1,act='relu')
# name=name)self.conv1 = ConvBNLayer(num_channels=num_filters,num_filters=num_filters,filter_size=3,stride=stride,padding=padding,act='relu',dilation=dilation)# name=name)self.conv2 = ConvBNLayer(num_channels=num_filters,num_filters=num_filters * 4,filter_size=1,stride=1)# name=name)if not shortcut:self.short = ConvBNLayer(num_channels=num_channels,num_filters=num_filters * 4,filter_size=1,stride=stride)
# name=name)self.shortcut = shortcutself.num_channel_out = num_filters * 4def forward(self, inputs):conv0 = self.conv0(inputs)#print('conv0 shape=',conv0.shape)conv1 = self.conv1(conv0)#print('conv1 shape=', conv1.shape)conv2 = self.conv2(conv1)#print('conv2 shape=', conv2.shape)if self.shortcut:short = inputselse:short = self.short(inputs)#print('short shape=', short.shape)y = fluid.layers.elementwise_add(x=short, y=conv2, act='relu')return yclass ResNet(fluid.dygraph.Layer):def __init__(self, layers=50, num_classes=1000, multi_grid=[1, 2, 4], duplicate_blocks=False):super(ResNet, self).__init__()self.layers = layerssupported_layers = [18, 34, 50, 101, 152]assert layers in supported_layersmgr = [1, 2, 4] # multi grid rate for duplicated blocksif layers == 18:depth = [2, 2, 2, 2]elif layers == 34:depth = [3, 4, 6, 3]elif layers == 50:depth = [3, 4, 6, 3]elif layers == 101:depth = [3, 4, 23, 3]elif layers == 152:depth = [3, 8, 36, 3]if layers < 50:num_channels = [64, 64, 128, 256, 512]else:num_channels = [64, 256, 512, 1024, 2048]num_filters = [64, 128, 256, 512]self.conv = ConvBNLayer(num_channels=3,num_filters=64,filter_size=7,stride=2,act='relu')self.pool2d_max = Pool2D(pool_size=3,pool_stride=2,pool_padding=1,pool_type='max')if layers < 50:block = BasicBlockl1_shortcut=Trueelse:block = BottleneckBlockl1_shortcut=Falseself.layer1 = fluid.dygraph.Sequential(*self.make_layer(block,num_channels[0],num_filters[0],depth[0],stride=1,shortcut=l1_shortcut,name='layer1'))self.layer2 = fluid.dygraph.Sequential(*self.make_layer(block,num_channels[1],num_filters[1],depth[1],stride=2,name='layer2'))self.layer3 = fluid.dygraph.Sequential(*self.make_layer(block,num_channels[2],num_filters[2],depth[2],stride=1,dilation=2,name='layer3'))# add multi grid [1, 2, 4] self.layer4 = fluid.dygraph.Sequential(*self.make_layer(block,num_channels[3],num_filters[3],depth[3],stride=1,name='layer4',dilation=multi_grid))if duplicate_blocks:self.layer5 = fluid.dygraph.Sequential(*self.make_layer(block,num_channels[4],num_filters[3],depth[3],stride=1,name='layer5',dilation=[x*mgr[0] for x in multi_grid]))self.layer6 = fluid.dygraph.Sequential(*self.make_layer(block,num_channels[4],num_filters[3],depth[3],stride=1,name='layer6',dilation=[x*mgr[1] for x in multi_grid]))self.layer7 = fluid.dygraph.Sequential(*self.make_layer(block,num_channels[4],num_filters[3],depth[3],stride=1,name='layer7',dilation=[x*mgr[2] for x in multi_grid]))self.last_pool = Pool2D(pool_size=7, # ignore if global_pooling is Trueglobal_pooling=True,pool_type='avg')self.fc = Linear(input_dim=num_filters[-1] * block.expansion,output_dim=num_classes,act=None)self.out_dim = num_filters[-1] * block.expansiondef forward(self, inputs):x = self.conv(inputs)x = self.pool2d_max(x)#print(x.shape)x = self.layer1(x)#print(x.shape)x = self.layer2(x)#print(x.shape)x = self.layer3(x)#print(x.shape)x = self.layer4(x)#print(x.shape)x = self.last_pool(x)x = fluid.layers.reshape(x, shape=[-1, self.out_dim])x = self.fc(x)return xdef make_layer(self, block, num_channels, num_filters, depth, stride, dilation=1, shortcut=False, name=None):layers = []if isinstance(dilation, int):dilation = [dilation] * depthelif isinstance(dilation, (list, tuple)):assert len(dilation) == 3, "Wrong dilation rate for multi-grid | len should be 3"assert depth ==3, "multi-grid can only applied to blocks with depth 3"padding = []for di in dilation:if di>1:padding.append(di)else:padding.append(None)layers.append(block(num_channels,num_filters,stride=stride,shortcut=shortcut,dilation=dilation[0],padding=padding[0],name=f'{name}.0'))for i in range(1, depth):layers.append(block(num_filters * block.expansion,num_filters,stride=1,dilation=dilation[i],padding=padding[i],name=f'{name}.{i}'))return layersdef ResNet18(pretrained=False):model = ResNet(layers=18)if pretrained:model_state, _ = fluid.load_dygraph(model_path['ResNet18'])model.set_dict(model_state)return modeldef ResNet34(pretrained=False):model = ResNet(layers=34)if pretrained:model_state, _ = fluid.load_dygraph(model_path['ResNet34'])model.set_dict(model_state)return modeldef ResNet50(pretrained=False, duplicate_blocks=False):model = ResNet(layers=50, duplicate_blocks=duplicate_blocks)if pretrained:model_state, _ = fluid.load_dygraph(model_path['ResNet50'])if duplicate_blocks:set_dict_ignore_duplicates(model, model_state)else:model.set_dict(model_state)return modeldef findParams(model_state, name):new_dict = dict()for key,val in model_state.items():if name == key[0:len(name)]:print(f'change {key} -> {key[len(name)+1::]}')new_dict[key[len(name)+1::]] = valreturn new_dictdef set_dict_ignore_duplicates(model, model_state):model.conv.set_dict(findParams(model_state,'conv'))model.pool2d_max.set_dict(findParams(model_state,'pool2d_max'))model.layer1.set_dict(findParams(model_state,'layer1'))model.layer2.set_dict(findParams(model_state,'layer2'))model.layer3.set_dict(findParams(model_state,'layer3'))model.layer4.set_dict(findParams(model_state,'layer4'))model.fc.set_dict(findParams(model_state,'fc'))return modeldef ResNet101(pretrained=False, duplicate_blocks=False):model = ResNet(layers=101, duplicate_blocks=duplicate_blocks)if pretrained:model_state, _ = fluid.load_dygraph(model_path['ResNet101'])if duplicate_blocks:set_dict_ignore_duplicates(model, model_state)else:model.set_dict(model_state)return modeldef ResNet152(pretrained=False):model = ResNet(layers=152)if pretrained:model_state, _ = fluid.load_dygraph(model_path['ResNet152'])model.set_dict(model_state)return modeldef main():with fluid.dygraph.guard():#x_data = np.random.rand(2, 3, 512, 512).astype(np.float32)x_data = np.random.rand(2, 3, 224, 224).astype(np.float32)x = to_variable(x_data)#model = ResNet18()#model.eval()#pred = model(x)#print('resnet18: pred.shape = ', pred.shape)#model = ResNet34()#pred = model(x)#model.eval()#print('resnet34: pred.shape = ', pred.shape)model = ResNet101(pretrained=False)model.eval()pred = model(x)print('dilated resnet50: pred.shape = ', pred.shape)#model = ResNet101()#pred = model(x)#model.eval()#print('resnet101: pred.shape = ', pred.shape)#model = ResNet152()#pred = model(x)#model.eval()#print('resnet152: pred.shape = ', pred.shape)#print(model.sublayers())#for name, sub in model.named_sublayers(include_sublayers=True):# #print(sub.full_name())# if (len(sub.named_sublayers()))# print(name)if __name__ == "__main__":main()
百度课程链接:https://aistudio.baidu.com/aistudio/course/introduce/1767
百度飞桨PaddlePaddle图像分割七日打卡营 class4 deeplab实现相关推荐
- 基于百度飞桨PaddlePaddle模型训练的手势识别模型控制音乐播放器
基于百度飞桨paddle模型训练的手势识别模型控制音乐播放器 前言 一.什么是百度飞桨PaddlePaddle? 一.1 飞桨AI Studio 二.实际使用 1.配置虚拟环境 2.安装 三.实战 四 ...
- 百度飞桨2021李宏毅机器学习特训营学习笔记之回归及作业PM2.5预测
百度飞桨2021李宏毅机器学习特训营学习笔记之回归及作业PM2.5预测 前言 回归 什么是回归(Regression)? 怎么做回归? 线性回归(Linear Regression) 训练集与验证集 ...
- 工程师程序员的自我修养 Episode.4 基于百度飞桨PaddlePaddle框架的女朋友情绪分析防被打消息推荐深度学习系统
具体为什么想到这个题目呢...大概是我也想不出别的什么有趣的话题或者项目的工作了吧. 有一天,柏拉图问老师苏格拉底什么是爱情?老师就让他到理论麦田里去,摘一棵全麦田里最大最金黄的麦穗来,期间只能摘一次 ...
- python画饼图_百度飞桨PaddlePaddle之[Python小白逆袭大神]7天训练营
第三次参加百度的7天训练营了 这次参加的主题是[Python小白逆袭大神],不过你别看是小白逆势...除非你一开始参加就逆袭完,不然你真的是python小白,这个课程还是有难难度的. 说一下个训练营的 ...
- 盘点国内那些深度学习框架:清华计图Jittor、腾讯优图NCNN、百度飞桨PaddlePaddle、阿里X-DeepLearning
1.清华计图Jittor 清华大学开发了一个名为计图(Jittor)的深度学习框架. 计图(Jittor:Just in Time)是一个采用元算子表达神经网络计算单元.完全基于动态编译(Just-i ...
- 强化学习——百度飞桨paddlepaddle parl
1. 配置环境 安装paddlepaddle(CPU/GPU) CPU和GPU版本的paddlepaddle均可使用,不知道是由于本人电脑显卡性能过低还是其他原因,并未发现明显训练速度差异.应该是缺少 ...
- 2021全国人工智能师资培训正式“开课”,百度飞桨助力高校教师提升AI“超能力”...
点击左上方蓝字关注我们 随着人工智能在各行各业的加速渗透和落地,AI人才缺口问题亟待解决.与此同时,高校教学仍面临着与工业实践脱节.资源差异大等困难,AI师资培训成为人才培养不可忽视的重要一环. 为积 ...
- 【机器学习】百度飞桨AI Studio平台项目:基于卷积神经网络分类方法的人脸颜值打分
基于卷积神经网络分类方法的人脸颜值打分 说在前面 实验数据 解决过程 1.Precondition 2.Dataset Preparation 3.Network Configuration 4.Mo ...
- 飞桨PaddlePaddle深度学习七日打卡营结营体会(小白菜只想混算力康康证书)
我是真的纯纯小白菜了,没法像大佬们一样技术心得体会了... 这是我第一次接触飞桨,第一次报飞桨的打卡营 我就 搞个 纯纯的体验版心得体会?(毕竟我就想看看证书啥样再混个算力 咋上路的 被大佬给我丢了个 ...
最新文章
- Oracle 11g Data Guard 使用duplicate from active database 创建 standby database
- USACO 1.0_Friday the Thirteenth
- JMeter初探五-配置元件与参数化
- Java守护线程概述
- Java但中获取时间将时间转换成字符串格式(年月日格式)
- 采蘑菇的克拉莉丝(树链剖分)
- grep与egrep的区别
- mysql 存储过程 模糊查询_mysql 分页创建存储过程并实现模糊查询
- linux系统怎么安装python3视频教程_Linux系统,python3.7安装教程
- 一种软件定时器/超时机制的实现方法
- 关于输入法的弹出和隐藏
- 360无痕浏览器_功能强大好用的浏览器
- matlab中小波工具箱下载,matlab小波工具箱小波分析步骤
- C#调用TSC打印机打印数据
- 算法导论 答案勘误(ing)
- 360浏览器通过访问插件管理界面启用flash实例演示,360浏览器启用Adobe Flash Player方法
- NSSM部署Net Core流程
- 【Python量化】 Scipy库求解最优资产投资组合
- 什么是mx记录?如何设置域名mx记录?
- 网络云盘前端项目启动