| import os |
| import argparse |
| from PIL import Image |
| import json |
| from moviepy.editor import VideoFileClip |
| import numpy as np |
|
|
| import black_box_image_edit as image_edit |
|
|
| def infer_video(model, video_path, output_dir, prompt, prompt_type="instruct", force_512=False, seed=42, negative_prompt="", overwrite=False): |
| """ |
| Processes videos from the input directory, resizes them to 512x512 before feeding into the model by first frame, |
| and saves the processed video back to its original size in the output directory. |
| |
| Args: |
| model: The video editing model. |
| input_dir (str): Path to the directory containing input videos. |
| output_dir (str): Path to the directory where processed videos will be saved. |
| prompt (str): Instruction prompt for video editing. |
| """ |
|
|
| |
| if not os.path.exists(output_dir): |
| os.makedirs(output_dir) |
|
|
| video_clip = VideoFileClip(video_path) |
| video_filename = os.path.basename(video_path) |
| |
| |
| |
| |
| final_output_dir = output_dir |
| if not os.path.exists(final_output_dir): |
| os.makedirs(final_output_dir) |
|
|
| result_path = os.path.join(final_output_dir, prompt + ".png") |
|
|
| |
| if os.path.exists(result_path) and overwrite is False: |
| print(f"Result already exists: {result_path}") |
| return |
|
|
| def process_frame(image): |
| pil_image = Image.fromarray(image) |
| if force_512: |
| pil_image = pil_image.resize((512, 512), Image.LANCZOS) |
| if prompt_type == "instruct": |
| result = model.infer_one_image(pil_image, instruct_prompt=prompt, seed=seed, negative_prompt=negative_prompt) |
| else: |
| result = model.infer_one_image(pil_image, target_prompt=prompt, seed=seed, negative_prompt=negative_prompt) |
| if force_512: |
| result = result.resize(video_clip.size, Image.LANCZOS) |
| return np.array(result) |
| |
| |
| first_frame = video_clip.get_frame(0) |
| processed_frame = process_frame(first_frame) |
|
|
|
|
| |
| Image.fromarray(processed_frame).save(result_path) |
| print(f"Processed and saved the first frame: {result_path}") |
| return result_path |
|
|
|
|
| if __name__ == "__main__": |
| parser = argparse.ArgumentParser(description='Process some images.') |
| parser.add_argument('--model', type=str, default='instructpix2pix', choices=['magicbrush','instructpix2pix'], help='Name of the image editing model') |
| parser.add_argument('--video_path', type=str, required=False, help='Name of the video', default=None) |
| parser.add_argument('--input_dir', type=str, required=False, help='Directory containing the video', default="./demo/") |
| parser.add_argument('--output_dir', type=str, required=False, help='Directory to save the processed images', default=None) |
| parser.add_argument('--prompt', type=str, required=False, help='Instruction prompt for editing', default="turn the man into darth vader") |
| parser.add_argument('--force_512', action='store_true', help='Force resize to 512x512 when feeding into image model') |
| parser.add_argument('--dict_file', type=str, required=False, help='JSON file containing files, instructions etc.', default=None) |
| parser.add_argument('--seed', type=int, required=False, help='Seed for random number generator', default=42) |
| parser.add_argument('--negative_prompt', type=str, required=False, help='Negative prompt for editing', default=None) |
| args = parser.parse_args() |
|
|
| if args.negative_prompt is None: |
| negative_prompt = "worst quality, normal quality, low quality, low res, blurry, watermark, jpeg artifacts" |
| else: |
| negative_prompt = args.negative_prompt |
| |
| if args.dict_file: |
| with open(args.dict_file, 'r') as json_file: |
| folders_info = json.load(json_file) |
|
|
| for video_name, video_infos in folders_info.items(): |
| input_dir = args.input_dir |
| video_path = os.path.join(input_dir, video_name) |
|
|
| for video_info in video_infos: |
| model_name = video_info.get('image_model', None) |
| instruction = video_info.get('instruction', None) |
| target_caption = video_info.get('target_caption', None) |
|
|
| if instruction is None and target_caption is None: |
| continue |
|
|
| if model_name == 'magicbrush': |
| model = image_edit.MagicBrush() |
| prompt_type = "instruct" |
| prompt = instruction |
| elif model_name == 'instructpix2pix': |
| model = image_edit.InstructPix2Pix() |
| prompt_type = "instruct" |
| prompt = instruction |
|
|
| if args.output_dir is None: |
| video_filename = os.path.basename(video_path) |
| filename_noext = os.path.splitext(video_filename)[0] |
| output_dir = os.path.dirname(video_path) |
| else: |
| output_dir = args.output_dir |
|
|
| infer_video(model, video_path, output_dir, prompt, prompt_type, args.force_512, args.seed, negative_prompt) |
| else: |
| if args.model == 'magicbrush': |
| model = image_edit.MagicBrush() |
| prompt_type = "instruct" |
| elif args.model == 'instructpix2pix': |
| model = image_edit.InstructPix2Pix() |
| prompt_type = "instruct" |
|
|
| video_path = args.video_path |
| |
| if args.output_dir is None: |
| video_filename = os.path.basename(video_path) |
| filename_noext = os.path.splitext(video_filename)[0] |
| output_dir = os.path.dirname(video_path) |
| else: |
| output_dir = args.output_dir |
| |
| print("video_filename", video_filename) |
| print("output_dir", output_dir) |
|
|
| infer_video(model, video_path, output_dir, args.prompt, prompt_type, args.force_512, args.seed, negative_prompt) |
|
|