上下文视觉提示实现zero-shot分割检测及多visual-prompt改造

文章目录

  • 一、Closed-Set VS Open-set
  • 二、DINOv
    • 2.1 论文和代码
    • 2.2 内容
    • 2.3 安装部署
    • 2.4 使用效果
  • 三、多visual prompt 改造
    • 3.1 获取示例图mask
    • 3.2 修改函数参数
    • 3.3 推理代码
    • 3.4 效果的提升!
  • 四、总结

  本文主要介绍visual prompt模型DINOv,该模型可输入八张目标示例图作为参考,告诉模型我要找的目标长这样,在新的图片上进行推理,实现实例分割的效果。
   但一些复杂的场景,八张的示例图不能让模型完全的学习到目标的特征,因此扩展模型能力,让visual prompt数量不受限制,对实际场景应用是非常有必要的(附改造方法、改造代码)。

一、Closed-Set VS Open-set

  Closed-Set模型只需要关注有限数量的已知类别,答案选项是预先定义的,这意味着模型的输出范围是有限的、固定的,并且只限于训练时已知的选项,例如YOLO;Open-Set模型可以识别不属于任何已知类别的样本,即其输出范围不是固定的,具备一定的泛化能力和鲁棒性,以应对这些未知的挑战,例如SAM。
  在某些特定的应用场景中,仅仅依赖文本提示(text prompt)来描述目标对象,对于Open-Set大模型来说,可能并不足以实现精准识别。若能够额外提供示例图像(visual prompt),将有助于模型更准确地理解我们的意图,从而提升整体的识别效果。
  下图是DINOv作者提供的demo界面,左上角输入油污推理图,左下角输入多张油污示例图,并用画笔进行mask,运行模型可得到右边的推理效果。

二、DINOv

2.1 论文和代码

论文名称:《Visual In-Context Prompting》
code:https://github.com/UX-Decoder/DINOv
demo:http://semantic-sam.xyzou.net:6099/

2.2 内容

  上下文提示是一种利用少量示例任务来指导模型完成新任务的技术。在视觉任务中,这种技术可以通过提供一组带有标签的图像作为示例,来引导模型理解和解决新的视觉任务。
  模型通过学习少量的带有标签的样本图像,提取出这些图像中的关键特征和模式,然后利用这些特征和模式来生成针对新图像的查询。这个查询可以引导模型在新图像中定位并分割出目标物体。具体来说,模型可能通过学习示例图像中的物体形状、颜色、纹理等特征,以及这些特征与标签之间的关系,来构造出查询。然后,模型将这个查询应用于其他图像,通过匹配和比较查询与图像中的特征,来定位并分割出目标物体。最终,模型会生成一个掩码,标记出分割出的物体区域。
  以图片作为提示(visual prompt),在提示图上通过笔画、画mask等方法作为视觉prompt,可推理出侧视图中同类目标,达到zero-shot目标分割的效果。
在这里插入图片描述
说明:在降落伞进行mask标注,在新的降落伞场景可分割出降落伞,其他场景同理

2.3 安装部署

系统要求:gcc版本>=4.9

# 1、离线安装detectron2
# 下载https://github.com/MaureenZOU/detectron2-xyz.git
Unzip detectron2-xyz.zip  # 解压
Cd detectron2-xyz
Pip install -e .
# 2、离线安装panopticapi
# 下载https://github.com/cocodataset/panopticapi.git
Unzip panopticapi.zip  # 解压
Cd panopticapi
Pip install -e .
# 3、启动DINOv
# 下载DINOv,https://github.com/UX-Decoder/DINOv
Unzip DINOv.zip  # 解压
cd DINOv
python -m pip install -r requirements.txt
python demo_openset.py --ckpt /path/to/swinL/ckpt
# 终端返回下图链接

在这里插入图片描述
注:在浏览器访问public URL,建议使用梯子,local URL直接用即可

2.4 使用效果

  通过界面输入八张示例图,在一些大目标、规整目标(如矩形、圆形),效果较好,在复杂场景、小目标、不规则物体,无法达到预期效果,例如墙缝缺陷,无法分割裂缝。
在这里插入图片描述

三、多visual prompt 改造

  使用八张图片作为示例图,可能无法完全学习到目标。在实际使用中,我们可能采集到一小部分图片,例如50张、100张等;如何让DINOv不受限制,可支持多张输入呢?

3.1 获取示例图mask

  使用labelme标注工具,生成json标注文件,使用下面代码将json转化为标注mask图。

import json
import cv2
import os
import matplotlib.pyplot as plt
import numpy as np
 
def generate_mask(img_path, json_path, save_path):
    img = cv2.imread(img_path)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    mask = np.zeros_like(img)


    with open(json_path, "r") as f:
        tmp = f.read()
     
    tmp = json.loads(tmp)
    tmp_shapes = tmp["shapes"]
    for shape in tmp_shapes:
        points = shape["points"]
        points = np.array(points, np.int32)
        cv2.fillPoly(mask, [points], (255, 255, 255)) 

    img_add = cv2.addWeighted(mask, 0.3,img,0.7,0)
    cv2.imwrite(save_path, mask)

if __name__ == "__main__":
    imgs_dir = "./imgs"    # 图片目录
    jsons_dir = "./jsons"  # 标注的json文件存放目录
    save_dir = "./masks"   # 生成mask图保存目录

    img_files = os.listdir(imgs_dir)
    for img_name in img_files:
        img_path = os.path.join(imgs_dir, img_name)
        json_path = os.path.join(jsons_dir, img_name.split('.')[0]+'.json')

        if os.path.exists(json_path):
            save_path = os.path.join(save_dir, img_name)
            generate_mask(img_path, json_path, save_path)

3.2 修改函数参数

修改文件路径:demo/openset_task.py
作用:将原8张图输入修改为列表不限制输入

# 原代码31-37行
def task_openset(model,generic_vp1, generic_vp2, generic_vp3, generic_vp4,
                   generic_vp5, generic_vp6, generic_vp7, generic_vp8, image_tgt=None, text_size=640,hole_scale=100,island_scale=100):
    in_context_examples = [generic_vp1, generic_vp2, generic_vp3, generic_vp4,
                   generic_vp5, generic_vp6, generic_vp7, generic_vp8]
    in_context_examples = [x for x in in_context_examples if x is not None]
    t = []
    t.append(transforms.Resize(int(text_size), interpolation=Image.BICUBIC))
# 替换代码
def task_openset(model,refer_img_list, image_tgt=None, text_size=640,hole_scale=100,island_scale=100):
    # in_context_examples = [generic_vp1, generic_vp2, generic_vp3, generic_vp4,
    #                generic_vp5, generic_vp6, generic_vp7, generic_vp8]
    in_context_examples = refer_img_list
    in_context_examples = [x for x in in_context_examples if x is not None]
    t = []
    t.append(transforms.Resize(int(text_size), interpolation=Image.BICUBIC))

3.3 推理代码

  自定义imgs_dir、mask_dir、tgt_dir,执行代码,可在save_dir中找到结果图

import torch
import argparse
from PIL import Image
import cv2
import os

from dinov.BaseModel import BaseModel
from dinov import build_model
from utils.arguments import load_opt_from_config_file

from demo.openset_task import task_openset 

def parse_option():
    parser = argparse.ArgumentParser('DINOv Demo', add_help=False)
    parser.add_argument('--conf_files', default="configs/dinov_sam_coco_swinl_train.yaml", metavar="FILE", help='path to config file', )
    parser.add_argument('--ckpt', default="model_swinL.pth", metavar="FILE", help='path to ckpt')
    parser.add_argument('--port', default=6099, type=int, help='path to ckpt', )
    args = parser.parse_args()

    return args


'''
build args
'''
args = parse_option()

'''
build model
'''

sam_cfg=args.conf_files

opt = load_opt_from_config_file(sam_cfg)

model_sam = BaseModel(opt, build_model(opt)).from_pretrained(args.ckpt).eval().cuda()

@torch.no_grad()
def inference(refer_img_list, image2,*args, **kwargs):
    with torch.autocast(device_type='cuda', dtype=torch.float16):
        model=model_sam
        a= task_openset(model, refer_img_list, image2, *args, **kwargs)
        return a

"""
读取image和labelme标注的mask图
推理一整个目录的图片
"""

def inference_dir(imgs_dir, mask_dir, tgt_dir, save_dir):
    files = os.listdir(tgt_dir)
    result_img_list = []

    for file in files:
        print(f'==={file}==')
        image_tgt_path = os.path.join(tgt_dir, file)
        image_tgt = Image.open(image_tgt_path).convert('RGB')

        refer_img_list = []

        img_files = os.listdir(imgs_dir)
        for img_name in img_files:
            img_path = os.path.join(imgs_dir, img_name)
            mask_path = os.path.join(mask_dir, img_name)

            if os.path.exists(mask_path):
                generic_vp= {"image":"", "mask":""}
                generic_vp["image"] = Image.open(img_path).convert('RGB')
                generic_vp["mask"] = Image.open(mask_path).convert('RGB')
                refer_img_list.append(generic_vp)
        # print(len(refer_img_list))
        res = inference(refer_img_list, image_tgt)
        res = cv2.cvtColor(res, cv2.COLOR_RGB2BGR)
        cv2.imwrite(os.path.join(save_dir, os.path.basename(image_tgt_path)), res)

if __name__ == "__main__":
    imgs_dir = "./test_img_2/group_50/refer/imgs"   # 示例图目录
    mask_dir = "./test_img_2/group_50/refer/masks"  # 示例mask图目录
    tgt_dir = "./test_img_2/tgt"     # 推理图目录
    save_dir = "results/group_50/"   # 结果保存目录
    inference_dir(imgs_dir, mask_dir, tgt_dir, save_dir)

3.4 效果的提升!

  在验证多visual prompt对结果的影响,采用了对比实验。在光学镜头缺陷场景中,8张visual prompt和50张visual prompt进行对比,50张visual prompt得到的推理效果更优!
在这里插入图片描述

四、总结

  如果文章对您有所帮助,记得点赞、收藏、评论探讨✌️

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux基础(八):计算机基础概论

本篇博客简单介绍计算机的基础知识,为后续学习做个铺垫。 目录 一、计算机的基本组成 1.1 计算机组成五大部件 1.1.1 运算器(Arithmetic Logic Unit,ALU) 1.1.2控制器 (Control Unit,CU) …

【网络协议】应用层协议--HTTP

文章目录 一、HTTP是什么?二、HTTP协议工作过程三、HTTP协议1. fiddler2. Fiddler抓包的原理3. 代理服务器是什么?4. HTTP协议格式1.1 请求1.2 响应 四、认识HTTP的请求1.认识HTTP请求的方法2.认识请求头(header)3.认识URL3.1 URL是什么&…

uni-app实现页面之间的跳转传参(八)

界面之间的参数传递在 开发中经常会用到,这节主要将一下uni-app开发应用是的传参情况。如下图所示,我的一级界面将点检分成三类:日点检、周点检和年保养;在点击相应的会导航到相应的功能。 在uni-app中常用的方法有uni.navigateTo(OBJECT)、uni.redirectTo(OBJECT);简单的…

详解 Scala 的集合类型

一、集合简介 1. 类型 序列 Seq:类似于 Java 中的 List 接口集 Set:类似于 Java 中的 Set 接口映射 Map:类似于 Java 中的 Map 接口所有的集合都扩展自 Iterable 特质 2. 不可变集合 位于 scala.collection.immutable 包,指该集…

基于docxtpl的模板生成Word

docxtpl是一个用于生成Microsoft Word文档的模板引擎库。它结合了docx模块和Jinja2模板引擎,使用户能够使用Microsoft Word模板文件并在其中填充动态数据。这个库提供了一种方便的方式来生成个性化的Word文档,并支持条件语句、循环语句和变量等控制结构&…

Spring Boot集成testcontainers快速入门Demo

1.什么是testcontainers? Testcontainers 是一个用于创建临时 Docker 容器进行单元测试的 Java 库。当我们想要避免使用实际服务器进行测试时,它非常有用。,官网介绍称支持50多种组件。​ 应用场景 数据访问层集成测试: 使用My…

HTTP交互导致ECONNABORTED的原因之一

背景: 本次记录的,是一次使用HTTP交互过程中遇到的问题,问题不大,就是给题目上这个报错补充一种可能的解决方案。 程序大致流程: 1. 设备向服务器A请求信息 2. 拿到回复记录下回复内容中的数据包下载地址等信息 3…

2024GDCPC广东省赛记录

比赛流程体验,依托,开赛几分钟了,选手还卡在门外无法入场,也没给延时,说好的桌上会发三支笔,于是我们就没准备,要了三次笔,终于在一小时后拿到了😅 比赛题目体验&#xf…

PyTorch深度学习快速入门——P1-P13

环境配置 Anaconda,创建conda create -n pytorch python3.12,使用conda activate pytorch切换到环境。安装pytorch,conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidia,使用import torch&…

力扣496. 下一个更大元素 I

Problem: 496. 下一个更大元素 I 文章目录 题目描述思路复杂度Code 题目描述 思路 因为题目说nums1是nums2的子集,那么我们先把nums2中每个元素的下一个更大元素算出来存到一个映射里,然后再让nums1中的元素去查表即可 复杂度 时间复杂度: O ( n 1 n 2…

宁夏银川、山东济南、中国最厉害的改名大师的老师颜廷利教授的前沿思想观点

在当代社会,一个响亮的声音穿越了传统的迷雾,它来自东方哲学的殿堂,由一位现代学者颜廷利教授所发出。他的话语,如同一股清泉,在混沌的世界里激荡着思考的波澜:"有‘智’不在年高,无‘智’…

福昕PDF编辑器自定义快捷方式

你是否为用不惯福昕PDF编辑器自带的快捷键而发愁?今天,我和大家分享一下如何设置自己想要的快捷键方式,希望能对大家有帮助。 步骤一:打开福昕PDF编辑,并找到更多命令 步骤二:切换到键盘一栏,并…

Stream流常用操作

一、中间操作 中间操作是返回一个新的流,并在返回的流中包含所有之前的操作结果。它们总是延迟计算,这意味着它们只会在终止操作时执行,这样可以最大限度地优化资源使用。 1. filter(过滤) filter()方法接受一个谓词(一个返回boo…

栈和队列的基本见解

1.栈 1.1栈的基本概念和结构: 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则。 压栈:栈的插入操作叫做进栈/压栈…

【java程序设计期末复习】chapter2 基本数据类型与数组

基本数据类型与数组 一,标识符和关键字 标识符 定义 用来标识类名、变量名、方法名、类型名、数组名、文件名的有效字符序列称为标识符,简单地说,标识符就是一个名字 。 性质 (1)标识符由字母、下划线、美元符号和…

cocos creator做圆形进度条

效果图: 我们在开发过程中经常要用到圆形进度条,例如技能CD 原文链接 之前写了一篇cocos2dx-lua_ProgressTimer创建扇形进度条,这里简单记录下在cocosCreator中如何制作。 具体方法 cocosCreator做起来比2dx还是要简单很多,首先给节点添加p…

PageHelper分页

文章目录 PageHelper分页ThreadLocalMap和ThreadLocal执行完PageHelper.startPage之后,分页参数存储到哪里了?Page和List的关系?PageInterceptor分页拦截器的作用?PageInfo的作用与结构?最后看下引入的pagehelper分页依…

Linux-部分:实用指令

1 指定运行级别 1)基本介绍: 运行级别说明: 0:关机1:单用户【找回丢失密码】2:多用户状态没有网络服务3:多用户状态有网络服务4:系统未使用保留给用户5:图形界面6&…

新业务 新市场 | 灵途科技新品亮相马来西亚亚洲防务展

5月6日,灵途科技携新品模组与武汉长盈通光电(股票代码:688143)携手参加第18届马来西亚亚洲防务展。首次亮相海外,灵途科技便收获全球客户的广泛关注,为公司海外市场开拓打下坚实基础。 灵途科技与长盈通共同…

基于Llama 3搭建中文版(Llama3-Chinese-Chat)大模型对话聊天机器人

前面两篇博文,我们分别在个人笔记本电脑部署了Llama 3 8B参数大模型,并使用Ollama搭建了基于 Web 可视化对话聊天机器人,可以在自己电脑上愉快的与Llama大模型 Web 机器人对话聊天了。但在使用过程中,笔者发现Llama大模型经常出现…