CV中常用Backbone-3:Clip/SAM原理以及代码操作
前面已经介绍了简单的视觉编码器,这里主要介绍多模态中使用比较多的两种backbone:1、Clip;2、SAM。对于这两个backbone简单介绍基本原理,主要是讨论使用这个backbone。
1、CV中常用Backbone-2:ConvNeXt模型详解
2、CV中常用Backbone(Resnet/Unet/Vit系列/多模态系列等)以及代码
SAM
SAM已经出了两个版本分别是:SAM v1和SAM v2这里对这两种分别进行解释,并且着重了解一下他的数据集是怎么构建的(毕竟很多论文里面都会提到直接用SAM作为一种数据集生成工具)
SAM v1[1]
https://arxiv.org/pdf/2304.02643
官方Blog:Introducing Segment Anything: Working toward the first foundation model for image segmentation[2]

结构上还是比较简单,首先在 Image Encoder:选择的是MAE;Prompt Encoder:从上面结构图很容易知道就3类prompt:1、text用CLIP进行编码;2、points、bbox使用论文[3](主要是通过傅里叶特征映射方法来提高模型对于高频函数学习能力)中的方法来进行编码处理;3、mask这种内容就直接使用卷积进行编码而后将结果和编码后图像相加;
对于points以及bbox编码原理很简单就是用点或者坐标直接计算他们的傅里叶特征,比如说points的伪代码
import numpy as np
# 假设输入点为2D,[x, y]
points = np.array([[0.5, 0.3], [0.2, 0.7]]) # 形状: (N, 2)
m = 256 # 映射维度
sigma = 10.0 # 频率控制参数
# 生成随机矩阵B
B = np.random.normal(0, sigma, size=(m, 2)) # 形状: (m, 2)
# 计算傅里叶特征
Bx = np.dot(points, B.T) # 点积,形状: (N, m)
fourier_features = np.concatenate([np.cos(2 * np.pi * Bx), np.sin(2 * np.pi * Bx)], axis=1) # 形状: (N, 2m)
Mask decoder:掩码解码器可以有效的将图嵌入、提示嵌入和输出标记映射到掩码。本模型的解码器基于Transformer的解码器块修改,在解码器后添加了动态掩码预测头。解码器使用了提示自注意力和交叉注意力在提示到图嵌入(prompt-to-image embedding)和vice-versa两个方面进行了修改。完成这两个部分后,对图像进行上采样再使用MLP将输出标记映射到动态线性分类器上,最终得出每个图像位置的蒙板前景概率。

Resolving ambiguity:对于一个不确定的提示,模型会给出多个有效掩码,经过修改SAM可以由单个提示预测输出多个掩码(一般是3个--整体、部分、子部分)。训练时,仅掩码进行反向传播。为了对掩码进行排名,模型会预测每个掩码的置信分数(使用IOU度量),所谓的整体、部分、子部分,比如说:

SAM v2[4]
SAM v2更像是SAM v1在视频邻域的泛化,整个模型结构如下所示:

主要值得关注的是其中的 Memory Attention:将当前帧的特征与过去帧的特征和预测以及任何新的提示联系起来。通过堆叠了 L 个transformer模块,第一个模块将当前帧的图像编码作为输入。每个区块执行self-attention,然后cross-attention(提示/未提示)帧和对象的记忆,这些记忆存储在一个记忆库中,接着是一个 MLP。在self-attention和cross-attention中使用了vanilla注意力操作,从而受益于高效注意力内核的最新发展。
memory encoder通过使用卷积模块对输出掩码进行下采样,并将其与图像编码器的无条件帧嵌入相加,生成记忆,然后使用轻量级卷积层来融合信息。
memory bank通过维护最多N个最近帧的FIFO记忆队列来保留视频中目标对象的过去预测信息,并将提示信息存储在最多M个提示帧的FIFO队列中。例如,在VOS任务中,初始掩码是唯一的提示,内存库始终保留第一帧的记忆以及最多N个最近(非提示)帧的记忆。两组记忆都以空间特征图的形式存储。
除空间存储器外,还根据每个帧的掩码解码器输出标记,将对象指针列表作为轻量级向量存储起来,用于存储要分割对象的高级语义信息。
我们将时间位置信息嵌入到N个最近帧的memory中,允许模型表示短期物体运动,但不包含到提示帧的记忆中,因为提示帧的训练信号更稀疏,并且更难以推广到推理设置中,提示帧可能来自与训练期间看到的时间范围非常不同的时间范围。
Clip[5]
Clip模型结构(论文里面提到的)也比较简单,其核心机制为:核心机制是通过对比学习和嵌入空间对齐,将图像和文本映射到一个共享的语义空间中

预训练过程:直接将文本和图像都进行编码,而后将编码后的内容通过计算他的相似度(比如:cosine similarities)来确保模型最后能够对齐文本和图像之间的特征。
使用过程:对于给定的图像直接通过Clip的图像编码,而后将文本进行编码(文本编码中会有一个 label dataset通过从label dataset中抽取出标签和自己文本进行组合得到n条微博呢)再去计算最后的结果。
代码操作
所有代码见:sam-clip.ipynb
参考
CV中常用Backbone-3:Clip/SAM原理以及代码操作的更多相关文章
- 动图+源码,演示Java中常用数据结构执行过程及原理
最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...
- 动图+源码,演示 Java 中常用数据结构执行过程及原理
阅读本文大概需要 3.7 分钟. 作者:大道方圆 cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想 ...
- 工作中常用的js、jquery自定义扩展函数代码片段
仅记录一些我工作中常用的自定义js函数. 1.获取URL请求参数 //根据URL获取Id function GetQueryString(name) { var reg = new RegExp(&q ...
- Vue中MVVM模式的双向绑定原理 和 代码的实现
今天带大家简单的实现MVVM模式,Object.defineProperty代理(proxy)数据 MVVM的实现方式: 模板编译(Compile) 数据劫持(Observer) Object ...
- sql server 中常用修改列 ,创建主外键操作
表结构 CREATE TABLE [staff] ( [id] [varchar](50) NOT NUL L, [name] [varchar](50) NOT NULL, [password] [ ...
- Spring 中常用注解原理剖析
前言 Spring 框架核心组件之一是 IOC,IOC 则管理 Bean 的创建和 Bean 之间的依赖注入,对于 Bean 的创建可以通过在 XML 里面使用 <bean/> 标签来配置 ...
- 【Unity3d游戏开发】Unity3D中常用的物理学公式
马三最近在一直负责Unity中的物理引擎这一块,众所周知,Unity内置了NVIDIA公司PhysX物理引擎.然而,马三一直觉得只会使用引擎而不去了解原理的程序猿不是一位老司机.所以对一些常用的物理学 ...
- Java中常用的查找算法——顺序查找和二分查找
Java中常用的查找算法——顺序查找和二分查找 神话丿小王子的博客 一.顺序查找: a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位 ...
- Eclipse,myeclipse开发中常用技巧总结
一.myeclipse自带包和自己部署的包冲突解决问题方案 原来的依赖设置: 修改后的配置: 二.取消Myeclipse的自动文件验证来增加myeclipse速度 1.Windows –> Pe ...
- 5. openCV中常用函数学习
一.前言 经过两个星期的努力,一边学习,一边写代码,初步完成了毕业论文系统的界面和一些基本功能,主要包括:1 数据的读写和显示,及相关的基本操作(放大.缩小和移动):2 样本数据的选择:3 数据归一化 ...
随机推荐
- Opencv | 图形学 | Mingw64 | 如何正确地用MinGW64编译与配置vscode的Opencv环境
如何正确地用MinGW64编译与配置vscode的Opencv环境 1.前情提要 最近有关于图形学的授课,教授开始布置的上机打码的代码实现作业了.虽说教授为了让我们省心,直接就整了个环境已经配置好的几 ...
- job提交后,inp文件的处理过程
用户提交job后,abaqus的inp文件处理过程 1. 对inp文件预处理 打开任务管理器可以看到pre.exe的进程 预处理中的error .warning 都会在.DAT文件中 dat文件出现e ...
- Qt 实现带阴影 无边框的QMessageBox
Qt 实现带阴影的QMessagebox 在实际项目里面使用到了QMessageBox做一个弹窗,最开始是样式不是需要的样式,就去找了一下QMessageBox的样式表,一般来说可以使用findChi ...
- php-fpm 启动后没有监听端口9000
netstat -tpln未发现监听9000端口.查看/var/log/php7-fpm.log一切正常. 随后查看PHP配置文件:/usr/local/php/etc/php-fpm.conf (源 ...
- 如何在 Github 上获得 1000 star?
作为程序员,Github 是第一个绕不开的网站.我们每天都在上面享受着开源带来的便利,我相信很多同学也想自己做一个开源项目,从而获得大家的关注.然而,理想很丰满,现实却是开发了很久的项目仍然无人问津. ...
- K8S组件详解
K8S的控制平面.和工作节点是集群正常运行的核心,通过这两部分的协同工作,K8S才能够实现高效的容器编排.管理.和自动化运维. K8S Kubernetes(简称K8s),是一个开源的容器编排平台,用 ...
- Linux下如何重启Oracle
操作步骤 切换到oracle用户 su – oracle 通过sqlplus以管理员身份登录 sqlplus / as sysdba 然后执行 shutdown immediate 退出sqlplus ...
- 3D Gaussian 三维视觉重建
论文资料 论文 https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_gaussian_splatting_low.pdf 资料网站 ...
- vivo Trace 监控追求极致的建设历程
作者:vivo 互联网服务器团队- Zhang Yi 当前vivo的应用监控产品Vtrace经常遇到用户反馈某个Trace链路信息没法给他们提供到实质的帮肋,对此团队一直在持续完善JavaAgent的 ...
- 搭建Zookeeper、Kafka集群
搭建Zookeeper.Kafka集群 Zookeeper.Kafka集群系统环境配置 配置IP ssh root@192.168.1.190 "rm -rf /etc/machine-id ...