论文阅读:Spatial Transformer Networks

文章目录

    • 1 概述
    • 2 模型说明
      • 2.1 Localisation Network
      • 2.2 Parameterised Sampling Grid
    • 3 模型效果
    • 参考资料

1 概述

CNN的机理使得CNN在处理图像时可以做到transition invariant,却没法做到scaling invariant和rotation invariant。即使是现在火热的transformer搭建的图像模型(swin transformer, vision transformer),也没办法做到这两点。因为他们在处理时都会参考图像中物体的相对大小和位置方向。不同大小和不同方向的物体,对网络来说是不同的东西。这个问题在这篇文章统称为spatially invariant问题。甚至不同方向的物体,本身就真的是不同的东西,比如文字。

其实pooling layer有一定程度上解决了这个问题,因为在做max pooling或者average pooling的时候,只要这个特征在,就可以提取出来,在什么位置,pooling layer是不关心的。但是pooling的kernel size通常都比较小,需要做到大物体的spatially invariant是很难的,除非网络特别深。

STN(spatial transformer network)的提出,就是为了解决spatially invariant问题这个问题。它的主要思想很简单,就是训练一个可以把物体线性变换到模型正常的大小和方向的前置网络。这个网络可以前置于任何的图像网络中,即插即用。同时也可以和整个网络一起训练。

再说的直白一点,就是一个可以根据输入图片输出仿射变换参数的网络。
stn demo

图1-1 STN结果示例

图1-1是STN网络的一个结果示意图,图1-1(a)是输入图片,图1-1(b)是STN中的localisation网络检测到的物体区域,图1-1©是STN对检测到的区域进行线性变换后输出,图1-1(d)是有STN的分类网络的最终输出。

2 模型说明

STN(spatial transformer network)更准确地说应该是STL(spatial transformer layer),它就是网络中的一层,并且可以在任何两层之间添加一个或者多个。如下图2-1所示,spatial transformer主要由两部分组成,分别是localisation net和grid generator。
stn模型结构示意

图2-1 stn模型结构示意图

2.1 Localisation Network

我们的目的是把第l−1l-1l1层的第nnn行,第mmm列的特征移动到第lll层的某行某列。如下图2-2所示,一个3×33 \times 33×3的特征要变换的话,第lll层的每个位置都可以表示为l−1l-1l1层的特征的加权和。通过控制权重wnm,ijlw_{nm,ij}^lwnm,ijl就可以实现任何仿射变换。
通过全连接进行仿射变换

图2-2 通过全连接进行仿射变换示例

但如果直接加一层全连接让模型学的话,模型可能学出来的就不是仿射变换了,参数量也很大,很难学,很难控制。所有就设计了一个localisation net,直接让模型学仿射变换的参数,这相当于是一个inductive bias。

localisation net的输入是前一层的特征,输出是仿射变换的参数,如果是平面的放射变换就是6个参数,通过这六个参数可以控制整个图像的平移,旋转,缩放。
通过参数进行仿射变换示例

图2-3 通过参数进行仿射变换示例

图2-3中的[a,b,c,d,e,f][a,b,c,d,e,f][a,b,c,d,e,f]参数就是localisation net的输出。核心公式就是

[x′y′]=[abecdf][xy1](2-1)\left [ \begin{matrix} x' \\ y' \end{matrix} \right ] = \left [ \begin{matrix} a & b & e \\ c & d & f \end{matrix} \right ] \left [ \begin{matrix} x \\ y \\ 1\end{matrix} \right ] \tag{2-1} [xy]=[acbdef]xy1(2-1)

其中,xxxyyy是当前层的坐标,x′x'xy′y'y是前一层的坐标,aaaddd主要控制缩放,bbbccc主要控制旋转,eeefff主要控制平移。

2.2 Parameterised Sampling Grid

localisation net输出了仿射变换参数之后,式(2−1)(2-1)(21)告诉了我们当前层(x,y)(x,y)(x,y)这个位置的特征是前一层的(x′,y′)(x', y')(x,y)位置的特征拿过来的。但是,如图2-4中的例子所示,(x′,y′)(x', y')(x,y)可能是小数,位置需要是正整数,如果采用取整的操作的话,网络就会变得不可梯度下降,没法更新参数了。

我们想要的是,当[a,b,c,d,e,f][a,b,c,d,e,f][a,b,c,d,e,f]发生微小的变化之后,下一层的特征也发生变化,这样才可以保证可以梯度下降。
带插值的仿射变换示意图

图2-4 带插值的仿射变换示意图

于是,作者就采用了插值的方法来进行采样。比如当坐标为[1.6,2.4][1.6, 2.4][1.6,2.4]时,就用[a12l−1,a13l−1,a22l−1,a23l−1][a_{12}^{l-1}, a_{13}^{l-1}, a_{22}^{l-1}, a_{23}^{l-1}][a12l1,a13l1,a22l1,a23l1]这几个值进行插值。这样一来[a,b,c,d,e,f][a,b,c,d,e,f][a,b,c,d,e,f]发生微小的变化之后,[x,y][x,y][x,y]位置采样得到的值也会有变化了。这也使得spatial transformer可以放到任何层,跟整个网络一起训练。

3 模型效果

(1)文字识别任务
图3-1表示了STN加入到文字识别任务时带来的效果提升,图3-1左侧是不同模型在SVHN数据集上的错误率。这相当于是一个只有数字的文字识别任务。

数字识别的效果示意图

图3-1 数字识别的效果示意图

不过用在OCR任务中,STN其实有点鸡肋。OCR有文字检测和文字识别两个部分,一般文字检测部分会带有检测框四个顶点的坐标,我们直接把文字检测的结果进行仿射变换再去文字识别就可以了,不需要在文字识别时再加一个STN。一个是难训练,再就是推理性能下降。

(2)图像分类任务
图3-2表示了STN在图像识别任务的效果,图3-2左侧表示了不同模型在Caltech-UCSD Birds-200-2011数据集上的准确率。
鸟类分类的效果示意图

图3-2 数字识别的效果示意图

2×ST−CNN2 \times ST-CNN2×STCNN表示在同一层是用了两个不同的STL,4×ST−CNN4 \times ST-CNN4×STCNN表示在同一层是用了四个不同的STL。图3-2右侧中的方框表示了不同STL要进行放射变换的位置。
鸟类识别中的STN示意图

图3-3 鸟类识别中的STN示意图

可以看到不同的STL关注的鸟的部位也是不一样的,一个一直关注头部,一个一直关注身子。这就相当于是一个attention,把感兴趣的区域提取出来了。

还有一个地方是,这里的方框都是正的,这其实是因为作者把仿射变换中的参数[b,c][b, c][b,c]人为置0了,变成了

[x′y′]=[a0e0df][xy1](3-1)\left [ \begin{matrix} x' \\ y' \end{matrix} \right ] = \left [ \begin{matrix} a & 0 & e \\ 0 & d & f \end{matrix} \right ] \left [ \begin{matrix} x \\ y \\ 1\end{matrix} \right ] \tag{3-1} [xy]=[a00def]xy1(3-1)

可见STN是一个可以融入到很多图像模型,且可拓展性高的模块。

参考资料

[1] Spatial Transformer Networks
[2] 李宏毅-Spatial Transformer Layer

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dataframe 排序_疯狂Spark之DataFrame创建方式详解一(九)

创建DataFrame的几种方式1、读取json格式的文件创建DataFrame注意:1. json文件中的json数据不能嵌套json格式数据。2. DataFrame是一个一个Row类型的RDD,df.rdd()/df.javaRdd()。3. 可以两种方式读取json格式的文件。4. df.show()默认显示前20行数据。5.…

【原】npm 常用命令详解

今年上半年在学习gulp的使用,对npm的掌握是必不可少的,经常到npm官网查询文档让我感到不爽,还不如整理了一些常用的命令到自己博客上,于是根据自己的理解简单翻译过来,终于有点输出,想学习npm这块的朋友不可…

论文阅读 - CRNN

文章目录1 概述2 模型介绍2.1 输入2.2 Feature extraction2.3 Sequence modeling2.4 Transcription2.4.1 训练部分2.4.2 预测部分3 模型效果参考资料1 概述 CRNN(Convolutional Recurrent Neural Network)是2015年华科的白翔老师团队提出的,直至今日,仍…

python easygui_Python里的easygui库

想要用python开发一些简单的图形界面,于是接触了easygui库,由于这是新手教程,我会把它写的尽量简单,希望大家都能看懂。1.msgboxmsgbox( )有一个标题,内容和一个ok键(是可以更改的)。举个例子:import easyg…

Rust小技巧 - 让函数既可接受String或str,也可以返回String或str

文章目录1 场景说明2 解决方案2.1 允许不同的输入参数2.2 允许不同的输出参数2.3 让调用方来做处理参考资料1 场景说明 假设我们有一个函数foo,它既要允许&str也要允许String作为输入参数。或是既要允许&str也要允许String作为输出。&str和String之间的…

JSP九大内置对象(转载)

JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception 1、request对象 request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息&#xf…

recv发送失败 缓冲区太小_从 GFS 失败的架构设计来看一致性的重要性

作者简介 陈东明,饿了么北京技术中心架构组负责人,负责饿了么的产品线架构设计以及饿了么基础架 构研发工作。曾任百度架构师,负责百度即时通讯产品的架构设计。具有丰富的大规模系统构 建和基础架构的研发经验,善于复杂业务需求下…

Rust小技巧 - 把异步函数放进vector当中

文章目录1 场景说明2 解决方案2.1 无借用参数2.2 有借用参数参考资料1 场景说明 有些时候,我们希望将将异步函数放到vector当中,或者说是注册进vector当中,然后在某个地方遍历这个vector来实现对已经注册了的异步函数的调用。 Cargo.toml中…

好用的记事本_分类记事本软件哪个好用?大家推荐一个苹果手机用的分类记事本便签呗...

随着“互联网”的发展,现在都开始在软件上记事备忘了。那么,都有哪些好用的记事本软件可以选择使用呢?大家在选择记事本软件的时候,都有哪些标准呢?不知道大家的标准是什么,小编有一个不能妥协的标准&#…

tch-rs指南 - Tensor的基本操作

文章目录1 概述2 Tensor的基本操作2.1 Tensor的初始化(1)通过数组创建(2)通过默认方法创建(3)通过其他的tensor创建(4)通过opencv::core::Mat创建2.2 Tensor的属性2.3 Tensor的运算&…

命令行运行jmeter脚本

1、通过gui界面的jmeter创建一份脚本;2、打开cmd,切换到jmeter程序的Bin目录;3、执行jmeter.bat -n -t bookair_0613.jmx -l log_3.jtl;4、使用gui界面添加一个监听器,打开log_3.jtl文件,来分析测试结果。转载于:https…

bootstrap table 分页_Java入门007~springboot+freemarker+bootstrap快速实现分页功能

本节是建立在上节的基础上,上一节给大家讲了管理后台表格如何展示数据,但是当我们的数据比较多的时候我们就需要做分页处理了。这一节给大家讲解如何实现表格数据的分页显示。准备工作1,项目要引入freemarker和bootstrap,如果不知…

Rust小技巧 - 通过FFI编程运行tensorrt模型

文章目录1 概述2 使用说明2.1 配置说明2.2 修改c头文件2.3 编写build.rs2.4 测试参考资料1 概述 shouxieai/tensorRT_Pro是一个文档完善,效果也很不错的tensorrt库,里面有对yolov5,yolox,unet,bert,retina…

1+X web中级 Laravel学习笔记——查询构造器简介及新增、更新、删除、查询数据

一、新增数据 插入多条数据: 二、更新数据 更新某条数据: 自增某字段的值: 自减某字段的值: 自增的同时改变其他字段的值: 三、删除数据 四、查询 查面构造器查面数据 有以下几种方法 get(&…

【HTML5】Canvas画布

什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。 画布是一个矩形区域,您可以控制其每一像素。 canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。 * 添加 canvas 元素。规定元素的 id、宽度和高度: &l…

SynthText流程解读 - 不看代码不知道的那些事

文章目录1 概述2 流程解读2.1 生成文字mask2.2 plane2xyz的bug2.3 文字上色2.4 图像融合参考资料1 概述 SynthText是OCR领域生成数据集非常经典,且至今看来无人超越的方法。整体可以分为三个大的步骤,分别是生成文字的mask,这里用到了图像的…