Grounding DINO+SAM实例分割:用Python实现文字驱动分割

一、算法简介

1.1 什么是Grounding DINO?

        Grounding DINO 是一种结合文本和图像的多模态目标检测模型,能够直接根据自然语言描述。它基于 Transformer 架构,将文本语义与视觉特征深度融合,实现开放词汇(Open-Vocabulary)的物体检测。

  • 核心功能:文字驱动的目标检测器,通过文字描述定位图像中的物体
  • 技术亮点:无需预训练类别标签,支持开放式描述
  • 举例:输入:"穿红衣服的人";输出:人物在图像中的坐标框

1.2 什么是SAM

        SAM(​Segment Anything Model) 是 Meta 提出的通用图像分割模型,能够对图像中的任意物体生成像素级分割掩码。它的核心目标是实现“零样本分割”,即无需特定数据训练即可分割新物体。

  • 高效分割:基于 ViT(Vision Transformer)架构,可快速生成高质量掩码。
  • 零样本泛化:无需微调即可分割训练数据中未出现过的物体。
  • 输入:坐标框
  • 输出:物体的像素级掩码

1.3 Grounding DINO+SAM能做什么

       输入一张图片,不仅能框出物体位置,还能生成像素级掩码。例如:

  • 自动驾驶中精准识别行人、车辆
  • 工业质检定位产品缺陷区域
  • 摄影后期抠图替换背景

1.4 工作流程

文字描述 → DINO定位目标 → SAM精细分割 → 可视化结果

二、环境准备

2.1 环境配置

  在终端执行以下命令

# 基础依赖
pip install torch torchvision opencv-python

# 算法库
pip install git+https://github.com/IDEA-Research/GroundingDINO.git
pip install git+https://github.com/facebookresearch/segment-anything.git

如果算法库安装失败可以手动下载安装。

2.2 文件下载

2.2.1 权重文件下载

# DINO模型权重文件地址
https://huggingface.co/ShilongLiu/GroundingDINO/resolve/main/groundingdino_swint_ogc.pth

# SAM模型权重文件地址
https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth

如果下载不下来可以去文章结尾获取

2.2.2 配置文件

  groundingdino_swint_ogc.py无法下载,直接添加

batch_size = 1
modelname = "groundingdino"
backbone = "swin_T_224_1k"
position_embedding = "sine"
pe_temperatureH = 20
pe_temperatureW = 20
return_interm_indices = [1, 2, 3]
backbone_freeze_keywords = None
enc_layers = 6
dec_layers = 6
pre_norm = False
dim_feedforward = 2048
hidden_dim = 256
dropout = 0.0
nheads = 8
num_queries = 900
query_dim = 4
num_patterns = 0
num_feature_levels = 4
enc_n_points = 4
dec_n_points = 4
two_stage_type = "standard"
two_stage_bbox_embed_share = False
two_stage_class_embed_share = False
transformer_activation = "relu"
dec_pred_bbox_embed_share = True
dn_box_noise_scale = 1.0
dn_label_noise_ratio = 0.5
dn_label_coef = 1.0
dn_bbox_coef = 1.0
embed_init_tgt = True
dn_labelbook_size = 2000
max_text_len = 256
text_encoder_type = "bert-base-uncased"
use_text_enhancer = True
use_fusion_layer = True
use_checkpoint = True
use_transformer_ckpt = True
use_text_cross_attention = True
text_dropout = 0.0
fusion_dropout = 0.0
fusion_droppath = 0.1
sub_sentence_present = True

2.3 项目结构检查

三、完整代码示例

  main.py

# -*- coding: utf-8 -*-
import time
import cv2
import numpy as np
import torch
from groundingdino.util.inference import Model
from segment_anything import sam_model_registry, SamPredictor

# -------------------- 参数设置 --------------------
CONFIG_PATH = "configs/groundingdino_swint_ogc.py"  # 配置文件路径
DINO_CHECKPOINT = "weights/groundingdino_swint_ogc.pth"  # DINO权重文件
SAM_CHECKPOINT = "weights/sam_vit_b_01ec64.pth"  # SAM权重文件
SAM_MODEL_TYPE = "vit_b"  # 可选: "vit_b"(最快)/ "vit_l" / "vit_h"(最准但最慢)

DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
TORCH_DTYPE = torch.float16 if DEVICE == "cuda" else torch.float32

# -------------------- 模型加载 --------------------
# 初始化Grounding DINO
grounding_dino_model = Model(
    model_config_path=CONFIG_PATH,
    model_checkpoint_path=DINO_CHECKPOINT,
    device=DEVICE
)

# 初始化SAM
sam = sam_model_registry[SAM_MODEL_TYPE](checkpoint=SAM_CHECKPOINT)
sam_predictor = SamPredictor(sam.to(DEVICE))


# -------------------- 核心处理函数 --------------------
def instance_segmentation(image_path, text_prompt):
    # 读取图像
    image = cv2.cvtColor(cv2.imread(image_path), cv2.COLOR_BGR2RGB)

    # Grounding DINO检测
    detections = grounding_dino_model.predict_with_caption(
        image=image,
        caption=text_prompt,
        box_threshold=0.35,
        text_threshold=0.25
    )

    # 提取检测结果
    detection_result = detections[0]

    # 转换检测框格式 (确保使用PyTorch张量)
    boxes = torch.as_tensor(
        detection_result.xyxy,
        dtype=torch.float32,  # 必须指定浮点类型
        device=DEVICE  # 与SAM模型相同的设备
    )

    # SAM生成掩码
    sam_predictor.set_image(image)
    transformed_boxes = sam_predictor.transform.apply_boxes_torch(
        boxes=boxes,
        original_size=image.shape[:2]  # 输入图像原始尺寸 (H, W)
    )

    # 预测掩码 (确保输入张量在正确设备)
    masks, _, _ = sam_predictor.predict_torch(
        point_coords=None,
        point_labels=None,
        boxes=transformed_boxes,
        multimask_output=False
    )

    return masks, boxes


# -------------------- 可视化与保存 --------------------
def visualize_and_save(image_path, masks, boxes, output_path="output.png"):
    image = cv2.cvtColor(cv2.imread(image_path), cv2.COLOR_BGR2RGB)

    # 绘制检测框
    for box in boxes:
        x1, y1, x2, y2 = map(int, box)
        cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)

    # 叠加分割掩码
    for mask in masks:
        mask = mask.cpu().numpy().squeeze()
        color_mask = np.random.randint(0, 256, (3,))
        image[mask > 0] = image[mask > 0] * 0.5 + color_mask * 0.5

    cv2.imwrite(output_path, cv2.cvtColor(image, cv2.COLOR_RGB2BGR))


# -------------------- 使用示例 --------------------
if __name__ == "__main__":
    # 示例输入
    while 1:
        img_path = "./imgs/%s.jpg" % input("请输入图号:")
        time1 = time.time()
        text_prompt = "car. wheel"  # 支持多个目标用英文句号分隔

        # 执行实例分割
        masks, boxes = instance_segmentation(img_path, text_prompt)
        print(time.time() - time1)
        # 可视化保存结果
        visualize_and_save(img_path, masks, boxes, "result.jpg")
        print("分割结果已保存至 result.jpg")

四、运行示例

        将".jpg"格式的图片准备好放入imgs文件夹中,运行后终端提示“请输入图号:”,此时输入文件名按下回车,每次循环运行完可查看result.jpg文件。

        可修改text_prompt参数来实现识别自己想要的内容。此处识别car和wheel。

以上代码仅为示例参考,可自行优化、增加功能。

五、直接拿代码及相关文件

        包含代码、示例图片、权重文件

        链接:https://pan.baidu.com/s/1TdxSzr4HuB2AFPIaHqFU5g?pwd=6s9e 
        提取码:6s9e

<think>好的,我现在需要处理用户关于“cross modal sam”的查询。首先,我需要确定用户指的是什么。SAM通常可以指多个概念,比如Segment Anything Model(分割一切模型)是Meta的一个图像分割模型。而“cross modal”通常涉及多模态学习,结合不同数据模态,比如文本、图像、语音等。 用户可能是在问结合多模态的SAM模型。我需要验证是否存在这样的模型。根据我的知识,原始的SAM主要处理图像分割,但可能有研究将其扩展到多模态,例如结合文本提示进行分割,或者与其他模态的数据联合训练。 接下来,我需要确认是否有相关论文或项目。比如,SAM本身支持通过点、框或文本提示进行分割,但这里的文本提示是否属于多模态集成?或者是否有工作将SAM与其他模态模型(如CLIP)结合,实现跨模态应用? 然后,我应该解释cross-modal SAM的基本概念:可能是指利用多模态数据(如图像+文本)来增强分割任务,例如通过文本描述指导图像分割,或者利用图像信息辅助文本理解等。 还需考虑技术细节,比如模型结构如何整合不同模态,训练数据是否包含多模态信息,以及应用场景,如跨模态检索、辅助生成任务等。 需要检查是否有具体项目或框架名为“Cross Modal SAM”,如果没有,可能需要综合现有技术进行解释,说明可能的实现方式。同时,应指出当前SAM在多模态方面的进展,比如Grounding DINO结合SAM进行文本驱动分割,这可能属于cross-modal应用。 最后,确保回答结构清晰,分点说明概念、技术原理、应用场景,并举例说明,同时提醒用户注意可能的混淆点,比如区分SAM的原生功能和与其他模态结合的扩展应用。</think>### Cross-Modal SAM 概念解析 Cross-Modal SAM计算机视觉领域对 **Segment Anything Model (SAM)** 的扩展应用,核心目标是通过**多模态数据**(如图像、文本、语音)增强图像分割能力。以下从三个层面逐步说明: --- #### 一、基础模型:Segment Anything Model (SAM) 1. **原生能力** - 由Meta于2023年提出,支持通过**点、框、涂鸦**等交互式提示分割任意物体。 - 基于1100万张图像、10亿掩码的SA-1B数据集训练。 - 模型结构:图像编码器(ViT)→ 提示编码器 → 掩码解码器。 2. **局限性** - 依赖视觉提示,难以直接理解**语义信息**(如“分割图中的第三只狗”)。 - 缺乏跨模态推理能力(如根据文本描述定位物体)。 --- #### 二、Cross-Modal SAM 技术原理 通过**多模态对齐**实现文本/语音到视觉的映射: 1. **模态融合方式** - **提示扩展**:将文本/语音输入转化为SAM可理解的视觉提示(坐标或掩码)。 *例:用CLIP模型将文本“红色汽车”映射到图像中的对应区域坐标。* - **联合训练**:在SAM基础上增加文本编码器,端到端学习跨模态特征。 *技术方案参考:Grounding DINO + SAM(通过文本生成检测框,再输入SAM分割)。* 2. **关键技术组件** | 组件 | 作用 | 示例模型 | |-----------------|-----------------------------|------------------| | 文本编码器 | 将自然语言转化为向量 | BERT, CLIP | | 跨模态对齐模块 | 关联文本特征与图像区域特征 | Transformer层 | | 提示生成器 | 输出SAM所需的点/框提示 | 轻量级MLP | --- #### 三、典型应用场景 1. **文本引导分割** - 输入:“分割图中所有金属材质的物体”→ 模型定位金属区域并输出掩码。 2. **语音交互编辑** - 用户语音指令:“把天空换成夜晚”→ 分割天空区域后替换背景。 3. **跨模态检索** - 用文本描述搜索图像中特定物体(如“圆形logo”)。 --- #### 四、现有实现方案 1. **Grounding-SAM** - 组合Grounding DINO(文本→检测框)和 SAM实现文本到分割。 - 代码示例: ```python from groundingdino.util.inference import load_model as load_grounding from segment_anything import SamPredictor grounding_model = load_grounding("groundingdino_swint_ogc") sam_predictor = SamPredictor(sam_checkpoint="sam_vit_h_4b8939.pth") # 文本生成检测框 boxes = grounding_model.predict(text="cat", image=image) # SAM分割 sam_predictor.set_image(image) masks, _, _ = sam_predictor.predict(box=boxes[0]) ``` 2. **CLIP-SAM** - 利用CLIP计算文本与图像区域相似度,生成热力图作为SAM提示。 --- ### 总结与挑战 - **优势**:突破纯视觉分割限制,提升人机交互直观性。 - **挑战**: - 多模态对齐需要大量配对数据(如图像-文本-掩码三元组)。 - 实时性受多模型串联影响(如Grounding DINO + SAM需约2秒/图像)。 如需进一步实现细节或具体代码调试,可提供更具体的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值