Add broader set of tests and API improvements, including job cancellation

pull/826/head
rewbs 2023-08-01 14:10:28 +10:00
parent 802605a3a3
commit 517a14e817
15 changed files with 1112 additions and 133 deletions

3
.gitignore vendored
View File

@ -14,4 +14,5 @@ scripts/deforum_helpers/navigation.py
#test output #test output
htmlcov htmlcov
tests/results.xml tests/results.xml
.coverage* .coverage*
serverlog.txt

View File

@ -3,3 +3,4 @@ syrupy
pytest pytest
tenacity tenacity
pydantic_requests pydantic_requests
moviepy

View File

@ -1,13 +1,19 @@
import os
import atexit import atexit
import json import json
import random import random
import tempfile import tempfile
import traceback import traceback
import logging
import threading
import debugpy
from concurrent.futures import ThreadPoolExecutor from concurrent.futures import ThreadPoolExecutor
from dataclasses import dataclass, replace from dataclasses import dataclass, replace
from datetime import datetime from datetime import datetime
from typing import Any, Dict, List from typing import Any, Dict, List
from deforum_api_models import Batch, DeforumJobErrorType, DeforumJobStatusCategory, DeforumJobPhase, DeforumJobStatus from deforum_api_models import Batch, DeforumJobErrorType, DeforumJobStatusCategory, DeforumJobPhase, DeforumJobStatus
from contextlib import contextmanager
import gradio as gr import gradio as gr
from deforum_helpers.args import (DeforumAnimArgs, DeforumArgs, from deforum_helpers.args import (DeforumAnimArgs, DeforumArgs,
@ -15,9 +21,17 @@ from deforum_helpers.args import (DeforumAnimArgs, DeforumArgs,
RootArgs, get_component_names) RootArgs, get_component_names)
from fastapi import FastAPI, Response, status 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): def make_ids(job_count: int):
batch_id = f"batch({random.randint(0, 1e9)})" batch_id = f"batch({random.randint(0, 1e9)})"
job_ids = [f"{batch_id}-{i}" for i in range(job_count)] job_ids = [f"{batch_id}-{i}" for i in range(job_count)]
@ -33,37 +47,48 @@ def get_default_value(name:str):
else: else:
return None 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. # For some values, defaults don't pass validation...
# We are overriding everything with the batch files, but some values are eagerly validated, so must appear valid. run_deforum_args[prefixed_gradio_args + component_names.index('animation_prompts')] = '{"0":"dummy value"}'
component_names = get_component_names() run_deforum_args[prefixed_gradio_args + component_names.index('animation_prompts_negative')] = ''
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... # Arg 0 is a UID for the batch
run_deforum_args[prefixed_gradio_args + component_names.index('animation_prompts')] = '{"0":"dummy value"}' run_deforum_args[0] = batch_id
run_deforum_args[prefixed_gradio_args + component_names.index('animation_prompts_negative')] = ''
# Arg 0 is a UID for the batch # Setup batch override
run_deforum_args[0] = batch_id 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 # Cleanup old state from previously cancelled jobs
run_deforum_args[prefixed_gradio_args + component_names.index('override_settings_with_file')] = True # WARNING: not thread safe because state is global. If we ever run multiple batches in parallel, this will need to be reworked.
run_deforum_args[prefixed_gradio_args + component_names.index('custom_settings_file')] = deforum_settings state.skipped = False
state.interrupted = False
# Invoke deforum with appropriate args # Invoke deforum with appropriate args
from deforum_helpers.run_deforum import run_deforum from deforum_helpers.run_deforum import run_deforum
run_deforum(*run_deforum_args) 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. # 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 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. # 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() apiState = ApiState()
# Submit a new batch
@app.post("/deforum_api/batches") @app.post("/deforum_api/batches")
async def run_batch(batch: Batch, response: Response): 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."} 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): 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_data = [deforum_settings_data]
deforum_settings_tempfiles = [] deforum_settings_tempfiles = []
@ -110,38 +137,94 @@ def deforum_api(_: gr.Blocks, app: FastAPI):
[batch_id, job_ids] = make_ids(job_count) [batch_id, job_ids] = make_ids(job_count)
apiState.submit_job(batch_id, job_ids, deforum_settings_tempfiles, batch.options_overrides) apiState.submit_job(batch_id, job_ids, deforum_settings_tempfiles, batch.options_overrides)
for job_id in job_ids: for idx, job_id in enumerate(job_ids):
JobStatusTracker().accept_job(batch_id=batch_id, job_id=job_id) 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 response.status_code = status.HTTP_202_ACCEPTED
return {"message": "Job(s) accepted", "batch_id": batch_id, "job_ids": job_ids } 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}") @app.get("/deforum_api/batches/{id}")
async def get_batch(id: str): async def get_batch(id: str, response: Response):
jobsForBatch = JobStatusTracker().batches[id] 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] return [JobStatusTracker().get(job_id) for job_id in jobsForBatch]
## TODO ## # Cancel all jobs in a batch
@app.delete("/deforum_api/batches/{id}") @app.delete("/deforum_api/batches/{id}")
async def stop_batch(id: str, response: Response): async def cancel_batch(id: str, response: Response):
response.status_code = status.HTTP_501_NOT_IMPLEMENTED jobsForBatch = JobStatusTracker().batches[id]
return {"id": id, "status": "NOT IMPLEMENTED"} 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") @app.get("/deforum_api/jobs")
async def list_jobs(): async def list_jobs():
return JobStatusTracker().statuses return JobStatusTracker().statuses
# Show details of a single job
@app.get("/deforum_api/jobs/{id}") @app.get("/deforum_api/jobs/{id}")
async def get_job(id: str): async def get_job(id: str, response: Response):
return JobStatusTracker().get(id) 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}") @app.delete("/deforum_api/jobs/{id}")
async def stop_job(id: str, response: Response): async def cancel_job(id: str, response: Response):
response.status_code = status.HTTP_501_NOT_IMPLEMENTED debugpy.breakpoint()
return {"id": id, "status": "NOT IMPLEMENTED"} 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): class Singleton(type):
_instances = {} _instances = {}
def __call__(cls, *args, **kwargs): 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. # Maintains persistent state required by API, e.g. thread pook, list of submitted jobs.
class ApiState(metaclass=Singleton): 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] = {} submitted_jobs : Dict[str, Any] = {}
@staticmethod @staticmethod
def cleanup(): def cleanup():
ApiState().deforum_api_executor.shutdown(wait=False) 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 submit_job(self, batch_id: str, job_ids: [str], deforum_settings: List[Any], opts_overrides: Dict[str, Any]):
def task(): log.debug(f"Submitting batch {batch_id} to threadpool.")
print("started task") future = self.deforum_api_executor.submit(lambda: run_deforum_batch(batch_id, job_ids, deforum_settings, opts_overrides))
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)
self.submitted_jobs[batch_id] = future self.submitted_jobs[batch_id] = future
atexit.register(ApiState.cleanup) 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, # Maintains state that tracks status of submitted jobs,
# so that clients can query job status. # so that clients can query job status.
class JobStatusTracker(metaclass=Singleton): class JobStatusTracker(metaclass=Singleton):
statuses: Dict[str, DeforumJobStatus] = {} statuses: Dict[str, DeforumJobStatus] = {}
batches: Dict[str, List[str]] = {} 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: if batch_id in self.batches:
self.batches[batch_id].append(job_id) self.batches[batch_id].append(job_id)
else: else:
@ -214,7 +303,9 @@ class JobStatusTracker(metaclass=Singleton):
updates=0, updates=0,
message=None, message=None,
outdir=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): 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 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): 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): def deforum_init_batch(_: gr.Blocks, app: FastAPI):
settings_files = [open(filename, 'r') for filename in cmd_opts.deforum_run_now.split(",")] settings_files = [open(filename, 'r') for filename in cmd_opts.deforum_run_now.split(",")]
[batch_id, job_ids] = make_ids(len(settings_files)) [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: if cmd_opts.deforum_terminate_after_run_now:
import os import os

View File

@ -11,6 +11,7 @@ class DeforumJobStatusCategory(str, Enum):
ACCEPTED = "ACCEPTED" ACCEPTED = "ACCEPTED"
SUCCEEDED = "SUCCEEDED" SUCCEEDED = "SUCCEEDED"
FAILED = "FAILED" FAILED = "FAILED"
CANCELLED = "CANCELLED"
class DeforumJobPhase(str, Enum): class DeforumJobPhase(str, Enum):
QUEUED = "QUEUED" QUEUED = "QUEUED"
@ -38,4 +39,6 @@ class DeforumJobStatus(BaseModel):
updates: int # number of status updates so far updates: int # number of status updates so far
message: Optional[str] message: Optional[str]
outdir: Optional[str] outdir: Optional[str]
timestring: Optional[str] timestring: Optional[str]
deforum_settings : Optional[List[Dict[str, Any]]]
options_overrides : Optional[Dict[str, Any]]

View File

@ -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)] 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) 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 reset_frames_cache(root) # cleanup the RAM in any case
processed = Processed(p, [root.first_frame], 0, root.initial_info) 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") 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) 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 return processed.images, root.timestring, generation_info_js, processed.info

View File

@ -137,18 +137,18 @@ def is_vid_path_valid(video_path):
if video_path.startswith('http://') or video_path.startswith('https://'): if video_path.startswith('http://') or video_path.startswith('https://'):
response = requests.head(video_path, allow_redirects=True) response = requests.head(video_path, allow_redirects=True)
if response.status_code == 404: 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: elif response.status_code == 302:
response = requests.head(response.headers['location'], allow_redirects=True) response = requests.head(response.headers['location'], allow_redirects=True)
if response.status_code != 200: 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: 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: else:
if not os.path.exists(video_path): 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: 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 return True
# quick-retreive frame count, FPS and H/W dimensions of a video (local or URL-based) # quick-retreive frame count, FPS and H/W dimensions of a video (local or URL-based)

View File

@ -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
'''
# ---

View File

@ -1,4 +1,49 @@
# serializer version: 1 # 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 # name: test_simple_settings
''' '''
1 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 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!
''' '''
# --- # ---

View File

@ -1,31 +1,59 @@
import pytest import pytest
import subprocess 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 from tenacity import retry, stop_after_delay, wait_fixed
import threading
import requests import requests
def pytest_addoption(parser): 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 @pytest.fixture
def cmdopt(request): def cmdopt(request):
return request.config.getoption("--start-server") return request.config.getoption("--start-server")
@retry(wait=wait_fixed(5), stop=stop_after_delay(60)) @retry(wait=wait_fixed(5), stop=stop_after_delay(60))
def wait_for_service(url): 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 assert response.status_code == 200
@pytest.fixture(scope="session", autouse=True) @pytest.fixture(scope="session", autouse=True)
def start_server(request): def start_server(request):
if request.config.getoption("--start-server"): 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"], # Kick off server subprocess
stdout=subprocess.PIPE, script_directory = os.path.dirname(__file__)
stderr=subprocess.PIPE) a1111_directory = Path(script_directory).parent.parent.parent # sd-webui/extensions/deforum/tests/ -> sd-webui
wait_for_service('http://localhost:7680') 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: else:
print("Assuming server is already running...") print("Assuming server is already running...")

View File

@ -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)"

View File

@ -1,56 +1,166 @@
import os import os
import json import json
from tenacity import retry, stop_after_delay, wait_fixed from scripts.deforum_api_models import DeforumJobStatus, DeforumJobStatusCategory, DeforumJobPhase
from scripts.deforum_api_models import DeforumJobStatus, DeforumJobStatusCategory
from pydantic_requests import PydanticSession
import requests 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 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): 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) data = json.load(settings_file)
response = requests.post(API_BASE_URL+"/batches", json={ response = requests.post(API_BASE_URL+"/batches", json={"deforum_settings":[data]})
"deforum_settings":[data],
"options_overrides": {
"deforum_save_gen_info_as_srt": True,
"deforum_save_gen_info_as_srt_params": get_user_values(),
}
})
response.raise_for_status() response.raise_for_status()
job_id = response.json()["job_ids"][0] 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) jobStatus = wait_for_job_to_complete(job_id)
assert jobStatus.status == DeforumJobStatusCategory.SUCCEEDED, f"Job {job_id} failed: {jobStatus}" assert jobStatus.status == DeforumJobStatusCategory.CANCELLED, f"Job {job_id} did not cancel: {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
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"

BIN
tests/testdata/example_init_vid.mp4 vendored Normal file

Binary file not shown.

231
tests/testdata/parseq.json vendored Normal file
View File

@ -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
}
}
}

View File

@ -15,10 +15,10 @@
"use_init": false, "use_init": false,
"strength": 0.8, "strength": 0.8,
"strength_0_no_init": true, "strength_0_no_init": true,
"init_image": "https://deforum.github.io/a1/I1.png", "init_image": "None",
"use_mask": true, "use_mask": false,
"use_alpha_as_mask": false, "use_alpha_as_mask": false,
"mask_file": "https://deforum.github.io/a1/M1.jpg", "mask_file": "",
"invert_mask": false, "invert_mask": false,
"mask_contrast_adjust": 1.0, "mask_contrast_adjust": 1.0,
"mask_brightness_adjust": 1.0, "mask_brightness_adjust": 1.0,
@ -112,13 +112,13 @@
"padding_mode": "reflection", "padding_mode": "reflection",
"sampling_mode": "bicubic", "sampling_mode": "bicubic",
"save_depth_maps": false, "save_depth_maps": false,
"video_init_path": "https://deforum.github.io/a1/V1.mp4", "video_init_path": "",
"extract_nth_frame": 1, "extract_nth_frame": 1,
"extract_from_frame": 0, "extract_from_frame": 0,
"extract_to_frame": -1, "extract_to_frame": -1,
"overwrite_extracted_frames": false, "overwrite_extracted_frames": false,
"use_mask_video": 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_alpha_schedule": "0:(0.5)",
"hybrid_comp_mask_blend_alpha_schedule": "0:(0.5)", "hybrid_comp_mask_blend_alpha_schedule": "0:(0.5)",
"hybrid_comp_mask_contrast_schedule": "0:(1)", "hybrid_comp_mask_contrast_schedule": "0:(1)",
@ -250,6 +250,6 @@
"frame_interpolation_x_amount": 3, "frame_interpolation_x_amount": 3,
"frame_interpolation_slow_mo_enabled": false, "frame_interpolation_slow_mo_enabled": false,
"frame_interpolation_slow_mo_amount": 2, "frame_interpolation_slow_mo_amount": 2,
"frame_interpolation_keep_imgs": true, "frame_interpolation_keep_imgs": false,
"frame_interpolation_use_upscaled": true "frame_interpolation_use_upscaled": false
} }

43
tests/utils.py Normal file
View File

@ -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