|
from typing import Any, Optional, List |
|
import time |
|
import tempfile |
|
import statistics |
|
import gradio |
|
|
|
import DeepFakeAI.globals |
|
from DeepFakeAI import wording |
|
from DeepFakeAI.capturer import get_video_frame_total |
|
from DeepFakeAI.core import conditional_process |
|
from DeepFakeAI.uis.typing import Update |
|
from DeepFakeAI.utilities import normalize_output_path, clear_temp |
|
|
|
BENCHMARK_RESULT_DATAFRAME : Optional[gradio.Dataframe] = None |
|
BENCHMARK_CYCLES_SLIDER : Optional[gradio.Button] = None |
|
BENCHMARK_START_BUTTON : Optional[gradio.Button] = None |
|
BENCHMARK_CLEAR_BUTTON : Optional[gradio.Button] = None |
|
|
|
|
|
def render() -> None: |
|
global BENCHMARK_RESULT_DATAFRAME |
|
global BENCHMARK_CYCLES_SLIDER |
|
global BENCHMARK_START_BUTTON |
|
global BENCHMARK_CLEAR_BUTTON |
|
|
|
with gradio.Box(): |
|
BENCHMARK_RESULT_DATAFRAME = gradio.Dataframe( |
|
label = wording.get('benchmark_result_dataframe_label'), |
|
headers = |
|
[ |
|
'target_path', |
|
'benchmark_cycles', |
|
'average_run', |
|
'fastest_run', |
|
'slowest_run', |
|
'relative_fps' |
|
], |
|
col_count = (6, 'fixed'), |
|
row_count = (7, 'fixed'), |
|
datatype = |
|
[ |
|
'str', |
|
'number', |
|
'number', |
|
'number', |
|
'number', |
|
'number' |
|
] |
|
) |
|
BENCHMARK_CYCLES_SLIDER = gradio.Slider( |
|
label = wording.get('benchmark_cycles_slider_label'), |
|
minimum = 1, |
|
step = 1, |
|
value = 3, |
|
maximum = 10 |
|
) |
|
with gradio.Row(): |
|
BENCHMARK_START_BUTTON = gradio.Button(wording.get('start_button_label')) |
|
BENCHMARK_CLEAR_BUTTON = gradio.Button(wording.get('clear_button_label')) |
|
|
|
|
|
def listen() -> None: |
|
BENCHMARK_START_BUTTON.click(update, inputs = BENCHMARK_CYCLES_SLIDER, outputs = BENCHMARK_RESULT_DATAFRAME) |
|
BENCHMARK_CLEAR_BUTTON.click(clear, outputs = BENCHMARK_RESULT_DATAFRAME) |
|
|
|
|
|
def update(benchmark_cycles : int) -> Update: |
|
DeepFakeAI.globals.source_path = '.assets/examples/source.jpg' |
|
target_paths =\ |
|
[ |
|
'.assets/examples/target-240p.mp4', |
|
'.assets/examples/target-360p.mp4', |
|
'.assets/examples/target-540p.mp4', |
|
'.assets/examples/target-720p.mp4', |
|
'.assets/examples/target-1080p.mp4', |
|
'.assets/examples/target-1440p.mp4', |
|
'.assets/examples/target-2160p.mp4' |
|
] |
|
value = [ benchmark(target_path, benchmark_cycles) for target_path in target_paths ] |
|
return gradio.update(value = value) |
|
|
|
|
|
def benchmark(target_path : str, benchmark_cycles : int) -> List[Any]: |
|
process_times = [] |
|
total_fps = 0.0 |
|
for i in range(benchmark_cycles + 1): |
|
DeepFakeAI.globals.target_path = target_path |
|
DeepFakeAI.globals.output_path = normalize_output_path(DeepFakeAI.globals.source_path, DeepFakeAI.globals.target_path, tempfile.gettempdir()) |
|
video_frame_total = get_video_frame_total(DeepFakeAI.globals.target_path) |
|
start_time = time.perf_counter() |
|
conditional_process() |
|
end_time = time.perf_counter() |
|
process_time = end_time - start_time |
|
fps = video_frame_total / process_time |
|
if i > 0: |
|
process_times.append(process_time) |
|
total_fps += fps |
|
average_run = round(statistics.mean(process_times), 2) |
|
fastest_run = round(min(process_times), 2) |
|
slowest_run = round(max(process_times), 2) |
|
relative_fps = round(total_fps / benchmark_cycles, 2) |
|
return\ |
|
[ |
|
DeepFakeAI.globals.target_path, |
|
benchmark_cycles, |
|
average_run, |
|
fastest_run, |
|
slowest_run, |
|
relative_fps |
|
] |
|
|
|
|
|
def clear() -> Update: |
|
if DeepFakeAI.globals.target_path: |
|
clear_temp(DeepFakeAI.globals.target_path) |
|
return gradio.update(value = None) |
|
|