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
(linhas de comando)StableV2V
StableV2V
StableV2V
(Gradio Demo)DAVIS-Edit
Se você tiver alguma dúvida sobre este trabalho, sinta-se à vontade para iniciar uma nova edição ou propor um PR.
StableV2V
StableV2V
apresenta um novo paradigma para realizar edição de vídeo de maneira consistente, especialmente lidando com cenários de edição quando as solicitações do usuário causam alterações significativas na forma do conteúdo editado. Além disso, StableV2V
apresenta flexibilidade superior no tratamento de uma ampla série de aplicações downstream, considerando vários prompts do usuário de diferentes modalidades.
<Voltar ao Índice>
DAVIS-Edit
para ModelScope.StableV2V
, com ilustrações detalhadas apresentadas nesta seção.DAVIS-Edit
para wisemodel.cn.DAVIS-Edit
para nosso repositório de conjunto de dados HuggingFace e carregamos todos os pesos de modelo necessários do StableV2V
para nosso repositório de modelo HuggingFace.StableV2V
DAVIS-Edit
para nosso repositório HuggingFace StableV2V
para nosso repositório HuggingFace <Voltar ao índice>
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
<Voltar ao Índice>
Oferecemos uma linha de comando com um clique para instalar todas as dependências exigidas pelo código. Primeiro, crie o ambiente virtual com conda
:
conda create -n stablev2v python=3.10
Então, você pode executar as seguintes linhas para instalar as dependências com pip
:
bash install_pip.sh
Você também pode instalar as dependências com conda
, seguindo a linha de comando abaixo:
bash install_conda.sh
Então, você está pronto para usar conda activate stablev2v
.
Antes de iniciar o processo de inferência, você precisa preparar os pesos do modelo exigidos StableV2V
.
Modelo | Componente | Link |
---|---|---|
Pintar por exemplo | PFE | Fantasy-Studio/Paint-by-Example |
InstructPix2Pix | PFE | timbrooks/instruct-pix2pix |
Pintura SD | PFE | botp/stable-diffusion-v1-5-inpainting |
ControlNet + SD Inpaint | PFE | Modelos ControlNet em lllyasviel |
Qualquer porta | PFE | xichenhku/AnyDoor |
JANGADA | ISA | Google Drive |
MiDaS | ISA | Link |
Rede U2 | ISA | Link |
Rede de refinamento de profundidade | ISA | Link |
SD v1.5 | CIG | stable-diffusion-v1-5/stable-diffusion-v1-5 |
ControlNet (profundidade) | CIG | lllyasviel/control_v11f1p_sd15_depth |
Ctrl-Adaptador | CIG | hanlincs/Ctrl-Adapter ( i2vgenxl_depth ) |
I2VGen-XL | CIG | ali-vilab/i2vgen-xl |
Depois de baixar todos os pesos do modelo, coloque-os na pasta de checkpoints
.
Observação
Se o seu ambiente de rede puder obter acesso ao HuggingFace, você poderá usar diretamente o ID do repositório HuggingFace para baixar os modelos. Caso contrário, recomendamos fortemente que você prepare os pesos do modelo localmente.
Especificamente, certifique-se de modificar o arquivo de configuração do AnyDoor
em models/anydoor/configs/anydoor.yaml
com o caminho dos pesos pré-treinados DINO-v2:
(at line 83)
cond_stage_config:
target: models.anydoor.ldm.modules.encoders.modules.FrozenDinoV2Encoder
weight: /path/to/dinov2_vitg14_pretrain.pth
<Voltar ao Índice>
StableV2V
(linhas de comando) Você pode consultar a seguinte linha de comando para executar 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 | Configuração padrão | Obrigatório ou não | Explicação |
---|---|---|---|
Argumentos do modelo | - | - | - |
--image-editor-type | - | Sim | Argumento para definir o tipo de editor de imagens. |
--image-editor-checkpoint-path | - | Sim | Caminho dos pesos do modelo para o editor de imagens, exigido pelo PFE. |
--raft-checkpoint-path | checkpoints/raft-things.pth | Sim | Caminho dos pesos do modelo para RAFT, exigido pela ISA. |
--midas-checkpoint-path | checkpoints/dpt_swin2_large_382.pt | Sim | Caminho dos pesos do modelo para MiDaS, exigido pelo ISA. |
--u2net-checkpoint-path | checkpoints/u2net.pth | Sim | Caminho dos pesos do modelo para U2-Net, exigido pelo ISA para obter as máscaras de segmentação de quadros de vídeo (será substituído pelo SAM em um futuro próximo) |
--stable-diffusion-checkpoint-path | stable-diffusion-v1-5/stable-diffusion-v1-5 | Sim | Caminho dos pesos do modelo para SD v1.5, exigido pelo CIG. |
--controlnet-checkpoint-path | lllyasviel/control_v11f1p_sd15_depth | Sim | Caminho dos pesos do modelo para ControlNet (profundidade) exigido pelo CIG. |
--ctrl-adapter-checkpoint-path | hanlincs/Ctrl-Adapter | Sim | Caminho dos pesos do modelo para Ctrl-Adapter, exigido pelo CIG. |
--i2vgenxl-checkpoint-path | ali-vilab/i2vgen-xl | Sim | Caminho dos pesos do modelo para I2VGen-XL, exigido pelo CIG. |
--completion-checkpoint-path | checkpoints/depth-refinement/50000.ckpt | Sim | Caminho dos pesos do modelo para I2VGen-XL, exigido pelo CIG. |
Argumentos de entrada | - | - | - |
--source-video-frames | - | Sim | Caminho dos quadros de vídeo de entrada. |
--prompt | - | Sim | Prompt de texto do vídeo editado. |
--external-guidance | - | Sim | Entradas externas para os editores de imagem se você usar Paint-by-Example , InstructPix2Pix e AnyDoor . |
--outdir | results | Sim | Caminho do diretório de saída. |
--edited-first-frame | - | Não | Caminho do primeiro quadro editado customizado, onde o editor de imagens não será utilizado se este argumento estiver configurado. |
--input-condition | - | Não | Caminho de mapas de profundidade personalizados. Extraímos diretamente mapas de profundidade dos quadros de vídeo de origem com MiDaS se este argumento não estiver configurado |
--input-condition | - | Não | Caminho de mapas de profundidade personalizados. Extraímos diretamente mapas de profundidade dos quadros de vídeo de origem com MiDaS se este argumento não estiver configurado. |
--reference-masks | - | Não | Caminho das máscaras de segmentação da imagem de referência, exigido pelo AnyDoor . Extrairemos automaticamente a máscara de segmentação da imagem de referência se este argumento não estiver configurado. |
--image-guidance-scale | 1,0 | Não | Hiperparâmetro exigido pelo InstructPix2Pix. |
--kernel-size | 9 | Não | Tamanho do kernel da operação de dilatação binária, para garantir que os processos de colagem cubram as regiões de conteúdo editado. |
--dilation-iteration | 1 | Não | Iteração para operação de dilatação binária. |
--guidance-scale | 9,0 | Não | Escala de orientação sem classificador. |
--mixed-precision | bf16 | Não | Precisão de modelos em StableV2V. |
--n-sample-frames | 16 | Não | Número de quadros de vídeo do vídeo editado. |
--seed | 42 | Não | Semente aleatória. |
Observação
Alguns pontos específicos aos quais você pode prestar atenção adicional ao inferir:
--image-editor-checkpoint-path
, o caminho será entregue automaticamente ao editor correspondente de acordo com seu --image-editor-type
. Então, por favor, não se preocupe com alguns argumentos extras na base de código.Paint-by-Example
, InstructPix2Pix
, AnyDoor
, será necessário configurar o argumento --external-guidance
, que corresponde à imagem de referência e às instruções do usuário de acordo.xformers
, o que pode causar artefatos nos resultados produzidos. Esse problema pode ser corrigido no futuro, se possível. StableV2V
Para obter os esboços desenhados por humanos, você precisa desenhá-los manualmente em dispositivos externos, como um tablet, e depois exportar o resultado para usos posteriores. Especificamente, obtemos os esboços desenhados à mão no aplicativo Sketchbook
para iPad. Um exemplo de esboço desenhado à mão pode ser assim:
ControlNet (scribble)
para gerar o primeiro quadro editado Depois de obter o esboço desenhado à mão, o próximo passo é obter o primeiro quadro editado. Ao fazer isso, usamos ControlNet (scribble)
, onde você precisa preparar antecipadamente os pesos do modelo ControlNet (scribble)
e SD Inpaint
. Suponha que colocamos os esboços desenhados à mão anteriormente em inputs/hand-drawn-sketches
, você pode executar a seguinte linha de comando executando 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
O resultado pode parecer:
Finalmente, você está pronto para gerar todo o vídeo editado. Oferecemos um exemplo de linha de comando da seguinte maneira:
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
Ao configurar o --edited-first-frame
, a base de código irá pular automaticamente o processo de edição do primeiro quadro, onde visualizamos o vídeo de origem e o vídeo editado abaixo:
<Voltar ao Índice>
StableV2V
Antes de pintar o primeiro quadro de vídeo, recomendamos que você dilate a máscara de segmentação anotada (se houver) usando o seguinte script:
python scripts/run_dilate_mask.py --input-folder inputs/masks/car-turn.png --output-folder inputs/dilated-masks --kernel-size 15 --iterations 1
As máscaras original (esquerda) e dilatada (direita) podem ter a seguinte aparência:
IOPaint
para gerar o primeiro quadro pintado Recomendamos que você use a biblioteca IOPaint
para uso conveniente. Para instalá-lo, você pode simplesmente executar:
pip install iopaint
Então, você pode executar LaMa
através da biblioteca:
iopaint run --model=lama --image inputs/frames/car-turn/00000.jpg --mask inputs/dilated-masks/car-turn.png --output inputs/edited-first-frames/
Os primeiros quadros originais e pintados podem ter a seguinte aparência:
Finalmente, você está pronto para gerar todo o vídeo editado. Oferecemos um exemplo de linha de comando da seguinte forma:
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
Ao configurar o --edited-first-frame
, a base de código irá pular automaticamente o processo de edição do primeiro quadro, onde visualizamos o vídeo de origem e o vídeo editado abaixo:
<Voltar ao índice>
StableV2V
(Gradio Demo) Também oferecemos uma demonstração gradio para testar StableV2V
por meio da interface interativa. Antes de prosseguir, recomendamos que você siga as instruções nesta seção para preparar todos os pesos de modelo necessários localmente (na pasta ./checkpoints
). Então, sinta-se à vontade para testá-lo simplesmente executando:
python app.py
Na figura a seguir, ilustramos as funções de diferentes módulos em nossa demonstração do Gradio:
Não hesite em iniciar uma nova edição ou propor um PR se tiver mais dúvidas sobre a demonstração.
<Voltar ao Índice>
DAVIS-Edit
Construímos DAVIS-Edit
seguindo a mesma estrutura de dados de DAVIS
, conforme mostrado abaixo:
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
Especificamente, edited_video_caption_dict_image.json
e edited_video_caption_dict_text.json
são construídos como dicionário Python, com suas chaves como nomes de pastas de vídeo em JPEGImages
. Por exemplo em 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 "
},
# ...
}
As anotações das imagens de referência contêm duas subpastas, ou seja, similar
e changing
, correspondentes às anotações de DAVIS-Edit-S
e DAVIS-Edit-C
, respectivamente, onde as estruturas são construídas no mesmo nome de pasta que em JPEGImages
.
É altamente recomendável indexar diferentes elementos no DAVIS-Edit
através dos arquivos de anotação . Particularmente, você pode consultar o script abaixo:
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)
<Voltar ao Índice>
YouTube-VOS
Usamos YouTube-VOS
para conduzir o processo de treinamento de nossa rede de refinamento de profundidade guiada por forma. Antes de iniciar o processo de treinamento, você precisa primeiro baixar os vídeos originais e as anotações neste link. Depois de baixados, os dados seguem as estruturas abaixo:
youtube-vos
├── JPEGImages <----- Path of source video frames
├── Annotations <----- Path of segmentation masks
└── meta.json <----- Annotation file for the segmentation masks
MiDaS
para anotar os mapas de profundidade Assim que os quadros de vídeo estiverem prontos, o próximo passo é anotar seus mapas de profundidade correspondentes. Especificamente, certifique-se de baixar os pesos do modelo MiDaS
neste link. Então, você pode executar as seguintes linhas de comando com nosso 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 as máscaras de forma do primeiro quadro Nossa rede de refinamento de profundidade usa um canal de rede adicional para usar a máscara de formato do primeiro quadro como orientação, portanto, você precisa anotá-los para o conjunto de dados YouTube-VOS
. Primeiro, certifique-se de baixar os pesos do modelo U2-Net
neste link. Em seguida, você executa as seguintes linhas de comando com nosso 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, você está pronto para executar o processo de treinamento com a seguinte linha 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
Os pesos do modelo treinado serão salvos em results/checkpoints
, e as visualizações dos resultados intermediários poderão ser verificadas via tensorboard
, com os logs salvos em results/tensorboard
.
<Voltar ao Índice>
Consulte a página do nosso projeto para mais resultados e comparações realizadas pelo StableV2V
.
<Voltar ao índice>
Se você achar este trabalho útil para sua pesquisa ou usar nosso benchmark de testes DAVIS-Edit
, cite nosso artigo:
@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},
}
<Voltar ao índice>
<Voltar ao índice>
Este repositório é fortemente modificado com base em Difusores, Ctrl-Adapter, AnyDoor e RAFT. Agradecemos sinceramente aos autores por suas implementações fantasiosas.
<Voltar ao índice>