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
(lignes de commande)StableV2V
StableV2V
StableV2V
(démo Gradio)DAVIS-Edit
Si vous avez des questions sur ce travail, n'hésitez pas à créer un nouveau numéro ou à proposer un PR.
StableV2V
StableV2V
présente un nouveau paradigme pour effectuer le montage vidéo de manière cohérente, en particulier en gérant les scénarios de montage lorsque les invites de l'utilisateur entraînent des changements de forme importants dans le contenu édité. En outre, StableV2V
fait preuve d'une flexibilité supérieure dans la gestion d'une large série d'applications en aval, en tenant compte de diverses invites utilisateur provenant de différentes modalités.
<Retour à la table des matières>
DAVIS-Edit
sur ModelScope.StableV2V
, avec des illustrations détaillées présentées dans cette section.DAVIS-Edit
sur wisemodel.cn.DAVIS-Edit
dans notre référentiel de jeux de données HuggingFace et téléchargé tous les poids de modèle requis de StableV2V
dans notre référentiel de modèles HuggingFace.StableV2V
DAVIS-Edit
sur notre référentiel HuggingFace StableV2V
sur notre dépôt HuggingFace <Retour à la table des matières>
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
<Retour à la table des matières>
Nous proposons une ligne de commande en un clic pour installer toutes les dépendances requises par le code. Tout d’abord, créez l’environnement virtuel avec conda
:
conda create -n stablev2v python=3.10
Ensuite, vous pouvez exécuter les lignes suivantes pour installer les dépendances avec pip
:
bash install_pip.sh
Vous pouvez également installer les dépendances avec conda
, en suivant la ligne de commande ci-dessous :
bash install_conda.sh
Ensuite, vous êtes prêt à utiliser conda activate stablev2v
.
Avant de commencer le processus d'inférence, vous devez préparer les poids de modèle requis par StableV2V
.
Modèle | Composant | Lien |
---|---|---|
Peinture par exemple | PFE | Fantasy-Studio/Paint-by-Example |
InstruirePix2Pix | PFE | timbrooks/instruct-pix2pix |
Peinture SD | PFE | botp/stable-diffusion-v1-5-inpainting |
ControlNet + SD Inpaint | PFE | Modèles ControlNet chez lllyasviel |
N'importe quelle porte | PFE | xichenhku/AnyDoor |
RADEAU | ISA | Google Drive |
MiDaS | ISA | Link |
U2-Net | ISA | Link |
Réseau de raffinement de la profondeur | ISA | Link |
SDv1.5 | CIGARETTE | stable-diffusion-v1-5/stable-diffusion-v1-5 |
ControlNet (profondeur) | CIGARETTE | lllyasviel/control_v11f1p_sd15_depth |
Adaptateur Ctrl | CIGARETTE | hanlincs/Ctrl-Adapter ( i2vgenxl_depth ) |
I2VGen-XL | CIGARETTE | ali-vilab/i2vgen-xl |
Une fois que vous avez téléchargé tous les poids du modèle, placez-les dans le dossier checkpoints
.
Note
Si votre environnement réseau peut accéder à HuggingFace, vous pouvez directement utiliser l'ID du dépôt HuggingFace pour télécharger les modèles. Sinon nous vous recommandons fortement de préparer les poids du modèle localement.
Plus précisément, assurez-vous de modifier le fichier de configuration d' AnyDoor
dans models/anydoor/configs/anydoor.yaml
avec le chemin des poids pré-entraînés DINO-v2 :
(at line 83)
cond_stage_config:
target: models.anydoor.ldm.modules.encoders.modules.FrozenDinoV2Encoder
weight: /path/to/dinov2_vitg14_pretrain.pth
<Retour à la table des matières>
StableV2V
(lignes de commande) Vous pouvez vous référer à la ligne de commande suivante pour exécuter 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
Argument | Paramètre par défaut | Obligatoire ou non | Explication |
---|---|---|---|
Arguments du modèle | - | - | - |
--image-editor-type | - | Oui | Argument pour définir le type d'éditeur d'images. |
--image-editor-checkpoint-path | - | Oui | Chemin des poids du modèle pour l'éditeur d'images, requis par PFE. |
--raft-checkpoint-path | checkpoints/raft-things.pth | Oui | Chemin des poids du modèle pour RAFT, requis par l'ISA. |
--midas-checkpoint-path | checkpoints/dpt_swin2_large_382.pt | Oui | Chemin des pondérations du modèle pour MiDaS, requis par l'ISA. |
--u2net-checkpoint-path | checkpoints/u2net.pth | Oui | Chemin des poids du modèle pour U2-Net, requis par l'ISA pour obtenir les masques de segmentation des images vidéo (sera remplacé par SAM dans un avenir proche) |
--stable-diffusion-checkpoint-path | stable-diffusion-v1-5/stable-diffusion-v1-5 | Oui | Chemin des poids du modèle pour SD v1.5, requis par CIG. |
--controlnet-checkpoint-path | lllyasviel/control_v11f1p_sd15_depth | Oui | Chemin des poids du modèle pour ControlNet (profondeur) requis par CIG. |
--ctrl-adapter-checkpoint-path | hanlincs/Ctrl-Adapter | Oui | Chemin des poids du modèle pour Ctrl-Adapter, requis par CIG. |
--i2vgenxl-checkpoint-path | ali-vilab/i2vgen-xl | Oui | Chemin des poids du modèle pour I2VGen-XL, requis par CIG. |
--completion-checkpoint-path | checkpoints/depth-refinement/50000.ckpt | Oui | Chemin des poids du modèle pour I2VGen-XL, requis par CIG. |
Arguments d'entrée | - | - | - |
--source-video-frames | - | Oui | Chemin des images vidéo d’entrée. |
--prompt | - | Oui | Invite textuelle de la vidéo éditée. |
--external-guidance | - | Oui | Entrées externes pour les éditeurs d'images si vous utilisez Paint-by-Example , InstructPix2Pix et AnyDoor . |
--outdir | results | Oui | Chemin du répertoire de sortie. |
--edited-first-frame | - | Non | Chemin du premier cadre édité personnalisé, où l'éditeur d'images ne sera pas utilisé si cet argument est configuré. |
--input-condition | - | Non | Chemin des cartes de profondeur personnalisées. Nous extrayons directement les cartes de profondeur des images vidéo sources avec MiDaS si cet argument n'est pas configuré |
--input-condition | - | Non | Chemin des cartes de profondeur personnalisées. Nous extrayons directement les cartes de profondeur des images vidéo sources avec MiDaS si cet argument n'est pas configuré. |
--reference-masks | - | Non | Chemin des masques de segmentation de l'image de référence, requis par AnyDoor . Nous extrairons automatiquement le masque de segmentation de l'image de référence si cet argument n'est pas configuré. |
--image-guidance-scale | 1.0 | Non | Hyper-paramètre requis par InstructPix2Pix. |
--kernel-size | 9 | Non | Taille du noyau de l'opération de dilatation binaire, pour garantir que les processus de collage couvrent les régions du contenu édité. |
--dilation-iteration | 1 | Non | Itération pour l’opération de dilatation binaire. |
--guidance-scale | 9.0 | Non | Échelle de guidage sans classificateur. |
--mixed-precision | bf16 | Non | Précision des modèles dans StableV2V. |
--n-sample-frames | 16 | Non | Nombre d'images vidéo de la vidéo éditée. |
--seed | 42 | Non | Graine aléatoire. |
Note
Quelques points spécifiques auxquels vous pouvez prêter une attention supplémentaire lors de l'inférence :
--image-editor-checkpoint-path
, le chemin sera automatiquement transmis à l'éditeur correspondant en fonction de votre --image-editor-type
. Alors ne vous inquiétez pas de certains arguments supplémentaires dans la base de code.Paint-by-Example
, InstructPix2Pix
, AnyDoor
, vous devez configurer l'argument --external-guidance
, qui correspond à l'image de référence et aux instructions de l'utilisateur en conséquence.xformers
, ce qui pourrait provoquer des artefacts dans les résultats produits. Ce problème pourrait être résolu à l’avenir si possible. StableV2V
Pour obtenir les croquis dessinés par l'homme, vous devez les dessiner manuellement sur des appareils externes tels qu'une tablette, puis exporter le résultat pour des utilisations ultérieures. On obtient notamment les croquis dessinés à la main sur l'application iPad Sketchbook
. Un exemple de croquis dessiné à la main pourrait ressembler à ceci :
ControlNet (scribble)
pour générer la première image modifiée Une fois que vous avez obtenu le croquis dessiné à la main, l'étape suivante consiste à obtenir le premier cadre modifié. Ce faisant, nous utilisons ControlNet (scribble)
, où vous devez préparer à l'avance les poids des modèles de ControlNet (scribble)
et SD Inpaint
. Supposons que nous placions les croquis précédemment dessinés à la main dans inputs/hand-drawn-sketches
, vous pouvez exécuter la ligne de commande suivante en exécutant 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
Le résultat pourrait ressembler à ceci :
Enfin, vous êtes prêt à générer l’intégralité de la vidéo éditée. Nous proposons un exemple de ligne de commande comme suit :
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
En configurant le --edited-first-frame
, la base de code ignorera automatiquement le processus d'édition de la première image, où nous visualisons la vidéo source et la vidéo éditée ci-dessous :
<Retour à la table des matières>
StableV2V
Avant de peindre la première image vidéo, nous vous recommandons de dilater le masque de segmentation annoté (le cas échéant) à l'aide du script suivant :
python scripts/run_dilate_mask.py --input-folder inputs/masks/car-turn.png --output-folder inputs/dilated-masks --kernel-size 15 --iterations 1
Les masques originaux (à gauche) et dilatés (à droite) pourraient ressembler à :
IOPaint
pour générer le premier cadre peint Nous vous recommandons d'utiliser la bibliothèque IOPaint
pour une utilisation pratique. Pour l'installer, vous pouvez simplement exécuter :
pip install iopaint
Ensuite, vous pouvez exécuter LaMa
via la bibliothèque :
iopaint run --model=lama --image inputs/frames/car-turn/00000.jpg --mask inputs/dilated-masks/car-turn.png --output inputs/edited-first-frames/
Les premiers cadres originaux et peints pourraient ressembler à :
Enfin, vous êtes prêt à générer l’intégralité de la vidéo éditée. Nous proposons un exemple de ligne de commande comme suit :
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
En configurant le --edited-first-frame
, la base de code ignorera automatiquement le processus d'édition de la première image, où nous visualisons la vidéo source et la vidéo éditée ci-dessous :
<Retour à la table des matières>
StableV2V
(démo Gradio) Nous proposons également une démo gradio pour essayer StableV2V
via une interface utilisateur interactive. Avant de partir, nous vous recommandons de suivre les instructions de cette section pour préparer localement tous les poids de modèle requis (dans le dossier ./checkpoints
). Ensuite, n'hésitez pas à le tester en exécutant simplement :
python app.py
Dans la figure suivante, nous illustrons les fonctions des différents modules de notre démo Gradio :
N'hésitez pas à créer un nouveau numéro ou à proposer un PR si vous avez d'autres questions sur la démo.
<Retour à la table des matières>
DAVIS-Edit
Nous construisons DAVIS-Edit
en suivant la même structure de données que celle de DAVIS
, comme indiqué ci-dessous :
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
Plus précisément, edited_video_caption_dict_image.json
et edited_video_caption_dict_text.json
sont construits comme un dictionnaire Python, avec ses clés comme noms de dossiers vidéo dans JPEGImages
. Par exemple dans 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 "
},
# ...
}
Les annotations des images de référence contiennent deux sous-dossiers, c'est-à-dire similar
et changing
, correspondant respectivement aux annotations pour DAVIS-Edit-S
et DAVIS-Edit-C
, où la structure est construite dans le même nom de dossier que celui de JPEGImages
.
Nous vous recommandons fortement d'indexer les différents éléments dans DAVIS-Edit
via les fichiers d'annotations . En particulier, vous pouvez vous référer au script ci-dessous :
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)
<Retour à la table des matières>
YouTube-VOS
Nous utilisons YouTube-VOS
pour mener le processus de formation de notre réseau de raffinement en profondeur guidé par la forme. Avant de commencer le processus de formation, vous devez d'abord télécharger ses vidéos sources et ses annotations à partir de ce lien. Une fois téléchargées, les données suivent les structures ci-dessous :
youtube-vos
├── JPEGImages <----- Path of source video frames
├── Annotations <----- Path of segmentation masks
└── meta.json <----- Annotation file for the segmentation masks
MiDaS
pour annoter les cartes de profondeur Une fois les images vidéo prêtes, l’étape suivante consiste à annoter les cartes de profondeur correspondantes. Plus précisément, assurez-vous de télécharger les poids du modèle MiDaS
à partir de ce lien. Ensuite, vous pouvez exécuter les lignes de commande suivantes avec notre script automatique :
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
pour annoter les masques de forme de la première image Notre réseau d'affinement de la profondeur utilise un canal réseau supplémentaire pour prendre le masque de forme de la première image comme guide. Vous devez donc les annoter pour l'ensemble de données YouTube-VOS
. Tout d’abord, assurez-vous de télécharger les poids du modèle U2-Net
à partir de ce lien. Ensuite, vous exécutez les lignes de commande suivantes avec notre script automatique :
python scripts/extract_youtube_vos_shapes.py --video-root data/youtube-vos/JPEGImages --model-dir checkpoints/u2net.pth --outdir data/youtube-vos/FirstFrameMasks
Enfin, vous êtes prêt à exécuter le processus de formation avec la ligne de commande suivante :
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
Les poids du modèle entraîné seront enregistrés dans results/checkpoints
, et les visualisations des résultats intermédiaires peuvent être vérifiées via tensorboard
, avec les journaux enregistrés dans results/tensorboard
.
<Retour à la table des matières>
Veuillez vous référer à notre page de projet pour plus de résultats et de comparaisons effectuées par StableV2V
.
<Retour à la table des matières>
Si vous trouvez ce travail utile pour votre recherche, ou si vous utilisez notre référence de test DAVIS-Edit
, veuillez citer notre article :
@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},
}
<Retour à la table des matières>
<Retour à la table des matières>
Ce dépôt est fortement modifié en fonction de Diffusers, Ctrl-Adapter, AnyDoor et RAFT. Nous remercions sincèrement les auteurs pour leurs implémentations fantastiques.
<Retour à la table des matières>