Grounding dino + segment anything + stable diffusion 实现图片编辑

总体介绍

总体流程

本方案用到了三个步骤,按顺序依次为:

  1. 基于语义的目标检测(使用grounding dino)
  2. 在检测到的范围内进行目标分割生成mask(使用segment anything)
  3. 图片绘制(使用stable diffusion)

模块介绍

目标检测: grounding dino

总体架构图
模型架构图
从图中可以看出,本算法本质上是对图像和文本进行多模态融合,将二者映射到同一个向量空间并使用attention的思路进行匹配从而得到文本对应的图像。

模型中使用Swin Transformer作为image backbone,BERT作为text backbone,使用cross-transformer进行多模态融合。

从上面流程可以更深入地理解attention中qkv含义,即可以将attention视为一种软寻址。在网上看到过一个简单易懂的解释:

attention 机制里主要有三个向量 - key, query 和 value,其实可以将 Attention 机制看作一种软寻址(Soft Addressing):Source 可以看作一个中药铺子的储物箱,储物箱里的药品由地址 Key(药品名)和值 Value(药品)组成,当前有个 Key=Query(药方)的查询,目的是取出储物箱里对应的 Value 值(药品),即 Attention 数值。通过 Query 和储物箱内元素 Key 的地址进行相似性比较来寻址,之所以说是软寻址,指的是我们不只从储物箱里面找出一中药物,而是可能从每个 Key 地址都会取出内容,取出内容的重要性(量的多少)根据 Query 和 Key 的相似性来决定,之后对 Value 进行加权求和,这样就可以取出最终的 Value 值(一副中药),也即 Attention 值。所以不少研究人员将 Attention 机制看作软寻址的一种特例

目标分割:Segment Anything Model (SAM)

整体思路

模型的目的是构建一个用于图像分割的基础模型,即寻求开发一个可提示的(promptable)模型并将其进行预训练,预训练的数据集通过一个有强大泛化能力的任务来生成。使用这个模型就可以寻求解决在使用prompt工程生成的新数据分布上的一系列下游分割问题。
本计划能否成功主要和三个部分相关:任务(task)、模型(model)、数据(data)。为了研究这些部分,需要解决以下三个问题:

  1. 什么样的任务可以零样本泛化?

    定义一个可提示的分割任务,可以针对任何分割提示(prompt)返回有效的分割掩码。本任务有两个作用,一是作为预训练目标,二是通过prompt工程解决下游通用分割任务。

  2. 与之相应的模型架构是什么样的?

    模型必须支持灵活的prompt,且可以实时输出掩码(mask)。

  3. 什么样的数据能支持这项任务和模型?

    论文提出需要大规模多样化的数据集,为了得到这样的数据集,可以构造一个数据引擎,通过引擎可以半自动、全自动生成新数据完成模型迭代

模型结构:

提示

模型结构

数据引擎

互联网上目前没有适用于本任务数据量的数据集,所以必须构建一套引擎来生成数据。生成的训练数据集名为SA-1B,总共包括1100万张图像和11亿个掩码。数据生成收集包含三个阶段。

  1. 人工辅助阶段。专业标注员使用浏览器上的交互式标记工具,并结合 SAM 进行手动标注。SAM 首先使用公共数据集进行训练。随着数据量的逐渐增加,SAM 图像编码器的尺寸也随之增大(ViT-B扩展为ViT-H)。在这一阶段结束时,收集了 430 万个掩码和 12 万张图像。

  2. 半自动阶段。为了增加掩码的多样性并改善模型的性能,研究人员首先预先填充了掩码,标注人员需要在此基础上补充其他未标注的对象。为了检测掩码的可信度,使用第一阶段得到掩码的数据训练一个边界检测模型,用来进行高置信度预测。在此阶段结束时,一张图像平均可以提供 72 个掩码。

  3. 全自动阶段。本阶段可以实现全自动标注。实现此步骤主要由于亮点:一,在前面两个阶段已经收集了足够的掩码;二,引入了可以在有歧义情况下也可以判断的歧义感知模型。在这一阶段结束时,最终的 SA-1B 数据集包含 1100 万张图像和 1.1B 个掩码。

图片绘制

stable diffusion(网上说这部分的文章众多,暂略)

集成

样例

(目前跑的样例均涉及到公司内部信息,暂略,后期有时间会补充脱敏版)

其他问题

grouding-dino检测到的目标是一个范围,如果此范围内有多个物体且互相之间不好区分,则会全部覆盖。
例:原图如下,src为dog,dst为tiger

原图:原图
生成的mask:
在这里插入图片描述
结果图:
在这里插入图片描述

附录

GroundingDINO开源项目地址
GroundingDino论文地址
segment anything论文地址
segment anything github
segment anything官方demo
SAM论文解读
Segment Anything(SAM)论文杂谈
SAM综述
sam数据集
SA-1B数据集
手把手教程
当前图片编辑基础代码

根据提供的引用内容,Grounding DINO是一种结合了DINO和基于Transformer的检测器的模型,用于开放式目标检测。它的输入是图像和文本,输出是多个[物体框,名词短语]对。具体来说,Grounding DINO使用DINO模型对图像和文本进行编码,然后使用基于Transformer的检测器对编码后的特征进行检测,最终输出[物体框,名词短语]对。 下面是一个简单的示例代码,演示如何使用Grounding DINO进行开放式目标检测: ```python import torch from torchvision.models.detection import fasterrcnn_resnet50_fpn from transformers import ViTFeatureExtractor, ViTForImageClassification from transformers.models.dino.modeling_dino import DINOHead # 加载预训练的DINO模型和ViT模型 dino = ViTForImageClassification.from_pretrained('facebook/dino-vit-base') dino_head = DINOHead(dino.config) dino_head.load_state_dict(torch.load('dino_head.pth')) dino.eval() vit_feature_extractor = ViTFeatureExtractor.from_pretrained('google/vit-base-patch16-224') # 加载预训练的Faster R-CNN检测器 model = fasterrcnn_resnet50_fpn(pretrained=True) model.eval() # 输入图像和文本 image = Image.open('example.jpg') text = 'a person riding a bike' # 对图像和文本进行编码 image_features = vit_feature_extractor(images=image, return_tensors='pt')['pixel_values'] text_features = dino_head.get_text_features(text) image_embedding, text_embedding = dino(image_features, text_features) # 使用Faster R-CNN检测器进行目标检测 outputs = model(image_embedding) boxes = outputs[0]['boxes'] labels = outputs[0]['labels'] # 输出[物体框,名词短语]对 for i in range(len(boxes)): print([boxes[i], labels[i]]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值