Inpaint Anything:一键进行多种图像修补
本文分享自华为云社区《绘制一切》,作者: 雨落无痕 。
绘制一切-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可视化部署案例演示。
示例效果如下:
图片去除
图片填充
背景替换
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
数仓现网案例丨超大结果集接收异常
本文分享自华为云社区《GaussDB(DWS)现网案例之超大结果集接收异常》,作者:你是猴子请来的救兵吗 。 问题背景 内核版本GaussDB 8.1.3 问题描述用户使用数据库客户端工具如navicat、dbeaver等执行查询语句异常中断,中断信息"Last read message sequence %d is not equal to the max written message sequence %d" 问题定位 客户端异常中断后有些错误信息时不感知的,此时topsql就派上了用场。历史topsql记录了查询作业运行结束时的资源使用情况(包括内存、下盘、CPU时间等)和运行状态信息(包括报错、终止、异常等)以及性能告警信息。而对于由于FATAL、PANIC错误导致查询异常结束时,状态信息列只显示aborted,无法记录详细异常信息。 1,此时我们通过历史topsql查询视图查询语句执行情况 --当前CN select * from GS_WLM_SESSION_HISTORY; --所有CN select * from PGXC_WLM_SESSION_H...
-
下一篇
X-SIMD 高性能跨平台向量化加速库
背景 在众多计算型软件的代码中,例如大数据,HPC以及AI,视频编解码软件,底层都会使用SIMD(单指令多数据流)指令对核心的逻辑进行优化。SIMD是一种计算机指令集,用于在不同的数据上执行相同的指令。它充分利用处理器的并行流水线,允许将多个数据一起处理来加速计算,从而提高程序的并行性,实现性能飞升。然而在当前服务器领域,由于X86生态占据主导地位,大量的软件针对X86平台利用X86的SIMD指令例如SSE/AVX/AVX2/AVX512进行了热点优化。由于ARM架构的服务器正在快速发展阶段,软件生态还远不如X86成熟,当一个X86软件需要移植到ARM服务器平台时,尤其是带有Intel SIMD的intrinsic指令时,需要将Intel的SIMD intrinsic指令(SSE/AVX/AVX2/AVX512)用ARM的SIMD intrinsic指令(NEON/SVE)重写,这将会给软件移植工作带来巨大的工作量,同时由于这些intrinsic指令和业务逻辑紧密耦合,这些移植的工作不具备可复制性,这也给软件移植带来了很重的负担。 X-SIMD简介 X-SIMD是平头哥基于开源SIMD...
相关文章
文章评论
共有0条评论来说两句吧...













微信收款码
支付宝收款码