Grounded-SAM(最强Zero-Shot视觉应用):本地部署及各个模块的全网最详细使用教程!

在这里插入图片描述

本篇文章主要对Grounded-SAM项目的部署以及使用进行讲解,目的是使读者可以直接参考文档去使用Grounded-SAM,而无需再去参考Github一步步自己去分析尝试(也算是我使用过程中的心得)。

对于Grounded-SAM 技术报告的paper阅读可以跳转链接:
全自动标注集成项目(Grounded-SAM)技术报告阅读

前言知识:
Grounded-SAM集成项目中包含了多个子项目,下表展示了部分(想要进一步了解各子项目的,可以参考附属链接):

项目链接
GroundingDINO由文本提示检测图像任意目标(Grounding DINO)论文详细阅读
SAM分割一切(SAM)论文详细阅读
SAM-HQ分割一切SAM之高精度(HQ-SAM)论文详细阅读
RAM识别一切(Tag2Text/RAM/RAM++)之RAM论文详细阅读
RAM++识别一切(Tag2Text/RAM/RAM++)之RAM++论文详细阅读
Tag2Text识别一切(Tag2Text/RAM/RAM++)之Tag2Text论文详细阅读

其他的如图像生成项目后续在补充

1.Grounded-Segment-Anything本地部署

github: https://github.com/IDEA-Research/Grounded-Segment-Anything

1.1.Installation

代码需要 python>=3.8 以及 pytorch>=1.7 和 torchvision>=0.8

1.GPU环境
如果要为 Grounded-SAM 构建本地 GPU 环境,则应按如下方式手动设置环境变量:

export AM_I_DOCKER=False
export BUILD_WITH_CUDA=True
export CUDA_HOME=/path/to/cuda-11.3/

这一步很关键,决定了项目是否能在GPU上运行。当然,如果不设置GPU,也是可以在CPU上运行的,这就视个人情况。

2.安装Grounded-SAM项目

将github: https://github.com/IDEA-Research/Grounded-Segment-Anything中的文件下载到本地

3.安装组件模型

  • Install Segment Anything:
python -m pip install -e segment_anything
  • Install Grounding DINO:
python -m pip install -e GroundingDINO
  • Install RAM & Tag2Text:
git clone https://github.com/xinyu1205/recognize-anything.git
pip install -r ./recognize-anything/requirements.txt
pip install -e ./recognize-anything/
  • Install diffusers:
pip install --upgrade diffusers[torch]

看个人需求选择安装

1.2.权重下载

  • GroundingDINO权重
wget https://github.com/IDEA-Research/GroundingDINO/releases/download/v0.1.0-alpha/groundingdino_swint_ogc.pth
  • SAM系列权重(个人选择版本)
SAM:
vit_h:  https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth
vit_l:  https://dl.fbaipublicfiles.com/segment_anything/sam_vit_l_0b3195.pth
vit_b:  https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth
SAM-HQ:
vit_h: https://drive.google.com/file/d/1qobFYrI4eyIANfBSmYcGuWRaSIXfMOQ8/view?usp=sharing
vit_l: https://drive.google.com/file/d/1Uk17tDKX1YAKas5knI4y9ZJCo0lRVL0G/view?usp=sharing
vit_b: https://drive.google.com/file/d/11yExZLOve38kRZPfRx_MRxfIAKmfMY47/view?usp=sharing
  • RAM系列权重
RAM++ (14M):    https://huggingface.co/xinyu1205/recognize-anything-plus-model/blob/main/ram_plus_swin_large_14m.pth 
RAM (14M):      https://huggingface.co/spaces/xinyu1205/Recognize_Anything-Tag2Text/blob/main/ram_swin_large_14m.pth
Tag2Text (14M): https://huggingface.co/spaces/xinyu1205/Recognize_Anything-Tag2Text/blob/main/tag2text_swin_14m.pth

1.3.本地文件展示

在这里插入图片描述

图中展示了本地的Grounded-Segment-Anything-main项目,图中圈出的bert-base-uncased是GroundingDINO运行需要使用的文本编码器的权重,如果因为网络问题无法下载的可以像我一样提前下载到本地

1.2中下载的权重文件也直接放在Grounded-Segment-Anything-main目录下即可

至此,整个Grounded-Segment-Anything的本地部署完成,下面就介绍组件的单独使用和联合使用

2. Grounded-SAM的使用

2.1.GroundingDINO的简单使用

1.代码演示

在Grounded-Segment-Anything目录下,有一个grouding_dino_demo.py文件,这个python文件就是GroundingDINO的简单demo:

from groundingdino.util.inference import load_model, load_image, predict, annotate, Model
import cv2CONFIG_PATH = "GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py"
CHECKPOINT_PATH = "./groundingdino_swint_ogc.pth"  #权重文件
DEVICE = "cpu"  #cuda or cpu
IMAGE_PATH = "assets/demo4.jpg"  # target image
TEXT_PROMPT = "Two dogs with a stick." # text prompt (classifity)
BOX_TRESHOLD = 0.35 
TEXT_TRESHOLD = 0.25image_source, image = load_image(IMAGE_PATH)  #image pre-process
model = load_model(CONFIG_PATH, CHECKPOINT_PATH)  #load GroundingDINO modelboxes, logits, phrases = predict(   #excute predict (image,text)->target boxmodel=model,image=image,caption=TEXT_PROMPT,box_threshold=BOX_TRESHOLD,text_threshold=TEXT_TRESHOLD,device=DEVICE,
)annotated_frame = annotate(image_source=image_source, boxes=boxes, logits=logits, phrases=phrases)
cv2.imwrite("./result_image/annotated_image.jpg", annotated_frame) #save result image

DINO 检测一个句子中的多个对象,建议在每个名称之间用 . 分隔。 例如:猫 . 狗 . 椅子 .
如果对GroundingDINO内部是如何构造的感兴趣,可以参考我的另一篇文章:
文本提示检测图像任意目标(Grounding DINO) 的使用以及全网最详细源码讲解

2.结果展示

本例使用一些电商领域的演示图来说明GroundingDINO的性能以及上述代码是否存在bug

输入:IMAGE_PATH = "assets/demo4.jpg"修改输入图片的路径
输出:cv2.imwrite("./result_image/annotated_image.jpg", annotated_frame)修改输出路径

Text PromptInput ImageResult Image
goods .在这里插入图片描述在这里插入图片描述
diaper skirt .在这里插入图片描述在这里插入图片描述

2.2.GroundingDINO+SAM的简单使用

1.代码演示

在Grounded-Segment-Anything目录下,提供了两个版本的Grounded-SAM演示,分别是:

  • grounded_sam_demo.py: Grounded-SAM原始演示
  • grounded_sam_simple_demo.py: Grounded-SAM优化演示

本次以grounded_sam_demo.py为例,进行代码运行与结果展示,具体代码如下:

import argparse
import os
import sys
import numpy as np
import json
import torch
from PIL import Imagesys.path.append(os.path.join(os.getcwd(), "GroundingDINO"))
sys.path.append(os.path.join(os.getcwd(), "segment_anything"))# Grounding DINO
import GroundingDINO.groundingdino.datasets.transforms as T
from GroundingDINO.groundingdino.models import build_model
from GroundingDINO.groundingdino.util.slconfig import SLConfig
from GroundingDINO.groundingdino.util.utils import clean_state_dict, get_phrases_from_posmap
# segment anything
from segment_anything import (sam_model_registry,sam_hq_model_registry,SamPredictor)
import cv2
import numpy as np
import matplotlib.pyplot as pltdef load_image(image_path):# load image........
def load_model(model_config_path, model_checkpoint_path, device):........
def get_grounding_output(model, image, caption, box_threshold, text_threshold, with_logits=True, device="cpu"):........
def show_mask(mask, ax, random_color=False):........
def show_box(box, ax, label):........
def save_mask_data(output_dir, mask_list, box_list, label_list):........
if __name__ == "__main__":parser = argparse.ArgumentParser("Grounded-Segment-Anything Demo", add_help=True)parser.add_argument("--config", type=str,default="GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py", required=False, help="path to config file")parser.add_argument("--grounded_checkpoint", type=str,default="./groundingdino_swint_ogc.pth", required=False, help="path to checkpoint file")parser.add_argument("--sam_version", type=str, default="vit_b", required=False, help="SAM ViT version: vit_b / vit_l / vit_h")parser.add_argument("--sam_checkpoint", type=str,default="./sam_vit_b_01ec64.pth", required=False, help="path to sam checkpoint file")parser.add_argument("--sam_hq_checkpoint", type=str, default=None, help="path to sam-hq checkpoint file")parser.add_argument("--use_sam_hq", action="store_true", help="using sam-hq for prediction")parser.add_argument("--input_image", type=str, default="./input_image/1.jpg",required=False, help="path to image file")parser.add_argument("--text_prompt", type=str,default="food .", required=False, help="text prompt")parser.add_argument("--output_dir", "-o", type=str, default="output_image", required=False, help="output directory")parser.add_argument("--box_threshold", type=float, default=0.7, help="box threshold")parser.add_argument("--text_threshold", type=float, default=0.25, help="text threshold")parser.add_argument("--device", type=str, default="cpu", help="running on cpu only!, default=False")args = parser.parse_args()# cfgconfig_file = args.config  # change the path of the model config filegrounded_checkpoint = args.grounded_checkpoint  # change the path of the modelsam_version = args.sam_versionsam_checkpoint = args.sam_checkpointsam_hq_checkpoint = args.sam_hq_checkpointuse_sam_hq = args.use_sam_hqimage_path = args.input_imagetext_prompt = args.text_promptoutput_dir = args.output_dirbox_threshold = args.box_thresholdtext_threshold = args.text_thresholddevice = args.device# make diros.makedirs(output_dir, exist_ok=True)# load imageimage_pil, image = load_image(image_path)# load modelmodel = load_model(config_file, grounded_checkpoint, device=device)# visualize raw imageimage_pil.save(os.path.join(output_dir, "raw_image.jpg"))# run grounding dino modelboxes_filt, pred_phrases = get_grounding_output(model, image, text_prompt, box_threshold, text_threshold, device=device)# initialize SAMif use_sam_hq:predictor = SamPredictor(sam_hq_model_registry[sam_version](checkpoint=sam_hq_checkpoint).to(device))else:predictor = SamPredictor(sam_model_registry[sam_version](checkpoint=sam_checkpoint).to(device))image = cv2.imread(image_path)image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)predictor.set_image(image)size = image_pil.sizeH, W = size[1], size[0]for i in range(boxes_filt.size(0)):boxes_filt[i] = boxes_filt[i] * torch.Tensor([W, H, W, H])boxes_filt[i][:2] -= boxes_filt[i][2:] / 2boxes_filt[i][2:] += boxes_filt[i][:2]boxes_filt = boxes_filt.cpu()transformed_boxes = predictor.transform.apply_boxes_torch(boxes_filt, image.shape[:2]).to(device)masks, _, _ = predictor.predict_torch( point_coords = None,point_labels = None,boxes = transformed_boxes.to(device),multimask_output = False)# draw output imageplt.figure(figsize=(10, 10))plt.imshow(image)for mask in masks:show_mask(mask.cpu().numpy(), plt.gca(), random_color=True)for box, label in zip(boxes_filt, pred_phrases):show_box(box.numpy(), plt.gca(), label)plt.axis('off')plt.savefig(os.path.join(output_dir, "grounded_sam_output.jpg"),bbox_inches="tight", dpi=300, pad_inches=0.0)save_mask_data(output_dir, masks, boxes_filt, pred_phrases)

代码中:

  • config -> "GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py"
  • grounded_checkpoint ->"./groundingdino_swint_ogc.pth"
  • sam_version ->"vit_b"
  • sam_checkpoint ->"./sam_vit_b_01ec64.pth"
  • output_dir ->"output_image"
  • input_image ->"./input_image/1.jpg"
  • text_prompt ->"food ."

按照自己的需求,修改相应的超参数

2.结果展示

通过演示图来说明Groundinged-SAM的性能以及上述代码是否存在bug

输入:input_image修改输入图片的路径
输出:output_dir 修改输出路径

Text PromptInput ImageResult Image
diaper skirt .在这里插入图片描述在这里插入图片描述

2.3.GroundingDINO+SAM-HQ的简单使用

1.代码演示
对于该演示,只需要将2.2中的SAM换成SAM-HQ即可,即不需要改变代码结构,只需要修改上述代码中:

  • parser.add_argument( "--use_sam_hq", default='True',action="store_true", help="using sam-hq for prediction")
  • parser.add_argument( "--sam_hq_checkpoint", type=str, default='./sam_hq_vit_b.pth', help="path to sam-hq checkpoint file")

2.结果展示

使用2.2中相同的演示图片

Text PromptInput ImageResult Image
diaper skirt .在这里插入图片描述在这里插入图片描述

这里我使用的都是vit_b最小的模型,所以在此不比较SAM与SAM-HQ之间的性能差异。

2.4.RAM+GroundingDINO+SAM的简单使用

在Grounded-Segment-Anything目录下,提供了RAM-Grounded-SAM演示:automatic_label_ram_demo.py,但是直接使用会存在bug,需要修改4处地方,(问题出在SAM model的初始化)

  1. 将引入SAM的依赖修改:
from segment_anything import (build_sam,build_sam_hq,SamPredictor
)
-> 修改为
from segment_anything import (sam_model_registry,sam_hq_model_registry,SamPredictor
)
  1. 添加新的超参数:
parser.add_argument("--sam_version", type=str, default="vit_b", required=False, help="SAM ViT version: vit_b / vit_l / vit_h")
)
  1. 添加:
sam_version = args.sam_version
  1. 修改SAM model的初始化:
  # initialize SAMif use_sam_hq:print("Initialize SAM-HQ Predictor")predictor = SamPredictor(build_sam_hq(checkpoint=sam_hq_checkpoint).to(device))else:predictor = SamPredictor(build_sam(checkpoint=sam_checkpoint).to(device))
->修改为# initialize SAMif use_sam_hq:predictor = SamPredictor(sam_hq_model_registry[sam_version](checkpoint=sam_hq_checkpoint).to(device))else:predictor = SamPredictor(sam_model_registry[sam_version](checkpoint=sam_checkpoint).to(device))

2.结果展示

使用2.3中相同的演示图片:

SAM resultInput ImageResult Image
Image Tags: baby, blanket, child, infant bed, key, lay, pillow, sleep, sleepwear, toy在这里插入图片描述在这里插入图片描述

后续还有一些其他项目:

  • Grounded-SAM + VISAM
  • Grounded-SAM + OSX
  • Grounded-SAM ChatBot
  • Grounded-SAM + Whisper
  • Grounded-SAM + BLIP
  • Grounded-SAM + Inpainting

因目前并没有用到,所以没有更新,后续使用到会在更新这些项目,可能有的细节问题我并没有注意到,在这里先给大家说声抱歉~, 有什么问题我们可以一起讨论哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2804265.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

介绍 CI / CD

目录 一、介绍 CI / CD 1、为什么要 CI / CD 方法简介 1、持续集成 2、持续交付 3、持续部署 2、GitLab CI / CD简介 3、GitLab CI / CD 的工作原理 4、基本CI / CD工作流程 5、首次设置 GitLab CI / CD 6、GitLab CI / CD功能集 一、介绍 CI / CD 在本文档中&#x…

echarts 实现x轴文字过长时折行展示

代码如下: this.options {color: ["#0075FF", "#00E2C4", "#FCA884", "#FFCB11"],grid: {top: "25%",bottom: "6%",right: "8%",left: "8%",containLabel: true,},legend: {top…

springboot751社区维修平台

springboot751社区维修平台 获取源码——》公主号:计算机专业毕设大全

TikTok账号注册指南:TikTok的注册方式有哪些?

随着全球数字化浪潮的加速,TikTok已成为跨越文化和国界的社交媒体巨头。对于寻找跨境电商机会的卖家来说,一个有效的TikTok账号都是打开通往成功之门的钥匙。本文将为大家详细介绍TikTok账号的注册方式,并提供一些实用的技巧,帮助…

018—pandas 生成笛卡尔积排列组合合并多列字符串数据

思路: 本需求需要将给定的几列数据,生成一个排列组合形式的数据列,利用到 Pandas 多层索引生成的笛卡尔积的方法。 二、使用步骤 1.引入库 代码如下(示例): import pandas as pd2.读入数据 代码如下&…

【动态规划】【回文】【字符串】1147. 段式回文

作者推荐 【广度优先搜索】【网格】【割点】【 推荐】1263. 推箱子 本文涉及知识点 动态规划汇总 LeetCode1147段式回文 你会得到一个字符串 text 。你应该把它分成 k 个子字符串 (subtext1, subtext2,…, subtextk) ,要求满足: subtext…

LeetCode104.二叉树的最大深度

题目 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 输入:root [3,9,20,null,null,15,7] 输出:3思路 计算二叉树的最大深度通常可以使用 递归 来实现。我们可以从根…

第九节HarmonyOS 常用基础组件26-Radio

1、描述 单选框,提供相应的用户交互选择项。 2、接口 Radio(options:{value:string, group:string}) 3、参数 参数名 参数类型 必填 描述 value string 是 当前单选框的值。 group string 是 当前单选框的所属组名称,相同group的Radio只能…

C语言-指针初学速成

1.指针是什么 C语言指针是一种特殊的变量,用于存储内存地址。它可以指向其他变量或者其他数据结构,通过指针可以直接访问或修改存储在指定地址的值。指针可以帮助我们在程序中动态地分配和释放内存,以及进行复杂的数据操作。在C语言中&#…

【算法分析与设计】1的个数

📝个人主页:五敷有你 🔥系列专栏:算法分析与设计 ⛺️稳中求进,晒太阳 题目 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位…

钧达股份:光伏跨界新贵只身赴港股,光伏“秩序重塑”?

2月21日,钧达股份终是在“千呼万唤”之中披露最新业绩快报。 快报显示,钧达股份预计2023年经调整后营业收入183.97亿元,同比增长58.65%,归母净利润8.32亿元,同比增长16.00%。 其中,由于Q4完整计提了9.5GW…

洛谷 【算法1-2】排序

【算法1-2】排序 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 鄙人不才,刷洛谷,迎蓝桥,【算法1-2】排序 已刷,现将 AC 代码献上,望有助于各位 P1271 选举学生会 【深基9.例1】选举学生会 - 洛谷 题目 解答…

概率密度函数(PDF)与神经网络中的激活函数

原创:项道德(daode3056,daode1212) 在量子力学中,许多现象都是统计的结果,基本上用的是正态分布,然而,从本质上思考,应该还存在低阶的分布,标准的正态分布是它的极限,这样一来,或许在…

《论文阅读》通过识别对话中的情绪原因来提高共情回复的产生 EMNLP 2021

《论文阅读》通过识别对话中的情绪原因来提高共情回复的产生 EMNLP 2021 前言简介方法实现Emotion ReasonerResponse Generator实验结果示例总结前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手工敲击键盘~ 今天为大家带来的是《Improv…

备战蓝桥杯—— 双指针技巧巧答链表1

对于单链表相关的问题,双指针技巧是一种非常广泛且有效的解决方法。以下是一些常见问题以及使用双指针技巧解决: 合并两个有序链表: 使用两个指针分别指向两个链表的头部,逐一比较节点的值,将较小的节点链接到结果链表…

【ECharts】调用接口获取后端数据的四种方法

使用eacharts做大屏,需要使用后端数据,下面的方法是自己试过有效的,有什么不对的,望各位大佬指点。 目录 方法一:在mounted中使用定时器调用eacharts方法(定时器可以获取到data中的数据) 方法…

图解李白的“朋友圈”

《长安三万里》作为2023年票房第一的国漫电影,以安史之乱为背景,从诗人高适的视角铺设了一幅绚丽的历史长卷,细细讲述“诗仙”李白跌宕起伏的一生,以及大唐盛世一路荣耀幻灭的唏嘘。同时,在这部动画电影中出现了多位大…

CP04大语言模型ChatGLM3-6B特性代码解读(2)

CP04大语言模型ChatGLM3-6B特性代码解读(2) 文章目录 CP04大语言模型ChatGLM3-6B特性代码解读(2)构建对话demo_chat.py定义client对象与LLM进行对话 构建工具调用demo_tool.py定义client对象定义工具调用提示词定义main&#xff0…

接口测试需求分析

测试接口的时候,可能很多人都会想,按着研发给的接口协议文档来测,不就好了吗? 其实,对于接口的测试,还需要有点深度的需求分析,然后再进行对应的测试。对于接口测试,这里有个不太详…

利用nginx内部访问特性实现静态资源授权访问

在nginx中,将静态资源设为internal;然后将前端的静态资源地址改为指向后端,在后端的响应头部中写上静态资源地址。 近期客户对我们项目做安全性测评,暴露出一些安全性问题,其中一个是有些静态页面(*.html&…