对象分割技术在图像重绘上的运用

news2024/11/27 2:27:26

今年早些时候,Meta AI 发布了他们的新开源项目: Segment Anything Model(SAM) ,在计算机视觉社区引起了巨大的轰动。SAM 是一种快速分割系统,它擅长于对不熟悉的物体和图像进行零样本泛化,而不需要额外的训练。

在本教程中,我将演示如何结合使用 SAM 和 GroundingDINO 以及Stable Diffusion 来创建一个接受文本作为输入的pipeline,以便使用生成式 AI 执行图像inpainting和outpainting。

在演示之前,总体了解下我们的pipeline:

系统先使用Grounding DINO 根据输入的文本进行对象检测,然后将对象检测结果作为输入 传递给 Segment Everything 得到图像掩码(Mask),这些掩码结合文本prompts 作为Stable Diffusion的输入,由SD来进行图像的重绘。

为了让大家对上述流程更清楚的理解,先介绍下 SAM,从官方宣传片得知,它擅长识别图片中的多对象,包括背景:

https://huggingface.co/spaces/segments/panoptic-segment-anything

Huggingface 有个空间,可以来尝试SAM:

比如针对下面左边图,输入对象类别:car,bus,person

右边图就能够识别每种类型的对象,并用不同的颜色标记出来。

比如你只想看识别出来的car:

这里只看识别出来的person:

还有人眼都看不清的 bus:

还有其他类别,比如 buildings,sidewalk,sky等:

还有马路上的电车:

以及在汽车前面等红绿灯的摩托车以及被电灯竖杆挡住的car 都能精准识别:

这确实让人震惊了,如果这种对象识别稳定的话,那用于自动驾驶L5级别完全没有问题。

为了进一步测试它的效果,我找来一张鸭子养殖户的照片,看看能不能数出来有多少只鸭:

果然不出所料:只识别出来2只,比我预料的差多了!不知道是我哪里没用对还是 模型 不行。 先不管了,有空再研究吧。继续我们的正题。

SAM是搅局者 Meta AI的重量级产品,被认为是计算机视觉的第一个基础模型。是什么让 SAM 如此特别呢? SAM 接受了包含 1100 万张图像和 11 亿个分割掩模的海量数据集的训练,Meta 也公开发布了该数据集。基础模型是使用神经网络通过海量的无标签数据集上训练得来的,模型强大的能力带来了诸如ChatGPT和BERT这样的产品。

但是在计算机领域,还没有这种预训练模型,但是 SAM 改变了这一现状。

这么重要的基础模型,我们怎么用呢?很简单,SAM接受多种输入(交互)方式,主要有三种:

1. 鼠标点击(point input):

2. 有界框(bounding box):

3. 文本prompt:

但是SAM并没有很好的集成这些输入方式,但是SAM的输出却能够很好地跟下游AI应用结合。但是Grounding DINO 却能够补齐SAM的这一不足。这就是上图中 Grounding DINO +SAM+ Stable Diffusion 三剑客组成的pipeline 来 生成图像的由来。

接下来,我们看如何使用这一组合生成下面的图像:

左边是原图,右边是结果图。我们的目标是保持背景不变,重新绘制fox,将它变成斗牛犬。

首先准备一张 狐狸的图片:

BOX_THRESHOLD = 0.35
TEXT_THRESHOLD = 0.25

MODEL_TYPE = "vit_h"  # default

IMAGE_PATH = f"{HOME}/data/fox.png"
TEXT_PROMPT = "fox . background"
image_bgr = cv2.imread(IMAGE_PATH)
image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB)

然后实例化两个模型:GroundingDINO和SAM:

from groundingdino.util.inference import ( load_model, load_image, predict, annotate, Model, ) # 实例化 GroundingDINO模型 grounding_dino_model = Model( model_config_path=GROUNDING_DINO_CONFIG_PATH, model_checkpoint_path=GROUNDING_DINO_CHECKPOINT_PATH, )

# Instantiate SAM model sam = sam_model_registry[MODEL_TYPE](checkpoint=SAM_CHECKPOINT_PATH).to(device=device) mask_generator = SamAutomaticMaskGenerator(sam) sam_predictor = SamPredictor(sam)

最后初始化 Stable Diffusion Inpainting Pipeline ,这个模型也可以用于outpainting:

sd_pipe = StableDiffusionInpaintPipeline.from_pretrained( "stabilityai/stable-diffusion-2-inpainting", torch_dtype=torch.float16, ).to(device)

初始化完成之后,就可以用 grounding_dino_model来检测对象了:

# detect objects
detections, phrases = grounding_dino_model.predict_with_caption(
    image=image_bgr,
    caption=TEXT_PROMPT,
    box_threshold=BOX_THRESHOLD,
    text_threshold=TEXT_THRESHOLD,
)

detections.class_id = phrases

# convert bbox detections to masks and add to detections object
detections.mask = segment(
    sam_predictor=sam_predictor, image=image_bgr, xyxy=detections.xyxy
)

fox = detections.mask[0]
background = detections.mask[1]其中:

fox = detections.mask[0]

background = detections.mask[1]

是我们需要拿到的对象掩码。

ip_prompt = "a brown bulldog"
ip_negative_prompt = "low resolution, ugly"
ip_SEED = -1
generated_image = generate_image(
    image=image_source_pil,
    mask=image_mask_pil,
    prompt=ip_prompt,
    negative_prompt=ip_negative_prompt,
    pipe=sd_pipe,
    seed=ip_SEED,
)
generated_image

调用sd depipeline 就可以根据mask对象来 inpainting对象了:

怎么样,相比 通过SD WebUI 手动绘制mask 得到蒙版,效率是不是快多了。这一过程中,你根本不需要关心mask的存在,只需要编程拿到对象作为参数传入sd即可。

再举个outpainting的例子,现在我们的目标变成这样的:狐狸不变,背景换掉。

此时只需要将背景mask 作为sd的参数既可:

op_prompt = "a hill with green grasses, weak sunlight"
op_negative_prompt = "low resolution, ugly"
op_SEED = -1
generated_image = generate_image(
    image=image_source_pil,
    mask=image_mask_pil,
    prompt=op_prompt,
    negative_prompt=op_negative_prompt,
    pipe=sd_pipe,
    seed=op_SEED,
)
generated_image

以上代码在colab运行的,需要源代码的同学,请关注我的微信公众号:纵横AI大世界。

 

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

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

相关文章

安全测试国家标准解读——函数调用安全、异常处理安全、指针安全

下面的系列文章主要围绕《GB/T 38674—2020 信息安全技术 应用软件安全编程指南》进行讲解,该标准是2020年4月28日,由国家市场监督管理总局、国家标准化管理委员会发布,2020年11月01日开始实施。我们对该标准中一些常见的漏洞进行了梳理&…

DCDC下垂控制算法

在并联的DC/DC转换器系统中,下垂控制(Droop Control)是一种常见的方法,用以实现在不同模块之间的功率均衡。在下垂控制策略中,每一个转换器的输出电压会随着负载的增加而减小,这样能够保证所有的转换器都在…

CSS font-family 等宽字体

CSS font-family 等宽字体 font-family: "Lucida Console", Consolas, "Courier New", Courier, monospace; font-family: Courier New, Courier, Lucida Console, Consolas, monospace; font-family: Courier, Lucida Console, Consolas, Courier New,…

【数学建模】2023 深圳杯 东三省 数学建模 B题 :电子资源版权保护问题 (基于DCT的暗水印信息嵌入模型)

在文章末尾的公众号回复:深圳杯B题,获取完整内容。 本文的文本、公式、代码都是部分展示。 文章目录 一、题目二、思路 与 解答2.1 问题一2.11 LSB 方法测试2.12 LSB 方法建模 2.2 问题二2.3 问题三2.31 方法与步骤概述2.32 基于DCT的暗水印信息嵌入模型…

第八章 HL7 架构和可用工具 - 测试转换

文章目录 第八章 HL7 架构和可用工具 - 测试转换显示段地址显示字段地址批量消息 测试转换 第八章 HL7 架构和可用工具 - 测试转换 显示段地址 要显示段地址,请将光标悬停在阴影列中的段名称上。工具提示显示以下内容: 在虚拟属性路径中使用的段地址该…

CSS样式中颜色与颜色值的应用

使用CSS描绘页面样式时,颜色是其中不可或缺的,无论是对文本、背景还是边框、阴影,我们都写过无数代码用来增添颜色。而为了让网页的色彩表现更出色,我们很有必要完整梳理下CSS中的色彩。 要讲清楚CSS中的颜色,离不开颜…

windows下tomcat无故宕机,检测http或https服务,并自动重启Tomcat服务

一、问题描述及解决原理 把项目发布到windows服务器中,如tomcat工程不稳定,会有无故宕机的问题。如果通过程序无法解决,并且重启tomcat服务能够生效的话,可以做一个自动检测并重启的脚本。 脚本通过检测tomcat对应的工程链接&…

flink1.17.0 jdk11服务的可以启动,web端无法访问

在配置文件中增加如下配置: 当前linux的ip地址,[localhsot,0.0.0.0]无效 rest.bind-address: 192.168.1.21

机器学习十大经典算法

机器学习算法是计算机科学和人工智能领域的关键组成部分,它们用于从数据中学习模式并作出预测或做出决策。本文将为大家介绍十大经典机器学习算法,其中包括了线性回归、逻辑回归、支持向量机、朴素贝叶斯、决策树等算法,每种算法都在特定的领…

使用 Docker Compose 部署单机版 Redis:简单高效的数据缓存与存储

家人们啦!今天我们来介绍如何使用 docker-compose 部署单机版 Redis,这是一个简单高效的数据缓存与存储解决方案,广泛应用于Web应用、移动应用以及各类数据处理场景。我们过后几篇文章了将会介绍cluster和sentinel集群的部署。通过本文的指导…

使用css和js给按钮添加微交互的几种方式

使用css和js给按钮添加微交互的几种方式 在现实世界中,当我们轻弹或按下某些东西时,它们会发出咔嗒声,例如电灯开关。有些东西会亮起或发出蜂鸣声,这些响应都是“微交互”,让我们知道我们何时成功完成了某件事。在本文…

切片[::-1]解析列表list表示的“非负整数加1”

列表数位表示非负整数,熟练操作“满十进位”。 (本笔记适合熟练操作Python列表list的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅…

一文搞定Java NIO,以及ZipInputStream、ByteArrayInputStream各种奇葩流

目录 一、Channel1、FileChannel代码示例2、DatagramChannel代码示例3、SocketChannel 和 ServerSocketChannel代码示例 二、Buffer1、ByteBuffer示例代码2、CharBuffer示例代码3、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer 等示例代码 三、Selector1、S…

MTK system_server 卡死导致手机重启案例分析

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、MTK AEE Log分析工具二、AEE Log分析流程三、system_server 卡死案例分析及解决 本文主要针对 Exception Type: system_server_watchdog , system_…

激光雷达供不应求?产能过剩、毛利下滑、定点兑付风险凸显

激光雷达,已经供不应求? 以小鹏最新上市的G6车型为例,目前该车的Max版本在官网下订的交付时间为12周,原因之一就是激光雷达等核心零部件交付吃紧。 截图来自网络(晚点Auto公众号) 那么事实是否如此&#xf…

【Vue2.x源码系列05】异步更新及nextTick原理

vue 官网中是这样描述 nextTick 的 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,可以获取更新后的 DOM。 在学习 nextTick 是如何实现之前,我们要先了解下 JavaScript 的执行机制 JavaScript 执行机制 浏览器是多线程的&…

Kindling the Darkness: A Practical Low-light Image Enhancer论文阅读笔记

这是ACMMM2019的一篇有监督暗图增强的论文,KinD其网络结构如下图所示: 首先是一个分解网络分解出R和L分量,然后有Restoration-Net和Adjustment-Net分别去对R分量和L分量进一步处理,最终将处理好的R分量和L分量融合回去。这倒是很常…

简要介绍 | 航行家的视觉:理解Odometry, Relocalization和SLAM的区别与联系

注1:本文系“简要介绍”系列之一,仅从概念上对计算机视觉和机器人导航中的Odometry、Relocalization和SLAM进行非常简要的介绍,不适合用于深入和详细的了解。 航行家的视觉:理解Odometry, Relocalization和SLAM的区别与联系 Senso…

什么样台灯能保护眼睛?分享眼科医生推荐的台灯好物

很多时候,我们在挑选台灯时只关注了台灯的亮度是否足够,以为只要台灯够亮就不会伤眼睛。而实际上我们大多数视力的下降原因就与光有着非常大的关系,传统的白炽灯、荧光灯等等对我们这一辈造成的伤害就不多说了。如今条件好了,而LE…

高等数学教材啃书汇总难点(一)函数与极限

教材为理工科标配的同济大学第七版,本系列为一轮啃书,将必会的全部重难点悉数总结——尤其是各种晦涩的理论证明部分,考研数学一的选手,想冲击高分的话必须掌握。对于考研证明题部分,熟练掌握定义是必不可少的底层基础…