双线性卷积神经网络_全卷积网络Fully Convolutional Networks (FCN)实战

2023-11-04

全卷积网络Fully Convolutional Networks (FCN)实战

使用图像中的每个像素进行类别预测的语义分割。全卷积网络(FCN)使用卷积神经网络将图像像素转换为像素类别。与之前介绍的卷积神经网络不同,FCN通过转置卷积层将中间层特征映射的高度和宽度转换回输入图像的大小,使得预测结果在空间维度(高度和宽度)与输入图像一一对应。给定空间维度上的位置,信道维度的输出将是对应于该位置的像素的类别预测。

将首先导入实验所需的包或模块,然后解释转置卷积层。

%matplotlib inline

from d2l import mxnet as d2l

from mxnet import gluon, image, init, np, npx

from mxnet.gluon import nn

npx.set_np()

1. Constructing a Model

展示了一个完全卷积网络模型的最基本设计。如图1所示,全卷积网络首先利用卷积神经网络提取图像特征,然后通过1×1卷积层将通道数转换为类别数,最后利用转置卷积层将特征映射的高度和宽度转换为输入图像的大小。模型输出与输入图像具有相同的高度和宽度,并且在空间位置上具有一对一的对应关系。最终输出信道包含对应空间位置的像素的类别预测。

Fig. 1. Fully convolutional network.

下面,我们使用在ImageNet数据集上预先训练的ResNet-18模型来提取图像特征,并将网络实例记录为pretrained_net。如您所见,模型成员变量特性的最后两层是全局最大池化层GlobalAvgPool2D和示例展平层Flatten。输出模块包含用于输出的完全连接层。完全卷积网络不需要这些层。

pretrained_net = gluon.model_zoo.vision.resnet18_v2(pretrained=True)

pretrained_net.features[-4:], pretrained_net.output

(HybridSequential(

(0): BatchNorm(axis=1, eps=1e-05, momentum=0.9, fix_gamma=False, use_global_stats=False, in_channels=512)

(1): Activation(relu)

(2): GlobalAvgPool2D(size=(1, 1), stride=(1, 1), padding=(0, 0), ceil_mode=True, global_pool=True, pool_type=avg, layout=NCHW)

(3): Flatten

),

Dense(512 -> 1000, linear))

接下来,我们创建完全卷积的网络实例网。它复制了除预训练后的神经网络实例成员变量特征和预训练后得到的模型参数外的所有神经层。

net = nn.HybridSequential()

for layer in pretrained_net.features[:-2]:

net.add(layer)

当输入的高度和宽度分别为320和480时,网络的正向计算将使输入的高度和宽度减小到原来的1/32,即10和15。

X = np.random.uniform(size=(1, 3, 320, 480))

net(X).shape

(1, 512, 10, 15)

通过1×1卷积层将输出通道数转换为Pascal VOC2012(21)的类别数。最后,我们需要将特征图的高度和宽度放大32倍,以将它们变回输入图像的高度和宽度。依据卷积层输出形状的计算方法。因为(320−64+16×2+32)/32=10和(480−64+16×2+32)/32=15,我们构造了一个跨距为32的转置卷积层,并将卷积核的高度和宽度设置为64,填充为16。如果s的宽度和高度都是整数,那么s/2的卷积因子很难被放大。

num_classes = 21

net.add(nn.Conv2D(num_classes, kernel_size=1),

nn.Conv2DTranspose(

num_classes, kernel_size=64, padding=16, strides=32))

1.2. Initializing the Transposed Convolution Layer

转置卷积层可以放大特征地图。在图像处理中,有时需要放大图像,即上采样。上采样的方法有很多种,最常用的方法是双线性插值。简单地说,为了在坐标(x,y)处获得输出图像的像素,首先将坐标映射到输入图像的坐标。

这可以根据三个输入的大小与输出大小的比率来实现。映射值x′还有y′ 通常是实数。然后,我们找到离坐标最近的四个像素(x′,y′)在输入图像上。最后,输出图像在坐标(x,y)处的像素,根据输入图像上的这四个像素及其与(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 = (np.arange(kernel_size).reshape(-1, 1),

np.arange(kernel_size).reshape(1, -1))

filt = (1 - np.abs(og[0] - center) / factor) *

(1 - np.abs(og[1] - center) / factor)

weight = np.zeros((in_channels, out_channels, kernel_size, kernel_size))

weight[range(in_channels), range(out_channels), :, :] = filt

return np.array(weight)

将实验双线性插值上采样实现转置卷积层。构造一个转置卷积层,将输入的高度和宽度放大2倍,并用双线性_核函数初始化其卷积核。

conv_trans = nn.Conv2DTranspose(3, kernel_size=4, padding=1, strides=2)

conv_trans.initialize(init.Constant(bilinear_kernel(3, 3, 4)))

读取图像X并将上采样结果记录为Y。为了打印图像,需要调整通道尺寸的位置。

img = image.imread('../img/catdog.jpg')

X = np.expand_dims(img.astype('float32').transpose(2, 0, 1), axis=0) / 255

Y = conv_trans(X)

out_img = Y[0].transpose(1, 2, 0)

如您所见,转置卷积层将图像的高度和宽度都放大了2倍。值得一提的是,除了坐标比例尺不同外,双线性插值放大后的图像与原始图像看起来一样。

d2l.set_figsize((3.5, 2.5))

print('input image shape:', img.shape)

d2l.plt.imshow(img.asnumpy());

print('output image shape:', out_img.shape)

d2l.plt.imshow(out_img.asnumpy());

input image shape: (561, 728, 3)

output image shape: (1122, 1456, 3)

在完全卷积网络中,我们初始化转置卷积层以进行上采样双线性插值。对于1×1 卷积层,我们使用Xavier进行随机初始化。

W = bilinear_kernel(num_classes, num_classes, 64)

net[-1].initialize(init.Constant(W))

net[-2].initialize(init=init.Xavier())

1.3. Reading the Dataset

将随机裁剪的输出图像的形状指定为320×480,所以高度和宽度都可以被32整除。

batch_size, crop_size = 32, (320, 480)

train_iter, test_iter = d2l.load_data_voc(batch_size, crop_size)

Downloading ../data/VOCtrainval_11-May-2012.tar from http://http://d2l-data.s3-accelerate.amazonaws.com/VOCtrainval_11-May-2012.tar...

read 1114 examples

read 1078 examples

1.4. Training

可以开始训练模型了。这里的损失函数和精度计算与图像分类中使用的损失函数和精度计算没有实质性的不同。因为我们使用转置卷积层的通道来预测像素类别,所以在SoftmaxCrossEntropyLoss中指定了axis=1(通道尺寸)选项。此外,该模型还根据每个像素的预测类别是否正确来计算精度。

num_epochs, lr, wd, ctx = 5, 0.1, 1e-3, d2l.try_all_gpus()

loss = gluon.loss.SoftmaxCrossEntropyLoss(axis=1)

net.collect_params().reset_ctx(ctx)

trainer = gluon.Trainer(net.collect_params(), 'sgd',

{'learning_rate': lr, 'wd': wd})

d2l.train_ch13(net, train_iter, test_iter, loss, trainer, num_epochs, ctx)

loss 0.331, train acc 0.890, test acc 0.841

290.4 examples/sec on [gpu(0), gpu(1)]

1.5. Prediction

在预测过程中,需要对每个通道的输入图像进行标准化,并将其转换为卷积神经网络所需的四维输入格式。

def predict(img):

X = test_iter._dataset.normalize_image(img)

X = np.expand_dims(X.transpose(2, 0, 1), axis=0)

pred = net(X.as_in_ctx(ctx[0])).argmax(axis=1)

return pred.reshape(pred.shape[1], pred.shape[2])

为了可视化每个像素的预测类别,我们将预测的类别映射回其在数据集中的标记颜色。

def label2image(pred):

colormap = np.array(d2l.VOC_COLORMAP, ctx=ctx[0], dtype='uint8')

X = pred.astype('int32')

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, 480, 320)

X = image.fixed_crop(test_images[i], *crop_rect)

pred = label2image(predict(X))

imgs += [X, pred, image.fixed_crop(test_labels[i], *crop_rect)]

d2l.show_images(imgs[::3] + imgs[1::3] + imgs[2::3], 3, n, scale=2);

1.6. Summary

  • The fully convolutional network first uses the convolutional neural network to extract image features, then transforms the number of channels into the number of categories through the 1×1 convolution layer, and finally transforms the height and width of the feature map to the size of the input image by using the transposed convolution layer to output the category of each pixel.
  • In a fully convolutional network, we initialize the transposed convolution layer for upsampled bilinear interpolation.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

双线性卷积神经网络_全卷积网络Fully Convolutional Networks (FCN)实战 的相关文章

  • C语言(函数与预处理、指针)

    一 函数与预处理 一 一维数组 1 一维数组的定义格式为 类型说明符 数组名 常量表达式 例如 int a 10 它表示定义了一个整形数组 数组名为a 有10个元素 2 在定义数组时 需要指定数组中元素的个数 方括弧中的常量表达式用来表示元
  • 基于 FFmpeg 的跨平台视频播放器简明教程(七):使用多线程解码视频和音频

    系列文章目录 基于 FFmpeg 的跨平台视频播放器简明教程 一 FFMPEG Conan 环境集成 基于 FFmpeg 的跨平台视频播放器简明教程 二 基础知识和解封装 demux 基于 FFmpeg 的跨平台视频播放器简明教程 三 视频
  • 69. Sqrt(x)

    Implement int sqrt int x Compute and return the square root of x where x is guaranteed to be a non negative integer Sinc
  • 新闻分析:解密代号A1S

    本周二SAP董事长特拉普纳 Hasso Plattner 在Software 2007会议上发言时阐述了SAP新的软件设计方法 SAP表示在过去的三年中有3000多名工程师都在运用这种新的软件设计方法在开发代号为A1S的新产品 虽然这一代号
  • HTML的input类型为hidden导致无法reset改字段的value问题

    问题关键 根据HTML规范 hidden是非ui类元素 不接受用户处理 所以form的 reset并不影响它 http stackoverflow com questions 6367793 why does the reset butto
  • 一种通用的业务监控触发方案设计

    一 背景 业务监控是指通过技术手段监控业务代码执行的最终结果或者状态是否符合预期 实现业务监控主要分成两步 一 在业务系统中选择节点发送消息触发业务监控 二 系统在接收到mq消息或者定时任务调度时 根据消息中或者任务中的业务数据查询业务执行
  • go-micro 在linux下安装出现service auth not found

    1 安装micro linux下执行该命令 wget q https raw githubusercontent com micro micro master scripts install sh O bin bash 2 micro se
  • vue 实现md5、base64加密

    背景 前端使用密码登录的时候 一般都会使用密文传输 否则控制台就能看到密码 具体实现如下 使用 md5 进行加密 1 安装 cnpm install save js md5 2 在 main js 全局引用 import md5 from
  • pycharm console 报错

    描述 pycharm的console本来用的好好地 但是我也不知道自己改了啥 结果报错了 报错 Error Console process terminated with error Traceback most recent call l
  • Inheritance___CH_17

    17 1 Introduction to inheritance A hierarchy is a diagram that shows how various objects are related Most hierarchies ei
  • 华为交换机配置链路聚合

    文章目录 1 拓扑图 2 任务描述 3 Sw1配置 4 Sw2配置 5 Lacp模式链路聚合演示 https blog csdn net qq 45042462 article details 120938052 1 拓扑图 2 任务描述
  • 正则表达式校验版本号

    需求 校验版本号 规则 X Y Z 1 99 0 99 0 99 要求 1 必须是三位 例如 x x x的形式 2 每位x的范围分别为1 99 0 99 0 99 3 不允许的情况 0 x x 01 x x x 0x x x 00 x x
  • Python根据Excel名单实现文件夹下文件批量改名

    班级收集截图 通过缓存快速获取图片 可是文件夹内的文件是乱码 所以采用Python进行批量改名操作 import os import xlrd count 1 path C Users White Desktop 18 文件所在文件夹 ex
  • 排查Linux服务器是否被入侵步骤

    作为一个Linux运维工程师 能够清晰地鉴别异常机器是否已经被入侵了显得至关重要 以下是结合centos7 9操作系统进行排查Linux操作系统是否被入侵 其他Linux发行版的操作类似 1 入侵者可能会删除机器的日志信息 可以查看日志信息
  • No projects are found to import 问题如何解决

    在myeclipse中导入项目遇到 No projects are found to import 导致原因 项目目录中没有 project或者 classpath 解决方案 1 project classpath直接拷贝到相应位置即可 2
  • 大数据——Java 知识点整理

    1 JDK 和 JRE 有什么区别 JDK Java Development Kit 的简称 java开发工具包 提供了java的开发环境和运行环境 JRE Java Runtime Environment 的简称 java运行环境 为ja
  • FSDataInputStream中的seek()方法

    FSDataInputStream实现了Seekable接口 实现方法 其中的seek long pos 方法可以 对任意位置进行重新定位 与java io inputstream中的skip 不同 举个例子对 hdfs中的一个文件进行两次
  • JavaScript 使用 canvas arcTo() 在画布上画一条弧线

    arcTo 在画布上创建介于两个切线之间的弧 曲线 arcTo 使用 stroke 方法在画布上绘制确切的弧
  • 汇编与接口课程实验3——利用8255A实现LED的流水点亮实验

    一 实验目的 该实验的目的在于让学生掌握8255A和微机接口的连接方法 了解8255A的基本的工作原理和编程方法 二 实验内容 PA口接8个拨动开关K1 K8 PB口接8个LED 初始由开关K1 K8设定8位不同的值 当执行程序后LED按K

随机推荐

  • 进程,线程,协程(用户级线程)相关知识

    一 进程 线程 协程 用户级线程 1 进程 为了方便管理计算机的多道程序 计算机操作系统引入进程概念 进程是系统进行资源分配和调度的基本单位 进程作为程序独立运行的载体保障程序的独立运行 进程的存在使操作系统的资源利用率大幅度提升 进程的控
  • pfsense配置网络

    文章目录 1 配置lan口 2 配置wan口 2 1 pfsense联网 2 2 局域网内部虚拟机联网 1 配置lan口 默认lan口ip是192 168 1 1也可以自己配置 输入2开始配置ip 输入2选择lan口 输入ip地址 不能和已
  • MATLAB读取指定文件夹下的所有文件

    1 指定路径下 单个文件夹data中所有图像 file path data 图像文件夹路径 img path list dir strcat file path jpg 获取该文件夹中所有 jpg格式的图像 img num length i
  • 华为机试牛客网,C语言实现

    HJ1 字符串最后一个单词的长度 int main char a 5000 int n 0 t 0 p gets a for int i 0 a i 0 i n n 1 for int i n 1 a i i gt 0 i t t 1 pr
  • JSON.parse()和JSON.stringify()用法

    JSON parse 方法用于将 JSON 格式的字符串转换为 JavaScript 对象 而 JSON stringify 方法用于将 JavaScript 对象转换为 JSON 字符串 这两个方法可以组合使用来实现将数据从对象到字符串再
  • Bankless:2022年Q3以太坊生态报告

    撰文 Ben Giove Bankless 分析师 编译 Cointelegraph 在过去的 3 个月里 以太坊网络的使用情况如何 有多少人还在购买 NFT 非同质化代币 Layer 2 第二层网络 是否在成功扩展以太坊 本文最初受 Ja
  • 发现一个 Mac 神仙截图工具(截长图、带阴影、贴图等)

    1 前言 在发现 Xnip 之前 我用的都是微信自带截图工具 一用就是好几年 每次从工作电脑切换到个人电脑 创作的时候 截图比较常用 每次都需要为了截图而登录微信 而且不支持截长图 不支持多窗口截图等比较常用的功能 很是失望 总想找一款替代
  • web请求过程剖析

    服务器渲染 在服务器那边直接把数据和html整合在一起 统一返回给浏览器 在页面源代码中能看到数据 客户端渲染 第一次请求只要一个html骨架 第二次请求拿到数据进行数据展示 在页面源代码中看不到数据 在打开额网页右键点检查 gt Netw
  • Vijava 学习笔记之(VirtualMachineRelocateSpec类)

    VirtualMachineRelocateSpec 移动或复制指定虚拟机 使用不同的DataStore或HostSystem Properties NAME TYPE DESCRIPTION datastore ManagedObject
  • GDI+绘制的一个Report Designer原型

    早上看到Pvistely同学在说设计器编程的一些问题 想起来我也曾使用GDI 做过一个报表设计器的原型 刚才翻到了代码 居然已经是整整一年前的东西了 时间过的可真是快啊 当时产品里计划要提供可视化报表设计功能 于是part time了两个周
  • AD620放大器 AD623放大器 仪表放大器 差分放大器 微弱信号放大 原理图和PCB设计

    AD620放大器 AD623放大器 仪表放大器 差分放大器 微弱信号放大 原理图和PCB设计 目录 AD620放大器 AD623放大器 仪表放大器 差分放大器 微弱信号放大 原理图和PCB设计 基本原理 芯片选型 原理图 3D PCB 具体
  • getBoundingClientRect offsetWidth offsetHeight

    对于一个旋转的dom元素 getBoundingClientRect 得到的width height是外接矩形的宽高 offsetWidth offsetHeight是未旋转前dom的宽高
  • 【开发实践】美团为什么开发 Kylin On Druid(下)?

    前言 在上篇文章里 我们比较了 Kylin 和 Druid 这两个重要的 OLAP引擎的特点 也分析了 Kylin on HBase 的不足 得出了使用 Druid 代替 HBase 作为 Kylin 存储的方案 最后介绍了美团开发的 Ky
  • 【C++】vector类的使用和模拟实现和如何解决迭代器失效的问题

    1 vector的介绍 vector文档介绍 vector是表示可变大小数组的序列容器 就像数组一样 vector也采用的连续存储空间来存储元素 也就是意味着可以采用下标对vector的元素进行访问 和数组一样高效 但是又不像数组 它的大小
  • windows缺少msvcp120.dll解决方案

    安装最新的Microsoft Visual C Redistributable Package 该错误标识MSVCR120 dll文件的问题 该文件属于Visual C Redistributable Package 可以通过从官方网站重新
  • 【C++11新特性】auto、范围for语句、nullptr

    文章目录 1 auto 2 范围for语句 2 1 遍历数组 2 2 遍历字符串 2 3 遍历STL容器 3 nullptr 1 auto auto 可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型 也就是说 声明时必须要
  • jenkins war版的在Linux下的安装与卸载

    文章目录 目录 文章目录 前言 一 安装 二 卸载 总结 前言 Jenkins是一个开源软件项目 是基于Java开发的一种持续集成工具 用于监控持续重复的工作 集成 该软件可以集成其他软件 来完成相应的功能 一 安装 因为jenkins本身
  • 【实习】vue input下拉及搜索功能

    一个需求input实现下拉及搜索 实习练手不让用ui模板 首先百度得出2种方法 一个是input select 一个是input datalist input组合select改css写js 最后bug太多放弃了 input datalist
  • 突破神奇的Cloudflare防火墙

    背景 最近碰到一个神奇的网站 在浏览器可以打开 但是通过 curl 或者 代码访问就直接 403 我估摸着这肯定是做了UA校验 于是请求的时候把浏览器的 UA 给带上 然后访问发现还是 403 不过这也难不倒我 肯定是还有校验其它的请求头
  • 双线性卷积神经网络_全卷积网络Fully Convolutional Networks (FCN)实战

    全卷积网络Fully Convolutional Networks FCN 实战 使用图像中的每个像素进行类别预测的语义分割 全卷积网络 FCN 使用卷积神经网络将图像像素转换为像素类别 与之前介绍的卷积神经网络不同 FCN通过转置卷积层将