使用Dino+SAM+Stable diffusion 自动进行图片的修改

news/2024/5/2 3:19:55/文章来源:https://blog.csdn.net/m0_46510245/article/details/130446712

SAM 是Mata发布的“Segment Anything Model”可以准确识别和提取图像中的对象。 它可以分割任何的图片,但是如果需要分割特定的物体,则需要需要点、框的特定提示才能准确分割图像。 所以本文将介绍一种称为 Grounding Dino 的技术来自动生成 SAM 进行分割所需的框。

除了分割以外,我们还可以通过将 SAM 与 Grounding Dino 和 Stable Diffusion 相结合,获得高度准确图像分割结果,并且对分割后的图像进行细微的更改。

下面就是我们需要的所有的包:

 `%cd /content!git clone https://github.com/IDEA-Research/Grounded-Segment-Anything%cd /content/Grounded-Segment-Anything !pip install -q-r requirements.txt%cd /content/Grounded-Segment-Anything/GroundingDINO!pip install -q .%cd /content/Grounded-Segment-Anything/segment_anything!pip install -q .%cd /content/Grounded-Segment-Anything

导入必要的包:

 importos, syssys.path.append(os.path.join(os.getcwd(), "GroundingDINO"))importargparseimportcopyfromIPython.displayimportdisplayfromPILimportImage, ImageDraw, ImageFontfromtorchvision.opsimportbox_convert# Grounding DINOimportGroundingDINO.groundingdino.datasets.transformsasTfromGroundingDINO.groundingdino.modelsimportbuild_modelfromGroundingDINO.groundingdino.utilimportbox_opsfromGroundingDINO.groundingdino.util.slconfigimportSLConfigfromGroundingDINO.groundingdino.util.utilsimportclean_state_dict, get_phrases_from_posmapfromGroundingDINO.groundingdino.util.inferenceimportannotate, load_image, predictimportsupervisionassv# segment anythingfromsegment_anythingimportbuild_sam, SamPredictorimportcv2importnumpyasnpimportmatplotlib.pyplotasplt# diffusersimportPILimportrequestsimporttorchfromioimportBytesIOfromdiffusersimportStableDiffusionInpaintPipelinefromhuggingface_hubimporthf_hub_download

然后我们设置处理的设备:

 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

然后我们创建一个 GroundingDino 模型的实例。

 defload_model_hf(repo_id, filename, ckpt_config_filename, device='cpu'):cache_config_file=hf_hub_download(repo_id=repo_id, filename=ckpt_config_filename)args=SLConfig.fromfile(cache_config_file) args.device=devicemodel=build_model(args)cache_file=hf_hub_download(repo_id=repo_id, filename=filename)checkpoint=torch.load(cache_file, map_location=device)log=model.load_state_dict(clean_state_dict(checkpoint['model']), strict=False)print("Model loaded from {} \n => {}".format(cache_file, log))_=model.eval()returnmodel   ckpt_repo_id="ShilongLiu/GroundingDINO"ckpt_filenmae="groundingdino_swinb_cogcoor.pth"ckpt_config_filename="GroundingDINO_SwinB.cfg.py"groundingdino_model=load_model_hf(ckpt_repo_id, ckpt_filenmae, ckpt_config_filename, device)

下面开始创建SAM 模型,定义模型并创建一个实例。

 ! wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pthsam_checkpoint ='sam_vit_h_4b8939.pth'sam_predictor = SamPredictor(build_sam(checkpoint=sam_checkpoint).to(device))

这里我们使用与训练的 vit_h 模型,下面就是扩散模型了:

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

然后我们开始测试:

 # Load image defdownload_image(url, image_file_path):r=requests.get(url, timeout=4.0)ifr.status_code!=requests.codes.ok:assertFalse, 'Status code error: {}.'.format(r.status_code)withImage.open(BytesIO(r.content)) asim:im.save(image_file_path)print('Image downloaded from url: {} and saved to: {}.'.format(url, image_file_path))local_image_path="assets/inpaint_demo.jpg"image_url="https://images.rawpixel.com/image_800/cHJpdmF0ZS9sci9pbWFnZXMvd2Vic2l0ZS8yMDIyLTA1L3Vwd2s2MTc3Nzk0MS13aWtpbWVkaWEtaW1hZ2Uta293YnN1MHYuanBn.jpg"download_image(image_url, local_image_path)image_source, image=load_image(local_image_path)Image.fromarray(image_source)

先使用Grounding Dino 进行检测:

 # detect object using grounding DINOdefdetect(image, text_prompt, model, box_threshold=0.3, text_threshold=0.25):boxes, logits, phrases=predict(model=model, image=image, caption=text_prompt,box_threshold=box_threshold,text_threshold=text_threshold)annotated_frame=annotate(image_source=image_source, boxes=boxes, logits=logits, phrases=phrases)annotated_frame=annotated_frame[...,::-1] # BGR to RGB returnannotated_frame, boxesannotated_frame, detected_boxes=detect(image, text_prompt="bench", model=groundingdino_model)Image.fromarray(annotated_frame)

让我们看看结果:

然后使用 SAM 分割这个狐狸:

 defsegment(image, sam_model, boxes):sam_model.set_image(image)H, W, _=image.shapeboxes_xyxy=box_ops.box_cxcywh_to_xyxy(boxes) *torch.Tensor([W, H, W, H])transformed_boxes=sam_model.transform.apply_boxes_torch(boxes_xyxy.to(device), image.shape[:2])masks, _, _=sam_model.predict_torch(point_coords=None,point_labels=None,boxes=transformed_boxes,multimask_output=False,)returnmasks.cpu()defdraw_mask(mask, image, random_color=True):ifrandom_color:color=np.concatenate([np.random.random(3), np.array([0.8])], axis=0)else:color=np.array([30/255, 144/255, 255/255, 0.6])h, w=mask.shape[-2:]mask_image=mask.reshape(h, w, 1) *color.reshape(1, 1, -1)annotated_frame_pil=Image.fromarray(image).convert("RGBA")mask_image_pil=Image.fromarray((mask_image.cpu().numpy() *255).astype(np.uint8)).convert("RGBA")returnnp.array(Image.alpha_composite(annotated_frame_pil, mask_image_pil))segmented_frame_masks=segment(image_source, sam_predictor, boxes=detected_boxes)annotated_frame_with_mask=draw_mask(segmented_frame_masks[0][0], annotated_frame)Image.fromarray(annotated_frame_with_mask)

这样就可以通过上面的分割结果为的扩散模型生成掩码:

 # create mask images mask=segmented_frame_masks[0][0].cpu().numpy()inverted_mask= ((1-mask) *255).astype(np.uint8)image_source_pil=Image.fromarray(image_source)image_mask_pil=Image.fromarray(mask)inverted_image_mask_pil=Image.fromarray(inverted_mask)display(*[image_source_pil, image_mask_pil, inverted_image_mask_pil])

绘时我们还需要一个背景的掩码,这个就是上面掩码的反操作

 defgenerate_image(image, mask, prompt, negative_prompt, pipe, seed):# resize for inpainting w, h=image.sizein_image=image.resize((512, 512))in_mask=mask.resize((512, 512))generator=torch.Generator(device).manual_seed(seed) result=pipe(image=in_image, mask_image=in_mask, prompt=prompt, negative_prompt=negative_prompt, generator=generator)result=result.images[0]returnresult.resize((w, h))

然后我们可以开始改图,输入一个提示:

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

或者用上面的背景掩码来修改背景:

 prompt="a hill with grasses ,weak sunlight "negative_prompt="people, low resolution, ugly"seed=32# for reproducibility generated_image=generate_image(image_source_pil, inverted_image_mask_pil, prompt, negative_prompt, sd_pipe, seed)generated_image

可以看到效果还是很好的

SAM、Grounding Dino 和 Stable Diffusion 的组合为我们提供了强大的工具。这些技术为探索令人兴奋的图像处理世界提供了坚实的基础 并为艺术家和开发者提供巨大的创造潜力。

如果你想在线测试,这里有完整的源代码:

https://avoid.overfit.cn/post/e9e083807a434935910c8116c85c8375

作者:Amir Shakiba

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

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

相关文章

Linux学习[8]查找文件指令:which whereis locate find

文章目录 前言1. which2. whereis3. locate4. find总结: 前言 之前在弄交叉编译的时候需要找到gcc,gdb什么的在哪里;涉及到了查找文件指令。 这里对linux中的查找指令进行总结 1. which which指令一般用来寻找可执行文件的路径,…

AI绘画能力的起源:通俗理解VAE、扩散模型DDPM、ViT/Swin transformer

前言 2018年我写过一篇博客,叫:《一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD》,该文相当于梳理了2019年之前CV领域的典型视觉模型,比如 2014 R-CNN2015 Fast R-CNN、Faster R-CNN2016 YOLO、SSD2…

5 款 AI 老照片修复工具的横向比较

在大语言模型和各类 AI 应用日新月异的今天,我终于下定决心,趁着老照片们还没有完全发黄褪色、受潮粘连抑或损坏遗失,将上一代人实体相册里的纸质胶卷照片全部数字化,并进行一次彻底的 AI 修复,好让这些珍贵的记忆能更…

【五一创作】数据可视化之美 ( 三 ) - 动图展示 ( Python Matlab )

1 Introduction 在我们科研学习、工作生产中,将数据完美展现出来尤为重要。 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。 …

利用倾斜摄影超大场景的三维模型轻量化技术如何提高网络传输的效率?

利用倾斜摄影超大场景的三维模型轻量化技术如何提高网络传输的效率? 倾斜摄影超大场景的三维模型轻量化在网络传输中的效率可以通过以下几个方面进行提高: 一、数据压缩 对于倾斜摄影超大场景的三维模型数据,可以采用数据轻量化压缩技术进…

Spring DI简介及依赖注入方式和依赖注入类型

目录 一、什么是依赖注入 二、依赖注入方式 1. Setter注入 2. 构造方法注入 3. 自动注入 三、依赖注入类型 1. 注入bean类型 2. 注入基本数据类型 3. 注入List集合 4. 注入Set集合 5. 注入Map集合 6. 注入Properties对象 往期专栏&文章相关导读 1. Maven系…

项目管理软件可以用来做什么?这篇文章说清楚了

项目管理软件是用来干嘛的,就得看对项目的理解。项目是为创造独特的产品、服务或成果而进行的临时性工作。建造一座大楼可以是一个项目,进行一次旅游活动、日常办公活动、期末考试复习等也都可以看成一个项目。 项目管理不善会导致项目超时、超支、返工、…

『python爬虫』05. requests模块入门(保姆级图文)

目录 安装requests1. 抓取搜狗搜索内容 requests.get2. 抓取百度翻译数据 requests.post3. 豆瓣电影喜剧榜首爬取4. 关于请求头和关闭request连接总结 欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏,持续更新中 安装requests …

【Linux】4. 开发工具的使用(yum/vim)

前言 工具的本质就是指令 在介绍工具之前先介绍一下互联网生态 Linux 软件包管理器 yum 1. 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以…

SQL(基础)

DDL: 数据定义语言 Definition,用来定义数据库对象(数据库、表、字段)CREATE、DROP、ALTER DML: 数据操作语言 Manipulation,用来对数据库表中的数据进行增删改 INSERT、UPDATE、DELETE 注意: DDL是改变表的结构 DML…

享受简单上传体验:将Maven仓库迁移到GitHub

前言:我为什么放弃了Maven Central 之前我写过一篇《Android手把手,发布开源组件至 MavenCentral仓库》,文中详细介绍了如何发布组件到Maven Central中供所有开发者共用。但是最近使用下来,发现Sonatype JIRA 的Maven Center上传…

EMC VPLEX VS2 FRU故障备件更换基本流程

本文是针对VPLEX VS2 备件更换流程的详细操作方法,其实VS6也是类似的。 首先要说明一点,EMC VPLEX的任何硬件故障更换都不是直接插拔来完成的,一定要执行脚本要完成更换,本文就是描述如何启动这个脚本和常见的一些问题&#xff0…

一以贯之:从城市网络到“城市一张网”

《论语里仁》中子曰:“参乎,吾道一以贯之”。 孔子所说的“一以贯之”,逐渐成为了中国文化与哲学的重要组成部分,指明事物发展往往需要以标准化、集约化、融合化作为目标。这种智慧在数字化发展中格外重要。从云计算、大数据技术模…

C++——入门基础知识

0.关注博主有更多知识 C知识合集 目录 1.命名空间 1.1命名空间的定义 1.2命名空间的使用 1.3命名空间定义的补充 2.输入与输出 3.缺省参数 3.1全缺省参数 3.2半缺省参数 3.3缺省参数的补充 4.函数重载 4.1C为什么支持函数重载? 5.引用 5.…

Clion开发STM32之串口封装(HAL库)

前提 在开发STM32过程中,芯片提供的串口引脚一般是不会发生变化的,所以为了方便移植,借助HAL提供的注册回调函数自定义,这边重新进行简要的封装此工程开发是以Clion为开发的IDE,用keil只需将对应的文件进行移植即可.文章末尾附带…

Java——Java面向对象

该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。 概述: Java是面向对象的程序…

XR技术在手术中的应用调研

虚拟现实、增强现实、混合现实等概念和技术是最近几年发展起来的,相信你对去年大火的元宇宙深有感触,元宇宙属于虚拟现实的技术范畴,头号玩家电影也让虚拟现实走进大众的视野中。早在2015年,笔者参加一次展会时就有接触&#xff0…

py_rabbitmq

安装 服务端 https://www.jianshu.com/p/2fb6d5ac17b9 客户端 pip install pika文档 https://rabbitmq.com/tutorials/tutorial-one-python.html 简单示例 生产者 import pika import rabbitmq_study.settings as settingscredentials pika.PlainCredentials(settings…

手记系列之四 ----- 关于使用MySql的一些经验

前言 本篇文章主要介绍的关于本人在使用MySql记录笔记的一些使用方法和经验,温馨提示,本文有点长,约1.5w字,几十张图片,建议收藏查看。 一、MySql安装 下载地址:https://dev.mysql.com/downloads/ 在安装MySql之前&a…

闪电加密和隐藏加密文件夹忘记密码怎么办?

闪电加密和隐藏加密是文件夹加密超级大师的两种文件夹加密类型,它们都拥有超快的加密算法,可以瞬间加密超大文件夹。那么这两种文件夹加密类型忘记密码该怎么办呢?下面我们一起来了解一下吧。 闪电加密和隐藏加密文件夹找回密码 首先&#x…