本文分享自华为云社区《绘制一切》,作者: 雨落无痕 。

绘制一切-Inpaint Anything

相关链接:

Notebook案例地址:绘制一切

AI Gallery:https://developer.huaweicloud.com/develop/aigallery/home.html

也可通过AI Gallery,搜索【绘制一切】一键体验!

Inpaint Anything

通过一键点击标记选定对象,即可实现移除指定对象、填补指定对象、替换一切场景,涵盖了包括目标移除、目标填充、背景替换等在内的多种典型图像修补应用场景。

它的整体框架如图所示:

Inpaint Anything工作原理

Inpaint Anything结合了 SAM、图像修补模型(例如 LaMa)和 AIGC 模型(例如 Stable Diffusion)等视觉基础模型。

  • SAM(Segment Anything Model)可以通过点或框等输入提示生成高质量的对象分割区域,实现指定目标的分割。更多相关的介绍可以参考一键分割图像
  • 图像修补模型LaMa,则能够在高分辨率图像的情况下,随意删除图像中的各种元素。模型的主要架构如下图所示。包含一个mask的黑白图,一张原始图像。将掩码图覆盖图像后输入Inpainting网络中,先是降采样到低分辨率,再经过几个快速傅里叶卷积FFC残差块,最后输出上采样,生成了一张高分辨的修复图像。

  • AIGC模型Stable Diffusion,则只要简单的输入一段文本,Stable Diffusion 就可以迅速将其转换为图像。更多相关的介绍可以参考AI作画

将三个模型结合到一起,我们可以做出很多的功能。本文就实现了在图片/视频中移除一切物体、在图片中填充一切物体和在图片中替换一切背景这三种功能,其具体实现步骤如下:

以下为具体通过ModelArts实现Inpaint Anything的流程。

Inpaint Anything适配ModelArts

使用方法:

本案例需使用 Pytorch-1.8 GPU-P100 及以上规格运行

点击Run in ModelArts,将会进入到ModelArts CodeLab中,这时需要你登录华为云账号,如果没有账号,则需要注册一个,且要进行实名认证,参考《ModelArts准备工作_简易版》 即可完成账号注册和实名认证。 登录之后,等待片刻,即可进入到CodeLab的运行环境

出现 Out Of Memory ,请检查是否为您的参数配置过高导致,修改参数配置,重启kernel或更换更高规格资源进行规避

下面让我们从零开始,一起来体验Inpaint Anything绘制一切的乐趣吧!

1.环境准备

拷贝代码,并安装依赖库

import os
import torch
import os.path as osp
import moxing as mox
path = osp.join(os.getcwd(),'Inpaint-Anything')
if not os.path.exists(path):
mox.file.copy_parallel('obs://modelarts-labs-bj4-v2/case_zoo/Inpaint-Anything', path)
if os.path.exists(path):
print('Download success')
else:
raise Exception('Download Failed')
else:
print("Model Package already exists!")

2.在图片中移除指定对象

!python remove_anything.py \
--input_img ./example/remove-anything/dog.jpg \
--coords_type key_in \
--point_coords 200 450 \
--point_labels 1 \
--dilate_kernel_size 15 \
--output_dir ./results \
--sam_model_type "vit_h" \
--sam_ckpt ./pretrained_models/sam_vit_h_4b8939.pth \
--lama_config ./lama/configs/prediction/default.yaml \
--lama_ckpt ./pretrained_models/big-lama
import cv2
import matplotlib.pyplot as plt
def show_original_image(image_path, modify_image_path):
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
with_point_image = cv2.imread(modify_image_path + 'with_points.png')
with_point_image = cv2.cvtColor(with_point_image, cv2.COLOR_BGR2RGB)
fig = plt.figure(figsize=(20, 10))
ax1 = fig.add_subplot(1, 2, 1)
plt.title('Original image', fontsize=16)
ax1.axis('off')
ax1.imshow(image)
ax2 = fig.add_subplot(1, 2, 2)
plt.title('With_Point image', fontsize=16)
ax2.axis('off')
ax2.imshow(with_point_image)
plt.show()
def show_modify_image(modify_image_path, image_class):
fig = plt.figure(figsize=(20, 15))
save_path = modify_image_path
index = 1
for i in range(0,3):
for image_item in image_class:
file_name = image_item + str(i) + '.png'
file_path = save_path + file_name
image = cv2.imread(file_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
ax = fig.add_subplot(3,3,index)
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
plt.title(image_item + str(i), fontsize=16)
ax.imshow(image)
index = index + 1
plt.show()
image_path = './example/remove-anything/dog.jpg'
modify_image_path = './results/dog/'
image_class = ['with_mask_','mask_','inpainted_with_mask_']
show_original_image(image_path, modify_image_path)
show_modify_image(modify_image_path,image_class)

3.在图片中填充指定对象

!python fill_anything.py \
--input_img ./example/fill-anything/sample1.png \
--coords_type key_in \
--point_coords 750 500 \
--point_labels 1 \
--text_prompt "a teddy bear on a bench" \
--dilate_kernel_size 50 \
--output_dir ./results \
--sam_model_type "vit_h" \
--sam_ckpt ./pretrained_models/sam_vit_h_4b8939.pth \
--model_path "stable-diffusion-2-inpainting"
image_path = './example/fill-anything/sample1.png'
modify_image_path = './results/sample1/'
image_class = ['with_mask_','mask_','filled_with_mask_']
show_original_image(image_path, modify_image_path)
show_modify_image(modify_image_path,image_class)

4.在图片中替换指定对象

!python replace_anything.py \
--input_img ./example/replace-anything/dog1.png \
--coords_type key_in \
--point_coords 750 500 \
--point_labels 1 \
--text_prompt "sit on the swing" \
--output_dir ./results \
--sam_model_type "vit_h" \
--sam_ckpt ./pretrained_models/sam_vit_h_4b8939.pth \
--model_path "stable-diffusion-2-inpainting"
image_path = './example/replace-anything/dog1.png'
modify_image_path = './results/dog1/'
image_class = ['with_mask_','mask_','replaced_with_mask_']
show_original_image(image_path, modify_image_path)
show_modify_image(modify_image_path,image_class)

5.在视频中移除指定对象

!python remove_anything_video.py \
--input_video ./example/video/paragliding/original_video.mp4 \
--coords_type key_in \
--point_coords 652 162 \
--point_labels 1 \
--dilate_kernel_size 15 \
--output_dir ./results \
--sam_model_type "vit_h" \
--sam_ckpt ./pretrained_models/sam_vit_h_4b8939.pth \
--lama_config lama/configs/prediction/default.yaml \
--lama_ckpt ./pretrained_models/big-lama \
--tracker_ckpt vitb_384_mae_ce_32x4_ep300 \
--vi_ckpt ./pretrained_models/sttn.pth \
--mask_idx 2 \
--fps 25
from ipywidgets import Output, GridspecLayout
from IPython import display
filepaths = ["./example/video/paragliding/original_video.mp4","./results/w_mask_15.mp4",
"./results/removed_w_mask_15.mp4"]
grid = GridspecLayout(1,len(filepaths))
for i, filepath in enumerate(filepaths):
out = Output()
with out:
display.display(display.Video(filepath, embed=True,width=250,height=140))
grid[0, i] = out
grid

运行完成后,从左到右依次为原始视频,选中(去除)对象的视频,去除后的视频。

6.Gradio展示(当前先展示在图像和视频中删除指定对象)

为了方便大家使用一键分割案例,当前增加了Gradio可视化部署案例演示。

示例效果如下:

图片去除

图片填充

背景替换

视频去除

详细实现代码参见Notebook-绘制一切,欢迎各位查看。

点击关注,第一时间了解华为云新鲜技术~

Inpaint Anything:一键进行多种图像修补的更多相关文章

  1. opencv —— inpaint 图像修补、去除指定区域物体

    实现图像修补.物体去除:inpaint 函数 void inpaint(InputArray src, InputArray inpaintMask, OutputArray dst, double ...

  2. opencv学习之路(30)、分水岭算法及图像修补

    一.简介 二.分水岭算法 #include "opencv2/opencv.hpp" using namespace cv; void main() { Mat srcImg = ...

  3. opencv 6 图像轮廓与图像分割修复 3 图像的矩,分水岭,图像修补

    图像的矩 矩的计算:moments()函数 计算轮廓面积:contourArea()函数 #include "opencv2/highgui/highgui.hpp" #inclu ...

  4. C# 如何将PDF转为多种图像文件格式(Png/Bmp/Emf/Tiff)

    PDF是一种在我们日常工作学习中最常用到的文档格式之一,但常常也会因为文档的不易编辑的特点,在遇到需要编辑PDF文档内容或者转换文件格式的情况时让人苦恼.通常对于开发者而言,可选择通过使用组件的方式来 ...

  5. OpenCV——图像修补

  6. 一键抠除路人甲,昇腾CANN带你识破神秘的“AI消除术”

    摘要:都说人工智能改变了生活,你感觉到了么?AI的魔力就在你抠去路人甲的一瞬间来到了你身边.今天就跟大家聊聊--神秘的"AI消除术". 引语 旅途归来,重温美好却被秀丽河山前的路人 ...

  7. OpenCV探索之路(十):图像修复技术

    在实际应用中,我们的图像常常会被噪声腐蚀,这些噪声或是镜头上的灰尘或水滴,或是旧照片的划痕,或者是图像遭到人为的涂画(比如马赛克)或者图像的部分本身已经损坏.如果我们想让这些受到破坏的额图片尽可能恢复 ...

  8. C#中使用FreeImage库加载Bmp、JPG、PNG、PCX、TGA、PSD等25种格式的图像(源码)。

    其实我一直都是喜欢自己去做图像格式的解码的(目前我自己解码的图像格式大概有15种),但是写本文主要原因是基于CSDN的这个帖子的: http://bbs.csdn.net/topics/3905104 ...

  9. paper 119:[转]图像处理中不适定问题-图像建模与反问题处理

    图像处理中不适定问题 作者:肖亮博士 发布时间:09-10-25 图像处理中不适定问题(ill posed problem)或称为反问题(inverse Problem)的研究从20世纪末成为国际上的 ...

  10. 图形学:图像围绕着某个点P(a,b)旋转------白话版

    前提:在研究图形时候,我们并没有规定图形的大小,所以任意图形多是支持的,这也另外说明了一点,图形转换和图形的大小没有关系. 如果图像围绕着某个点P(a,b)旋转,则先要将坐标系平移到该点,再进行旋转, ...

随机推荐

  1. RateLimiter使用

    1.maven依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava ...

  2. js对象方法大全

    JavaScript中Object构造函数的方法 Object构造函数的方法节 Object.assign() 通过复制一个或多个对象来创建一个新的对象. Object.create() 使用指定的原 ...

  3. 快速上手Linux核心命令(九):文件备份与压缩

    目录 tar 打包备份 gzip 压缩或解压文件 zip 打包和压缩文件 unzip 解压zip文件 scp 远程文件复制 rsync 文件同步工具 这期呢主要说一说Linux中文件备份与压缩命令,一 ...

  4. ChatGPT在工业领域的研究与应用探索-数据与工况认知

    1.      ChatGPT发展现状... 2 2.      ChatGPT如何与工业相结合... 2 3.      ChatGPT在工业领域的研究与应用... 3 1.   ChatGPT发展 ...

  5. 基于ChatGPT用AI实现自然对话

    1.概述 ChatGPT是当前自然语言处理领域的重要进展之一,通过预训练和微调的方式,ChatGPT可以生成高质量的文本,可应用于多种场景,如智能客服.聊天机器人.语音助手等.本文将详细介绍ChatG ...

  6. Notion 中文:客户端、网页端汉化方案

    Notion 官方已经正式公布将会支持中文.不过距离正式发布中文版,可能还有一段时间. Notion 的汉化方案 目前,Notion 汉化方案有两种: 客户端汉化 此方法本质上也是在客户端中增加脚本, ...

  7. drf-spectacular

    介绍 drf-spectacular是为Django REST Framework生成合理灵活的OpenAPI 3.0模式.它可以自动帮我们提取接口中的信息,从而形成接口文档,而且内容十分详细,再也不 ...

  8. k8s资源对象(二)

    Configmap和Secret资源介绍 secret和configmap资源都是通过挂载的方式将对应数据挂载到容器内部环境中去使用,两者的使用没有太多的不同 ,configmap资源通常用于为pod ...

  9. adb查看端口号,杀进程

    1.先查看端口号占用的进程 netstat -ano | findstr 8000 2.在杀掉我们查出的进程15812 3.再次查看8000端口号的进程

  10. es mysql 适用场景对比

    es mysql 适用场景对比 问题一 全文检索毫无疑问直接上es,那么除了这种场景,什么时候该选es?为啥mysql不行? 对枚举字段的搜索 mysql创建索引的原则是对于那些区别度高字段建立索引, ...