上下文视觉提示实现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 npdef 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_listin_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 osfrom dinov.BaseModel import BaseModel
from dinov import build_model
from utils.arguments import load_opt_from_config_filefrom 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_filesopt = 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_sama= 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得到的推理效果更优!
在这里插入图片描述

四、总结

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

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

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

相关文章

深度解析:医院管理全面数字化转型的技术实现与优势

随着科技的飞速发展,信息技术的应用已经渗透到社会的各个角落,医疗行业作为关乎人民群众生命健康的重要领域,更是急需借助科技的力量实现转型升级。在这样的时代背景下,全面数字化转型成为了医院管理创新的必由之路。 北京XXX医院…

linux下宝塔负载100%解决方法

今天发现服务器宝塔面板负载居然是100% 但是cpu 和内存其实并不高 通过命令查看主机 uptime 中load average 居然高达18.23 看来负载是真的高了 通过vmstat 看看具体问题 procs: ​ r 表示运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU个数…

Pytorch深度学习实践笔记9(b站刘二大人)

🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:pytorch深度学习 🎀CSDN主页 发狂的小花 🌄人生秘诀:学习的本质就是极致重复! 《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibi…

【一竞技CS2】YaLLa 2024邀请TheMongolz和BB

1、近日YaLLa Compass 2024主办方已宣布了最后两支受邀参赛的队伍是TheMongolz和BB两支战队,赛事将于6月5日至9日间在阿联酋阿布扎比的Space 42 Arena举行,总奖金为40万美元。 值得一说的是本次赛事的12支参赛队伍中,Cloud9和FURIA尚未确定参赛阵容。在arT离队后,FURIA让青训队…

LaTex安装及配置(Windows)

LaTex安装及配置(Windows) 安装环境安装texlive下载texlive安装 编辑器安装texstudio下载texstudio安装 环境配置 使用第一个LaTex文档新建文件编程查看results 安装 环境安装 texlive下载 镜像清华源下载地址:https://mirrors.tuna.tsing…

Java通过Html(ftl模板)生成PDF实战, 可支持商用

Java通过Html(freemarker模板)生成PDF实战, 可支持商用 技术架构 springboot freemarker [pdfbox] flying-saucer-pdf 生成流程: freemarker: 根据数据填充ftl模板文件,得到包含有效数据的html文件(包含页眉页脚页码的处理&#xff0c…

InteractiveGraph图谱中vue项目中如何使用

InteractiveGraph图谱中vue项目中如何使用 一、下载js和css和字体二、vue2.0项目中引用三、grap组件 一、下载js和css和字体 //在这里面找 https://github.com/grapheco/InteractiveGraph/blob/master/dist/examples/example1.html二、vue2.0项目中引用 //main.js中全局引入$ …

导入 FDTD 仿真的 S 参数到 INTERCONNECT 的器件中

导入 FDTD 仿真的 S 参数到 INTERCONNECT 的器件中 正文正文 很多时候,仿真链路比较大时,我们可以将仿真的每个部分分隔开来,用 FDTD 计算出每一部分的 S 参数,然后将这些 S 参数导入 INTERCONNECT 中得到最终的仿真结果。这里我们来介绍一下这种方法。 首先,我们从右侧…

Linux系统安装AMH服务器管理面板并实现远程访问管理维护

目录 前言 1. Linux 安装AMH 面板 2. 本地访问AMH 面板 3. Linux安装Cpolar 4. 配置AMH面板公网地址 5. 远程访问AMH面板 6. 固定AMH面板公网地址 1. 部署Docker Registry 2. 本地测试推送镜像 3. Linux 安装cpolar 4. 配置Docker Registry公网访问地址 5. 公网远程…

【链表】Leetcode 92. 反转链表 II【中等】

反转链表 II 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#x…

Solidity 教程01 Remix IDE 初次见面

访问链接地址&#xff1a; https://remix.ethereum.org/ 文件管理器 文件资源管理器用于管理工作区和文件。此插件还包含许多快捷方式和命令。要快速浏览&#xff0c;请右键单击文件以获取弹出菜单&#xff0c;并检查插件右上角的汉堡菜单。 要找到文件资源管理器模块 - 单…

rust语言初识

程序设计实践课上水一篇ing 来源&#xff1a;rust基础入门-1.初识rust-酷程网 (kucoding.com) rust作为一名新兴语言&#xff0c;与go又有些许不同&#xff0c;因为它的目标是对标系统级开发&#xff0c;也就是C、C这两位在编程界的位置。比如我们最常用的windows系统&#x…

001.数据分析_NumPy

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

【ai】pycharm设置软件仓库编译运行基于langchain的chatpdf

联想笔记本 y9000p创建python工程: 使用langchain支持openai的向量化embedding安装软件包 发现没有openai ,添加软件仓库打开工具窗口 点击设置

Jlink卡死 JFlash keil 盗版JLINK

现象&#xff1a;用Keil打开Jlink配置页&#xff0c;会卡死。 解决方法&#xff1a;用旧版本的Jlink软件&#xff0c;因为淘宝买的很多JLINK下载器是盗版的&#xff0c;不支持新版本的JLINK软件。到https://www.segger.com/downloads/jlink下载旧版本的软件。 如果必须要用新版…

SQLI-labs-第二十五关和第二十五a关

目录 第二十五关 1、判断注入点 2、判断数据库 3、判断表名 4、判断字段名 5、获取数据库的数据 第二十五a关 1、判断注入点 2、判断数据库 第二十五关 知识点&#xff1a;绕过and、or过滤 思路&#xff1a; 通过分析源码和页面&#xff0c;我们可以知道对and和or 进…

链表经典题目—相交链表和链表倒数第k个节点

&#x1f389;&#x1f389;&#x1f389;欢迎莅临我的博客空间&#xff0c;我是池央&#xff0c;一个对C和数据结构怀有无限热忱的探索者。&#x1f64c; &#x1f338;&#x1f338;&#x1f338;这里是我分享C/C编程、数据结构应用的乐园✨ &#x1f388;&#x1f388;&…

艾体宝干货 | 教程:使用ntopng和nProbe监控网络流量

本教程旨在分享如何通过 ntopng 和 nProbe 这两款工具&#xff0c;深入了解和掌握网络流量监控的艺术。我们将提供从基本概念到高级应用的全面指导&#xff0c;涵盖了在多种平台和设备上的部署和配置步骤。不论您是专业人员还是技术爱好者&#xff0c;跟随本教程&#xff0c;都…

11thingsboard物联网网关接入ThingsBoard物联网平台的操作说明

本文包含关于如何配置ThingsBoard 平台和连接钡铼技术R40设备的说明。ThingsBoard平台是一个用于数据收集、处理、可视化和设备管理的开源物联网平台。它通过行业标准MQTT协议实现设备连接。ThingsBoard结合了可扩展性、容错性和性能&#xff0c;因此您永远不会丢失数据。 4G L…

【考研数学】线代除了「李永乐」,还能跟谁?

考研线代&#xff0c;除了利用了老师&#xff0c;我觉得还有一个宝藏老师的课程值得听&#xff01; 那就是喻老&#xff0c;这个是我在b站上面新发现的老师&#xff0c;听完他的课程发现真的喜欢 他不仅在B站上开设了课程&#xff0c;还编写了配套的线性代数辅导讲义&#xff…