目录
- 引言
- 整体结构介绍
- 论文问答
- 代码仓库中,模型哪部分转换为了ONNX格式?以及如何转的?
- Mask decoder部分 Transformer decoder block?
- 如何整合image_embedding,image_pe, sparse_prompt_embedding和dense_prompt_embedding的?
- points, boxes, text和masks四种类型prompt如何嵌入到网络中?
- 什么样的任务具有zero-shot泛化能力?
引言
- 论文:Segment Anything是Meta出的图像语义分割的算法。这个算法因其强大的zero-shot泛化能力让人惊艳,这不抽空拿来学习了一下。
- 该算法的代码写得很清楚、简洁和规范,读来让人赏心悦目。推荐去看源码,很有意思。
- 本篇文章,将以问答形式来解读阅读过程中遇到的困惑,想来这种方式效率更高一些。
- PDF | Code
整体结构介绍
- 整体分为三大部分:image encoder、prompt encoder和mask decoder。下图看的更加清楚一些,也是来自论文。
论文问答
代码仓库中,模型哪部分转换为了ONNX格式?以及如何转的?
-
mask_decoder部分做了转onnx格式
-
直接采用torch.onnx.export函数接口转的。因为没有采用transformer函数库,因为转换较为简单。
-
先基于torch构建整个部分模型,构建模型输入。
-
调用torch.onnx.export函数来转换
-
Mask decoder部分 Transformer decoder block?
-
该部分采用的动态mask预测头。
-
在两个方向上(prompt-to-image embedding 和相反的)使用了prompt self-attention和cross-attention来达到更新所有embedding的目的。
如何整合image_embedding,image_pe, sparse_prompt_embedding和dense_prompt_embedding的?
- 通过mask decoder这一部分来做的。采用的是修改过的Transformer decoder block.
points, boxes, text和masks四种类型prompt如何嵌入到网络中?
-
points, boxes, text在论文中称为sparse prompt。masks类型被称为dense prompt
-
points和boxes 是以positional encodings(位置编码)和每个提示类型的学习嵌入来表示的。
-
text是来自CLIP的text encoder表示的。从demo中并没有看到text输入的prompt, 从issue #93中验证了这点
-
mask是使用卷积嵌入,并与图像embedding逐元素求和
什么样的任务具有zero-shot泛化能力?
- 模型以promptable的方式训练得到,因此具备zero-shot的泛化能力