Chang Liu, Rui Li, Kaidong Zhang, Yunwei Lan, Dong Liu
[ Paper
] / [ Project
] / [ Models (Huggingface)
] / [ DAVIS-Edit (HuggingFace)
] / [ Models (wisemodel)
] / [ DAVIS-Edit (wisemodel)
] / [ Models (ModelScope)
] / [ DAVIS-Edit (ModelScope)
]
StableV2V
StableV2V
(líneas de comando)StableV2V
StableV2V
StableV2V
(demostración de Gradio)DAVIS-Edit
Si tiene alguna pregunta sobre este trabajo, no dude en iniciar un nuevo número o proponer un PR.
StableV2V
StableV2V
presenta un paradigma novedoso para realizar la edición de video de manera consistente, especialmente manejando los escenarios de edición cuando las indicaciones del usuario causan cambios significativos en la forma del contenido editado. Además, StableV2V
muestra una flexibilidad superior en el manejo de una amplia serie de aplicaciones posteriores, considerando varias indicaciones del usuario de diferentes modalidades.
<Volver a la tabla de contenidos>
DAVIS-Edit
a ModelScope.StableV2V
, con ilustraciones detalladas presentadas en esta sección.DAVIS-Edit
a Wisemodel.cn.DAVIS-Edit
a nuestro repositorio de conjunto de datos de HuggingFace y hemos cargado todos los pesos de modelo requeridos de StableV2V
a nuestro repositorio de modelos de HuggingFace.StableV2V
DAVIS-Edit
a nuestro repositorio de HuggingFace StableV2V
a nuestro repositorio de HuggingFace <Volver a la tabla de contenidos>
StableV2V
├── LICENSE
├── README.md
├── assets
├── datasets <----- Code of datasets for training of the depth refinement network
├── models <----- Code of model definitions in different components
├── runners <----- Code of engines to run different components
├── inference.py <----- Script to inference StableV2V
├── train_completion_net.py <----- Script to train the shape-guided depth completion network
└── utils <----- Code of toolkit functions
<Volver a la tabla de contenidos>
Ofrecemos una línea de comando con un solo clic para instalar todas las dependencias que requiere el código. Primero, crea el entorno virtual con conda
:
conda create -n stablev2v python=3.10
Luego, puedes ejecutar las siguientes líneas para instalar las dependencias con pip
:
bash install_pip.sh
También puedes instalar las dependencias con conda
, siguiendo la siguiente línea de comando:
bash install_conda.sh
Entonces, estará listo para comenzar con conda activate stablev2v
.
Antes de comenzar el proceso de inferencia, debe preparar los pesos del modelo que requiere StableV2V
.
Modelo | Componente | Enlace |
---|---|---|
Pintura por ejemplo | PFE | Fantasy-Studio/Paint-by-Example |
InstruirPix2Pix | PFE | timbrooks/instruct-pix2pix |
SD en pintura | PFE | botp/stable-diffusion-v1-5-inpainting |
ControlNet + SD en pintura | PFE | Modelos ControlNet en lllyasviel |
Cualquier puerta | PFE | xichenhku/AnyDoor |
BALSA | ISA | Google Drive |
Midas | ISA | Link |
U2-net | ISA | Link |
Red de refinamiento de profundidad | ISA | Link |
SD v1.5 | cig | stable-diffusion-v1-5/stable-diffusion-v1-5 |
ControlNet (profundidad) | cig | lllyasviel/control_v11f1p_sd15_depth |
Ctrl-Adaptador | cig | hanlincs/Ctrl-Adapter ( i2vgenxl_depth ) |
I2VGen-XL | cig | ali-vilab/i2vgen-xl |
Una vez que haya descargado todos los pesos del modelo, colóquelos en la carpeta de checkpoints
.
Nota
Si su entorno de red puede obtener acceso a HuggingFace, puede usar directamente el ID del repositorio de HuggingFace para descargar los modelos. De lo contrario, le recomendamos encarecidamente que prepare las pesas del modelo localmente.
Específicamente, asegúrese de modificar el archivo de configuración de AnyDoor
en models/anydoor/configs/anydoor.yaml
con la ruta de los pesos previamente entrenados DINO-v2:
(at line 83)
cond_stage_config:
target: models.anydoor.ldm.modules.encoders.modules.FrozenDinoV2Encoder
weight: /path/to/dinov2_vitg14_pretrain.pth
<Volver a la tabla de contenidos>
StableV2V
(líneas de comando) Puede consultar la siguiente línea de comando para ejecutar StableV2V
:
python inference.py --raft-checkpoint-path checkpoints/raft-things.pth --midas-checkpoint-path checkpoints/dpt_swin2_large_384.pt --u2net-checkpoint-path checkpoints/u2net.pth --stable-diffusion-checkpoint-path stable-diffusion-v1-5/stable-diffusion-v1-5 --controlnet-checkpoint-path lllyasviel/control_v11f1p_sd15_depth --i2vgenxl-checkpoint-path ali-vilab/i2vgen-xl --ctrl-adapter-checkpoint-path hanlincs/Ctrl-Adapter --completion-net-checkpoint-path checkpoints/depth-refinement/50000.ckpt --image-editor-type paint-by-example --image-editor-checkpoint-path /path/to/image/editor --source-video-frames examples/frames/bear --external-guidance examples/reference-images/raccoon.jpg --prompt " a raccoon " --outdir results
Argumento | Configuración predeterminada | Requerido o no | Explicación |
---|---|---|---|
Argumentos modelo | - | - | - |
--image-editor-type | - | Sí | Argumento para definir el tipo de editor de imágenes. |
--image-editor-checkpoint-path | - | Sí | Ruta de los pesos del modelo para el editor de imágenes, requerida por PFE. |
--raft-checkpoint-path | checkpoints/raft-things.pth | Sí | Ruta de pesos del modelo para RAFT, requerida por ISA. |
--midas-checkpoint-path | checkpoints/dpt_swin2_large_382.pt | Sí | Ruta de ponderaciones del modelo para MiDaS, requerida por ISA. |
--u2net-checkpoint-path | checkpoints/u2net.pth | Sí | Ruta de los pesos del modelo para U2-Net, requerida por ISA para obtener las máscaras de segmentación de cuadros de video (será reemplazada por SAM en un futuro próximo) |
--stable-diffusion-checkpoint-path | stable-diffusion-v1-5/stable-diffusion-v1-5 | Sí | Ruta de los pesos del modelo para SD v1.5, requerida por CIG. |
--controlnet-checkpoint-path | lllyasviel/control_v11f1p_sd15_depth | Sí | Ruta de los pesos del modelo para ControlNet (profundidad) requerida por CIG. |
--ctrl-adapter-checkpoint-path | hanlincs/Ctrl-Adapter | Sí | Ruta de los pesos del modelo para Ctrl-Adapter, requerida por CIG. |
--i2vgenxl-checkpoint-path | ali-vilab/i2vgen-xl | Sí | Ruta de pesos del modelo para I2VGen-XL, requerida por CIG. |
--completion-checkpoint-path | checkpoints/depth-refinement/50000.ckpt | Sí | Ruta de pesos del modelo para I2VGen-XL, requerida por CIG. |
Argumentos de entrada | - | - | - |
--source-video-frames | - | Sí | Ruta de los fotogramas de vídeo de entrada. |
--prompt | - | Sí | Mensaje de texto del video editado. |
--external-guidance | - | Sí | Entradas externas para los editores de imágenes si usa Paint-by-Example , InstructPix2Pix y AnyDoor . |
--outdir | results | Sí | Ruta del directorio de salida. |
--edited-first-frame | - | No | Ruta del primer fotograma editado personalizado, donde no se utilizará el editor de imágenes si se configura este argumento. |
--input-condition | - | No | Ruta de mapas de profundidad personalizados. Extraemos mapas de profundidad directamente de los fotogramas del vídeo fuente con MiDaS si este argumento no está configurado |
--input-condition | - | No | Ruta de mapas de profundidad personalizados. Extraemos directamente mapas de profundidad de los fotogramas del vídeo de origen con MiDaS si este argumento no está configurado. |
--reference-masks | - | No | Ruta de las máscaras de segmentación de la imagen de referencia, requerida por AnyDoor . Extraeremos automáticamente la máscara de segmentación de la imagen de referencia si este argumento no está configurado. |
--image-guidance-scale | 1.0 | No | Hiperparámetro requerido por InstructPix2Pix. |
--kernel-size | 9 | No | Tamaño del kernel de la operación de dilatación binaria, para garantizar que los procesos de pegado cubran las regiones de los contenidos editados. |
--dilation-iteration | 1 | No | Iteración para operación de dilatación binaria. |
--guidance-scale | 9.0 | No | Escala orientativa sin clasificador. |
--mixed-precision | bf16 | No | Precisión de modelos en StableV2V. |
--n-sample-frames | 16 | No | Número de fotogramas de vídeo del vídeo editado. |
--seed | 42 | No | Semilla aleatoria. |
Nota
Algunos puntos específicos a los que puede prestar atención adicional al inferir:
--image-editor-checkpoint-path
, la ruta se entregará automáticamente al editor correspondiente de acuerdo con su --image-editor-type
. Así que no se preocupe por algunos argumentos adicionales en el código base.Paint-by-Example
, InstructPix2Pix
, AnyDoor
, debe configurar el argumento --external-guidance
, que corresponde a la imagen de referencia y a las instrucciones del usuario en consecuencia.xformers
, lo que podría causar artefactos en los resultados producidos. Este problema podría solucionarse en el futuro si es posible. StableV2V
Para obtener los bocetos dibujados por humanos, debe dibujarlos manualmente en dispositivos externos, como una tableta, y luego exportar el resultado para usos posteriores. En concreto, obtenemos los bocetos dibujados a mano en la aplicación para iPad Sketchbook
. Un ejemplo de boceto dibujado a mano podría verse así:
ControlNet (scribble)
para generar el primer fotograma editado Una vez que obtengas el boceto dibujado a mano, el siguiente paso es obtener el primer fotograma editado. Al hacerlo, utilizamos ControlNet (scribble)
, donde es necesario preparar los pesos del modelo de ControlNet (scribble)
y SD Inpaint
con anticipación. Supongamos que colocamos los bocetos dibujados a mano previamente en inputs/hand-drawn-sketches
, puede ejecutar la siguiente línea de comando ejecutando ControlNet (scribble)
:
python scripts/inference_controlnet_inpaint.py --controlnet-checkpoint-path lllyasviel/control_v11p_sd15_scribble --stable-diffusion-checkpoint-path botp/stable-diffusion-v1-5-inpainting --prompt " an elephant " --input-mask inputs/masks/bear.png --controlnet-guidance inputs/hand-drawn-sketches/bear-elephant-sketch.png --outdir results/sketch-guided-result.png
El resultado podría parecer así:
Finalmente, estás listo para generar el video editado completo. Ofrecemos una línea de comando de ejemplo de la siguiente manera:
python inference.py --raft-checkpoint-path checkpoints/raft-things.pth --midas-checkpoint-path checkpoints/dpt_swin2_large_384.pt --u2net-checkpoint-path checkpoints/u2net.pth --stable-diffusion-checkpoint-path stable-diffusion-v1-5/stable-diffusion-v1-5 --controlnet-checkpoint-path lllyasviel/control_v11f1p_sd15_depth --i2vgenxl-checkpoint-path ali-vilab/i2vgen-xl --ctrl-adapter-checkpoint-path hanlincs/Ctrl-Adapter --completion-net-checkpoint-path checkpoints/depth-refinement/50000.ckpt --source-video-frames examples/frames/bear --edited-first-frame inputs/edited-first-frames/bear-elephant.png --prompt " an elephant walking on the rocks in a zoo " --outdir results
Al configurar --edited-first-frame
, el código base omitirá automáticamente el proceso de edición del primer fotograma, donde visualizamos el video fuente y el video editado a continuación:
<Volver a la tabla de contenidos>
StableV2V
Antes de pintar el primer cuadro de video, le recomendamos dilatar la máscara de segmentación anotada (si corresponde) usando el siguiente script:
python scripts/run_dilate_mask.py --input-folder inputs/masks/car-turn.png --output-folder inputs/dilated-masks --kernel-size 15 --iterations 1
Las máscaras original (izquierda) y dilatada (derecha) podrían verse así:
IOPaint
para generar el primer marco pintado Le recomendamos que utilice la biblioteca IOPaint
para un uso más cómodo. Para instalarlo, simplemente puedes ejecutar:
pip install iopaint
Luego, podrás ejecutar LaMa
a través de la biblioteca:
iopaint run --model=lama --image inputs/frames/car-turn/00000.jpg --mask inputs/dilated-masks/car-turn.png --output inputs/edited-first-frames/
Los primeros fotogramas originales e inpintados podrían verse así:
Finalmente, estás listo para generar el video editado completo. Ofrecemos una línea de comando de ejemplo de la siguiente manera:
python inference.py --raft-checkpoint-path checkpoints/raft-things.pth --midas-checkpoint-path checkpoints/dpt_swin2_large_384.pt --u2net-checkpoint-path checkpoints/u2net.pth --stable-diffusion-checkpoint-path stable-diffusion-v1-5/stable-diffusion-v1-5 --controlnet-checkpoint-path lllyasviel/control_v11f1p_sd15_depth --i2vgenxl-checkpoint-path ali-vilab/i2vgen-xl --ctrl-adapter-checkpoint-path hanlincs/Ctrl-Adapter --completion-net-checkpoint-path checkpoints/depth-refinement/50000.ckpt --source-video-frames examples/frames/car-turn --edited-first-frame inputs/edited-first-frame/car-turn-inpainted.png --prompt " an elephant walking on the rocks in a zoo " --outdir results
Al configurar --edited-first-frame
, el código base omitirá automáticamente el proceso de edición del primer fotograma, donde visualizamos el video fuente y el video editado a continuación:
<Volver a la tabla de contenidos>
StableV2V
(demostración de Gradio) También ofrecemos una demostración de gradio para probar StableV2V
a través de la interfaz de usuario interactiva. Antes de continuar, le recomendamos que siga las instrucciones de esta sección para preparar todos los pesos del modelo necesarios localmente (en la carpeta ./checkpoints
). Luego, siéntete libre de probarlo simplemente ejecutando:
python app.py
En la siguiente figura, ilustramos las funciones de diferentes módulos en nuestra demostración de Gradio:
No dude en iniciar una nueva edición o proponer un PR si tiene más preguntas sobre la demostración.
<Volver a la tabla de contenidos>
DAVIS-Edit
Construimos DAVIS-Edit
siguiendo la misma estructura de datos que la de DAVIS
, como se muestra a continuación:
DAVIS-Edit
├── Annotations <----- Official annotated masks of DAVIS
├── bear
├── blackswan
├── ...
└── train
├── JPEGImages <----- Official video frames of DAVIS
├── bear
├── blackswan
├── ...
└── train
├── ReferenceImages <----- Annotated reference images for image-based editing on DAVIS-Edit
├── bear.png
├── blackswan.png
├── ...
└── train.png
├── .gitattributes
├── README.md
├── edited_video_caption_dict_image.json <----- Annotated text descriptions for image-based editing on DAVIS-Edit
└── edited_video_caption_dict_text.json <----- Annotated text descriptions for text-based editing on DAVIS-Edit
Específicamente, edited_video_caption_dict_image.json
y edited_video_caption_dict_text.json
se construyen como un diccionario de Python, con sus claves como los nombres de las carpetas de videos en JPEGImages
. Por ejemplo en edited_video_caption_dict_text.json
:
{
"bear" : {
"original" : " a bear walking on rocks in a zoo " ,
"similar" : " A panda walking on rocks in a zoo " ,
"changing" : " A rabbit walking on rocks in a zoo "
},
# ...
}
Las anotaciones de imágenes de referencia contienen dos subcarpetas, es decir, similar
y changing
, correspondientes a las anotaciones de DAVIS-Edit-S
y DAVIS-Edit-C
, respectivamente, donde la estructura se construye en el mismo nombre de carpeta que en JPEGImages
.
Le recomendamos encarecidamente que indexe diferentes elementos en DAVIS-Edit
a través de los archivos de anotaciones . En particular, puede consultar el siguiente script:
import os
import json
from tqdm import tqdm
from PIL import Image
# TODO: Modify the configurations here to your local paths
frame_root = 'JPEGImages'
mask_root = 'Annotations'
reference_image_root = 'ReferenceImages/similar' # Or 'ReferenceImages/changing'
annotation_file_path = 'edited_video_caption_dict_text.json'
# Load the annotation file
with open ( annotation_file_path , 'r' ) as f :
annotations = json . load ( f )
# Iterate all data samples in DAVIS-Edit
for video_name in tqdm ( annotations . keys ()):
# Load text prompts
original_prompt = annotations [ video_name ][ 'original' ]
similar_prompt = annotations [ video_name ][ 'similar' ]
changing_prompt = annotations [ video_name ][ 'changing' ]
# Load reference images
reference_image = Image . open ( os . path . join ( reference_image_root , video_name + '.png' ))
# Load video frames
video_frames = []
for path in sorted ( os . listdir ( os . path . join ( frame_root , video_name ))):
if path != 'Thumbs.db' and path != '.DS_store' :
video_frames . append ( Image . open ( os . path . join ( frame_root , path )))
# Load masks
masks = []
for path in sorted ( os . listdir ( os . path . join ( mask_root , video_name ))):
if path != 'Thumbs.db' and path != '.DS_store' :
masks . append ( Image . open ( os . path . join ( frame_root , path )))
# (add further operations that you expect in the lines below)
<Volver a la tabla de contenidos>
YouTube-VOS
Usamos YouTube-VOS
para llevar a cabo el proceso de capacitación de nuestra red de refinamiento de profundidad guiada por formas. Antes de comenzar el proceso de capacitación, primero debe descargar los videos fuente y las anotaciones desde este enlace. Una vez descargados, los datos siguen las estructuras siguientes:
youtube-vos
├── JPEGImages <----- Path of source video frames
├── Annotations <----- Path of segmentation masks
└── meta.json <----- Annotation file for the segmentation masks
MiDaS
para anotar los mapas de profundidad Una vez que los cuadros de video estén listos, el siguiente paso es anotar sus correspondientes mapas de profundidad. En concreto, asegúrate de descargar los pesos del modelo MiDaS
desde este enlace. Luego, puede ejecutar las siguientes líneas de comando con nuestro script automático:
python scripts/extract_youtube_vos_depths.py --midas-path checkpoints/dpt_swin2_large_384.pt --dataset-path data/youtube-vos/JPEGImages --outdir data/youtube-vos/DepthMaps
U2-Net
para anotar las máscaras de forma del primer fotograma Nuestra red de refinamiento de profundidad utiliza un canal de red adicional para tomar la máscara de forma del primer fotograma como guía, por lo que es necesario anotarlos para el conjunto de datos YouTube-VOS
. Primero, asegúrese de descargar las pesas del modelo U2-Net
desde este enlace. Luego, ejecuta las siguientes líneas de comando con nuestro script automático:
python scripts/extract_youtube_vos_shapes.py --video-root data/youtube-vos/JPEGImages --model-dir checkpoints/u2net.pth --outdir data/youtube-vos/FirstFrameMasks
Finalmente, está listo para ejecutar el proceso de capacitación con la siguiente línea de comando:
python train_completion_net.py --video-path data/youtube-vos/JPEGImages --shape-path data/youtube-vos/FirstFrameMasks --max-train-steps 50000 --outdir results/shape-guided-depth-refinement --checkpoint-freq 2000 --validation-freq 200
Los pesos del modelo entrenado se guardarán en results/checkpoints
, y las visualizaciones de los resultados intermedios se pueden verificar mediante tensorboard
, con los registros guardados en results/tensorboard
.
<Volver a la tabla de contenidos>
Consulte nuestra página de proyecto para obtener más resultados y comparaciones realizadas por StableV2V
.
<Volver a la tabla de contenidos>
Si este trabajo le resulta útil para su investigación o utiliza nuestro punto de referencia de prueba DAVIS-Edit
, cite nuestro artículo:
@misc{liu-etal-2024-stablev2v,
title={StableV2V: Stablizing Shape Consistency in Video-to-Video Editing},
author={Chang Liu and Rui Li and Kaidong Zhang and Yunwei Lan and Dong Liu},
year={2024},
eprint={2411.11045},
archivePrefix={arXiv},
primaryClass={cs.CV},
}
<Volver a la tabla de contenidos>
<Volver a la tabla de contenidos>
Este repositorio está muy modificado según Difusores, Ctrl-Adapter, AnyDoor y RAFT. Agradecemos sinceramente a los autores por sus fantásticas implementaciones.
<Volver a la tabla de contenidos>