Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
ComfyUI-MimicMotionWrapper
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
王骏浩
ComfyUI-MimicMotionWrapper
Commits
97197011
提交
97197011
authored
7月 02, 2024
作者:
kijai
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
separate decode phase
上级
e3933422
全部展开
显示空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
44 行增加
和
11 行删除
+44
-11
mimic_motion_example_02.json
examples/mimic_motion_example_02.json
+0
-0
pipeline_mimicmotion.py
mimicmotion/pipelines/pipeline_mimicmotion.py
+3
-0
nodes.py
nodes.py
+41
-11
没有找到文件。
examples/mimic_motion_example_02.json
浏览文件 @
97197011
差异被折叠。
点击展开。
mimicmotion/pipelines/pipeline_mimicmotion.py
浏览文件 @
97197011
...
...
@@ -259,6 +259,7 @@ class MimicMotionPipeline(DiffusionPipeline):
accepts_num_frames
=
"num_frames"
in
set
(
inspect
.
signature
(
forward_vae_fn
)
.
parameters
.
keys
())
# decode decode_chunk_size frames at a time to avoid OOM
pbar
=
ProgressBar
(
latents
.
shape
[
0
])
frames
=
[]
for
i
in
range
(
0
,
latents
.
shape
[
0
],
decode_chunk_size
):
num_frames_in
=
latents
[
i
:
i
+
decode_chunk_size
]
.
shape
[
0
]
...
...
@@ -272,6 +273,7 @@ class MimicMotionPipeline(DiffusionPipeline):
self
.
vae
.
to
(
offload_device
)
frames
.
append
(
frame
.
cpu
())
pbar
.
update
(
decode_chunk_size
)
frames
=
torch
.
cat
(
frames
,
dim
=
0
)
# [batch*frames, channels, height, width] -> [batch, channels, frames, height, width]
...
...
@@ -485,6 +487,7 @@ class MimicMotionPipeline(DiffusionPipeline):
width
=
width
or
self
.
unet
.
config
.
sample_size
*
self
.
vae_scale_factor
num_frames
=
num_frames
if
num_frames
is
not
None
else
self
.
unet
.
config
.
num_frames
print
(
"num_frames: "
,
num_frames
)
decode_chunk_size
=
decode_chunk_size
if
decode_chunk_size
is
not
None
else
num_frames
# 1. Check inputs. Raise error if not correct
...
...
nodes.py
浏览文件 @
97197011
...
...
@@ -7,15 +7,13 @@ import folder_paths
import
comfy.model_management
as
mm
import
comfy.utils
from
comfy.clip_vision
import
clip_preprocess
from
diffusers.models
import
AutoencoderKLTemporalDecoder
from
diffusers.schedulers
import
EulerDiscreteScheduler
from
transformers
import
CLIPImageProcessor
,
CLIPVisionModelWithProjection
script_directory
=
os
.
path
.
dirname
(
os
.
path
.
abspath
(
__file__
))
from
.mimicmotion.pipelines.pipeline_mimicmotion
import
MimicMotionPipeline
from
.mimicmotion.pipelines.pipeline_mimicmotion
import
MimicMotionPipeline
,
tensor2vid
from
.mimicmotion.modules.unet
import
UNetSpatioTemporalConditionModel
from
.mimicmotion.modules.pose_net
import
PoseNet
...
...
@@ -140,7 +138,6 @@ class DownloadAndLoadMimicMotionModel:
pipeline
.
pose_net
.
to
(
dtype
)
pipeline
.
vae
.
to
(
dtype
)
pipeline
.
image_encoder
.
to
(
dtype
)
pipeline
.
pose_net
.
to
(
dtype
)
mimic_model
=
{
'pipeline'
:
pipeline
,
...
...
@@ -168,8 +165,8 @@ class MimicMotionSampler:
},
}
RETURN_TYPES
=
(
"
IMAGE
"
,)
RETURN_NAMES
=
(
"
imag
es"
,)
RETURN_TYPES
=
(
"
LATENT
"
,)
RETURN_NAMES
=
(
"
sampl
es"
,)
FUNCTION
=
"process"
CATEGORY
=
"MimicMotionWrapper"
...
...
@@ -215,18 +212,47 @@ class MimicMotionSampler:
min_guidance_scale
=
cfg_min
,
max_guidance_scale
=
cfg_max
,
decode_chunk_size
=
4
,
output_type
=
"
p
t"
,
output_type
=
"
laten
t"
,
device
=
device
)
.
frames
frames
=
frames
.
squeeze
(
0
)[
1
:]
.
permute
(
0
,
2
,
3
,
1
)
.
cpu
()
.
float
()
#
frames = frames.squeeze(0)[1:].permute(0, 2, 3, 1).cpu().float()
if
not
keep_model_loaded
:
pipeline
.
unet
.
to
(
offload_device
)
pipeline
.
vae
.
to
(
offload_device
)
mm
.
soft_empty_cache
()
gc
.
collect
()
return
{
"samples"
:
frames
},
class
MimicMotionDecode
:
@classmethod
def
INPUT_TYPES
(
s
):
return
{
"required"
:
{
"mimic_pipeline"
:
(
"MIMICPIPE"
,),
"samples"
:
(
"LATENT"
,),
"decode_chunk_size"
:
(
"INT"
,
{
"default"
:
4
,
"min"
:
1
,
"max"
:
200
,
"step"
:
1
})
},
}
RETURN_TYPES
=
(
"IMAGE"
,)
RETURN_NAMES
=
(
"images"
,)
FUNCTION
=
"process"
CATEGORY
=
"MimicMotionWrapper"
def
process
(
self
,
mimic_pipeline
,
samples
,
decode_chunk_size
):
mm
.
soft_empty_cache
()
pipeline
=
mimic_pipeline
[
'pipeline'
]
num_frames
=
samples
[
'samples'
]
.
shape
[
0
]
try
:
frames
=
pipeline
.
decode_latents
(
samples
[
'samples'
],
num_frames
,
decode_chunk_size
)
except
:
frames
=
pipeline
.
decode_latents
(
samples
[
'samples'
],
num_frames
,
1
)
frames
=
tensor2vid
(
frames
,
pipeline
.
image_processor
,
output_type
=
"pt"
)
frames
=
frames
.
squeeze
(
1
)[
1
:]
.
permute
(
0
,
2
,
3
,
1
)
.
cpu
()
.
float
()
return
frames
,
class
MimicMotionGetPoses
:
...
...
@@ -251,6 +277,8 @@ class MimicMotionGetPoses:
from
.mimicmotion.dwpose.util
import
draw_pose
from
.mimicmotion.dwpose.dwpose_detector
import
DWposeDetector
assert
ref_image
.
shape
[
1
:
3
]
==
pose_images
.
shape
[
1
:
3
],
"ref_image and pose_images must have the same resolution"
yolo_model
=
"yolox_l.onnx"
dw_pose_model
=
"dw-ll_ucoco_384.onnx"
model_base_path
=
os
.
path
.
join
(
script_directory
,
"models"
,
"DWPose"
)
...
...
@@ -331,11 +359,13 @@ class MimicMotionGetPoses:
NODE_CLASS_MAPPINGS
=
{
"DownloadAndLoadMimicMotionModel"
:
DownloadAndLoadMimicMotionModel
,
"MimicMotionSampler"
:
MimicMotionSampler
,
"MimicMotionGetPoses"
:
MimicMotionGetPoses
"MimicMotionGetPoses"
:
MimicMotionGetPoses
,
"MimicMotionDecode"
:
MimicMotionDecode
}
NODE_DISPLAY_NAME_MAPPINGS
=
{
"DownloadAndLoadMimicMotionModel"
:
"DownloadAndLoadMimicMotionModel"
,
"MimicMotionSampler"
:
"MimicMotionSampler"
,
"MimicMotionGetPoses"
:
"MimicMotionGetPoses"
"MimicMotionGetPoses"
:
"MimicMotionGetPoses"
,
"MimicMotionDecode"
:
"MimicMotionDecode"
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论