绘画手残党的福音:涂鸦线稿秒变绝美图像

这篇具有很好参考价值的文章主要介绍了绘画手残党的福音:涂鸦线稿秒变绝美图像。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

摘要:涂鸦线稿秒变绝美图像,ControlNet-Scribble2Img适配华为云ModelArts,提供更加便利和创新的图像生成体验,将你的想象变为真实的图像。

本文分享自华为云社区《AIGC拯救手残党:涂鸦线稿秒变绝美图像》,作者:Emma_Liu 。

ControlNet

什么是ControlNet?简而言之,文本到图像的生成涉及使用预训练的扩散模型来生成基于某些文本的图像。

从输入图像中提取特定信息的过程称为注释(在paper中)或预处理(在 ControlNet extension中)。
这个扩散模型是在数十亿张图片上预训练的,当我们输入文字时,模型会根据输入的内容生成一张图片。然而,有时输出结果与我们的意图并不完全一致。这就是ControlNet的作用…

ControlNet最早是在L.Zhang等人的论文《Adding Conditional Control to Text-to-Image Diffusion Model》中提出的,目的是提高预训练的扩散模型的性能。特别是,在预训练的扩散模型中加入另一个神经网络模型(ControlNet),使我们对输出有更多的控制。

ControlNet 的工作原理是将可训练的网络模块附加到稳定扩散模型的U-Net (噪声预测器)的各个部分。Stable Diffusion 模型的权重是锁定的,在训练过程中它们是不变的。在训练期间仅修改附加模块。

研究论文中的模型图很好地总结了这一点。最初,附加网络模块的权重全部为零,使新模型能够利用经过训练和锁定的模型。

训练 ControlNet 包括以下步骤:

  1. 克隆扩散模型的预训练参数,如Stable Diffusion的潜在UNet,(称为 “可训练副本”),同时也单独保留预训练的参数(“锁定副本”)。这样做是为了使锁定的参数副本能够保留从大型数据集中学习到的大量知识,而可训练的副本则用于学习特定的任务方面。
  2. 参数的可训练副本和锁定副本通过 "零卷积 "层连接,该层作为ControlNet框架的一部分被优化。这是一个训练技巧,在训练新的条件时,保留冻结模型已经学会的语义。
    从图上看,训练ControlNet是这样的:

ControlNet提供了八个扩展,每个扩展都可以对扩散模型进行不同的控制。这些扩展是Canny, Depth, HED, M-LSD, Normal, Openpose, Scribble, and Semantic Segmentation.

ControlNet-Scribble2img

Scribble 用于预处理用户绘制的涂鸦, 这个预处理程序不应该用在真实的图像上。由于它能够根据简单的草图生成令人惊叹、逼真或改进的图像。理想情况下,不需要任何提示。通过输入一个基本的图画,模型可以推断出细节和纹理,从而产生一个更高质量的图像。

下面是用ModelArts的Notebook适配Scribble2img生成的几幅图,一起来看看吧。

浮世绘风格的海浪 || 满天繁星 || 小兔子和萝卜

发光水母||一筐橙子||小花喵||微笑的太阳

尝试用自己画的素描生成,效果也不错

接下来让我们从零开始,在ModelArts上一起来体验Scribble2img涂鸦生图的乐趣吧。

涂鸦生成图像 ControlNet-Scribble2img

本文介绍如何在ModelArts来实现 ControlNet-Scribble2img 涂鸦生成图像。

AI Gallery - Notebook链接:拯救手残党:AI涂鸦一键成图 (huaweicloud.com)

前言

ModelArts 是面向开发者的一站式 AI 开发平台,为机器学习与深度学习提供海量数据预处理及交互式智能标注、大规模分布式训练、自动化模型生成,及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期 AI 工作流。

前期准备

在使用ModelArts之前,需要进入华为云官网 https://www.huaweicloud.com/ ,然后注册华为云账号,再进行实名认证。主要分为3步(注册–>实名认证–>服务授权)(如有已完成部分,请忽略)

点去完成 实名认证,账号类型选"个人",个人认证类型推荐使用"扫码认证"。

进入ModelArts 控制台数据管理页面,上方会提示访问授权,点击【服务授权】按钮,按下图顺序操作:

注意事项

  • 本案例需使用 Pytorch-1.8 GPU-P100 及以上规格运行;
  • 点击Run in ModelArts,将会进入到ModelArts CodeLab中,如果您没有登录需要进行登录。 登录之后,等待片刻,即可进入到CodeLab的运行环境;
  • 出现 Out Of Memory ,请检查是否为您的参数配置过高导致,修改参数配置,重启kernel或更换更高规格资源进行规避;
  • 运行代码方法:点击本页面顶部菜单栏的三角运行按钮或按Ctrl+Enter或cell左侧三角按钮运行每个方块中的代码;
  • 如果您是第一次使用 JupyterLab,请查看《ModelArts JupyterLab使用指导》了解使用方法;
  • 如果您在使用 JupyterLab 过程中碰到报错,请参考《ModelArts JupyterLab常见问题解决办法》尝试解决问题。

 

1.环境设置

check GPU & 拷贝代码及数据

为了更快的准备数据和模型,将其转存在了华为云OBS中,方便大家使用。

!nvidia-smi
import os
import moxing as mox
parent = "/home/ma-user/work/ControlNet"
bfp = "/home/ma-user/work/ControlNet/openai/clip-vit-large-patch14/pytorch_model.bin"
sfp = "/home/ma-user/work/ControlNet/models/control_sd15_scribble.pth"
if not os.path.exists(parent):
 mox.file.copy_parallel('obs://modelarts-labs-bj4-v2/case_zoo/scribble2img/ControlNet',parent)
 if os.path.exists(parent):
 print('Download success')
 else:
        raise Exception('Download Failed')
elif os.path.exists(bfp)==False or os.path.getsize(bfp)!=1710671599: 
 mox.file.copy_parallel('obs://modelarts-labs-bj4-v2/case_zoo/scribble2img/ControlNet/openai/clip-vit-large-patch14/pytorch_model.bin', bfp)
elif os.path.exists(sfp)==False or os.path.getsize(sfp)!=5710757851: 
 mox.file.copy_parallel('obs://modelarts-labs-bj4-v2/case_zoo/scribble2img/ControlNet/models/control_sd15_scribble.pth', sfp)
else:
 print("Model Package already exists!")

安装库,大约耗时1min,请耐心等待。

%cd /home/ma-user/work/ControlNet
!pip uninstall torch torchtext -y
!pip install torch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1 
!pip install omegaconf==2.1.1 einops==0.3.0
!pip install pytorch-lightning==1.5.0
!pip install transformers==4.19.2 open_clip_torch==2.0.2
!pip install gradio==3.24.1
!pip install translate==3.6.1

2. 加载模型

导包并加载模型,加载约40s,请耐心等待。

import numpy as np
from PIL import Image as PilImage
import cv2
import einops
import matplotlib.pyplot as plt
from IPython.display import HTML, Image
from base64 import b64decode
from translate import Translator
import torch
from pytorch_lightning import seed_everything
import config
from cldm.model import create_model, load_state_dict
from ldm.models.diffusion.ddim import DDIMSampler
from annotator.util import resize_image, HWC3
model = create_model('./models/cldm_v15.yaml')
model.load_state_dict(load_state_dict('./models/control_sd15_scribble.pth', location='cuda'))
model = model.cuda()
ddim_sampler = DDIMSampler(model)

3. 涂鸦生成图像

涂鸦生成图像函数定义

def process(input_image, prompt, a_prompt, n_prompt, num_samples, image_resolution, ddim_steps, strength, scale, seed, eta):
    trans = Translator(from_lang="ZH",to_lang="EN-US")
    prompt = trans.translate(prompt)
 a_prompt = trans.translate(a_prompt)
 n_prompt = trans.translate(n_prompt)
 guess_mode = False
    # 图像预处理
 with torch.no_grad():
 if type(input_image) is str:
 input_image = np.array(PilImage.open(input_image))
 img = resize_image(HWC3(input_image), image_resolution)
 else:
 img = resize_image(HWC3(input_image['mask'][:, :, 0]), image_resolution)  # scribble
 H, W, C = img.shape
        # 初始化检测映射
 detected_map = np.zeros_like(img, dtype=np.uint8)
 detected_map[np.min(img, axis=2) > 127] = 255
        control = torch.from_numpy(detected_map.copy()).float().cuda() / 255.0
        control = torch.stack([control for _ in range(num_samples)], dim=0)
        control = einops.rearrange(control, 'b h w c -> b c h w').clone()
        # 设置随机种子
 if seed == -1:
            seed = random.randint(0, 65535)
 seed_everything(seed)
 if config.save_memory:
 model.low_vram_shift(is_diffusing=False)
 cond = {"c_concat": [control], "c_crossattn": [model.get_learned_conditioning([prompt + ', ' + a_prompt] * num_samples)]}
 un_cond = {"c_concat": None if guess_mode else [control], "c_crossattn": [model.get_learned_conditioning([n_prompt] * num_samples)]}
        shape = (4, H // 8, W // 8)
 if config.save_memory:
 model.low_vram_shift(is_diffusing=True)
        # 采样
 model.control_scales = [strength * (0.825 ** float(12 - i)) for i in range(13)] if guess_mode else ([strength] * 13)  # Magic number. 
        samples, intermediates = ddim_sampler.sample(ddim_steps, num_samples,
                                                     shape, cond, verbose=False, eta=eta,
 unconditional_guidance_scale=scale,
 unconditional_conditioning=un_cond)
 if config.save_memory:
 model.low_vram_shift(is_diffusing=False)
        # 后处理
 x_samples = model.decode_first_stage(samples)
 x_samples = (einops.rearrange(x_samples, 'b c h w -> b h w c') * 127.5 + 127.5).cpu().numpy().clip(0, 255).astype(np.uint8)
        results = [x_samples[i] for i in range(num_samples)]
 return [255 - detected_map] + results

3.1设置参数,生成图像

在/home/ma-user/work/ControlNet/test_imgs/ 此路径下,我们预置了一些线稿供您测试。当然您可以自己上传您的涂鸦画至此路径下,然后更改图像路径及其他参数后,点击运行。

参数说明

images:生成图像张数

img_path:输入图像路径,黑白稿

prompt:提示词(建议填写)

a_prompt:正面提示(可选,要附加到提示的其他文本)

n_prompt: 负面提示(可选)

image_resolution: 对输入的图片进行最长边等比resize

scale:classifier-free引导比例

seed: 随机种子

ddim_steps: 采样步数,一般15-30,值越大越精细,耗时越长

eta: 控制在去噪扩散过程中添加到输入数据的噪声量。0表示无噪音,1.0表示更多噪音。eta对图像有微妙的、不可预测的影响,所以您需要尝试一下这如何影响您的项目。

strength: 这是应用 ControlNet 的步骤数。它类似于图像到图像中的去噪强度。如果指导强度为 1,则 ControlNet 应用于 100% 的采样步骤。如果引导强度为 0.7 并且您正在执行 50 个步骤,则 ControlNet 将应用于前 70% 的采样步骤,即前 35 个步骤。

#@title Scribble2img 
img_path = "test_imgs/cat.jpg" #@param {type:"string"}
prompt = "小花猫" #@param {type:"string"}
num_samples = 1
# Added Prompt
a_prompt = "质量最好,非常详细" #@param {type:"string"}
# Negative Prompt
n_prompt = "裁剪,质量最差,质量低" #@param {type:"string"}
image_resolution = 512 #@param {type:"raw", dropdown}
scale = 4.3 #@param {type:"slider", min:0.1, max:30, step:0.1}
seed = 1773327477 #@param {type:"slider", min:-1, max:2147483647, step:1}
eta = 0.02 #@param {type:"slider", min:-1.00, max:3.00, step:0.01}
ddim_steps = 15 #@param {type:"slider", min:1, max:100, step:1}
guess_mode = False
strength = 1.0
np_imgs = process(img_path, prompt, a_prompt, n_prompt, num_samples, image_resolution, ddim_steps, strength, scale, seed, eta)
src = PilImage.fromarray(~np_imgs[0])
dst = PilImage.fromarray(np_imgs[1])
fig = plt.figure(figsize=(25, 10))
ax1 = fig.add_subplot(1, 2, 1)
plt.title('Scribble image', fontsize=16)
ax1.axis('off')
ax1.imshow(src)
ax2 = fig.add_subplot(1, 2, 2)
plt.title('Generate image', fontsize=16)
ax2.axis('off')
ax2.imshow(dst)
plt.show()

在右侧有交互式控件,可以简单调整参数,然后运行即可,等待生成。

3.2模型局限性以及可能的偏差

  • Prompt只支持中英文输入。
  • 所提供的图像或简笔画过于简单或意义不明确时,模型可能生成与上传图像相关度低的物体或是一些无意义的前景物体,可以修改上传图像重新尝试。
  • 在一些场景下,描述Prompt不够明确时,模型可能生成错误的前景物体,可以更改Prompt并生成多次,取效果较好的结果。

当所提供的图像或简笔画与描述Prompt相关度低或无关时,模型可能生成偏向图像或偏向Prompt的内容,也可能生成无意义的内容;因此建议描述Prompt与所上传的图像紧密相关并且尽可能详细。

4. Gradio可视化部署

如果想进行可视化部署,可以继续以下步骤: Gradio应用启动后可在下方页面进行涂鸦生成图像,您也可以分享public url在手机端,PC端进行访问生成图像。

4.1 ControlNet扩展说明

  • 图像画布:您可以拖动设置画布宽度和画布高度,然后点击 开启画布! 来创建一张空白画布。
  • 调整笔刷进行绘画
  • 输入描述词(推荐),点击 Run
  • 高级选项(可选),您可点击此选项卡,打开折叠部分,按照上述参数说明进行设置,设置完成后点击 Run
import gradio as gr
# 画布生成函数
def create_canvas(w, h):
 img = np.zeros(shape=(h-2, w-2, 3), dtype=np.uint8) + 255
 im = cv2.copyMakeBorder(img,1,1,1,1,cv2.BORDER_CONSTANT)
 return im
block = gr.Blocks().queue()
with block:
 with gr.Row():
 gr.Markdown("##  涂鸦生成图像 ")
 with gr.Row():
 with gr.Column():
 canvas_width = gr.Slider(label="画布宽度", minimum=256, maximum=1024, value=512, step=1)
 canvas_height = gr.Slider(label="画布高度", minimum=256, maximum=1024, value=512, step=1)
 create_button = gr.Button(label="Start", value='开启画布!')
 gr.Markdown(value='点击下面右上角小铅笔图标,改变你的刷子宽度,让它变的更细 (Gradio不允许开发人员设置画笔宽度,因此需要手动设置) ')
 input_image = gr.Image(source='upload', type='numpy', tool='sketch')
 create_button.click(fn=create_canvas, inputs=[canvas_width, canvas_height], outputs=[input_image])
            prompt = gr.Textbox(label="Prompt")
 run_button = gr.Button(label="运行")
 with gr.Accordion("高级选项", open=False):
 num_samples = gr.Slider(label="Images", minimum=1, maximum=12, value=1, step=1)
 image_resolution = gr.Slider(label="Image Resolution", minimum=256, maximum=768, value=512, step=64)
                strength = gr.Slider(label="Control Strength", minimum=0.0, maximum=2.0, value=1.0, step=0.01)
 ddim_steps = gr.Slider(label="Steps", minimum=1, maximum=100, value=20, step=1)
                scale = gr.Slider(label="Guidance Scale", minimum=0.1, maximum=30.0, value=9.0, step=0.1)
                seed = gr.Slider(label="Seed", minimum=-1, maximum=2147483647, step=1, randomize=True)
                eta = gr.Number(label="eta (DDIM)", value=0.0)
 a_prompt = gr.Textbox(label="Added Prompt", value='质量最好,非常详细')
 n_prompt = gr.Textbox(label="Negative Prompt",
                                      value='裁剪,质量最差,质量低')
 with gr.Column():
 result_gallery = gr.Gallery(label='Output', show_label=False, elem_id="gallery").style(grid=2, height='auto')
 ips = [input_image, prompt, a_prompt, n_prompt, num_samples, image_resolution, ddim_steps, strength, scale, seed, eta]
 run_button.click(fn=process, inputs=ips, outputs=[result_gallery])
block.launch(share=True)

请注意: 图像生成消耗显存,您可以在左侧操作栏查看您的实时资源使用情况,点击GPU显存使用率即可查看,当显存不足时,您生成图像可能会报错,此时,您可以通过重启kernel的方式重置,然后重头运行即可规避。或更换更高规格的资源

 

点击关注,第一时间了解华为云新鲜技术~文章来源地址https://www.toymoban.com/news/detail-482225.html

到了这里,关于绘画手残党的福音:涂鸦线稿秒变绝美图像的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity绘画功能实现(包含涂鸦、颜色一键填充、撤销操作、保存图像)

    项目需要,要实现在图像上进行绘画,看来网上的很多Unity绘画代码,感觉挺复杂的而且功能不全,这里我自己实现了一个在图像上进行绘画的代码,包含了涂鸦、一键填充颜色、撤销上一次操作、保存图片功能。 本项目是在http://www.qb5200.com/article/391439.html上进行了魔改。 左

    2024年02月14日
    浏览(31)
  • 【强烈推荐】 十多款2023年必备国内外王炸级AI工具 (免费 精品 好用) 让你秒变神一样的装逼佬感受10倍生产力 (3) AI绘画 我的天,淘汰原画师的神器来了,赶紧闪!

    🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞👍🏻 收藏 📂加关注 AI 绘画 AI人工智能 不仅可以处理图片和声音,在绘画和绘图方面的应用也有很大

    2024年02月12日
    浏览(53)
  • [生活][杂项] 上班党的注意事项

    目前是上班已经接近两年了,目前的状态是,一个人租了一个单间在上班。对于这种情况有以下几点需要注意。 钥匙问题,一定不要陷入钥匙丢失的情况!一定不要陷入钥匙丢失的情况!一定不要陷入钥匙丢失的情况!方法是 准备一把备用钥匙放在公司 或者就是 回到家开门

    2024年04月23日
    浏览(18)
  • 手残也不该敲的命令

    Linux命令是一种很有趣且有用的东西,但在你不知道会带来什么后果的时候,它又会显得非常危险。所以,在输入某些命令前,请多多检查再敲回车。 rm –rf rm –rf是删除文件夹和里面附带内容的一种最快捷的方法,但是细微的错误或者语法认知不到位,就可能对系统造成不

    2024年02月03日
    浏览(23)
  • Stable Diffusion|线稿上色/图片转3D模型

    今天分享一个线稿上色的小教程。最近我一直在尝试在完成线稿上色后,如何使用同一张已经上色的图片生成多种姿势。虽然我原本打算在本文中分享这个方法,但是最终效果并不理想,所以后续如果有更好的解决方案,再跟大家分享。如果各位有好的解决方法,欢迎交流,

    2024年04月27日
    浏览(26)
  • AI绘图实战(七):室内设计线稿渲染、景观设计手绘稿改动、建筑照片转线稿|Stable Diffusion成为设计师生产力工具

    S:AI能取代设计师么? I :至少在设计行业,目前AI扮演的主要角色还是超级工具,要顶替?除非甲方对设计效果无所畏惧~~ 预先学习 : 安装及其问题解决参考:《Windows安装Stable Diffusion WebUI及问题解决记录》; 运行使用时问题《Windows使用Stable Diffusion时遇到的各种问题整理

    2024年02月06日
    浏览(51)
  • stable diffusion实践操作-黑白稿线稿上色

    本文专门开一节【黑白稿线稿上色】写相关的内容,在看之前,可以同步关注: stable diffusion实践操作 `本章主要介绍黑白稿线稿上色,这是通过ControlNet插件来实现的。 想要看ControlNet的详细内容,可以在下面链接中查看: 链接入口:stable diffusion实践操作-Controlnet 例如:以上

    2024年02月09日
    浏览(28)
  • AndroidStudio实现在图片上涂鸦并记录涂鸦轨迹

    开个坑,终于有时间整理一下这个项目里用到的比较重要的技术 虽然最后甲方没有采用(笑) 因为博主学艺不精,有很多小bug AndroidStudio版本:2020.3.1.25 实现效果: 本文通过重写view类,实现在选择的图片上涂鸦的功能,因为项目需要残留了一些多余代码 项目结构: MainAct

    2024年02月09日
    浏览(27)
  • mysql误删数据后,从binlog中进行恢复删除数据(拯救手残,不跑路)

    在一次数据维护过程中,对数据删除时没有提前备份数据,导致数据被删除后无法通过备份文件直接恢复。 数据如果在删除前提前备份好,那么直接从备份文件中恢复。 如果没有备份文件,则需要查看mysql数据库是否打开logbin日志。如果没有打开直接GG。如果恰好打开了的,

    2024年02月16日
    浏览(28)
  • 十五)Stable Diffusion使用教程:另一个线稿出3D例子

    案例:黄金首饰出图 1)线稿,可以进行色阶加深,不易丢失细节; 2)文生图,精确材质、光泽、工艺(抛光、拉丝等)、形状(包括深度等,比如镂空)和渲染方式(3D、素描、线稿等)提示词,负面提示词; 3)seed调-1,让ai随机出图; 4)开启controlnet,上传线稿图,选择

    2024年02月07日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包