如何在Linux上离线部署Grounding DINO

最近由于需要用到Grounding DINO进行标注,Grounding DINO可以通过文本提示的方式检测目标,号称检查一切,有点类似Segment Anything Model (SAM)分割一切的大模型。因此需要用到Grounding DINO,但是在部署的时候发现国内无法访问Hugging Face,因此需要把相关的资源下载到本地部署。

1. Grounding DINO链接

GitHub - IDEA-Research/GroundingDINO: ECCV 2024 Official implementation of the paper "Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection"

2. 资源准备

复制代码
groundingdino权重

上面的权重直接下载即可!!!后面放进项目的weights文件夹里

bert-base-uncased

下载以上的即可!!!

3. 配置环境

3.1 设置环境变量

临时设置:

export CUDA_HOME=/path/to/cuda-11.3

永久设置:

echo 'export CUDA_HOME=/path/to/cuda' >> ~/.bashrc

source ~/.bashrc

echo $CUDA_HOME

检测是否配置成功

echo $CUDA_HOME

有输出则成功,没有任何输出则配置失败

3.2 下载代码

git clone https://github.com/IDEA-Research/GroundingDINO.git

3.3 配置虚拟环境

conda create -n grounding_dino python=3.8.16

cd GroundingDINO/

pip install -e .

3.4 项目配置

在项目根目录创建两个文件夹,weights和bert-base-uncased把上面下载的内容分别放进这两个文件夹即可。

3.5 修改代码

GroundingDINO-main/groundingdino/util/get_tokenlizer.py

python 复制代码
from transformers import AutoTokenizer, BertModel, BertTokenizer, RobertaModel, RobertaTokenizerFast
import os

def get_tokenlizer(text_encoder_type):
    # import ipdb;ipdb.set_trace();
    if not isinstance(text_encoder_type, str):
        # print("text_encoder_type is not a str")
        if hasattr(text_encoder_type, "text_encoder_type"):
            text_encoder_type = text_encoder_type.text_encoder_type
        elif text_encoder_type.get("text_encoder_type", False):
            text_encoder_type = text_encoder_type.get("text_encoder_type")
        elif os.path.isdir(text_encoder_type) and os.path.exists(text_encoder_type):
            pass
        else:
            raise ValueError(
                "Unknown type of text_encoder_type: {}".format(type(text_encoder_type))
            )
    print("final text_encoder_type: {}".format(text_encoder_type))
    
    # 新添加代码片段
    tokenizer_path = "/home/zhangh/GroundingDINO-main/GroundingDINO-main/bert-base-uncased"    # 这个需要使用绝对路径才可以。他这里使用了相对路径,有可能报错。
    tokenizer = BertTokenizer.from_pretrained(tokenizer_path, use_fast=False)
    return tokenizer

    '''
    tokenizer = AutoTokenizer.from_pretrained(text_encoder_type)
    return tokenizer
    '''
    

def get_pretrained_language_model(text_encoder_type):
    # import ipdb;ipdb.set_trace();
    if text_encoder_type == "bert-base-uncased" or (os.path.isdir(text_encoder_type) and os.path.exists(text_encoder_type)):
        # 新添加代码片段
        model_path = "/home/zhangh/GroundingDINO-main/GroundingDINO-main/bert-base-uncased"
        return BertModel.from_pretrained(model_path)
        # return BertModel.from_pretrained(text_encoder_type)
    if text_encoder_type == "roberta-base":
        return RobertaModel.from_pretrained(text_encoder_type)

    raise ValueError("Unknown text_encoder_type {}".format(text_encoder_type))

把配置的文件夹的路径改为自己的路径即可!

4. 开始测试

测试代码

python 复制代码
from groundingdino.util.inference import load_model, load_image, predict, annotate
import cv2

model = load_model("groundingdino/config/GroundingDINO_SwinT_OGC.py", "weights/groundingdino_swint_ogc.pth")
IMAGE_PATH = "OIP.jpg"
TEXT_PROMPT = "chair . person . dog ."
BOX_TRESHOLD = 0.35
TEXT_TRESHOLD = 0.25

image_source, image = load_image(IMAGE_PATH)

boxes, logits, phrases = predict(
    model=model,
    image=image,
    caption=TEXT_PROMPT,
    box_threshold=BOX_TRESHOLD,
    text_threshold=TEXT_TRESHOLD
)

annotated_frame = annotate(image_source=image_source, boxes=boxes, logits=logits, phrases=phrases)
cv2.imwrite("annotated_image.jpg", annotated_frame)

里面的代码修改下图片路径,再修改下提示词,即可开始运行!

感觉效果还不错 !!!

附录

还有个Grounding DINO API 1.5也还可以,这个的部署比较简单,没这个这么麻烦,只需要注册一个账号,申请下token,免费的!再再本地简单的部署下环境即可。

链接如下:

https://github.com/IDEA-Research/Grounding-DINO-1.5-API

本篇博客参考了以下的博客!非常感谢!

1 https://blog.csdn.net/m0_46295727/article/details/133221439?spm=1001.2014.3001.5506

2 https://blog.csdn.net/weixin_44151034/article/details/139362032?spm=1001.2014.3001.5506

相关推荐
老当益壮梁奶奶5 分钟前
Linux软件编程学习笔记(二)Linux文件IO编程入门:从fopen到fgetc
linux·c语言·c++·笔记·学习
sunoo-2295 分钟前
C 语言文件 IO 全攻略:从基础函数到实战踩坑(BMP 读取 + 词典查询)
linux·c语言·前端·笔记·vscode·学习
草莓熊Lotso20 分钟前
【Linux网络加餐】手动部署:SSH 与 Web 服务实战 + 底层原理全解析
linux·运维·网络·人工智能·python·langchain·ssh
CHHH_HHH29 分钟前
【Linux系统篇】深入解析Linux文件系统:从磁盘寻址到软硬链接
linux·服务器·开发语言·后端·ubuntu
剑锋所指,所向披靡!30 分钟前
TCP并发服务器
服务器·网络·tcp/ip
XiaQ09191 小时前
Linux 常用命令学习笔记(用户管理篇):用户、组与权限的钥匙
linux·开发语言·笔记·学习
刚入门的大一新生1 小时前
Linux-Linux的进程状态
linux·运维·服务器
AI备忘录1 小时前
(十一)DHCP 配置命令五厂商对照:华为 华三 锐捷 迈普 思科
服务器·网络·网络协议·网络安全·华为
随便做点啥2 小时前
32卡×4090 24GB,Qwen3.8-27B-FP8 集群部署报告
服务器·经验分享·docker·vllm
Brilliantwxx2 小时前
313131
服务器