使用ControlNet生成视频(Pose2Pose)

目录

ControlNet 介绍

ControlNet 14种模型分别是用来做什么的

ControlNet 运行环境搭建

用到的相关模型地址


ControlNet 介绍

ControlNet 是一种用于控制扩散模型的神经网络结构,可以通过添加额外的条件来实现对图像生成的控制¹²。它通过将神经网络块的权重复制到一个“锁定”的副本和一个“可训练”的副本来实现这一点。 “可训练”的副本学习你的条件,而“锁定”的副本保留你的模型。这样,使用小规模的图像对数据集进行训练不会破坏生产就绪的扩散模型。

ControlNet 的创新之处在于它解决了空间一致性的问题。以前,没有有效的方法可以告诉 AI 模型保留输入图像的哪些部分,而 ControlNet 通过引入一种方法来实现这一点,使得稳定扩散模型能够使用额外的输入条件来指导模型的行为。

ControlNet 可以通过重复上述简单的结构 14 次来控制稳定扩散。这样,ControlNet 就可以重用 SD 编码器作为一个深层、强大、稳健和强大的骨干网络,来学习多样化的控制¹。

ControlNet 可以使用各种技术来对输入图像和提示进行条件化,例如姿态、边缘检测、深度图等。它可以让我们通过不同的方式来控制最终的图像生成,例如涂鸦、交互式分割、内容混合等。

ControlNet 14种模型分别是用来做什么的

  1. Canny: 用于生成边缘检测图像,可以用于AI绘画或者风格迁移。
  2. Depth: 用于生成深度图像,可以用于3D重建或者虚拟现实。
  3. Openpose: 用于生成人体姿态估计图像,可以用于动作识别或者动画制作。
  4. Style: 用于生成不同风格的图像,可以用于艺术创作或者滤镜效果。
  5. MLSD: 用于生成直线检测图像,可以用于几何变换或者透视校正。
  6. Normal: 用于生成法线图像,可以用于光照模拟或者材质编辑。
  7. Seg: 用于生成分割图像,可以用于物体识别或者背景替换。
  8. Inpaint: 用于生成修复图像,可以用于去除水印或者填补空缺。
  9. Lineart: 用于生成线稿图像,可以用于漫画制作或者素描练习。
  10. Lineart_anime: 用于生成动漫风格的线稿图像,可以用于二次元创作或者上色。
  11. Scribble: 用于生成涂鸦图像,可以用于草图设计或者儿童游戏。
  12. Softedge: 用于生成软边缘图像,可以用于模糊效果或者边缘检测。
  13. Shuffle: 用于生成随机排列的图像,可以用于拼图游戏或者视觉混乱。
  14. IP2P: 用于生成图片到图片的转换,可以用于风格迁移或者内容变换。

ControlNet 运行环境搭建

  • 克隆项目
    git clone --recursive https:\\github.com\lllyasviel/ControlNet-v1-1-nightly
  • 创建虚拟环境
cd ControlNet-v1-1-nightly
conda env create -f=environment.yml
  • 试运行depth模型
    首先去huggingface下载,control_v11flp_sd15_depth.pth模型和v1-5-pruned.ckpt两个模型放置在models目录下,运行代码
python gradio_depth.py

浏览器打开http://127.0.0.1:7860/

  • 使用视频生成连续的帧并合成视频文件
    生成得太慢了,这里只生成100帧,模型用的原生stablediffusion的模型,对人物的绘制不太好,用经过lora训练的模型生成的视频更好
from share import *
import configimport cv2
import einops
import gradio as gr
import sys
import numpy as np
import torch
import randomfrom pytorch_lightning import seed_everything
from annotator.util import resize_image, HWC3
from annotator.openpose import OpenposeDetector
from cldm.model import create_model, load_state_dict
from cldm.ddim_hacked import DDIMSamplerpreprocessor = Nonemodel_name = 'control_v11p_sd15_openpose'
model = create_model(f'./models/{model_name}.yaml').cpu()
model.load_state_dict(load_state_dict('./models/v1-5-pruned.ckpt', location='cuda'), strict=False)
model.load_state_dict(load_state_dict(f'./models/{model_name}.pth', location='cuda'), strict=False)
model = model.cuda()
ddim_sampler = DDIMSampler(model)# def process(det, input_image, prompt, a_prompt, n_prompt, num_samples, image_resolution, detect_resolution, ddim_steps, guess_mode, strength, scale, seed, eta):
def process(input_image, prompt, det="Openpose_Full", seed=1, num_samples=1, detect_resolution=512, image_resolution=512, guess_mode=False, a_prompt="best quality", n_prompt="lowres, bad anatomy, bad hands, cropped, worst quality", strength=1.0, ddim_steps=20, eta=1.0, scale=9.0):global preprocessorif 'Openpose' in det:if not isinstance(preprocessor, OpenposeDetector):preprocessor = OpenposeDetector()with torch.no_grad():input_image = HWC3(input_image)if det == 'None':detected_map = input_image.copy()else:detected_map = preprocessor(resize_image(input_image, detect_resolution), hand_and_face='Full' in det)detected_map = HWC3(detected_map)img = resize_image(input_image, image_resolution)H, W, C = img.shapedetected_map = cv2.resize(detected_map, (W, H), interpolation=cv2.INTER_LINEAR)control = torch.from_numpy(detected_map.copy()).float().cuda() / 255.0control = 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. IDK why. Perhaps because 0.825**12<0.01 but 0.826**12>0.01samples, 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 [detected_map] + resultsif __name__=='__main__':video_capture = cv2.VideoCapture(sys.argv[1])fps = int(video_capture.get(cv2.CAP_PROP_FPS))frame_size = (int(video_capture.get(cv2.CAP_PROP_FRAME_WIDTH)),int(video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))count = video_capture.get(cv2.CAP_PROP_FRAME_COUNT)output_video = Noneinit = Falsewhile True:ret, frame = video_capture.read()if not ret:breakoimage = process(input_image=np.uint8(frame), prompt="photorealistic,long_hair,realistic,solo,long_hair,(photorealistic:1.4),best quality,ultra high res,teeth,Long sleeve,""Blue dress,full body,big breasts, 3girls,Grin,graffiti (medium),ok sign,sexy,""smile,stand,1girl,full body,beautiful,masterpiece,best quality,extremely detailed face,perfect lighting,1girl,solo""best quality,ultra high res,(photorealistic:1.4),parted lipslipstick,ultra detailed,Peach buttock,looking at viewer,masterpiece,best quality")print(oimage[1].shape)if init is False:output_video = cv2.VideoWriter("output_video.mp4", cv2.VideoWriter_fourcc(*'mp4v'), fps, (oimage[1].shape[1], oimage[1].shape[0]))init = Trueoutput_video.write(oimage[1])print("==> frame:%d count:%d" % (video_capture.get(cv2.CAP_PROP_POS_FRAMES), count))if video_capture.get(cv2.CAP_PROP_POS_FRAMES) == 100:break;video_capture.release()output_video.release()cv2.destroyAllWindows()
  • 运行
python ovc_openpose.py exp.mp4

用到的相关模型地址

Annotators
StableDiffusion
ControlNet

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/123748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OPNET <<< Program Abort >>> Standard function stack imbalance

OPNET <<< Program Abort >>> Standard function stack imbalance OPNET 问题原因及解决办法 OPNET 问题 OPNET仿真时遇到此问题&#xff1a; <<< Program Abort >>> Standard function stack imbalance 原因及解决办法 出现此问题是因…

【开题报告】基于Springboot的母婴商城设计与实现

1.研究背景与目的 随着社会发展和人们生活水平的提高&#xff0c;母婴市场逐渐兴起并蓬勃发展。为了满足消费者对母婴产品的需求&#xff0c;建立一个高效、可靠的母婴商城系统变得尤为重要。本项目旨在通过使用Spring Boot框架&#xff0c;设计和实现一个功能完善、易于扩展的…

Maven compile时报错 系统资源不足,出现OOM:GC overhead limit exceeded

今天在对项目进行Maven clean compile的时候&#xff0c;报出了如下的错误&#xff0c; 系统资源不足。 有关详细信息&#xff0c;请参阅一下堆栈跟踪。 java.lang.OutOfMemoryError: GC overhead limit exceededat java.util.EnumSet.noneOf(EnumSet.java:115)at com.sun.too…

半导体设备:静电卡盘

静电卡盘是半导体设备的核心组件之一&#xff0c;对于控制晶圆的温度&#xff08;加热及冷却&#xff09;至关重要。静电卡盘&#xff08;简称 ESC 或者 E-CHUCK&#xff09;具有高稳定性、晶圆平坦度高、颗粒污染小、边缘效应小等优势&#xff0c;目前已广泛应用在等离子和真空…

2.10、自定义量化优化过程

introduction 如何自定义量化优化过程,以及如何手动调用优化过程 code from typing import Callable, Iterableimport torch import torchvision from ppq import QuantizationSettingFactory, TargetPlatform from ppq.api import (ENABLE_CUDA_KERNEL, QuantizationSetti…

QT如何检测当前系统是是Windows还是Uninx或Mac?以及是哪个版本?

简介 通过Qt获取当前系统及版本号&#xff0c;需要用到QSysInfo。 QSysInfo类提供有关系统的信息。 WordSize指定了应用程序编译所在的平台的指针大小。 ByteOrder指定了平台是大端序还是小端序。 某些常量仅在特定的平台上定义。您可以使用预处理器符号Q_OS_WIN和Q_OS_MACOS来…

【设计模式】第14节:结构型模式之“代理模式”

一、简介 代理模式&#xff08;Proxy Design Pattern&#xff09;在不改变原始类&#xff08;或叫被代理类&#xff09;代码的情况下&#xff0c;通过引入代理类来给原始类附加功能。 二、优点 关注点分离访问控制延迟实例化远程访问缓存增加附加功能 三、应用场景 访问控…

【2021集创赛】海云捷迅杯一等奖:基于稀疏卷积与层融合的流水线优化方案

海云捷迅杯:基于FPGA C5Soc的MobileNetV1 SSD目标检测方案设计 本作品参与极术社区组织的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~活动。 **杯赛题目&#xff1a;**海云捷迅杯——基于FPGA C5Soc的MobileNetV1 SSD目标检测方案设计 设计任务&#xff1a; 基于已训…

【MedusaSTears】正则表达式搜索心得

文章目录 心得体会1.懒惰匹配最少字符 .?2.前瞻: 字符串后边 包括/不包括 某个单词/字母2-1.包含某单词: start(?.?hello)2-2.不包含某单词: start(?!.?hello) 心得体会 前情回顾: 【MedusaSTears】正则?不要太简单!—正则表达式个人学习心得总结: 正则说白了是对字符串…

关于pycharm中句号变成点的问题

现象 在pycharm的使用中&#xff0c;经常遇到一个问题&#xff1a;注释写着写着&#xff0c;突然句号“。”变成了“.” 原因 今天突然发现&#xff0c;造成该现象的原因是&#xff1a;某个瞬间按下了ctrl .&#xff0c;那么之后按下句号只能显示为点。 pycharm中&#xf…

STM32G030F6P6 芯片实验 (一)

STM32G030F6P6 芯片实验 (一) 淘宝搞了几片, 没试过 G系列, 试试感觉. 先搞片小系统版: 套 STM32F103C8T6小系统板格式. 原理图: (1) Ref 有点跳, 从 STM32F103C8T6 系统板改的, 没重编号. (2) Type-C 纯给电, 砍了 16pin的, 直接换 6pin的。 (3) 测试LED放 B2。 (4) 测试底…

Android 10.0 framework关于systemUI状态栏透明背景的功能实现

1.概述 在10.0的系统产品定制化开发中,在对于系统原生SystemUI的状态栏背景在沉浸式状态栏的 情况下默认是会随着背景颜色的变化而改变的,在一些特定背景下状态栏的背景也是会改变的,所以由于产品开发需要 要求需要设置状态栏背景为透明的,所以就需要在Activity创建的时候…

MongoDB安装大全

MongoDB官网&#xff1a;https://www.mongodb.com/zh windows下安装mongodb 下载msi安装程序 一步一步安装即可 MacOS下安装mongodb 安装流程&#xff1a;https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/ 首先安装homebrew 注意事项&#xff1a; 在安…

仿真翻页企业内刊制作方法

现如今很多企业都会把自身的企业文化做成电子内刊形式&#xff0c;不再停留于传统纸质的形式&#xff0c;而这种电子版的书更容易被翻阅和传播。特别是员工可以随时随地来阅读企业的文化价值和发展趋向&#xff0c;进而创造出更多的经济效益。不得不说&#xff0c;一本企业文化…

封装线程池ThreadPoolExecutor

封装代码 class MyThread(object):def __init__(self):# 线程池 根据自己需要传入最大线程数量,我只需要一个所以传1self.executor ThreadPoolExecutor(2)# 用于存储期程self.future_dict {}# 检查worker线程是否正在运行def is_running(self, tag):future self.future_dic…

Mysql数据库 4.SQL语言 DQL数据查询语言 查询

DQL数据查询语言 从数据表中提取满足特定条件的记录 1.单表查询 2.多表查询 查询基础语法 select 关键字后指定要查询到的记录的哪些列 语法&#xff1a;select 列名&#xff08;字段名&#xff09;/某几列/全部列 from 表名 [具体条件]&#xff1b; select colnumName…

uniapp项目APP端安卓ios权限检测教程

导语:在 APP 的日常开发过程中,权限检测与授权是不可避免的一项重要的功能,下面就简单介绍一下如何检测和授权的方法。 目录 原理方法实战原理 此授权方法主要是依托于 HTML5 产业联盟的HTML5+规范实现的。 HTML5 产业联盟官网 获取当前操作系统名称 可以使用uni.getSys…

大数据前置学习基础准备(非常详细!)

1.需要的环境 需要3台服务器&#xff0c;centos7 为集群&#xff0c;全部设置为nat模式 2.整个环境大体 1.设置三台Linux虚拟机的主机和固定ip 2.在Linux系统以及本机系统中配置了主机名映射 3.配置了三台服务器之间root用户的ssh免密互通 4.安装配置JDK环境 5.关闭防火墙和SEL…

Python基础入门例程24-NP24 淘汰排名最后的学生(列表)

最近的博文&#xff1a; Python基础入门例程23-NP23 删除好友&#xff08;列表&#xff09;-CSDN博客 Python基础入门例程22-NP22 删除简历&#xff08;列表&#xff09;-CSDN博客 Python基础入门例程21-NP21 增加派对名单&#xff08;二&#xff09;&#xff08;列表&#xff…

【Linux】进程概念(下)

进程概念 一、环境变量1. 命令行参数2. 常见的环境变量&#xff08;1&#xff09;PATH&#xff08;2&#xff09;PWD&#xff08;3&#xff09;HOME&#xff08;4&#xff09;env 查看所有的环境变量 3. 获取环境变量&#xff08;1&#xff09;通过代码获取环境变量&#xff08…