全卷积网络

全卷积网络

全卷积网络就是图像到图像的变换,一般用于语义分割,图像恢复啥的
在这里插入图片描述
我们使用Resnet18来进行,最后平均池化和全连接层我们不需要

import torch
import torchvision
from torch import nn
from torch.nn import functional as F
from d2l import torch as d2l
# 使用ImageNet数据集上预训练的Resnet-18来提取图像特征,Resnet-18的最后几层包括全局平均池化和全连接层,我们不需要
pretrained_net = torchvision.models.resnet18(pretrained=True)
list(pretrained_net.children())[-3:]

在这里插入图片描述
创建全卷积网络,抛掉最后两层

net = nn.Sequential(*list(pretrained_net.children())[:-2])

给定高320宽480, net前向传播为1/32

X = torch.rand(size=(1, 3, 320, 480))
net(X).shape

因此,我们需要利用转置卷积将shape转为原来的320*480
在此之前,我们需要将通道数改为类别数,这样每个通道相同位置上的点就代表其对应类别的概率

# 最后先用1*1卷积层将输出通道数换成类别数,因为这样子通道上相同位置的点就代表为这个类别的概率
# 然后再通过反卷积增加高和宽的size
# 如果步幅为s,填充为s/2,卷积核size为2s*2s,那么输入的高和宽为放大s倍
num_classes = 21
net.add_module('final_conv', nn.Conv2d(512, num_classes, kernel_size=1))
net.add_module('transpose_conv', nn.ConvTranspose2d(num_classes, num_classes, kernel_size=64, padding=16, stride=32))

对于转置卷积的初始化,我们有特殊的做法
初始化卷积层,我们有时候需要将图像放大,用上采样,双线性插值是常用的上采样方法之一,它也常用于初始化卷积层
假设我们将输出图像坐标(x, y) 映射到(x’, y’)上,例如,根据输入和输出的尺寸来映射
然后我们需要在输入图像上找到与(x’, y’)最近的四个像素
输出图像坐标(x,y)上的像素依据输入图像上的zz这四个像素和(x’, y’)距离来计算

了解一下原理就行,代码层面先不深究

# 可以通过转置卷积层实现,我们不讨论算法的原理,就给出一个函数(我也没了解)
def bilinear_kernel(in_channels, out_channels, kernel_size):
    factor = (kernel_size + 1) // 2
    if kernel_size % 2 == 1:
        center = factor - 1
    else:
        center = factor - 0.5
    og = (torch.arange(kernel_size).reshape(-1, 1),
          torch.arange(kernel_size).reshape(1, -1))
    filt = (1 - torch.abs(og[0] - center) / factor) * \
           (1 - torch.abs(og[1] - center) / factor)
    weight = torch.zeros((in_channels, out_channels,
                          kernel_size, kernel_size))
    weight[range(in_channels), range(out_channels), :, :] = filt
    return weight

假设需要放大两倍,使用该初始化技术

# 假设我们需要把图像放大两倍,使用bilinear_kernel初始化
conv_trans = nn.ConvTranspose2d(3, 3, kernel_size=4, padding=1, stride=2, bias=False)
conv_trans.weight.data.copy_(bilinear_kernel(3, 3, 4))

用一张图片来感受一下

img = torchvision.transforms.ToTensor()(d2l.Image.open('catdog.png'))
X = img.unsqueeze(0)
Y = conv_trans(X)
out_img = Y[0].permute(1, 2, 0).detach()
d2l.set_figsize()
print(img.permute(1, 2, 0).shape)
d2l.plt.imshow(img.permute(1, 2, 0))
print(out_img.shape)
d2l.plt.imshow(out_img)

在这里插入图片描述
可以看到跟原图片是没什么变化的(原图片前面的章节中有提到)

初始化之前的全卷积网络的参数

# 我们就使用bilinear_kernel来初始化W
# 对于1*1卷积层,使用Xavier初始化参数
W = bilinear_kernel(num_classes, num_classes, 64)
net.transpose_conv.weight.data.copy_(W)

读取数据, 这里我修改了内置函数的num_worker,要不然会报错

# 读取数据集
batch_size, crop_size = 32, (320, 480)
train_iter, test_iter = d2l.load_data_voc(batch_size, crop_size) # 我修改了内置函数的num_worker = 0

定义Loss和训练,这里由于我电脑性能问题,没有训练成功,应该代码是可以运行的

def loss(inputs, targets):  # loss和之前的没什么区别,只不过是基于通道维度的
    return F.cross_entropy(inputs, targets, reduction='none').mean(1).mean(1)
num_epochs, lr, wd, devices = 5, 0.001, 1e-3, d2l.try_all_gpus()
trainer = torch.optim.SGD(net.parameters(), lr=lr, weight_decay=wd)
d2l.train_ch13(net, train_iter, test_iter, loss, trainer, num_epochs, devices)

最后是预测

def predict(img):  # 先标准化
    X = test_iter.dataset.normalize_image(img).unsqueeze(0)
    pred = net(X.to(device[0])).argmax(dim=1)
    return pred.reshape(pred.shape[1], pred.shape[2])

# 可视化类别的颜色
def label2image(pred):
    coloarmap = torch.tensor(d2l.VOC_COLORMAP, device = devices[0])
    X = pred.long()
    return colormap[X, :]

测试集中的图像大小各异,由于模型使用了步幅为32的转置卷积层,因此当输入图像的高或宽无法被32整除时,
转置卷积层输出的高或宽会与输入图像的尺寸有偏差。 为了解决这个问题,我们可以在图像中截取多块高和宽为32的整数倍的矩形区域,
并分别对这些区域中的像素做前向传播。 请注意,这些区域的并集需要完整覆盖输入图像。
当一个像素被多个区域所覆盖时,它在不同区域前向传播中转置卷积层输出的平均值可以作为softmax运算的输入,从而预测类别

我们只读取几张较大的测试图像,并从图像的左上角开始截取形状为320*480的区域用于预测。
对于这些测试图像,我们逐一打印它们截取的区域,再打印预测结果,最后打印标注的类别

voc_dir = d2l.download_extract('voc2012', 'VOCdevkit/VOC2012')
test_images, test_labels = d2l.read_voc_images(voc_dir, False)
n, imgs = 4, []
for i in range(n):
    crop_rect = (0, 0, 320, 480)
    X = torchvision.transforms.functional.crop(test_images[i], *crop_rect)
    pred = label2image(predict(X))
    imgs += [X.permute(1, 2, 0), pred.cpu(), torchvision.transforms.functional.crop(test_images[i], *crop_rect).permute(1, 2, 0)]
d2l.show_images(imgs[::3] + imgs[1::3] + imgs[2::3], 3, n, scales=2)  # 连续的是图像、预测、标签 这样加起来后,得到的是连续的图像,连续的预测,连续的标签

在这里插入图片描述
参考:https://zh.d2l.ai/chapter_computer-vision/fcn.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/272270.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

sheng的学习笔记-【中】【吴恩达课后测验】Course 4 -卷积神经网络 - 第四周测验

课程4_第4周_测验题 目录 第一题 1.面部验证只需要将新图片与1个人的面部进行比较,而面部识别则需要将新图片与K个人的面部进行比较。 A. 【  】正确 B. 【  】错误 答案: A.【 √ 】正确 第二题 2.在人脸验证中函数d(img1,img2)起什么作用&a…

12.26_黑马数据结构与算法笔记Java

目录 243 图 Floyd Warshall 算法实现2 244 图 Floyd Warshall 算法实现3 245 图 Floyd Warshall 算法实现4 246 图 最小生成树 Prim 247 图 最小生成树 Kruskal 248 图 并查集 1 249 图 并查集 2 250 图 并查集 路径压缩 251 图 并查集 UnionBySize 252 贪心算法 介绍…

Python干饭神器告诉你,今天吃什么,再也不用为吃什么发愁!

亲爱的小伙伴们,由于微信公众号改版,打乱了发布时间,为了保证大家可以及时收到文章的推送,可以点击上方蓝字关注测试工程师成长之路,并设为星标就可以第一时间收到推送哦 一.前言 hello,大家好&#xff0c…

计算器——可支持小数的任意四则运算(中缀表达式转为后缀表达式算法)

中缀表达式转为后缀表达式的原理过程主要包括以下步骤: 1. 初始化两个栈,一个用于存储操作数,一个用于存储运算符。2. 从左到右扫描中缀表达式的每个字符。3. 如果遇到数字,则直接将其压入操作数栈。4. 如果遇到运算符&#xff0c…

[vue]Echart使用手册

[vue]Echart使用手册 使用环境Echart的使用Echart所有组件和图表类型Echart 使用方法 使用环境 之前是在JQuery阶段使用Echart,直接引入Echart的js文件即可,现在是在vue中使用,不仅仅时echarts包,还需要安装vue-echarts: "…

性能暴增的Rope Crystal版本:红宝石(12.25)

文章目录 (零)版本介绍(一)主界面调整(二)模型与性能(三)创作纪念日 (零)版本介绍 🔗 Github仓库。 这次圣诞节更新主要是提升性能!&…

JavaScript:DOM节点

JavaScript:DOM节点 DOM节点查找节点父节点查找子节点查找兄弟节点查找 插入节点追加节点克隆节点 删除节点浏览器渲染模式回流重绘 DOM节点 DOM树中的每一个内容都称之为节点,主要包括元素节点,属性节点,文本节点等,本…

EasyCVR无人机推流+人数统计AI算法,助力公共场所人群密度管控

一、背景与需求 在公共场所和大型活动的管理中,人数统计和人群密度控制是非常重要的安全问题。传统的方法可能存在效率低下或准确度不足的情况,无法满足现代社会的需求。TSINGSEE青犀可以利用无人机推流AI人流量统计算法,基于计算机视觉技术…

22000mAh 电池,这款国产新机来了场「续航」震撼

见惯了主流智能手机,是时候上一波离谱新机震撼了。 三防手机这一细分类型,咱们普通用户可能接触得比较少; 但对于极限运动、野外探险爱好者来说,这玩意儿可是关键时候能救命的必备神器。 在真正严苛环境面前,性能啥的…

ES慢查询分析——性能提升6 倍

问题 生产环境频繁报警。查询跨度91天的数据,请求耗时已经来到了30s。报警的阈值为5s。 背景 查询关键词简单,为‘北京’ 单次仅检索两个字段 查询时间跨度为91天,覆盖数据为450亿数据 问题分析 使用profle分析,复现监控报警的…

【DevOps 工具链】搭建 项目管理软件 禅道

文章目录 1、简介2、环境要求3、搭建部署环境3.1. 安装Apache服务3.2. 安装PHP环境(以php7.0为例 )3.3. 安装MySQL服务 4、搭建禅道4.1、下载解压4.2、 配置4.2.1、 启动4.2.2、自启动4.2.3、确认是否开机启动 5、成功安装 1、简介 禅道是国产开源项目管…

nvprof:CUDA编程性能分析工具

nvprof分析工具使您能够从命令行收集和查看分析数据。nvprof能够收集CPU和GPU上与CUDA相关的活动的时间线,包括内核执行、内存传输、内存集和CUDA API调用以及CUDA内核的事件或度量。评测选项通过命令行选项提供给nvprof。分析结果在收集分析数据后显示在控制台中&a…

PS 修改图片为固定大小和固定内存

1. 改为固定大小 点击图像->图像大小 然后就可以根据你的需求进行更改了 2. 改为固定内存 点击文件->存储或者存储为web 然后就是如下界面: 点击确定之后,就会有如下界面,其中右边有图片内存的最大大小,三角形处可以来回…

详解Junit单元测试@Test及Assert断言(一学就会,通俗易懂版)

定义 快速入门(扩展:Assert断言) 断言机制 运行该类的所有测试类 Junit常用注解 示例 1. 2. 3. 4.实例方法初始化和释放资源 5.静态方法初始化和释放资源 一样的使用

[SWPUCTF 2021 新生赛]hardrce

[SWPUCTF 2021 新生赛]hardrce wp 参考博客&#xff1a;https://www.cnblogs.com/bkofyZ/p/17644820.html 代码审计 题目的代码如下&#xff1a; <?php header("Content-Type:text/html;charsetutf-8"); error_reporting(0); highlight_file(__FILE__); if(is…

2023年民宿管理系统排名前十的是哪些?哪一个的功能强大?

现在说起去旅游&#xff0c;很多都会选择订民宿&#xff0c;因为民宿装修风格更具个性化和本土气息&#xff0c;适合追求新潮的年轻人&#xff0c;拍照打卡效果很好。另外就是民宿布局和家里比较相似&#xff0c;出游人数比较多的话住着更方便。由于这股风潮的兴起&#xff0c;…

模型性能评估简介

模型评估 混淆矩阵 Positive - 正例Negative (N) - 负例 结果: 预测为正类别 预测为负类别 真实为正类别 True Positive (TP) False Negative (FN) 真实为负类别 False Positive (FP) True Negative (TN)TP - 预测 P, 实际 P, 模型预测正确FP - 预测 P, …

promise的使用和实例方法

前言 异步,是任何编程都无法回避的话题。在promise出现之前,js中也有处理异步的方案,不过还没有专门的api能去处理链式的异步操作。所以,当大量的异步任务逐个执行,就变成了传说中的回调地狱。 function asyncFn(fn1, fn2, fn3) {setTimeout(() > {//处理第一个异步任务fn1…

网工内推 | 技术支持、解决方案工程师,RHCA认证优先,带薪年假

01 天融信 招聘岗位&#xff1a;售后技术支持工程师 职责描述&#xff1a; 1.负责公司运营商态势安全项目系统远程维护与运营支持工作。 2.负责远程对态势平台、数据探针进行日常巡检&#xff0c;及时发现故障问题&#xff0c;并反馈处置。 3.负责远程支撑态势平台的功能考核&…

k8s是什么

生么是k8s&#xff1a; Kubernetes:8个字母省略&#xff0c;就是k8s 自动部署&#xff0c;自动扩展和管理容器化部署的应用程序的一个开源系统、 k8s是负责自动化运维管理多个容器化程序的集群&#xff0c;是一个功能强大的容器编排工具。 分布式和集群化的分布式进行容器管…