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

绘制一切-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. JS 打开本地应用软件

    我们有遇到可以直接打开QQ的跳转链接,也有遇到过直接启动office打开文档. 具体是如何操作的呢? 添加注册表项 首先需要在注册表中添加应用软件的启动地址,操作方式如下 在HKEY_CLASSES_ ...

  2. 从七个方面聊聊linux到底强在哪

    从事计算机相关行业的同学不难发现,身边总有一些朋友在学习linux,有的开发同学甚至自己的电脑就是它.经常听他们说linux如何好用等等.那么linux到底好在那里,能让大家如此喜欢.这也是我经常问自 ...

  3. ASP.NET Response.Filter

    寫 ASP.NET 有時候會想要在畫面輸出前一刻進行攔截,並換掉 html 中的特定字元.例如網站中有許多頁面都有 www.google.com.tw 的超連結,我希望在測試機上可以把連結換成 www ...

  4. selenium 多浏览器处理

    开头 当我们做多浏览器自动化测试的时候,需要很多不同的浏览器,所以不同的参数对应不同的浏览器操作 目录结构 新建一个 base.py 文件, 通过 os 捕获到从命令行传进来的 import pyte ...

  5. hasattr()、getattr()、setattr()函数简介

    hasattr(object, name) 判断object对象中是否存在name属性,当然对于python的对象而言,属性包含变量和方法:有则返回True,没有则返回False:需要注意的是name ...

  6. [安全开发] SQL注入扫描(一股子GPT味~)

    实际上大部分都是它写的,它真我哭 SQL注入扫描就是一种用于检测和预防SQL注入攻击的工具.它通过模拟SQL注入攻击的方式,向目标网站发送特定的SQL查询语句,以验证目标网站是否存在SQL注入漏洞.S ...

  7. 泰裤辣!!!手摸手教学,如何训练一个你的专属AI歌姬~

    最近在做AIGC的项目,不过是与图片相关的,现在的模型效果可比前几年图片替换效果好多了.之前尝试过用 faceswap 工具来进行人脸替换的,具体可以参看下我之前的这篇文章:https://blog. ...

  8. 代码随想录算法训练营Day31 贪心算法| 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II

    代码随想录算法训练营 122.买卖股票的最佳时机II 题目链接:122.买卖股票的最佳时机II 给定一个数组,它的第 i个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润. ...

  9. hexrays sdk study

    There are 20 examples in /ida_path/plugins/hexrays_sdk/plugins, you can learn from that, you can als ...

  10. 4、数据库:MySQL部署 - 系统部署系列文章

    MySQL数据库在其它博文中有介绍,包括学习规划系列.今天就讲讲MySQL的部署事情. 一.先下载MySQL数据库: 到下面这个网址去下载数据库,这里下载的社区版: https://dev.mysql ...