(grounding) DINO 阅读笔记

DEtection with TRansformers 阅读笔记

DEtection with TRansformers 阅读笔记

模型结构

CNN Backbone

常规做法, 用来特征提取。输出一个 C * HW 的特征图。

Transformer

  • 多头注意力机制
  • pos_embed 给 sum 到 Encoder 的 query 和 key 里
  • Decoder 里固定查 N = 100 个 token

FFN

实际上就是 1*1 的卷积。

数据

COCO Dataset

训练

计算损失

由于产出 100 个检测结果,故而和事实做二分图匹配,跑个 Hungarian 算法即可获得匹配关系。

DINO 阅读笔记

Preliminaries

论文提到两个对它影响比较大的工作:

  • DAB-DETR 将 positional query 描述成 R^4 里的一个向量 (x, y, w, h)
  • DN-DETR 认为收敛缓慢可能是因为二分图匹配不够稳定,因此引入 denosing ,将带噪声的 label 和 box 送入 DETR
  • Deformable DETR 让 attention 关注 sampling points 周围的一小部份点。首先它引入了 query selection 技术(直接从 encoder 的输出提取 features 和 reference boxes);其次是它用了所谓梯度分离技术,这里叫它 look forward once

Backbone

分别用 ResNet-50 和 SwinL 作为 backbone

模型

  • look forward twice: 一个类似 residual connection 的操作,用来减少梯度消失的风险
  • Mixed Query Selection: 选择 top-k 个 feature 传入 decoder

训练

  • Contrastive DeNoising Training (CDN) ,将 Ground Truth 内的作为正样本,外的作为负样本,可以避免重复预测。

Grounding DINO 阅读笔记

Preliminaries

提出一个范式:Backbone 用于 feature extraction, neck 用于 feature enchancement, head 用于 region refinement(box prediction)

模型

image 经过一个 Swin-T 作为 backbone, 而 text 则经过一个 BERT

然后是一个 Feature Enhance Layer, SAM 和它有点相似,都是 image 和 text (在 SAM 里是 prompt) 各经过一个 self-attention / deformable self-attention 以后做一个双向的 cross-attention, 然后各 FFN 以后输出。

接着是 Language-Guided Query Selection, 这个部分首先将 image 和 text 的 feature 沿第三维卷积,取 max 作为 img feat,最后取 topk 返回。

接着是 Cross-Modality Decoder, 将 Query 经过 self-attention 以后,取 Q 分别和 Image Features, Text Features 的 K, V 做 Cross-Attention ,再过一个 FFN 以后输出。

输入

处理 Text Prompt: 以往采用两种 text prompt, 作者称之为 Sentence Level 和 Word Level; 在这里则使用了 Sub-sentence Level

训练

  • 类似 DETR, 仍然是先二分图匹配再计算损失

Ablations

消融实验认为 Encoder fusion 是最重要的部份

Segment Anything Model 阅读笔记

Segment Anything Model(SAM) 阅读笔记

模型架构

模型主要由三个部份组成,一个笨重的 image encoder ,用于将图像 embedding;一个轻量级的 prompt encoder 和一个轻量级的 mask decoder,

Image Encoder

Vision Transformer(ViT)

这个部份采用了 NLP 领域常用的 Transformer 思想。

输入图片首先经过 PatchEmbed 模块。在这里,将图片切割成 16 * 16 个 patch, 每个 patch 的维度是 768.

然后,如果启用 absolute positional embeddings, 也就是位置信息,那么直接将它 sum 到 patch embedding 上。

接下来通过一组 depth 个的 transformer blocks. 这里使用了 Multihead Attention,然后再经过一个激活函数是 GeLU 的 MLP 。 这里它使用了 Window Attention ,也就是每次自注意力只关注一个局部。论文称它使用了 14 * 14 的 Window。同时还加上了 relative positional embeddings。

Reduce Channel Dimension

在这里它参照了Exploring Plain Vision Transformer Backbones for Object Detection,把输出先后通过 1 * 1, 256 channel 和 3 * 3, 256 channel 的卷积压缩。每次卷积后 LayerNorm 一次。

Prompt Encoder

将输入分成以下四种:

  • 一个点:将 positional encoding 和一个表示它是在前景还是背景的 embedding 相加。
  • 一个框:分别用两个 embedding 表示左上角和右下角。
  • mask:可能是用于训练,直接塞入 dense_prompt_embedding ,sparse 项置零。
  • 无输入:单独的 embedding,表示 no prompt.

分别传出两个部份 sparse_prompt_embeddingdense_prompt_embedding

Lightweight mask Decoder

传入的信息包括两个部份:

  • token:这里包括两个 Embedding :iou_tokenmask_token ,还有 prompt encoder 传出的 sparse_prompt_embedding ,将他们 concatenate 在一起。
  • src:这个部分将 image_embeddingdense_prompt_embedding sum 在一起。

接下来将 src 和 pos_src (分别代表 prompt 的信息和 image 的信息)放入 TwoWayTransformer 。分别用两个 cross attention 来处理 token 和 image 之间的相互关系。

一个 upscaling,然后生成 4 个 mask token ;同时预测一个 IoU (用来给结果质量排序)

Ambiguity-aware

这个部分主要问题是可能会把多个有效输出的 mask 给平均掉。「observe that」的处理方案是同时预测并输出三个 mask(代表整体,部份和子部份),同时预测一个 IoU 给结果排序,并且只考虑质量最好的 loss 来反向传播。

同时如果给出多个 prompt 的话只返回一个(多个 prompt 足以确认一个有效输出),为了不和前面混淆总共需要生成 4 个 mask。

数据

原文用了很大篇幅来解释数据的采样在种族,国家和生存环境上的多样性。

数据集生成

原始数据是从某个摄影公司处获取的,同时附有

大致分成三个步骤

  • Assisted-manual stage: 这个阶段主要由打标人在一个 web 端上用一些工具来打标
  • Semi-auto stage: 这个阶段标记出 confident masks,然后要求打标人给其他的对象打标
  • Fully-auto stage: 这个部份用一个 32 * 32 的 point 型 prompt 来生成一组 masks,然后根据预测的 IoU 来筛选

一些 trick

  • 只保留 confident mask ,也就是 IoU > 88.0
  • 去除覆盖超过 95% 的 mask,提升 mask 质量,同时处理掉过小(100像素)的 spurious holes 和 components

训练

Losses

用 focal loss 和 dice loss 的 20:1 的线性组合来监督 mask 用 mean-square-error loss 监督 IoU 预测,factor 是 1.0

Training Algorithm

等概率选择 foreground point 或者 bounding box,然后加一些扰动。

之后从误差区域里加入新的采样点作为 prompt

把前一代的 mask 作为 prompt 塞给后一代(这可能是前面 prompt encoder 中 mask 的作用)

由于 prompt encoder 和 mask decoder 的开销很小(不足 1% 相对 image encoder),所以可以支持多步迭代(这里选择了 1 次初始,8 次更新采样点,然后 2 次没有额外信息的迭代)

Zero-shot Text-to-Mask

The key observation here is that because CLIP’s image embeddings are trained to align with its text embeddings, we can train with image embeddings, but use textembeddings for inference. That is, at inference time we run text through CLIP’s text encoder and then give the resulting text embedding as a prompt to SAM.

用 CLIP 的 image embedding 做训练,用 text embeddings 作推理。很深刻。