Transformer在计算机视觉中的应用-VIT、TNT模型
上期介绍了Transformer的结构、特点和作用等方面的知识,回头看下来这一模型并不难,依旧是传统机器翻译模型中常见的seq2seq网络,里面加入了注意力机制,QKV矩阵的运算使得计算并行。
当然,最大的重点不是矩阵运算,而是注意力机制的出现。
一、CNN最大的问题是什么
CNN依旧是十分优秀的特征提取器,然而注意力机制的出现使得CNN隐含的一些问题显露了出来。
CNN中一个很重要的概念是感受野,一开始神经网络渐层的的卷积核中只能看到一些线条边角等信息,而后才能不断加大,看到一个小小的“面”,看到鼻子眼睛,再到后来看到整个头部。一方面的问题是:做到这些需要网络层数不断地加深(不考虑卷积核的大小),感受野才会变大;另一方面的问题是:特征图所表达出来的信息往往是十分抽象的,我们不清楚到底需要多少层也不清楚每层的抽象信息是否都有用(ResNet出现)。
假设我们的脸贴在一幅画上,我们无法看出一幅画里都有什么; “管中窥豹”、“坐井观天”、“一叶障目” 等都是我们此时的感受野太小了;稍微抬下头,我们看到了画中的人;稍微站得远一步,我们看到了整幅画从脑中的经验得知,这是《清明上河图》。

上面这种情况是我们机械的从视野的角度去分辨看待事物,然而我们是人类,我们拥有注意力。
我们会在观察一张图片时会忽略背景,注意图片中的主体(或相反)
我们会在区分狮子还是老虎时,更注意看它们的毛发,它们的头上有没有“王”。

回想注意力机制的特点,它是从"整体"上观察我们需要什么,要注意的地方在哪里。既然是在整体上观察,那么其“感受野”,一定就相当于许多层之后的CNN了。
CNN许多层才做到的事情,在Transformer中第一层就做到了。
二、VIT整体架构解读
2.1 图像转换成序列
接下来就是该怎么做了,由于Transofrmer是序列到序列模型,我们需要把图像信息转为序列传给Encoder。

观察上图左下角,一个完整的图片,我们可以把它切割成9份(举例),9个patch,每一份比如说是10x10x3的矩阵。将每一份通过一次卷积变成1x300的矩阵,由此变成序列。
如上图,9个300维的向量传递给Linear Projection of Flattened Patches层,其实就是一次全连接进行映射,把我们这些300维的向量映射成256/512维等的向量。
之后传递给Transformer Encoder。
2.2 VIT位置编码
我们上面把一张图片切成了9份,每份都有建筑物的一部分,要让计算机更好地识别出图片内容,这9份应当给它们加上序号,即位置编码。

论文实验证明,加上序号比不加效果好;以1-9为序号和以(1,1) (1,2) (1,3) (2,1)...(3,3)为序号结果相差不大。
当然,该论文进行的是分类任务,位置编码1D和2D确实没有太大区别。但如果放在分割等任务就不一定了。
2.3 VIT工作原理

可以看到,上图除了1-9以外,还存在一个序列0,我们把这个0叫做token。这个token一般只用于分类任务,而检测分割一般用不到。
以分类任务为例,无非是多了一行序列。
当把0号token+序列1-9传递给Encoder后,它内部进行QKV计算,和权重矩阵计算转变为QKV矩阵继续计算。其本质就是0号token+序列1-9这10个序列点积,这样0号token中就是存储着序列1-9的特征9个patch的。如此经过L轮,经过L轮计算,0号token中的信息就是全局信息了。
之后,就可以使用0号token这个向量去做分类了。
2.4 backbone

如上,Embedded Patches+位置编码后经过层归一化,多头注意力,层归一化,全连接,期间还有这残差连接。
另外这不只是一轮,而是会执行多次。
三、Transformer为什么能
就像 一 中末尾说的那样,它是从"整体"上观察我们需要什么,要注意的地方在哪里。既然是在整体上观察,那么其“感受野”,一定就相当于许多层之后的CNN了。

因为0号token是最后拿去进行分类的,在计算时,第一层第一次的计算0号就分别于1-9patch进行了点积,这9个局部信息组成的整体便是这张图片。

上图可以看到,这样做在浅层就能获得较大的范围信息;可能5层就做得比CNN好了;全局信息丰富,更有助于理解图像。
四、VIT公式解读和效果图

E表示的是全连接,P²·C的矩阵映射为P²·D维。后面的则是位置编码,(N+1)·D维,N是N个patch,+1是因为前面所提的0号token。

Z是每层的输入,Z0就是第0层,记得加上位置编码。

然后就是进行多轮多头注意力机制的运算,MSA是多头注意力,LN是层归一化,MLP是全连接。后面的加法是残差连接。

最后输出结果。
效果图

其中ViT后面的16 14 32指的是patch的大小,对于一张图片来说,patch越大窗口数量越少,patch越小窗口数量越多。
显然与ResNet相比,ViT更好些。
五、TNT模型
5.1 TNT介绍
TNT:Transformer in Transformer
在VIT中,只针对patch进行了建模,比如一个patch是16*16*C (其中C是特征图个数,可能是256、512等)。每个patch可能有点大了,越大的patch所蕴含的信息就越多,学习起来难度就越大。
因此,一方面可以基于patch去做,另一方面还可以把patch再分得细一点,如16*16分成4个4*4。

所以TNT的名字就代表了它要做什么,在Transformer里嵌套一个Transformer。
5.2 TNT模型做法分析
TNT由外部Transformer和内部Transoformer组成,其中:
- 外部Transformer与VIT的做法一样

- 内部把每个patch组成多个超像素(4个像素点),把重组的序列继续做Transformer。

以16*16为例,序列的长度就是256了,太长了太慢了效率低,且通常一个像素点也不能表达什么信息。至少也是4个点。因此内部将每个patch拆分成很多个4*4的小块,即分成更多个batch,然后重组。
以内部的一个16*16*3的patch为例,拆分成4*4的超像素,结果就是每一个超像素,每一个小patch上特征的个数。

之前一个点上有3个channel的信息,而现在一个点上有48个。patch变小了但浓缩了。

把这些小patch整合在一起,全连接,之后的Transformer与前面一样。

如上,每个patch经过外部Transformer计算得到向量,每个patch又拆分成小patch后全连接,经过内部Transformer得到同样维度的输出向量。两个向量加在一起,作为最后的输出结果。
5.4 TNT模型位置编码
实验证明,内外Transormer都进行位置编码效果更好。
5.5 TNT效果
上方是DeiT,就当作是VIT把,下面是TNT。

显而易见TNT特征提取得更鲜明,效果更好,更细腻。
右图可见TNT点更发散些,说明特征更发散些,更好区分。
相关文章:
Transformer在计算机视觉中的应用-VIT、TNT模型
上期介绍了Transformer的结构、特点和作用等方面的知识,回头看下来这一模型并不难,依旧是传统机器翻译模型中常见的seq2seq网络,里面加入了注意力机制,QKV矩阵的运算使得计算并行。 当然,最大的重点不是矩阵运算&…...
快速入门Zookeeper技术.黑马教程
快速入门Zookeeper技术.黑马教程一、初识 Zookeeper二、ZooKeeper 安装与配置三、ZooKeeper 命令操作1.Zookeeper 数据模型2.Zookeeper 服务端常用命令3.Zookeeper 客户端常用命令四、ZooKeeper JavaAPI 操作五、ZooKeeper JavaAPI 操作1.Curator 介绍2.Curator API 常用操作2.…...
网易C++实习一面
说下C11新特性 auto有没有效率上的问题?为什么?发生在什么时候? 说下单例模式 什么时候需要加锁,什么时候不需要加锁? 像printf这样的函数,自己本身不修改数据,但是其他人会修改数据&#x…...
进程和线程的区别和联系
进程和线程的区别和联系1. 认识线程2. 进程和线程的关系3. 进程和线程的区别4. 线程共享了进程哪些资源1. 上下文切换2. 线程共享了进程哪些资源1.代码区2. 数据区3. 堆区1. 认识线程 线程是进程的一个实体,它被包含在进程中,一个进程至少包含一个线程,一个进程也可以包含多个…...
Java学习笔记——集合
目录集合与数组的对比集合体系结构Collection——常见成员方法Collection——迭代器基本使用Collection——迭代器原理分析Collection——迭代器删除方法增强for——基本格式增强for——注意点Collection——练习集合与数组的对比 package top.xxxx.www.CollectionDemo;import …...
差分运放公式推导-运算放大器
不知道大家有没遇到这种情况,在计算电路的时候,有时候会突然的忘记一些公式啊啥的,需要回去翻看笔记或者查资料,知其然而不知其所以然。今天跟大家一起来一起推导一遍差分运放的计算过程。 计算过程其实归根结底还是根据运放的虚…...
金丹二层 —— 字符串长度求解的四种方法
前言: 1.CSDN由于我的排版不怎么好看,我的有道云笔记比较美观,请移步有道云笔记 2.修炼必备 1)入门必备:VS2019社区版,下载地址:Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (m…...
深入剖析Linux——进程信号
致前行的人: 要努力,但不着急,繁花锦簇,硕果累累都需要过程! 目录 1.信号概念 1.1生活角度的信号 2. 技术应用角度的信号 3.Linux操作系统中查看信号 4.常用信号发送 4.1通过键盘发送信号 4.2调用系统函数发送信号 4.3…...
API-Server的监听器Controller的List分页失效
前言 最近做项目,还是K8S的插件监听器(理论上插件都是通过API-server通信),官方的不同写法居然都能出现争议,争议点就是对API-Server的请求的耗时,说是会影响API-Server。实际上通过源码分析两着有差别&am…...
jupyter notebook 进阶使用:nbextensions,终极避坑
jupyter notebook 进阶使用:nbextensions,终极避坑吐槽安装 jupyter_contrib_nbextensions1. Install the python package(安装python包)方法一,PIP:方法二,Conda(推荐)&…...
C 语言编程 — Doxygen + Graphviz 静态项目分析
目录 文章目录目录安装配置解析Project related configuration optionsBuild related configuration optionsConfiguration options related to warning and progress messagesConfiguration options related to the input filesConfiguration options related to source brows…...
Mybatis报BindingException:Invalid bound statement (not found)异常
一、前言 本文的mybatis是与springboot整合时出现的异常,若使用的不是基于springboot,解决思路也大体一样的。 二、从整合mybatis的三个步骤排查问题 但在这之前,我们先要知道整合mybatis的三个重要的工作,如此才能排查&#x…...
HttpRunner3.x(1)-框架介绍
HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。主要特征继承的所有强大功能requests ,只需以人工方式获得乐趣即可处理HTTP…...
pytest学习和使用20-pytes如何进行分布式测试?(pytest-xdist)
20-pytes如何进行分布式测试?(pytest-xdist)1 什么是分布式测试?2 为什么要进行分布式测试?2.1 场景1:自动化测试场景2.2 场景2:性能测试场景3 分布式测试有什么特点?4 分布式测试关…...
三、Python 操作 MongoDB ----非 ODM
文章目录一、连接器的安装和配置二、新增文档三、查询文档四、更新文档五、删除文档一、连接器的安装和配置 pymongo: MongoDB 官方提供的 Python 工具包。官方文档: https://pymongo.readthedocs.io/en/stable/ pip安装,命令如下࿱…...
求最大公约数和最小公倍数---辗转相除法(欧几里得算法)
目录 一.GCD和LCM 1.最大公约数 2.最小公倍数 二.暴力求解 1.最大公约数 2.最小公倍数 三.辗转相除法 1.最大公约数 2.最小公倍数 一.GCD和LCM 1.最大公约数 最大公约数(Greatest Common Divisor,简称GCD)指的是两个或多个整数共有…...
音视频开发_获取媒体文件的详细信息
一、前言 做音视频开发过程中,经常需要获取媒体文件的详细信息。 比如:获取视频文件的总时间、帧率、尺寸、码率等等信息。 获取音频文件的的总时间、帧率、码率,声道等信息。 这篇文章贴出2个我封装好的函数,直接调用就能获取媒体信息返回,copy过去就能使用,非常方便。…...
Springboot集成Swagger
一、Swagger简介注意点! 在正式发布的时候要关闭swagger(出于安全考虑,而且节省内存空间)之前开发的时候,前端只用管理静态页面, http请求到后端, 模板引擎JSP,故后端是主力如今是前…...
Vue全新一代状态管理库 Pinia【一篇通】
文章目录前言1. Pinia 是什么?1.1 为什么取名叫 Pinia?1.2. 为什么要使用 Pinia ?2. 安装 Pinia2.1.创建 Store2.1.1. Option 类型 Store2.1.2 Setup 函数类型 Store2.1.3 模板中使用3. State 的使用事项(Option Store )3.1 读取 State3.2 …...
STM32 -4 关于STM32的RAM、ROM
一 stm32 的flash是什么、有什么用、注意事项、如何查看 一 、说明 它主要用于存储代码,FLASH 存储器的内容在掉电后不会丢失,STM32 芯片在运行的时候,也能对自身的内部 FLASH 进行读写,因此,若内部 FLASH 存储了应用…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
