写点什么

Inpaint Anything:一键进行多种图像修补

  • 2023-07-27
    广东
  • 本文字数:3435 字

    阅读完需:约 11 分钟

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 osimport torchimport os.path as ospimport moxing as moxpath = 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 cv2import matplotlib.pyplot as pltdef 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, GridspecLayoutfrom IPython import displayfilepaths = ["./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] = outgrid
复制代码


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

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


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


示例效果如下:


图片去除



图片填充



背景替换



视频去除



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


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

发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
Inpaint Anything:一键进行多种图像修补_人工智能_华为云开发者联盟_InfoQ写作社区