diff --git a/.gitignore b/.gitignore index a922caf8..e2a6c92d 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,5 @@ scripts/deforum_helpers/navigation.py #test output htmlcov tests/results.xml -.coverage* \ No newline at end of file +.coverage* +serverlog.txt diff --git a/requirements-dev.txt b/requirements-dev.txt index c79daa3e..37ab3b59 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -3,3 +3,4 @@ syrupy pytest tenacity pydantic_requests +moviepy \ No newline at end of file diff --git a/scripts/deforum_api.py b/scripts/deforum_api.py index fdf74ec5..029f15fa 100644 --- a/scripts/deforum_api.py +++ b/scripts/deforum_api.py @@ -1,13 +1,19 @@ +import os import atexit import json import random import tempfile import traceback +import logging +import threading +import debugpy from concurrent.futures import ThreadPoolExecutor from dataclasses import dataclass, replace from datetime import datetime from typing import Any, Dict, List from deforum_api_models import Batch, DeforumJobErrorType, DeforumJobStatusCategory, DeforumJobPhase, DeforumJobStatus +from contextlib import contextmanager + import gradio as gr from deforum_helpers.args import (DeforumAnimArgs, DeforumArgs, @@ -15,9 +21,17 @@ from deforum_helpers.args import (DeforumAnimArgs, DeforumArgs, RootArgs, get_component_names) from fastapi import FastAPI, Response, status -from modules.shared import cmd_opts, opts +from modules.shared import cmd_opts, opts, state +log = logging.getLogger(__name__) +log_level = os.environ.get("DEFORUM_API_LOG_LEVEL") or os.environ.get("SD_WEBUI_LOG_LEVEL") or "INFO" +log.setLevel(log_level) +logging.basicConfig( + format='%(asctime)s %(levelname)s [%(name)s] %(message)s', + datefmt='%Y-%m-%d %H:%M:%S', +) + def make_ids(job_count: int): batch_id = f"batch({random.randint(0, 1e9)})" job_ids = [f"{batch_id}-{i}" for i in range(job_count)] @@ -33,37 +47,48 @@ def get_default_value(name:str): else: return None -def run_deforum_batch(batch_id : str, deforum_settings : List[Any] ): - print("started run_deforum_batch") +def run_deforum_batch(batch_id: str, job_ids: [str], deforum_settings_files: List[Any], opts_overrides: Dict[str, Any] = None): + log.info(f"Starting batch {batch_id} in thread {threading.get_ident()}.") + try: + with A1111OptionsOverrider(opts_overrides): + # Fill deforum args with default values. + # We are overriding everything with the batch files, but some values are eagerly validated, so must appear valid. + component_names = get_component_names() + prefixed_gradio_args = 2 + expected_arg_count = prefixed_gradio_args + len(component_names) + run_deforum_args = [None] * expected_arg_count + for idx, name in enumerate(component_names): + run_deforum_args[prefixed_gradio_args + idx] = get_default_value(name) - # Fill args with default values. - # We are overriding everything with the batch files, but some values are eagerly validated, so must appear valid. - component_names = get_component_names() - prefixed_gradio_args = 2 - expected_arg_count = prefixed_gradio_args + len(component_names) - run_deforum_args = [None] * expected_arg_count - for idx, name in enumerate(component_names): - run_deforum_args[prefixed_gradio_args + idx] = get_default_value(name) + # For some values, defaults don't pass validation... + run_deforum_args[prefixed_gradio_args + component_names.index('animation_prompts')] = '{"0":"dummy value"}' + run_deforum_args[prefixed_gradio_args + component_names.index('animation_prompts_negative')] = '' - # For some values, defaults don't pass validation... - run_deforum_args[prefixed_gradio_args + component_names.index('animation_prompts')] = '{"0":"dummy value"}' - run_deforum_args[prefixed_gradio_args + component_names.index('animation_prompts_negative')] = '' + # Arg 0 is a UID for the batch + run_deforum_args[0] = batch_id - # Arg 0 is a UID for the batch - run_deforum_args[0] = batch_id + # Setup batch override + run_deforum_args[prefixed_gradio_args + component_names.index('override_settings_with_file')] = True + run_deforum_args[prefixed_gradio_args + component_names.index('custom_settings_file')] = deforum_settings_files - # Setup batch override - run_deforum_args[prefixed_gradio_args + component_names.index('override_settings_with_file')] = True - run_deforum_args[prefixed_gradio_args + component_names.index('custom_settings_file')] = deforum_settings + # Cleanup old state from previously cancelled jobs + # WARNING: not thread safe because state is global. If we ever run multiple batches in parallel, this will need to be reworked. + state.skipped = False + state.interrupted = False - # Invoke deforum with appropriate args - from deforum_helpers.run_deforum import run_deforum - run_deforum(*run_deforum_args) + # Invoke deforum with appropriate args + from deforum_helpers.run_deforum import run_deforum + run_deforum(*run_deforum_args) + + except Exception as e: + log.error(f"Batch {batch_id} failed: {e}") + traceback.print_exc() + for job_id in job_ids: + # Mark all jobs in this batch as failed + JobStatusTracker().fail_job(job_id, 'TERMINAL', {e}) - -# # API to allow a batch of jobs to be submitted to the deforum pipeline. # A batch is settings object OR a list of settings objects. # A settings object is the JSON structure you can find in your saved settings.txt files. @@ -87,6 +112,7 @@ def deforum_api(_: gr.Blocks, app: FastAPI): apiState = ApiState() + # Submit a new batch @app.post("/deforum_api/batches") async def run_batch(batch: Batch, response: Response): @@ -97,6 +123,7 @@ def deforum_api(_: gr.Blocks, app: FastAPI): return {"message": "No settings files provided. Please provide an element 'deforum_settings' of type list in the request JSON payload."} if not isinstance(deforum_settings_data, list): + # Allow input deforum_settings to be top-level object as well as single object list deforum_settings_data = [deforum_settings_data] deforum_settings_tempfiles = [] @@ -110,38 +137,94 @@ def deforum_api(_: gr.Blocks, app: FastAPI): [batch_id, job_ids] = make_ids(job_count) apiState.submit_job(batch_id, job_ids, deforum_settings_tempfiles, batch.options_overrides) - for job_id in job_ids: - JobStatusTracker().accept_job(batch_id=batch_id, job_id=job_id) + for idx, job_id in enumerate(job_ids): + JobStatusTracker().accept_job(batch_id=batch_id, job_id=job_id, deforum_settings=deforum_settings_data[idx], options_overrides=batch.options_overrides) response.status_code = status.HTTP_202_ACCEPTED return {"message": "Job(s) accepted", "batch_id": batch_id, "job_ids": job_ids } + # List all batches and theit job ids + @app.get("/deforum_api/batches") + async def list_batches(id: str): + return JobStatusTracker().batches + # Show the details of all jobs in a batch @app.get("/deforum_api/batches/{id}") - async def get_batch(id: str): + async def get_batch(id: str, response: Response): jobsForBatch = JobStatusTracker().batches[id] + if not jobsForBatch: + response.status_code = status.HTTP_404_NOT_FOUND + return {"id": id, "status": "NOT FOUND"} return [JobStatusTracker().get(job_id) for job_id in jobsForBatch] - ## TODO ## + # Cancel all jobs in a batch @app.delete("/deforum_api/batches/{id}") - async def stop_batch(id: str, response: Response): - response.status_code = status.HTTP_501_NOT_IMPLEMENTED - return {"id": id, "status": "NOT IMPLEMENTED"} + async def cancel_batch(id: str, response: Response): + jobsForBatch = JobStatusTracker().batches[id] + cancelled_jobs = [] + if not jobsForBatch: + response.status_code = status.HTTP_404_NOT_FOUND + return {"id": id, "status": "NOT FOUND"} + for job_id in jobsForBatch: + try: + cancelled = _cancel_job(job_id) + if cancelled: + cancelled_jobs.append(job_id) + except: + log.warning(f"Failed to cancel job {job_id}") + + return {"ids": cancelled_jobs, "message:": f"{len(cancelled_jobs)} job(s) cancelled." } + # Show details of all jobs across al batches @app.get("/deforum_api/jobs") async def list_jobs(): return JobStatusTracker().statuses + # Show details of a single job @app.get("/deforum_api/jobs/{id}") - async def get_job(id: str): - return JobStatusTracker().get(id) + async def get_job(id: str, response: Response): + jobStatus = JobStatusTracker().get(id) + if not jobStatus: + response.status_code = status.HTTP_404_NOT_FOUND + return {"id": id, "status": "NOT FOUND"} + return jobStatus - ## TODO ## + # Cancel a single job @app.delete("/deforum_api/jobs/{id}") - async def stop_job(id: str, response: Response): - response.status_code = status.HTTP_501_NOT_IMPLEMENTED - return {"id": id, "status": "NOT IMPLEMENTED"} + async def cancel_job(id: str, response: Response): + debugpy.breakpoint() + try: + if _cancel_job(id): + return {"id": id, "message": "Job cancelled."} + else: + response.status_code = status.HTTP_400_BAD_REQUEST + return {"id": id, "message": f"Job with ID {id} not in a cancellable state. Has it already finished?"} + except FileNotFoundError as e: + response.status_code = status.HTTP_404_NOT_FOUND + return {"id": id, "message": f"Job with ID {id} not found."} + # Shared logic for job cancellation + def _cancel_job(job_id:str): + jobStatus = JobStatusTracker().get(job_id) + if not jobStatus: + raise FileNotFoundError(f"Job {job_id} not found.") + + if jobStatus.status != DeforumJobStatusCategory.ACCEPTED: + # Ignore jobs in completed state (error or success) + return False + + if job_id in ApiState().submitted_jobs: + # Remove job from queue + ApiState().submitted_jobs[job_id].cancel() + if jobStatus.phase != DeforumJobPhase.QUEUED and jobStatus.phase != DeforumJobPhase.DONE: + # Job must be actively running - interrupt it. + # WARNING: + # - Possible race condition: if job_id just finished after the check and another started, we'll interrupt the wrong job. + # - Not thread safe because State object is global. Will break with concurrent jobs. + state.interrupt() + JobStatusTracker().cancel_job(job_id, "Cancelled due to user request.") + return True + class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs): @@ -151,50 +234,56 @@ class Singleton(type): # Maintains persistent state required by API, e.g. thread pook, list of submitted jobs. class ApiState(metaclass=Singleton): - deforum_api_executor = ThreadPoolExecutor(max_workers=5) + + ## Locking concurrency to 1. Concurrent generation does seem to work, but it's not clear if it's safe. + ## TODO: more experimentation required. + deforum_api_executor = ThreadPoolExecutor(max_workers=1) submitted_jobs : Dict[str, Any] = {} @staticmethod def cleanup(): ApiState().deforum_api_executor.shutdown(wait=False) - def submit_job(self, batch_id: str, job_ids: [str], deforum_settings: List[Any], opts_overrides: Dict[str, Any] ): - def task(): - print("started task") - try: - if opts_overrides is not None and len(opts_overrides)>1: - original_opts = {k: opts.data[k] for k in opts_overrides.keys() if k in opts.data} - print(f"Captured options to override: {original_opts}") - print(f"Overriding with: {opts_overrides}") - for k, v in opts_overrides.items(): - setattr(opts, k, v) - run_deforum_batch(batch_id, deforum_settings) - except Exception as e: - print(f"Batch {batch_id} failed: {e}") - traceback.print_exc() - # Mark all jobs in this batch as failed - for job_id in job_ids: - JobStatusTracker().fail_job(job_id, 'TERMINAL', {e}) - finally: - if (original_opts is not None): - print(f"Restoring options") - for k, v in original_opts.items(): - setattr(opts, k, v) - - - print("submitting task") - future = self.deforum_api_executor.submit(task) + def submit_job(self, batch_id: str, job_ids: [str], deforum_settings: List[Any], opts_overrides: Dict[str, Any]): + log.debug(f"Submitting batch {batch_id} to threadpool.") + future = self.deforum_api_executor.submit(lambda: run_deforum_batch(batch_id, job_ids, deforum_settings, opts_overrides)) self.submitted_jobs[batch_id] = future atexit.register(ApiState.cleanup) + +class A1111OptionsOverrider(object): + def __init__(self, opts_overrides: Dict[str, Any]): + self.opts_overrides = opts_overrides + + def __enter__(self): + if self.opts_overrides is not None and len(self.opts_overrides)>1: + self.original_opts = {k: opts.data[k] for k in self.opts_overrides.keys() if k in opts.data} + log.debug(f"Captured options to override: {self.original_opts}") + log.info(f"Setting options: {self.opts_overrides}") + for k, v in self.opts_overrides.items(): + setattr(opts, k, v) + else: + self.original_opts = None + return self + + def __exit__(self, exception_type, exception_value, traceback): + if (exception_type is not None): + log.warning(f"Error during batch execution: {exception_type} - {exception_value}") + log.debug(f"{traceback}") + if (self.original_opts is not None): + log.info(f"Restoring options: {self.original_opts}") + for k, v in self.original_opts.items(): + setattr(opts, k, v) + + # Maintains state that tracks status of submitted jobs, # so that clients can query job status. class JobStatusTracker(metaclass=Singleton): statuses: Dict[str, DeforumJobStatus] = {} batches: Dict[str, List[str]] = {} - def accept_job(self, batch_id : str, job_id: str): + def accept_job(self, batch_id : str, job_id: str, deforum_settings : List[Dict[str, Any]] , options_overrides : Dict[str, Any]): if batch_id in self.batches: self.batches[batch_id].append(job_id) else: @@ -214,7 +303,9 @@ class JobStatusTracker(metaclass=Singleton): updates=0, message=None, outdir=None, - timestring=None + timestring=None, + deforum_settings=deforum_settings, + options_overrides=options_overrides, ) def update_phase(self, job_id: str, phase: DeforumJobPhase, progress: float = 0): @@ -279,15 +370,31 @@ class JobStatusTracker(metaclass=Singleton): ) self.statuses[job_id] = new_status + def cancel_job(self, job_id: str, message: str): + if job_id in self.statuses: + current_status = self.statuses[job_id] + now = datetime.now().timestamp() + new_status = replace( + current_status, + status=DeforumJobStatusCategory.CANCELLED, + message=message, + last_updated=now, + execution_time=now-current_status.started_at, + update_interval_time=now-current_status.last_updated, + updates=current_status.updates+1 + ) + self.statuses[job_id] = new_status + + def get(self, job_id:str): - return self.statuses[job_id] + return self.statuses[job_id] if job_id in self.statuses else None def deforum_init_batch(_: gr.Blocks, app: FastAPI): settings_files = [open(filename, 'r') for filename in cmd_opts.deforum_run_now.split(",")] [batch_id, job_ids] = make_ids(len(settings_files)) - print(f"Starting batch with job(s) {job_ids}...") + log.info(f"Starting init batch {batch_id} with job(s) {job_ids}...") - run_deforum_batch(batch_id, settings_files) + run_deforum_batch(batch_id, job_ids, settings_files, None) if cmd_opts.deforum_terminate_after_run_now: import os diff --git a/scripts/deforum_api_models.py b/scripts/deforum_api_models.py index 270a8701..6018f267 100644 --- a/scripts/deforum_api_models.py +++ b/scripts/deforum_api_models.py @@ -11,6 +11,7 @@ class DeforumJobStatusCategory(str, Enum): ACCEPTED = "ACCEPTED" SUCCEEDED = "SUCCEEDED" FAILED = "FAILED" + CANCELLED = "CANCELLED" class DeforumJobPhase(str, Enum): QUEUED = "QUEUED" @@ -38,4 +39,6 @@ class DeforumJobStatus(BaseModel): updates: int # number of status updates so far message: Optional[str] outdir: Optional[str] - timestring: Optional[str] \ No newline at end of file + timestring: Optional[str] + deforum_settings : Optional[List[Dict[str, Any]]] + options_overrides : Optional[Dict[str, Any]] \ No newline at end of file diff --git a/scripts/deforum_helpers/run_deforum.py b/scripts/deforum_helpers/run_deforum.py index cb786a9a..1943a2da 100644 --- a/scripts/deforum_helpers/run_deforum.py +++ b/scripts/deforum_helpers/run_deforum.py @@ -189,7 +189,7 @@ def run_deforum(*args): cn_inputframes_list = [os.path.join(args.outdir, f'controlnet_{i}_inputframes') for i in range(1, num_of_models + 1)] handle_cn_frames_deletion(cn_inputframes_list) - root.initial_info += f"\n The animation is stored in {args.outdir}" + root.initial_info = (root.initial_info or " ") + f"\n The animation is stored in {args.outdir}" reset_frames_cache(root) # cleanup the RAM in any case processed = Processed(p, [root.first_frame], 0, root.initial_info) @@ -201,6 +201,7 @@ def run_deforum(*args): persistent_sett_path = shared.opts.data.get("deforum_persistent_settings_path") save_settings_from_animation_run(args, anim_args, parseq_args, loop_args, controlnet_args, video_args, root, persistent_sett_path) - JobStatusTracker().complete_job(root.job_id) + if (not shared.state.interrupted): + JobStatusTracker().complete_job(root.job_id) return processed.images, root.timestring, generation_info_js, processed.info diff --git a/scripts/deforum_helpers/video_audio_utilities.py b/scripts/deforum_helpers/video_audio_utilities.py index 62c10eda..14eefcf8 100644 --- a/scripts/deforum_helpers/video_audio_utilities.py +++ b/scripts/deforum_helpers/video_audio_utilities.py @@ -137,18 +137,18 @@ def is_vid_path_valid(video_path): if video_path.startswith('http://') or video_path.startswith('https://'): response = requests.head(video_path, allow_redirects=True) if response.status_code == 404: - raise ConnectionError("Video URL is not valid. Response status code: {}".format(response.status_code)) + raise ConnectionError(f"Video URL {video_path} is not valid. Response status code: {response.status_code}") elif response.status_code == 302: response = requests.head(response.headers['location'], allow_redirects=True) if response.status_code != 200: - raise ConnectionError("Video URL is not valid. Response status code: {}".format(response.status_code)) + raise ConnectionError(f"Video URL {video_path} is not valid. Response status code: {response.status_code}") if extension not in file_formats: - raise ValueError("Video file format '{}' not supported. Supported formats are: {}".format(extension, file_formats)) + raise ValueError(f"Video file {video_path} has format '{extension}', which not supported. Supported formats are: {file_formats}") else: if not os.path.exists(video_path): - raise RuntimeError("Video path does not exist.") + raise RuntimeError(f"Video path does not exist: {video_path}") if extension not in file_formats: - raise ValueError("Video file format '{}' not supported. Supported formats are: {}".format(extension, file_formats)) + raise ValueError(f"Video file {video_path} has format '{extension}', which is not supported. Supported formats are: {file_formats}") return True # quick-retreive frame count, FPS and H/W dimensions of a video (local or URL-based) diff --git a/tests/__snapshots__/deforum_postprocess_test.ambr b/tests/__snapshots__/deforum_postprocess_test.ambr new file mode 100644 index 00000000..c464f624 --- /dev/null +++ b/tests/__snapshots__/deforum_postprocess_test.ambr @@ -0,0 +1,181 @@ +# serializer version: 1 +# name: test_post_process_FILM + ''' + 1 + 00:00:00,000 --> 00:00:00,050 + F#: 0; Cadence: false; Seed: 1; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.002; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 2 + 00:00:00,050 --> 00:00:00,100 + F#: 1; Cadence: false; Seed: 2; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 3 + 00:00:00,100 --> 00:00:00,150 + F#: 2; Cadence: false; Seed: 3; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 4 + 00:00:00,150 --> 00:00:00,200 + F#: 3; Cadence: false; Seed: 4; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 5 + 00:00:00,200 --> 00:00:00,250 + F#: 4; Cadence: false; Seed: 5; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 6 + 00:00:00,250 --> 00:00:00,300 + F#: 5; Cadence: false; Seed: 6; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 7 + 00:00:00,300 --> 00:00:00,350 + F#: 6; Cadence: false; Seed: 7; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 8 + 00:00:00,350 --> 00:00:00,400 + F#: 7; Cadence: false; Seed: 8; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 9 + 00:00:00,400 --> 00:00:00,450 + F#: 8; Cadence: false; Seed: 9; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 10 + 00:00:00,450 --> 00:00:00,500 + F#: 9; Cadence: false; Seed: 10; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + + ''' +# --- +# name: test_post_process_RIFE + ''' + 1 + 00:00:00,000 --> 00:00:00,050 + F#: 0; Cadence: false; Seed: 1; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.002; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 2 + 00:00:00,050 --> 00:00:00,100 + F#: 1; Cadence: false; Seed: 2; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 3 + 00:00:00,100 --> 00:00:00,150 + F#: 2; Cadence: false; Seed: 3; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 4 + 00:00:00,150 --> 00:00:00,200 + F#: 3; Cadence: false; Seed: 4; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 5 + 00:00:00,200 --> 00:00:00,250 + F#: 4; Cadence: false; Seed: 5; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 6 + 00:00:00,250 --> 00:00:00,300 + F#: 5; Cadence: false; Seed: 6; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 7 + 00:00:00,300 --> 00:00:00,350 + F#: 6; Cadence: false; Seed: 7; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 8 + 00:00:00,350 --> 00:00:00,400 + F#: 7; Cadence: false; Seed: 8; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 9 + 00:00:00,400 --> 00:00:00,450 + F#: 8; Cadence: false; Seed: 9; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 10 + 00:00:00,450 --> 00:00:00,500 + F#: 9; Cadence: false; Seed: 10; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + + ''' +# --- +# name: test_post_process_UPSCALE + ''' + 1 + 00:00:00,000 --> 00:00:00,050 + F#: 0; Cadence: false; Seed: 1; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.002; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 2 + 00:00:00,050 --> 00:00:00,100 + F#: 1; Cadence: false; Seed: 2; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 3 + 00:00:00,100 --> 00:00:00,150 + F#: 2; Cadence: false; Seed: 3; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 4 + 00:00:00,150 --> 00:00:00,200 + F#: 3; Cadence: false; Seed: 4; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 5 + 00:00:00,200 --> 00:00:00,250 + F#: 4; Cadence: false; Seed: 5; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 6 + 00:00:00,250 --> 00:00:00,300 + F#: 5; Cadence: false; Seed: 6; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 7 + 00:00:00,300 --> 00:00:00,350 + F#: 6; Cadence: false; Seed: 7; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 8 + 00:00:00,350 --> 00:00:00,400 + F#: 7; Cadence: false; Seed: 8; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 9 + 00:00:00,400 --> 00:00:00,450 + F#: 8; Cadence: false; Seed: 9; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 10 + 00:00:00,450 --> 00:00:00,500 + F#: 9; Cadence: false; Seed: 10; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + + ''' +# --- +# name: test_post_process_UPSCALE_FILM + ''' + 1 + 00:00:00,000 --> 00:00:00,050 + F#: 0; Cadence: false; Seed: 1; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.002; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 2 + 00:00:00,050 --> 00:00:00,100 + F#: 1; Cadence: false; Seed: 2; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 3 + 00:00:00,100 --> 00:00:00,150 + F#: 2; Cadence: false; Seed: 3; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 4 + 00:00:00,150 --> 00:00:00,200 + F#: 3; Cadence: false; Seed: 4; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 5 + 00:00:00,200 --> 00:00:00,250 + F#: 4; Cadence: false; Seed: 5; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 6 + 00:00:00,250 --> 00:00:00,300 + F#: 5; Cadence: false; Seed: 6; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 7 + 00:00:00,300 --> 00:00:00,350 + F#: 6; Cadence: false; Seed: 7; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 8 + 00:00:00,350 --> 00:00:00,400 + F#: 7; Cadence: false; Seed: 8; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 9 + 00:00:00,400 --> 00:00:00,450 + F#: 8; Cadence: false; Seed: 9; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 10 + 00:00:00,450 --> 00:00:00,500 + F#: 9; Cadence: false; Seed: 10; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + + ''' +# --- diff --git a/tests/__snapshots__/deforum_test.ambr b/tests/__snapshots__/deforum_test.ambr index 464ef22e..b51ffbc1 100644 --- a/tests/__snapshots__/deforum_test.ambr +++ b/tests/__snapshots__/deforum_test.ambr @@ -1,4 +1,49 @@ # serializer version: 1 +# name: test_3d_mode + ''' + 1 + 00:00:00,000 --> 00:00:00,050 + F#: 0; Cadence: false; Seed: 1; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.002; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 2 + 00:00:00,050 --> 00:00:00,100 + F#: 1; Cadence: false; Seed: 2; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 3 + 00:00:00,100 --> 00:00:00,150 + F#: 2; Cadence: false; Seed: 3; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 4 + 00:00:00,150 --> 00:00:00,200 + F#: 3; Cadence: false; Seed: 4; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 5 + 00:00:00,200 --> 00:00:00,250 + F#: 4; Cadence: false; Seed: 5; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 6 + 00:00:00,250 --> 00:00:00,300 + F#: 5; Cadence: false; Seed: 6; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 7 + 00:00:00,300 --> 00:00:00,350 + F#: 6; Cadence: false; Seed: 7; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 8 + 00:00:00,350 --> 00:00:00,400 + F#: 7; Cadence: false; Seed: 8; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 9 + 00:00:00,400 --> 00:00:00,450 + F#: 8; Cadence: false; Seed: 9; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 10 + 00:00:00,450 --> 00:00:00,500 + F#: 9; Cadence: false; Seed: 10; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + + ''' +# --- # name: test_simple_settings ''' 1 @@ -42,5 +87,75 @@ F#: 9; Cadence: false; Seed: 10; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + ''' +# --- +# name: test_with_hybrid_video + ''' + 1 + 00:00:00,000 --> 00:00:00,050 + F#: 0; Cadence: false; Seed: 1; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.002; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 2 + 00:00:00,050 --> 00:00:00,100 + F#: 1; Cadence: false; Seed: 2; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 3 + 00:00:00,100 --> 00:00:00,150 + F#: 2; Cadence: false; Seed: 3; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: -1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 4 + 00:00:00,150 --> 00:00:00,200 + F#: 3; Cadence: false; Seed: 4; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + 5 + 00:00:00,200 --> 00:00:00,250 + F#: 4; Cadence: false; Seed: 5; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 1; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 1; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: tiny cute swamp bunny, highly detailed, intricate, ultra hd, sharp photo, crepuscular rays, in focus, by tomasz alen kopera --neg + + + ''' +# --- +# name: test_with_parseq_inline + ''' + 1 + 00:00:00,000 --> 00:00:00,050 + F#: 0; Cadence: false; Seed: 1; Angle: 0; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.002; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 55; SubSStrSch: 0; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 55; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: Parseq prompt! --neg neg parseq prompt! + + 2 + 00:00:00,050 --> 00:00:00,100 + F#: 1; Cadence: false; Seed: 56; Angle: 30.111; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 56; SubSStrSch: 0.100; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 55.100; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: Parseq prompt! --neg neg parseq prompt! + + 3 + 00:00:00,100 --> 00:00:00,150 + F#: 2; Cadence: false; Seed: 56; Angle: 14.643; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 56; SubSStrSch: 0.200; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 55.200; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: Parseq prompt! --neg neg parseq prompt! + + 4 + 00:00:00,150 --> 00:00:00,200 + F#: 3; Cadence: false; Seed: 56; Angle: -8.348; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 56; SubSStrSch: 0.300; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 55.300; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: Parseq prompt! --neg neg parseq prompt! + + 5 + 00:00:00,200 --> 00:00:00,250 + F#: 4; Cadence: false; Seed: 56; Angle: -27.050; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.003; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 56; SubSStrSch: 0.400; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 55.400; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: Parseq prompt! --neg neg parseq prompt! + + 6 + 00:00:00,250 --> 00:00:00,300 + F#: 5; Cadence: false; Seed: 56; Angle: -31.856; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 56; SubSStrSch: 0.500; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 55.500; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: Parseq prompt! --neg neg parseq prompt! + + 7 + 00:00:00,300 --> 00:00:00,350 + F#: 6; Cadence: false; Seed: 56; Angle: -20.298; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 56; SubSStrSch: 0.600; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 55.600; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: Parseq prompt! --neg neg parseq prompt! + + 8 + 00:00:00,350 --> 00:00:00,400 + F#: 7; Cadence: false; Seed: 56; Angle: 1.688; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 56; SubSStrSch: 0.700; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 55.700; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: Parseq prompt! --neg neg parseq prompt! + + 9 + 00:00:00,400 --> 00:00:00,450 + F#: 8; Cadence: false; Seed: 56; Angle: 22.806; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 56; SubSStrSch: 0.800; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 55.800; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: Parseq prompt! --neg neg parseq prompt! + + 10 + 00:00:00,450 --> 00:00:00,500 + F#: 9; Cadence: false; Seed: 56; Angle: 32.209; Tr.C.X: 0.500; Tr.C.Y: 0.500; Zoom: 1.004; TrX: 0; TrY: 0; TrZ: 0; RotX: 0; RotY: 0; RotZ: 0; PerFlT: 0; PerFlP: 0; PerFlG: 0; PerFlFV: 53; Noise: 0.040; StrSch: 0.650; CtrstSch: 1; CFGSch: 7; P2PCfgSch: 1.500; SubSSch: 56; SubSStrSch: 0.900; CkptSch: model1.ckpt; StepsSch: 25; SeedSch: 55.900; SamplerSchedule: Euler a; ClipskipSchedule: 2; NoiseMultiplierSchedule: 1.050; MaskSchedule: {video_mask}; NoiseMaskSchedule: {video_mask}; AmountSchedule: 0.050; KernelSchedule: 5; SigmaSchedule: 1; ThresholdSchedule: 0; AspectRatioSchedule: 1; FieldOfViewSchedule: 70; NearSchedule: 200; CadenceFlowFactorSchedule: 1; RedoFlowFactorSchedule: 1; FarSchedule: 10000; HybridCompAlphaSchedule: 0.500; HybridCompMaskBlendAlphaSchedule: 0.500; HybridCompMaskContrastSchedule: 1; HybridCompMaskAutoContrastCutoffHighSchedule: 100; HybridCompMaskAutoContrastCutoffLowSchedule: 0; HybridFlowFactorSchedule: 1; Prompt: Parseq prompt! --neg neg parseq prompt! + + ''' # --- diff --git a/tests/conftest.py b/tests/conftest.py index e197dd25..963fe7b1 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,31 +1,59 @@ import pytest import subprocess +import sys +import os +from subprocess import Popen, PIPE, STDOUT +from pathlib import Path from tenacity import retry, stop_after_delay, wait_fixed +import threading import requests - def pytest_addoption(parser): - parser.addoption("--start-server", action="store_true", help="start the server before the test run (if not specified you must start the server manually)") + parser.addoption("--start-server", action="store_true", help="start the server before the test run (if not specified, you must start the server manually)") @pytest.fixture def cmdopt(request): return request.config.getoption("--start-server") - @retry(wait=wait_fixed(5), stop=stop_after_delay(60)) def wait_for_service(url): - response = requests.get(url) + response = requests.get(url, timeout=(5, 5)) + print(f"Waiting for server to respond 200 at {url} (response: {response.status_code})...") assert response.status_code == 200 - @pytest.fixture(scope="session", autouse=True) def start_server(request): if request.config.getoption("--start-server"): - print("Starting server...") - subprocess.Popen(["python", "-m", "coverage", "run", "--data-file=.coverage.server", "launch.py", "--skip-prepare-environment", "--skip-torch-cuda-test", "--test-server", "--no-half", "--disable-opt-split-attention", "--use-cpu", "all", "--add-stop-route", "--api", "--deforum-api"], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - wait_for_service('http://localhost:7680') + + # Kick off server subprocess + script_directory = os.path.dirname(__file__) + a1111_directory = Path(script_directory).parent.parent.parent # sd-webui/extensions/deforum/tests/ -> sd-webui + print(f"Starting server in {a1111_directory}...") + proc = Popen(["python", "-m", "coverage", "run", "--data-file=.coverage.server", "launch.py", + "--skip-prepare-environment", "--skip-torch-cuda-test", "--test-server", "--no-half", + "--disable-opt-split-attention", "--use-cpu", "all", "--add-stop-route", "--api", "--deforum-api", "--listen"], + cwd=a1111_directory, + stdout=PIPE, + stderr=STDOUT, + universal_newlines=True) + + # ensure server is killed at the end of the test run + request.addfinalizer(proc.kill) + + # Spin up separate thread to capture the server output to file and stdout + def server_console_manager(): + with proc.stdout, open('serverlog.txt', 'ab') as logfile: + for line in proc.stdout: + sys.stdout.write(f"[SERVER LOG] {line}") + sys.stdout.flush() + logfile.write(line.encode('utf-8')) + logfile.flush() + proc.wait() + + threading.Thread(target=server_console_manager).start() + + # Wait for deforum API to respond + wait_for_service('http://localhost:7860/deforum_api/jobs/') else: print("Assuming server is already running...") \ No newline at end of file diff --git a/tests/deforum_postprocess_test.py b/tests/deforum_postprocess_test.py new file mode 100644 index 00000000..ba6b96c1 --- /dev/null +++ b/tests/deforum_postprocess_test.py @@ -0,0 +1,158 @@ +import os +import json +from scripts.deforum_api_models import DeforumJobStatus, DeforumJobStatusCategory, DeforumJobPhase +import requests +from moviepy.editor import VideoFileClip +import glob +from utils import wait_for_job_to_complete, wait_for_job_to_enter_phase, wait_for_job_to_enter_status, API_BASE_URL + +from scripts.deforum_helpers.subtitle_handler import get_user_values + +def test_post_process_FILM(snapshot): + with open('tests/testdata/simple.input_settings.txt', 'r') as settings_file: + deforum_settings = json.load(settings_file) + + deforum_settings["frame_interpolation_engine"] = "FILM" + deforum_settings["frame_interpolation_x_amount"] = 3 + deforum_settings["frame_interpolation_slow_mo_enabled"] = False + + response = requests.post(API_BASE_URL+"/batches", json={ + "deforum_settings":[deforum_settings], + "options_overrides": { + "deforum_save_gen_info_as_srt": True, + "deforum_save_gen_info_as_srt_params": get_user_values(), + } + }) + response.raise_for_status() + job_id = response.json()["job_ids"][0] + jobStatus = wait_for_job_to_complete(job_id) + + assert jobStatus.status == DeforumJobStatusCategory.SUCCEEDED, f"Job {job_id} failed: {jobStatus}" + + # Ensure parameters used at each frame have not regressed + srt_filenname = os.path.join(jobStatus.outdir, f"{jobStatus.timestring}.srt") + with open(srt_filenname, 'r') as srt_file: + assert srt_file.read() == snapshot + + # Ensure interpolated video format is as expected + video_filenames = glob.glob(f'{jobStatus.outdir}/*FILM*.mp4', recursive=True) + assert len(video_filenames) == 1, "Expected one FILM video to be generated" + + interpolated_video_filename = video_filenames[0] + clip = VideoFileClip(interpolated_video_filename) + assert clip.fps == deforum_settings['fps'] * deforum_settings["frame_interpolation_x_amount"] , "Video FPS does not match input settings (fps * interpolation amount)" + assert clip.duration * clip.fps == deforum_settings['max_frames'] * deforum_settings["frame_interpolation_x_amount"], "Video frame count does not match input settings (including interpolation)" + assert clip.size == [deforum_settings['W'], deforum_settings['H']] , "Video dimensions are not as expected" + +def test_post_process_RIFE(snapshot): + with open('tests/testdata/simple.input_settings.txt', 'r') as settings_file: + deforum_settings = json.load(settings_file) + + deforum_settings["frame_interpolation_engine"] = "RIFE v4.6" + deforum_settings["frame_interpolation_x_amount"] = 3 + deforum_settings["frame_interpolation_slow_mo_enabled"] = False + + response = requests.post(API_BASE_URL+"/batches", json={ + "deforum_settings":[deforum_settings], + "options_overrides": { + "deforum_save_gen_info_as_srt": True, + "deforum_save_gen_info_as_srt_params": get_user_values(), + } + }) + response.raise_for_status() + job_id = response.json()["job_ids"][0] + jobStatus = wait_for_job_to_complete(job_id) + + assert jobStatus.status == DeforumJobStatusCategory.SUCCEEDED, f"Job {job_id} failed: {jobStatus}" + + # Ensure parameters used at each frame have not regressed + srt_filenname = os.path.join(jobStatus.outdir, f"{jobStatus.timestring}.srt") + with open(srt_filenname, 'r') as srt_file: + assert srt_file.read() == snapshot + + # Ensure interpolated video format is as expected + video_filenames = glob.glob(f'{jobStatus.outdir}/*RIFE*.mp4', recursive=True) + assert len(video_filenames) == 1, "Expected one RIFE video to be generated" + + interpolated_video_filename = video_filenames[0] + clip = VideoFileClip(interpolated_video_filename) + assert clip.fps == deforum_settings['fps'] * deforum_settings["frame_interpolation_x_amount"] , "Video FPS does not match input settings (fps * interpolation amount)" + assert clip.duration * clip.fps == deforum_settings['max_frames'] * deforum_settings["frame_interpolation_x_amount"], "Video frame count does not match input settings (including interpolation)" + assert clip.size == [deforum_settings['W'], deforum_settings['H']] , "Video dimensions are not as expected" + +def test_post_process_UPSCALE(snapshot): + with open('tests/testdata/simple.input_settings.txt', 'r') as settings_file: + deforum_settings = json.load(settings_file) + + deforum_settings["r_upscale_video"] = True + deforum_settings["r_upscale_factor"] = "x4" + deforum_settings["r_upscale_model"] = "realesrgan-x4plus" + + response = requests.post(API_BASE_URL+"/batches", json={ + "deforum_settings":[deforum_settings], + "options_overrides": { + "deforum_save_gen_info_as_srt": True, + "deforum_save_gen_info_as_srt_params": get_user_values(), + } + }) + response.raise_for_status() + job_id = response.json()["job_ids"][0] + jobStatus = wait_for_job_to_complete(job_id) + + assert jobStatus.status == DeforumJobStatusCategory.SUCCEEDED, f"Job {job_id} failed: {jobStatus}" + + # Ensure parameters used at each frame have not regressed + srt_filenname = os.path.join(jobStatus.outdir, f"{jobStatus.timestring}.srt") + with open(srt_filenname, 'r') as srt_file: + assert srt_file.read() == snapshot + + # Ensure interpolated video format is as expected + video_filenames = glob.glob(f'{jobStatus.outdir}/*Upscaled*.mp4', recursive=True) + assert len(video_filenames) == 1, "Expected one upscaled video to be generated" + + interpolated_video_filename = video_filenames[0] + clip = VideoFileClip(interpolated_video_filename) + assert clip.fps == deforum_settings['fps'] , "Video FPS does not match input settings" + assert clip.duration * clip.fps == deforum_settings['max_frames'], "Video frame count does not match input settings" + assert clip.size == [deforum_settings['W']*4, deforum_settings['H']*4] , "Video dimensions are not as expected (including upscaling)" + + +def test_post_process_UPSCALE_FILM(snapshot): + with open('tests/testdata/simple.input_settings.txt', 'r') as settings_file: + deforum_settings = json.load(settings_file) + + deforum_settings["r_upscale_video"] = True + deforum_settings["r_upscale_factor"] = "x4" + deforum_settings["r_upscale_model"] = "realesrgan-x4plus" + deforum_settings["frame_interpolation_engine"] = "FILM" + deforum_settings["frame_interpolation_x_amount"] = 3 + deforum_settings["frame_interpolation_slow_mo_enabled"] = False + deforum_settings["frame_interpolation_use_upscaled"] = True + + response = requests.post(API_BASE_URL+"/batches", json={ + "deforum_settings":[deforum_settings], + "options_overrides": { + "deforum_save_gen_info_as_srt": True, + "deforum_save_gen_info_as_srt_params": get_user_values(), + } + }) + response.raise_for_status() + job_id = response.json()["job_ids"][0] + jobStatus = wait_for_job_to_complete(job_id) + + assert jobStatus.status == DeforumJobStatusCategory.SUCCEEDED, f"Job {job_id} failed: {jobStatus}" + + # Ensure parameters used at each frame have not regressed + srt_filenname = os.path.join(jobStatus.outdir, f"{jobStatus.timestring}.srt") + with open(srt_filenname, 'r') as srt_file: + assert srt_file.read() == snapshot + + # Ensure interpolated video format is as expected + video_filenames = glob.glob(f'{jobStatus.outdir}/*FILM*upscaled*.mp4', recursive=True) + assert len(video_filenames) == 1, "Expected one upscaled video to be generated" + + interpolated_video_filename = video_filenames[0] + clip = VideoFileClip(interpolated_video_filename) + assert clip.fps == deforum_settings['fps'] * deforum_settings["frame_interpolation_x_amount"] , "Video FPS does not match input settings (fps * interpolation amount)" + assert clip.duration * clip.fps == deforum_settings['max_frames'] * deforum_settings["frame_interpolation_x_amount"], "Video frame count does not match input settings (including interpolation)" + assert clip.size == [deforum_settings['W']*4, deforum_settings['H']*4] , "Video dimensions are not as expected (including upscaling)" diff --git a/tests/deforum_test.py b/tests/deforum_test.py index defb54bc..e96cc613 100644 --- a/tests/deforum_test.py +++ b/tests/deforum_test.py @@ -1,56 +1,166 @@ import os import json -from tenacity import retry, stop_after_delay, wait_fixed -from scripts.deforum_api_models import DeforumJobStatus, DeforumJobStatusCategory -from pydantic_requests import PydanticSession +from scripts.deforum_api_models import DeforumJobStatus, DeforumJobStatusCategory, DeforumJobPhase import requests +from moviepy.editor import VideoFileClip +import glob +from pathlib import Path +from utils import wait_for_job_to_complete, wait_for_job_to_enter_phase, wait_for_job_to_enter_status, API_BASE_URL from scripts.deforum_helpers.subtitle_handler import get_user_values -SERVER_BASE_URL = "http://localhost:7860" -API_ROOT = "/deforum_api" -API_BASE_URL = SERVER_BASE_URL + API_ROOT - -# -# Start server with: -# python -m coverage run --data-file=.coverage.server launch.py --skip-prepare-environment --disable-nan-check --no-half --disable-opt-split-attention --add-stop-route --api --deforum-api --ckpt ./test/test_files/empty.pt -# - -@retry(wait=wait_fixed(2), stop=stop_after_delay(600)) -def wait_for_job_to_complete(id): - with PydanticSession( - {200: DeforumJobStatus}, headers={"accept": "application/json"} - ) as session: - response = session.get(API_BASE_URL+"/jobs/"+id) - response.raise_for_status() - jobStatus : DeforumJobStatus = response.model - print(f"Waiting for job {id}: status={jobStatus.status}; phase={jobStatus.phase}; execution_time:{jobStatus.execution_time}s") - assert jobStatus.status != DeforumJobStatusCategory.ACCEPTED - return jobStatus - - def test_simple_settings(snapshot): - with open('tests/testdata/test1.input_settings.txt', 'r') as settings_file: + with open('tests/testdata/simple.input_settings.txt', 'r') as settings_file: + deforum_settings = json.load(settings_file) + + response = requests.post(API_BASE_URL+"/batches", json={ + "deforum_settings":[deforum_settings], + "options_overrides": { + "deforum_save_gen_info_as_srt": True, + "deforum_save_gen_info_as_srt_params": get_user_values(), + } + }) + response.raise_for_status() + job_id = response.json()["job_ids"][0] + jobStatus = wait_for_job_to_complete(job_id) + + assert jobStatus.status == DeforumJobStatusCategory.SUCCEEDED, f"Job {job_id} failed: {jobStatus}" + + # Ensure parameters used at each frame have not regressed + srt_filenname = os.path.join(jobStatus.outdir, f"{jobStatus.timestring}.srt") + with open(srt_filenname, 'r') as srt_file: + assert srt_file.read() == snapshot + + # Ensure video format is as expected + video_filename = os.path.join(jobStatus.outdir, f"{jobStatus.timestring}.mp4") + clip = VideoFileClip(video_filename) + assert clip.fps == deforum_settings['fps'] , "Video FPS does not match input settings" + assert clip.duration * clip.fps == deforum_settings['max_frames'] , "Video frame count does not match input settings" + assert clip.size == [deforum_settings['W'], deforum_settings['H']] , "Video dimensions are not as expected" + + +def test_api_cancel_active_job(): + with open('tests/testdata/simple.input_settings.txt', 'r') as settings_file: data = json.load(settings_file) - response = requests.post(API_BASE_URL+"/batches", json={ - "deforum_settings":[data], - "options_overrides": { - "deforum_save_gen_info_as_srt": True, - "deforum_save_gen_info_as_srt_params": get_user_values(), - } - }) + response = requests.post(API_BASE_URL+"/batches", json={"deforum_settings":[data]}) response.raise_for_status() job_id = response.json()["job_ids"][0] + wait_for_job_to_enter_phase(job_id, DeforumJobPhase.GENERATING) + + cancel_url = API_BASE_URL+"/jobs/"+job_id + response = requests.delete(cancel_url) + response.raise_for_status() + assert response.status_code == 200, f"DELETE request to {cancel_url} failed: {response.status_code}" + jobStatus = wait_for_job_to_complete(job_id) - assert jobStatus.status == DeforumJobStatusCategory.SUCCEEDED, f"Job {job_id} failed: {jobStatus}" - - srt_filenname = os.path.join(jobStatus.outdir, f"{jobStatus.timestring}.srt") - with open(srt_filenname, 'r') as srt_file: - assert srt_file.read() == snapshot + assert jobStatus.status == DeforumJobStatusCategory.CANCELLED, f"Job {job_id} did not cancel: {jobStatus}" +def test_3d_mode(snapshot): + with open('tests/testdata/simple.input_settings.txt', 'r') as settings_file: + deforum_settings = json.load(settings_file) + + deforum_settings['animation_mode'] = "3D" + + response = requests.post(API_BASE_URL+"/batches", json={ + "deforum_settings":[deforum_settings], + "options_overrides": { + "deforum_save_gen_info_as_srt": True, + "deforum_save_gen_info_as_srt_params": get_user_values(), + } + }) + response.raise_for_status() + job_id = response.json()["job_ids"][0] + jobStatus = wait_for_job_to_complete(job_id) + + assert jobStatus.status == DeforumJobStatusCategory.SUCCEEDED, f"Job {job_id} failed: {jobStatus}" + + # Ensure parameters used at each frame have not regressed + srt_filenname = os.path.join(jobStatus.outdir, f"{jobStatus.timestring}.srt") + with open(srt_filenname, 'r') as srt_file: + assert srt_file.read() == snapshot + + # Ensure video format is as expected + video_filename = os.path.join(jobStatus.outdir, f"{jobStatus.timestring}.mp4") + clip = VideoFileClip(video_filename) + assert clip.fps == deforum_settings['fps'] , "Video FPS does not match input settings" + assert clip.duration * clip.fps == deforum_settings['max_frames'] , "Video frame count does not match input settings" + assert clip.size == [deforum_settings['W'], deforum_settings['H']] , "Video dimensions are not as expected" +def test_with_parseq_inline(snapshot): + with open('tests/testdata/simple.input_settings.txt', 'r') as settings_file: + deforum_settings = json.load(settings_file) + + with open('tests/testdata/parseq.json', 'r') as parseq_file: + parseq_data = json.load(parseq_file) + + deforum_settings['parseq_manifest'] = json.dumps(parseq_data) + + response = requests.post(API_BASE_URL+"/batches", json={ + "deforum_settings":[deforum_settings], + "options_overrides": { + "deforum_save_gen_info_as_srt": True, + "deforum_save_gen_info_as_srt_params": get_user_values(), + } + }) + response.raise_for_status() + job_id = response.json()["job_ids"][0] + jobStatus = wait_for_job_to_complete(job_id) + + assert jobStatus.status == DeforumJobStatusCategory.SUCCEEDED, f"Job {job_id} failed: {jobStatus}" + + # Ensure parameters used at each frame have not regressed + srt_filenname = os.path.join(jobStatus.outdir, f"{jobStatus.timestring}.srt") + with open(srt_filenname, 'r') as srt_file: + assert srt_file.read() == snapshot + + # Ensure video format is as expected + video_filename = os.path.join(jobStatus.outdir, f"{jobStatus.timestring}.mp4") + clip = VideoFileClip(video_filename) + assert clip.fps == deforum_settings['fps'] , "Video FPS does not match input settings" + assert clip.duration * clip.fps == deforum_settings['max_frames'] , "Video frame count does not match input settings" + assert clip.size == [deforum_settings['W'], deforum_settings['H']] , "Video dimensions are not as expected" +# def test_with_parseq_url(): + +def test_with_hybrid_video(snapshot): + with open('tests/testdata/simple.input_settings.txt', 'r') as settings_file: + deforum_settings = json.load(settings_file) + + with open('tests/testdata/parseq.json', 'r') as parseq_file: + parseq_data = json.load(parseq_file) + + init_video_local_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "testdata", "example_init_vid.mp4") + deforum_settings['video_init_path'] = init_video_local_path + deforum_settings['extract_nth_frame'] = 200 # input video is 900 frames, so we should keep 5 frames + deforum_settings["hybrid_generate_inputframes"] = True + deforum_settings["hybrid_composite"] = "Normal" + + response = requests.post(API_BASE_URL+"/batches", json={ + "deforum_settings":[deforum_settings], + "options_overrides": { + "deforum_save_gen_info_as_srt": True, + "deforum_save_gen_info_as_srt_params": get_user_values(), + } + }) + response.raise_for_status() + job_id = response.json()["job_ids"][0] + jobStatus = wait_for_job_to_complete(job_id) + + assert jobStatus.status == DeforumJobStatusCategory.SUCCEEDED, f"Job {job_id} failed: {jobStatus}" + + # Ensure parameters used at each frame have not regressed + srt_filenname = os.path.join(jobStatus.outdir, f"{jobStatus.timestring}.srt") + with open(srt_filenname, 'r') as srt_file: + assert srt_file.read() == snapshot + + # Ensure video format is as expected + video_filename = os.path.join(jobStatus.outdir, f"{jobStatus.timestring}.mp4") + clip = VideoFileClip(video_filename) + assert clip.fps == deforum_settings['fps'] , "Video FPS does not match input settings" + assert clip.duration == 5 / deforum_settings['fps'], "Video frame count does not match input settings" + assert clip.size == [deforum_settings['W'], deforum_settings['H']] , "Video dimensions are not as expected" + diff --git a/tests/testdata/example_init_vid.mp4 b/tests/testdata/example_init_vid.mp4 new file mode 100644 index 00000000..b11552f9 Binary files /dev/null and b/tests/testdata/example_init_vid.mp4 differ diff --git a/tests/testdata/parseq.json b/tests/testdata/parseq.json new file mode 100644 index 00000000..61d650a3 --- /dev/null +++ b/tests/testdata/parseq.json @@ -0,0 +1,231 @@ +{ + "meta": { + "generated_by": "sd_parseq", + "version": "0.1.94", + "generated_at": "Tue, 01 Aug 2023 03:02:03 GMT", + "doc_id": "doc-9d687a32-6bb4-41e3-a974-e8c5a6a18571", + "version_id": "version-9762c158-b3e0-471e-ad6b-97259c8a5141" + }, + "prompts": { + "format": "v2", + "enabled": true, + "commonPrompt": { + "name": "Common", + "positive": "", + "negative": "", + "allFrames": true, + "from": 0, + "to": 119, + "overlap": { + "inFrames": 0, + "outFrames": 0, + "type": "none", + "custom": "prompt_weight_1" + } + }, + "commonPromptPos": "append", + "promptList": [ + { + "name": "Prompt 1", + "positive": "Parseq prompt!", + "negative": "neg parseq prompt!", + "allFrames": false, + "from": 0, + "to": 119, + "overlap": { + "inFrames": 0, + "outFrames": 0, + "type": "none", + "custom": "prompt_weight_1" + } + } + ] + }, + "options": { + "input_fps": 20, + "bpm": 140, + "output_fps": 20, + "cc_window_width": 0, + "cc_window_slide_rate": 1, + "cc_use_input": false + }, + "managedFields": [ + "seed", + "angle" + ], + "displayedFields": [ + "seed", + "angle" + ], + "keyframes": [ + { + "frame": 0, + "zoom": 1, + "zoom_i": "C", + "seed": 55, + "noise": 0.04, + "strength": 0.6, + "prompt_weight_1": 1, + "prompt_weight_1_i": "bez(0,0.6,1,0.4)", + "prompt_weight_2": 0, + "prompt_weight_2_i": "bez(0,0.6,1,0.4)", + "angle": "", + "angle_i": "sin(p=1b, a=45)" + }, + { + "frame": 10, + "prompt_weight_1": 0, + "prompt_weight_2": 1, + "seed": 56 + } + ], + "timeSeries": [], + "keyframeLock": "frames", + "reverseRender": false, + "rendered_frames": [ + { + "frame": 0, + "seed": 55, + "angle": 0, + "deforum_prompt": "Parseq prompt! --neg neg parseq prompt!", + "subseed": 55, + "subseed_strength": 0, + "seed_delta": 55, + "seed_pc": 98.21428571428571, + "angle_delta": 0, + "angle_pc": 0 + }, + { + "frame": 1, + "seed": 55.1, + "angle": 30.11087728614862, + "deforum_prompt": "Parseq prompt! --neg neg parseq prompt!", + "subseed": 56, + "subseed_strength": 0.10000000000000142, + "seed_delta": 0.10000000000000142, + "seed_pc": 98.39285714285715, + "angle_delta": 30.11087728614862, + "angle_pc": 67.28163648031882 + }, + { + "frame": 2, + "seed": 55.2, + "angle": 44.7534852915723, + "deforum_prompt": "Parseq prompt! --neg neg parseq prompt!", + "subseed": 56, + "subseed_strength": 0.20000000000000284, + "seed_delta": 0.10000000000000142, + "seed_pc": 98.57142857142858, + "angle_delta": 14.642608005423675, + "angle_pc": 100 + }, + { + "frame": 3, + "seed": 55.3, + "angle": 36.405764746872634, + "deforum_prompt": "Parseq prompt! --neg neg parseq prompt!", + "subseed": 56, + "subseed_strength": 0.29999999999999716, + "seed_delta": 0.09999999999999432, + "seed_pc": 98.75, + "angle_delta": -8.347720544699662, + "angle_pc": 81.34732861516005 + }, + { + "frame": 4, + "seed": 55.4, + "angle": 9.356026086799169, + "deforum_prompt": "Parseq prompt! --neg neg parseq prompt!", + "subseed": 56, + "subseed_strength": 0.3999999999999986, + "seed_delta": 0.10000000000000142, + "seed_pc": 98.92857142857142, + "angle_delta": -27.049738660073466, + "angle_pc": 20.905692653530693 + }, + { + "frame": 5, + "seed": 55.5, + "angle": -22.500000000000004, + "deforum_prompt": "Parseq prompt! --neg neg parseq prompt!", + "subseed": 56, + "subseed_strength": 0.5, + "seed_delta": 0.10000000000000142, + "seed_pc": 99.10714285714286, + "angle_delta": -31.856026086799172, + "angle_pc": -50.275413978175834 + }, + { + "frame": 6, + "seed": 55.6, + "angle": -42.79754323328191, + "deforum_prompt": "Parseq prompt! --neg neg parseq prompt!", + "subseed": 56, + "subseed_strength": 0.6000000000000014, + "seed_delta": 0.10000000000000142, + "seed_pc": 99.28571428571429, + "angle_delta": -20.297543233281903, + "angle_pc": -95.62952014676112 + }, + { + "frame": 7, + "seed": 55.7, + "angle": -41.109545593917034, + "deforum_prompt": "Parseq prompt! --neg neg parseq prompt!", + "subseed": 56, + "subseed_strength": 0.7000000000000028, + "seed_delta": 0.10000000000000142, + "seed_pc": 99.46428571428572, + "angle_delta": 1.6879976393648732, + "angle_pc": -91.85775214172767 + }, + { + "frame": 8, + "seed": 55.8, + "angle": -18.303148938411006, + "deforum_prompt": "Parseq prompt! --neg neg parseq prompt!", + "subseed": 56, + "subseed_strength": 0.7999999999999972, + "seed_delta": 0.09999999999999432, + "seed_pc": 99.64285714285714, + "angle_delta": 22.806396655506028, + "angle_pc": -40.89770622145878 + }, + { + "frame": 9, + "seed": 55.9, + "angle": 13.905764746872622, + "deforum_prompt": "Parseq prompt! --neg neg parseq prompt!", + "subseed": 56, + "subseed_strength": 0.8999999999999986, + "seed_delta": 0.10000000000000142, + "seed_pc": 99.82142857142857, + "angle_delta": 32.208913685283626, + "angle_pc": 31.0719146369842 + }, + { + "frame": 10, + "seed": 56, + "angle": 38.97114317029975, + "deforum_prompt": "Parseq prompt! --neg neg parseq prompt!", + "subseed": 56, + "subseed_strength": 0, + "seed_delta": 0.10000000000000142, + "seed_pc": 100, + "angle_delta": 25.065378423427127, + "angle_pc": 87.07957138175908 + } + ], + "rendered_frames_meta": { + "seed": { + "max": 56, + "min": 55, + "isFlat": false + }, + "angle": { + "max": 44.7534852915723, + "min": -42.79754323328191, + "isFlat": false + } + } +} \ No newline at end of file diff --git a/tests/testdata/test1.input_settings.txt b/tests/testdata/simple.input_settings.txt similarity index 96% rename from tests/testdata/test1.input_settings.txt rename to tests/testdata/simple.input_settings.txt index 3b8c92a7..ebc0b42a 100644 --- a/tests/testdata/test1.input_settings.txt +++ b/tests/testdata/simple.input_settings.txt @@ -15,10 +15,10 @@ "use_init": false, "strength": 0.8, "strength_0_no_init": true, - "init_image": "https://deforum.github.io/a1/I1.png", - "use_mask": true, + "init_image": "None", + "use_mask": false, "use_alpha_as_mask": false, - "mask_file": "https://deforum.github.io/a1/M1.jpg", + "mask_file": "", "invert_mask": false, "mask_contrast_adjust": 1.0, "mask_brightness_adjust": 1.0, @@ -112,13 +112,13 @@ "padding_mode": "reflection", "sampling_mode": "bicubic", "save_depth_maps": false, - "video_init_path": "https://deforum.github.io/a1/V1.mp4", + "video_init_path": "", "extract_nth_frame": 1, "extract_from_frame": 0, "extract_to_frame": -1, "overwrite_extracted_frames": false, "use_mask_video": false, - "video_mask_path": "https://deforum.github.io/a1/VM1.mp4", + "video_mask_path": "", "hybrid_comp_alpha_schedule": "0:(0.5)", "hybrid_comp_mask_blend_alpha_schedule": "0:(0.5)", "hybrid_comp_mask_contrast_schedule": "0:(1)", @@ -250,6 +250,6 @@ "frame_interpolation_x_amount": 3, "frame_interpolation_slow_mo_enabled": false, "frame_interpolation_slow_mo_amount": 2, - "frame_interpolation_keep_imgs": true, - "frame_interpolation_use_upscaled": true + "frame_interpolation_keep_imgs": false, + "frame_interpolation_use_upscaled": false } \ No newline at end of file diff --git a/tests/utils.py b/tests/utils.py new file mode 100644 index 00000000..2830e585 --- /dev/null +++ b/tests/utils.py @@ -0,0 +1,43 @@ +from tenacity import retry, stop_after_delay, wait_fixed +from pydantic_requests import PydanticSession +from scripts.deforum_api_models import DeforumJobStatus, DeforumJobStatusCategory, DeforumJobPhase + +SERVER_BASE_URL = "http://localhost:7860" +API_ROOT = "/deforum_api" +API_BASE_URL = SERVER_BASE_URL + API_ROOT + +@retry(wait=wait_fixed(2), stop=stop_after_delay(600)) +def wait_for_job_to_complete(id : str): + with PydanticSession( + {200: DeforumJobStatus}, headers={"accept": "application/json"} + ) as session: + response = session.get(API_BASE_URL+"/jobs/"+id) + response.raise_for_status() + jobStatus : DeforumJobStatus = response.model + print(f"Waiting for job {id}: status={jobStatus.status}; phase={jobStatus.phase}; execution_time:{jobStatus.execution_time}s") + assert jobStatus.status != DeforumJobStatusCategory.ACCEPTED + return jobStatus + +@retry(wait=wait_fixed(1), stop=stop_after_delay(60)) +def wait_for_job_to_enter_phase(id : str, phase : DeforumJobPhase): + with PydanticSession( + {200: DeforumJobStatus}, headers={"accept": "application/json"} + ) as session: + response = session.get(API_BASE_URL+"/jobs/"+id) + response.raise_for_status() + jobStatus : DeforumJobStatus = response.model + print(f"Waiting for job {id} to enter phase {phase}. Currently: status={jobStatus.status}; phase={jobStatus.phase}; execution_time:{jobStatus.execution_time}s") + assert jobStatus.phase != phase + return jobStatus + +@retry(wait=wait_fixed(1), stop=stop_after_delay(60)) +def wait_for_job_to_enter_status(id : str, status : DeforumJobStatusCategory): + with PydanticSession( + {200: DeforumJobStatus}, headers={"accept": "application/json"} + ) as session: + response = session.get(API_BASE_URL+"/jobs/"+id) + response.raise_for_status() + jobStatus : DeforumJobStatus = response.model + print(f"Waiting for job {id} to enter status {status}. Currently: status={jobStatus.status}; phase={jobStatus.phase}; execution_time:{jobStatus.execution_time}s") + assert jobStatus.status == status + return jobStatus