Add broader set of tests and API improvements, including job cancellation
parent
802605a3a3
commit
517a14e817
|
|
@ -15,3 +15,4 @@ scripts/deforum_helpers/navigation.py
|
||||||
htmlcov
|
htmlcov
|
||||||
tests/results.xml
|
tests/results.xml
|
||||||
.coverage*
|
.coverage*
|
||||||
|
serverlog.txt
|
||||||
|
|
|
||||||
|
|
@ -3,3 +3,4 @@ syrupy
|
||||||
pytest
|
pytest
|
||||||
tenacity
|
tenacity
|
||||||
pydantic_requests
|
pydantic_requests
|
||||||
|
moviepy
|
||||||
|
|
@ -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,37 +137,93 @@ 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 = {}
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
@ -39,3 +40,5 @@ class DeforumJobStatus(BaseModel):
|
||||||
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]]
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
'''
|
||||||
|
# ---
|
||||||
|
|
@ -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!
|
||||||
|
|
||||||
|
|
||||||
'''
|
'''
|
||||||
# ---
|
# ---
|
||||||
|
|
|
||||||
|
|
@ -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...")
|
||||||
|
|
@ -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)"
|
||||||
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
@ -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
|
||||||
Loading…
Reference in New Issue