多重controlnet控制(使用huggingface提供的API)

这篇具有很好参考价值的文章主要介绍了多重controlnet控制(使用huggingface提供的API)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

huggingface相关diffusers等库的下载暂不提供,可以轻易找到。

直接放代码。

import torch
import datetime
import cv2
import numpy as np
from PIL import Image
import PIL.Image
import PIL.ImageOps
from controlnet_aux import OpenposeDetector
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler, \
    StableDiffusionPipeline


def canny_img_process(imagepath, low_threshold, high_threshold):
    img = cv2.imread(imagepath)
    image = cv2.Canny(img, low_threshold, high_threshold)
    
    # zero_start = image.shape[1] // 4
    # zero_end = zero_start + image.shape[1] // 2
    # image[:, zero_start:zero_end] = 0

    image = image[:, :, None]
    image = np.concatenate([image, image, image], axis=2)
    image = Image.fromarray(image)
    return image


def openpose_img_process(imagepath):
    image = PIL.Image.open(imagepath)
    openpose = OpenposeDetector.from_pretrained(
        # 'lllyasviel/ControlNet'
        './ControlNet_Cache/',
        filename="body_pose_model.pth",
        hand_filename="hand_pose_model.pth",
        face_filename="facenet.pth"
    )
    image = PIL.ImageOps.exif_transpose(image)
    image = image.convert("RGB")
    image = openpose(image)
    return image


def multi_control_sd(prompt, control_mode=None, images_PATH=None, low_threshold=100,
                     high_threshold=200, negative_prompt=None, GenNum=20, num_inference_steps=50, sketch_mode=True,
                     controlnet_conditioning_scale=None):
    """
    :param control_mode: only support canny openpose
    """

    controlnets = []
    inference_img = []
    for mode, image_path in zip(control_mode, images_PATH):
        if mode == "canny":
            controlnets.append(ControlNetModel.from_pretrained("./Control/canny/", torch_dtype=torch.float16))
            cur_img = canny_img_process(image_path, low_threshold, high_threshold)
            inference_img.append(cur_img)
        if mode == "openpose":
            if sketch_mode:
                controlnets.append(ControlNetModel.from_pretrained("./Control/openpose/", torch_dtype=torch.float16))
                image = PIL.Image.open(image_path)
                inference_img.append(image)
            else:
                controlnets.append(ControlNetModel.from_pretrained("./Control/openpose/", torch_dtype=torch.float16))
                cur_img = openpose_img_process(image_path)
                inference_img.append(cur_img)

    pipe = StableDiffusionControlNetPipeline.from_pretrained("./stable-diffusion-v1-5/", controlnet=controlnets,
                                                             torch_dtype=torch.float16)
    pipe = pipe.to("cuda")
    pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
    pipe.enable_model_cpu_offload()

    for index in range(GenNum):
        print("第{}次生成".format(index + 1))
        # random seed
        seed_id = int(datetime.datetime.now().timestamp())
        generator = torch.Generator("cuda").manual_seed(seed_id)

        final_image = \
            pipe(prompt, inference_img, num_inference_steps=num_inference_steps, negative_prompt=negative_prompt,
                 generator=generator, controlnet_conditioning_scale=controlnet_conditioning_scale).images[0]  # PIL格式 (https://pillow.readthedocs.io/en/stable/)
        time = datetime.datetime.now().strftime('%Y_%m_%d_%H_%M')
        name = time + "_" + str(seed_id)
        final_image.save("./control_generate_image/{}.png".format(name))


if __name__ == '__main__':

    prompt = "a giant standing in a fantasy landscape, best quality"
    #prompt = "a boy is watching a cute cat"
    negative_prompt = "nsfw,disfigured,long neck, deformed,ugly, malformed hands,floating limbs"
    control_mode = ["openpose", "canny"]
    images_path = ["./person_pose.png", "./landscape.png"]
    control_scale = [1.0, 0.6]
    multi_control_sd(prompt, control_mode, images_path, negative_prompt=negative_prompt, num_inference_steps=399,
                     controlnet_conditioning_scale=control_scale)


    # control_stable_diffusion(prompt, canny_mode=False, openpose_mode=True, imagepath="./ceshi.png",
    #                          GenNum=10, num_inference_steps=50,sketch_mode=False)
    # simple_stable_diffusion(prompt,negative_prompt)

以上设置都下载了相关权重文件,所以可以本地使用。在openpose处理部分需要修改源码才能实现本地部署,不然的话会连接huggingface官方,离线就不能运行了。相关操作如下:

首先进入 from_pretrained的源码,然后做如下修改:

 def from_pretrained(cls, pretrained_model_or_path, filename=None, hand_filename=None, face_filename=None, cache_dir=None):

        if pretrained_model_or_path == "lllyasviel/ControlNet":
            filename = filename or "annotator/ckpts/body_pose_model.pth"
            hand_filename = hand_filename or "annotator/ckpts/hand_pose_model.pth"
            face_filename = face_filename or "facenet.pth"

            face_pretrained_model_or_path = "lllyasviel/Annotators"
        else:
            filename = filename or "body_pose_model.pth"
            hand_filename = hand_filename or "hand_pose_model.pth"
            face_filename = face_filename or "facenet.pth"

            face_pretrained_model_or_path = pretrained_model_or_path

        # body_model_path = hf_hub_download(pretrained_model_or_path, filename, cache_dir=cache_dir)
        # hand_model_path = hf_hub_download(pretrained_model_or_path, hand_filename, cache_dir=cache_dir)
        # face_model_path = hf_hub_download(face_pretrained_model_or_path, face_filename, cache_dir=cache_dir)


        body_model_path = pretrained_model_or_path + filename
        hand_model_path = pretrained_model_or_path + hand_filename
        face_model_path = pretrained_model_or_path + face_filename

        body_estimation = Body(body_model_path)
        hand_estimation = Hand(hand_model_path)
        face_estimation = Face(face_model_path)

        return cls(body_estimation, hand_estimation, face_estimation)

该部分是用来处理人体姿态的,有很多其他的方法,也可以不使用他们huggingface提供的一个方法。这样就省了这个操作。文章来源地址https://www.toymoban.com/news/detail-662566.html

到了这里,关于多重controlnet控制(使用huggingface提供的API)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 使用ControlNet控制Stable-Diffusion出图人物的姿势

    在Stable-Diffusion(以下简称SD)出图中,我们往往需要对出图人物的姿势进行控制,这里我使用一个比较简单上手的方法,通过ControlNet可以很方便地对画面风格,人物姿势进行控制,从而生成更加符合自己期望的图片 跟SD配合的插件工具的项目地址是:https://github.com/Mikubill/s

    2024年02月09日
    浏览(53)
  • Stable Diffusion - 图像控制插件 ControlNet (OpenPose) 配置与使用

    欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131591887 论文:Adding Conditional Control to Text-to-Image Diffusion Models ControlNet 是神经网络结构,用于控制预训练的大型扩散模型,以支持额外的输入条件。ControlNet 以端到端的方式学习任务特定的条

    2024年02月13日
    浏览(38)
  • 在Stable Diffusion WebUI中使用ControlNet控制人物姿势

    在Stable Diffusion WebUI中使用ControlNet控制人物姿势@TOC 这个教程默认你已经安装好了 stable-diffusion-webui , 并且已经学会了基本的用法,加载骨干模型和Lora等辅助模型。 已经如下图所示可以生成图片了: 然而,这样生成的人物难以控制动作,因此需要添加扩展:sd-webui-controlnet,

    2024年02月01日
    浏览(61)
  • CANoe的python API,使用python控制CANoe工具

    CANoe是一款用于开发、测试和仿真汽车通信系统的工具,它提供了Python API,使得开发者可以使用Python脚本来控制CANoe工具的各项功能。 CANoe的Python API提供了丰富的功能,可以用于配置网络和节点、发送和接收消息、执行测量和仿真等。 注意:在使用python API时确保电脑脑已经

    2024年04月11日
    浏览(30)
  • 论文阅读_条件控制_ControlNet

    name_en: Adding Conditional Control to Text-to-Image Diffusion Models name_ch: 向文本到图像的扩散模型添加条件控制 paper_addr: http://arxiv.org/abs/2302.05543 date_read: 2023-08-17 date_publish: 2023-02-10 tags: [‘图形图像’,‘大模型’,‘多模态’] author: Lvmin Zhang code: https://github.com/lllyasviel/ControlNet ControlNet 几

    2024年02月12日
    浏览(37)
  • AI绘画部署-Stable Diffusion(huggingface API图片生成初体验)

    最近,在很多地方都看到了各个大佬用AI生成的神图,索性从网上搜集资料部署一下体验一下AI绘画的魅力。本文基于huggingface API在colab上构建AI绘画。 https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/stable_diffusion.ipynb#scrollTo=AAVZStIokTVv 点击右上角 连接 初始化完成

    2024年02月03日
    浏览(66)
  • Stable Diffusion基础:ControlNet之人体姿势控制

    在AI绘画中精确控制图片是一件比较困难的事情,不过随着 ControlNet 的诞生,这一问题得到了很大的缓解。 今天我就给大家分享一个使用Stable Diffusion WebUI + OpenPose ControlNet 复制照片人物姿势的方法,效果可以参考上图。 OpenPose 可以控制人体的姿态、面部的表情,有时候还能够

    2024年02月13日
    浏览(38)
  • 【深度强化学习】Python:OpenAI Gym-CarRacing 自动驾驶 | 提供项目完整代码 | 车道检测功能 | 路径训练功能 | 车辆控制功能

          💭 写在前面: 本篇是关于 OpenAI Gym-CarRacing 自动驾驶项目的博客,面向掌握 Python 并有一定的深度强化学习基础的读者。 GYM-Box2D CarRacing 是一种在 OpenAI Gym 平台上开发和比较强化学习算法的模拟环境。它是流行的 Box2D 物理引擎的一个版本,经过修改以支持模拟汽车在

    2024年02月16日
    浏览(48)
  • Python数据权限的管理通常涉及到几个关键组件:身份验证,、授权和访问控制。这通常是通过使用数据库、ORM(对象关系映射)框架、API框架和中间件

    在Python中,数据权限的管理通常涉及到几个关键组件:身份验证,、授权和访问控制。这通常是通过使用数据库、ORM(对象关系映射)框架、API框架和中间件等技术来实现的。以下是一些建议的步骤和工具,用于在Python项目中实施数据权限管理: 用户身份验证: 使用如Djan

    2024年04月26日
    浏览(43)
  • 快速理解AIGC图像控制利器ControlNet和Lora的架构原理

    作者公众号 大数据与AI杂谈 (TalkCheap),转载请标明出处 ControlNet以及Lora是什么,玩过stable diffusion AI图像生成的同学应该都不陌生。 一般来说,如果你用以SD 或 SDXL为基础的模型来生成图像,产出的图像往往非常随机,很难对图像的内容做相对精确的控制。尤其是原始的S

    2024年04月11日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包