Grounded-Segment-Anything本地部署

news2024/11/26 0:26:39

Grounded-Segment-Anything本地部署

  • 1.本地部署源码
    • 1.1 克隆源码
    • 1.2 下载初始参数
  • 2. 创建虚拟环境及配置
  • 3. 测试相关文件
    • 3.1 运行`grounding_dino_demo.py`文件
    • 3.2 运行`grounded_sam_demo.py`文件
    • 3.3 运行`grounded_sam_simple_demo.py`文件
    • 3.4 `grounded_sam_inpainting_demo.py`文件
    • 3.5 ` 运行`automatic_label_ram_demo.py`文件
    • 3.6 运行`automatic_label_demo.py`文件
    • 3.7. 批量自动标注图片
  • 5. 总结

  • 源码链接:https://github.com/IDEA-Research/Grounded-Segment-Anything
  • 介绍
    • Segment Anything Model,简称 SAM。
    • SAM 已经学会了关于物体的一般概念,可以为任何图像或视频中的任何物体生成 mask,甚至包括在训练过程中没有遇到过的物体和图像类型。
    • SAM 足够通用,可以涵盖广泛的用例,并且可以在新的图像领域即开即用,无需额外的训练

1.本地部署源码

1.1 克隆源码

  • 克隆命令
    git clone https://github.com/IDEA-Research/Grounded-Segment-Anything.git
    
  • 问题一
    • 克隆下来后发现下面的三个文件夹是空的
      在这里插入图片描述

    • 在源码链接中有这两行命令,应该是把这三个文件夹文件下载下来,但是我的报错
      在这里插入图片描述

    • 解决 :手动下载,然后放在相应的文件夹
      在这里插入图片描述

  • 问题二【手动放在相应的文件夹后,调用里面的文件路径是错的】
    • 解决:修改相关路径,运行代码将不对的路径全部改掉
    • 修改路径 【segment_anything】
      在这里插入图片描述
    • 修改路径 【GroundingDINO】
      在这里插入图片描述

1.2 下载初始参数

  • 参数链接
    • groundingdino_swint_ogc.pth
    • sam_vit_h_4b8939.pth
    • sam_hq_vit_h.pth
    • ram_swin_large_14m.pth
    • tag2text_swin_14m.pth
  • 初始参数文件存放目录:项目根目录
    在这里插入图片描述

2. 创建虚拟环境及配置

  • 创建虚拟环境
    conda create -n env_grounded_segment_anything python==3.8.10
    
  • 进入虚拟环境
    conda activate env_grounded_segment_anything
    
  • 安装pytorch
    pip install torch==1.10.0+cu113 torchvision==0.11.0+cu113 torchaudio==0.10.0 -f https://download.pytorch.org/whl/torch_stable.html
    
  • 安装requirements.txt
    pip install -r requirements.txt 
    
  • 使用pycharm打开项目
    在这里插入图片描述
  • 选择虚拟环境
    在这里插入图片描述

3. 测试相关文件

3.1 运行grounding_dino_demo.py文件

  • gpu,将DEVICE 值改为 cpu
  • gpu,无需修改参数
  • 生成标注图片
    在这里插入图片描述

3.2 运行grounded_sam_demo.py文件

  • 添加参数,电脑没有gpudevice 参数使用默认的cpu
    --config GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py  
    --grounded_checkpoint groundingdino_swint_ogc.pth  
    --sam_checkpoint sam_vit_h_4b8939.pth 
    --input_image assets/demo1.jpg  
    --output_dir "outputs"  
    --box_threshold 0.3  
    --text_threshold 0.25  
    --text_prompt "bear"  
    

在这里插入图片描述

  • 输出结果
    • 文件说明
      在这里插入图片描述
    • 图片显示
      在这里插入图片描述

3.3 运行grounded_sam_simple_demo.py文件

  • 无cuda报错
    在这里插入图片描述
  • inference.py修改device值改为cpu
    在这里插入图片描述
  • 测试demo4.jpg【无需修改代码】
    在这里插入图片描述
  • 测试demo7.jpg
    • 修改关于demo.jpg信息
      在这里插入图片描述
    • 结果
      在这里插入图片描述

3.4 grounded_sam_inpainting_demo.py文件

  • 修复图片文件

  • 添加参数

    --config
    GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py
    --grounded_checkpoint
    groundingdino_swint_ogc.pth
    --sam_checkpoint
    sam_vit_h_4b8939.pth
    --input_image
    assets/inpaint_demo.jpg
    --output_dir
    "outputs"
    --box_threshold
    0.3
    --text_threshold
    0.25
    --det_prompt
    "bench"
    --inpaint_prompt
    "A sofa, high quality, detailed"
    

    在这里插入图片描述

  • 报错 【下载远程文件失败】
    在这里插入图片描述

  • 解决:手动下载

    • 下载链接:https://huggingface.co/runwayml/stable-diffusion-inpainting/tree/main
    • 将下载好的文件放在config_data文件夹中
      在这里插入图片描述
    • 修改为本地路径
      在这里插入图片描述
  • 重新运行:报错 【原因:我没有gpu】
    在这里插入图片描述

  • 解决,将cuda换为cpu
    在这里插入图片描述

  • 重新运行:报错

    • RuntimeError: "LayerNormKernelImpl" not implemented for 'Half'
      在这里插入图片描述

    • 解决方式:解决链接

    • float16改为float32
      在这里插入图片描述

  • 结果
    在这里插入图片描述

3.5 运行automatic_label_ram_demo.py`文件

  • 添加参数

    --ram_checkpoint
    ram_swin_large_14m.pth
    --grounded_checkpoint
    groundingdino_swint_ogc.pth
    --sam_checkpoint
    sam_vit_h_4b8939.pth
    --input_image
    assets/demo9.jpg
    --output_dir
    "outputs"
    --box_threshold
    0.25
    --text_threshold
    0.2
    --iou_threshold
    0.5
    
  • 结果
    在这里插入图片描述

3.6 运行automatic_label_demo.py文件

  • 自动标注文件

  • 添加参数

    --config
    GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py
    --grounded_checkpoint
    groundingdino_swint_ogc.pth
    --sam_checkpoint
    sam_vit_h_4b8939.pth
    --input_image
    assets/demo9.jpg
    --output_dir
    "outputs"
    --box_threshold
    0.25
    --text_threshold
    0.2
    --iou_threshold
    0.5
    

    在这里插入图片描述

  • 报错
    在这里插入图片描述

  • 原因:下载文件失败,手动下载

    • 下载链接:https://huggingface.co/Salesforce/blip-image-captioning-large/tree/main
    • 将文件放在config_data
      在这里插入图片描述
    • 修改为本地路径
      在这里插入图片描述
  • 报错Resource punkt not found. Please use the NLTK Downloader to obtain the resources

    • 手动下载链接:http://www.nltk.org/nltk_data/
    • 下载wordnet,punkt,averaged_perceptron_tagger
    • 放到相应目录,zip解压文件都要有
      在这里插入图片描述
  • 结果
    在这里插入图片描述

3.7. 批量自动标注图片

  • 修改automatic_label_demo.py文件
  • 文件太长,其他的地方还要改
    if __name__ == "__main__":
        root_path=''  # 根目录
        images_name='images'   # 图片文件夹名
        images_path=os.path.join(root_path,images_name)
        images_outputs_path=os.path.join(root_path,'grounded_segment_anything_images')
        output_json = os.path.join(images_outputs_path,'json')
        output_orig = os.path.join(images_outputs_path,'orig')
        output_mask = os.path.join(images_outputs_path,'mask')
        output_automatic_label = os.path.join(images_outputs_path,'automatic_label')
        for i in [output_json,output_mask,output_orig,output_automatic_label]:
            os.makedirs(i, exist_ok=True)
        images_list=os.listdir(images_path)
        parser = argparse.ArgumentParser("Grounded-Segment-Anything Demo", add_help=True)
        parser.add_argument("--config", type=str, default='GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py',
                            help="path to config file")
        parser.add_argument("--grounded_checkpoint", type=str, default='groundingdino_swint_ogc.pth', help="path to checkpoint file")
        parser.add_argument("--sam_checkpoint", type=str, default='sam_vit_h_4b8939.pth', help="path to checkpoint file")
        parser.add_argument("--split", default=",", type=str, help="split for text prompt")
        parser.add_argument("--openai_key", type=str, help="key for chatgpt")
        parser.add_argument("--openai_proxy", default=None, type=str, help="proxy for chatgpt")
        parser.add_argument("--box_threshold", type=float, default=0.25, help="box threshold")
        parser.add_argument("--text_threshold", type=float, default=0.2, help="text threshold")
        parser.add_argument("--iou_threshold", type=float, default=0.5, help="iou threshold")
        parser.add_argument("--device", type=str, default="cpu", help="running on cpu only!, default=False")
        args = parser.parse_args()
    
        # cfg
        config_file = args.config  # change the path of the model config file
        grounded_checkpoint = args.grounded_checkpoint  # change the path of the model
        sam_checkpoint = args.sam_checkpoint
        # image_path = args.input_image
        split = args.split
        openai_key = args.openai_key
        openai_proxy = args.openai_proxy
        box_threshold = args.box_threshold
        text_threshold = args.text_threshold
        iou_threshold = args.iou_threshold
        device = args.device
        openai.api_key = openai_key
        if openai_proxy:
            openai.proxy = {"http": openai_proxy, "https": openai_proxy}
    
        # load model
        model = load_model(config_file, grounded_checkpoint, device=device)
     
        processor = BlipProcessor.from_pretrained("config_data/blip-image-captioning-large")
        if device == "cuda":
            blip_model = BlipForConditionalGeneration.from_pretrained("config_data/blip-image-captioning-large",
                                                                      torch_dtype=torch.float16).to("cuda")
        else:
            blip_model = BlipForConditionalGeneration.from_pretrained("config_data/blip-image-captioning-large")
        for img_name in images_list:
     
            image_path=os.path.join(images_path,img_name)
            image_pil, image = load_image(image_path)
            image_pil.save(os.path.join(output_orig, img_name))
            args = parser.parse_args()
            caption = generate_caption(image_pil, device=device)
            text_prompt = generate_tags(caption, split=split)
            print(f"Caption: {caption}")
            print(f"Tags: {text_prompt}")
            # visualize raw image
            image_pil.save(os.path.join(output_orig,img_name ))
            # run grounding dino model
            boxes_filt, scores, pred_phrases = get_grounding_output(
                model, image, text_prompt, box_threshold, text_threshold, device=device
            )
    
            # initialize SAM
            predictor = SamPredictor(build_sam(checkpoint=sam_checkpoint).to(device))
            image = cv2.imread(image_path)
            image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
            predictor.set_image(image)
    
            size = image_pil.size
            H, 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:] / 2
                boxes_filt[i][2:] += boxes_filt[i][:2]
    
            boxes_filt = boxes_filt.cpu()
            # use NMS to handle overlapped boxes
            print(f"Before NMS: {boxes_filt.shape[0]} boxes")
            nms_idx = torchvision.ops.nms(boxes_filt, scores, iou_threshold).numpy().tolist()
            boxes_filt = boxes_filt[nms_idx]
            pred_phrases = [pred_phrases[idx] for idx in nms_idx]
            print(f"After NMS: {boxes_filt.shape[0]} boxes")
            caption = check_caption(caption, pred_phrases)
            print(f"Revise caption with number: {caption}")
    
            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 image
            plt.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.title(caption)
            plt.axis('off')
            plt.savefig(
                os.path.join(output_automatic_label,img_name),
                bbox_inches="tight", dpi=300, pad_inches=0.0
            )
    
            save_mask_data(output_mask,output_json,img_name, caption, masks, boxes_filt, pred_phrases)
    

5. 总结

  • 文件太多了,其他的不像测试了,因该都没有很大的问题
  • 文件初始化参数太大了,一个项目占了几十个G
  • 效果也不好,不想做了,摆烂

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

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

相关文章

Spring Boot 如何使用 Jetty 容器

Spring Boot 如何使用 Jetty 容器 Jetty 是一款轻量级的 Java Web 容器,适用于各种规模的 Web 应用程序。在 Spring Boot 中,我们可以使用 Jetty 作为 Web 容器来处理 HTTP 请求和响应。本文将介绍 Spring Boot 如何使用 Jetty 容器,包括如何…

SpringBoot 如何使用 AOP 容器

SpringBoot 如何使用 AOP 容器 SpringBoot 是基于 Spring Framework 的一种快速开发框架,它提供了丰富的功能和组件,其中之一就是 AOP(面向切面编程)。AOP 是一种编程范式,可以将横向关注点(如日志记录、事…

紫东太初:造一个国产大模型,需用多少篇高质量论文?

原创:谭婧 “视觉自监督算法这轮,你是不是没跟上?” 我面前这位年薪近七十万,互联网大厂AI算法工程师的好友, 他用一个反问句回答了我的关心: “自监督这个玩意咋跟上?” 他抬了抬头&#xff0c…

shell 拼接字符串,出现后面的字符串覆盖前面的字符串问题

字符串拼接语法 shell 拼接字符串语法很简单两个参数并排前后写上接口,如下 str1www str2bbb s t r 1 str1 str1str2 的结果未 wwwbbb 有时会出现如下问题: 在拼接字符串的时候,后面的字符串将前面的字符串覆盖了。 一、问题描述 shell的…

Unity3D:Game 视图

推荐:将 NSDT场景编辑器 加入你的3D工具链 3D工具集: NSDT简石数字孪生 Game 视图 从应用程序中的摄像机渲染 Game 视图。 该视图代表最终发布的应用程序。 需要使用一个或多个摄像机来控制玩家在使用应用程序时看到的内容。 有关摄像机的更多信息&#…

Github调研:开发者对生产力、协作和AI编码工具的看法

Datawhale干货 翻译:段秋阳 Datawhale成员 调研背景 GitHub首席产品官Inbal Shani如是说: 今天的开发人员所做的不仅仅是编写和发布代码,他们还需要熟练应用各种工具、环境和技术,包括生成人工智能编码工具这个新领域。但对开发人…

Python基础(14)——Python元组(tuple)详解

Python基础(14)——Python元组(tuple)详解 文章目录 Python基础(14)——Python元组(tuple)详解课程:元组目标一. 元组的应用场景二. 定义元组三. 元组的常见操作四. 总结…

vue进阶-vue-route

Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成,让用 Vue.js 构建单页应用变得轻而易举。 本章只做学习记录,详尽的内容一定要去官网查看api文档 Vue Router-Vue.js 的官方路由 1. 路由的基本使用 1.1 安装vue-router npm install vue-…

图解transformer中的自注意力机制

本文将将介绍注意力的概念从何而来,它是如何工作的以及它的简单的实现。 注意力机制 在整个注意力过程中,模型会学习了三个权重:查询、键和值。查询、键和值的思想来源于信息检索系统。所以我们先理解数据库查询的思想。 假设有一个数据库&#xff0c…

Django-带参数的路由编写(二)【用正则表达式匹配复杂路由】

在上一篇博文中,学习了“不用正则表达式匹配的简单带参数路由”,详情见链接: https://blog.csdn.net/wenhao_ir/article/details/131225388 本篇博文学习用“用正则表达式匹配复杂路由”。 简单的参数路由用库django.urls中的函数path()就可…

内涝监测系统如何助力城市防洪抗涝

近年来,各地内涝问题愈发严重,强降雨天气导致城市内涝已经屡见不鲜了,城市内涝不仅影响城市交通、居民生活,还可能对建筑物和基础设施造成损害,给城市运行带来重大风险。内涝治理除了要解决城市“里子”问题&#xff0…

【2023,学点儿新Java-11】基础案例练习:输出个人基础信息、输出心形 | Java中 制表符\t 和 换行符\n 的简单练习

前情回顾: 【2023,学点儿新Java-10】Java17 API文档简介&获取 |详解Java核心机制:JVM |详解Java内存泄漏与溢出 |Java优缺点总结 |附:GPT3.5-turbo问答测试【2023,学点儿新Java-09】Java初学者常会犯的错误总结与…

数据库SQL Server实验报告 之 SQL语言进行数据更新(6/8)

SQL语言进行数据更新 生命的本质是一场历练 实验目的及要求: 掌握如何使用sql语句进行插入、删除和更新操作。使用sql语句进行插入操作。使用sql语句进行删除操作。使用sql语句进行更新操作。使用各种查询条件完成指定的查询操作 实验内容及步骤&#xff1a…

计算机基础--->网络(2)【TCP、UDP、IP、ARP】

文章目录 TCP与UDP的区别TCP三次握手和四次挥手为什么要三次握手?第二次握手传回了ACK,为什么还要传回SYN?为什么要四次挥手?为什么不能将服务器发送的ACK和FIN合并起来,变成三次挥手?TCP如何保证传输的可靠…

推荐召回-Swing

概述 swing 是阿里原创的 i2i 召回算法,在阿里内部的多个业务场景被验证是一种非常有效的召回方法。据笔者了解,swing 在工业界已得到比较广泛的使用,抖音,小红书,B 站等推荐系统均使用了swing i2i。 1.传统 icf 算法…

MySql常见问题(长期更新)

基于mysql 8.0.3版本 一、忘记root密码1.1 、linux 系统下忘记密码1.2、Windows 系统下忘记密码1.3 Unix 和类 Unix 系统 二、账号问题2.1 远程访问账号设置 一、忘记root密码 1.1 、linux 系统下忘记密码 啥?你问我为什么会忘记密码?别问,…

Flutter状态管理新的实践 | 京东云技术团队

1 背景介绍 1.1 声明式ui 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明式UI是以后的前端发…

大数据从0到1的完美落地之sqoop优化

Sqoop的Job与优化 Job操作 job的好处: 1、一次创建,后面不需要创建,可重复执行job即可 2、它可以帮我们记录增量导入数据的最后记录值 3、job的元数据默认存储目录:$HOME/.sqoop/ 4、job的元数据也可以存储于mysql中。 复制代码…

C# 特性总结

目录 特性是什么? 如何使用特性? (1).Net 框架预定义特性 (2)自定义特性 为什么要使用特性? 特性的应用 特性实现枚举展示描述信息 特性是什么? 特性(Attribute&…

拉新、转化、留存,一个做不好,就可能会噶?

用户周期 对于我们各个平台来说(CSDN也是),我们用户都会有一个生命周期:引入期–成长期–成熟期–休眠期–流失期。 而一般获客就在引入期,在这个时候我们会通过推广的手段进行拉新;升值期则发生在成长期…