Skip to content

Commit 1d441fd

Browse files
committed
Integrated new Denoise AI - waifu2x-ncnn-vulkan
1 parent 13c869b commit 1d441fd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1002
-225
lines changed

.env

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@ STEP_PER_BATCH=6
66
FRAMES_PER_BATCH=1000
77

88
# Настройка апскейла
9-
MODEL_NAME=realesr-animevideov3
9+
REALESRGAN_MODEL_NAME=realesr-animevideov3
1010
UPSCALE_FACTOR=4
1111
OUTPUT_IMAGE_FORMAT=jpg
12+
13+
# Настройка денойза
14+
DENOISE_FACTOR=3
15+
WAIFU2X_UPSCALE_FACTOR=1
16+
17+
# Настройка интерполяции
18+
FRAMES_MULTIPLY_FACTOR=4
19+
ENABLE_UHD_MODE=true

data/denoised_frame_batches/.gitkeep

Whitespace-only changes.

data/interpolated_frame_batches/.gitkeep

Whitespace-only changes.

main.py

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,15 @@
1616
START_BATCH_TO_UPSCALE,
1717
TMP_VIDEO_PATH,
1818
)
19+
from src.files.batch_utils import (
20+
BatchType,
21+
delete_default_batches,
22+
delete_denoise_batches,
23+
delete_frames,
24+
)
1925
from src.files.file_actions import delete_file
2026
from src.frames.frames_helpers import extract_frames_to_batches, get_fps_accurate
21-
from src.frames.upscale import delete_frames, upscale_batches
27+
from src.frames.improve import ProcessingType, improve_batches
2228
from src.utils.logger import logger
2329
from src.video.video_handling import VideoHandler
2430

@@ -39,17 +45,16 @@ async def clean_up(audio: AudioHandler) -> None:
3945
"""Удаляет временные файлы."""
4046
logger.debug("Начало очистки временных файлов")
4147
delete_tasks = [
42-
delete_frames(del_upscaled=False),
43-
delete_frames(del_upscaled=True),
44-
audio.delete_audio_if_exists()
48+
delete_frames(BatchType.DEFAULT, del_all=True), # Удаляем все default батчи
49+
delete_frames(BatchType.DENOISE, del_all=True), # Удаляем все denoise батчи
50+
delete_frames(BatchType.UPSCALE, del_all=True), # Удаляем все upscale батчи
51+
audio.delete_audio_if_exists(),
4552
]
4653
delete_tasks.extend(
47-
delete_file(f)
48-
for f in glob.glob(os.path.join(BATCH_VIDEO_PATH, "*.mp4"))
54+
delete_file(f) for f in glob.glob(os.path.join(BATCH_VIDEO_PATH, "*.mp4"))
4955
)
5056
delete_tasks.extend(
51-
delete_file(f)
52-
for f in glob.glob(os.path.join(TMP_VIDEO_PATH, "*.mp4"))
57+
delete_file(f) for f in glob.glob(os.path.join(TMP_VIDEO_PATH, "*.mp4"))
5358
)
5459
if delete_tasks:
5560
await asyncio.gather(*delete_tasks)
@@ -80,6 +85,7 @@ async def process_batches(
8085
threads: int,
8186
ai_threads: str,
8287
video: VideoHandler,
88+
ai_waifu2x_path: str,
8389
ai_realesrgan_path: str,
8490
start_batch: int,
8591
end_batch_to_upscale: int,
@@ -90,9 +96,28 @@ async def process_batches(
9096
end_batch = min(start_batch + threads - 1, end_batch_to_upscale)
9197
logger.info(f"Обработка батчей с {start_batch} по {end_batch}")
9298

93-
await upscale_batches(
94-
threads, ai_threads, ai_realesrgan_path, start_batch, end_batch
99+
# денойз фреймов
100+
await improve_batches(
101+
ProcessingType.DENOISE,
102+
threads,
103+
ai_threads,
104+
ai_waifu2x_path,
105+
start_batch,
106+
end_batch,
107+
)
108+
await delete_default_batches(start_batch, end_batch)
109+
logger.success(f"Батчи {start_batch}-{end_batch} успешно денойзены")
110+
111+
# апскейл фреймов
112+
await improve_batches(
113+
ProcessingType.UPSCALE,
114+
threads,
115+
ai_threads,
116+
ai_realesrgan_path,
117+
start_batch,
118+
end_batch,
95119
)
120+
await delete_denoise_batches(start_batch, end_batch)
96121
logger.success(f"Батчи {start_batch}-{end_batch} успешно апскейлены")
97122

98123
batches_to_perform = [f"batch_{i}" for i in range(start_batch, end_batch + 1)]
@@ -108,6 +133,7 @@ async def main():
108133
try:
109134
my_computer = ComputerParams()
110135
ai_realesrgan_path = my_computer.ai_realesrgan_path
136+
ai_waifu2x_path = my_computer.ai_waifu2x_path
111137
ai_threads, process_threads = my_computer.get_optimal_threads()
112138

113139
# логирование параметров системы
@@ -119,6 +145,7 @@ async def main():
119145
f"\n\tСкорость SSD: ~{my_computer.ssd_speed} MB/s"
120146
f"\n\tRAM: ~{my_computer.ram_total} GB"
121147
f"\n\tПараметры нейронок: -j {ai_threads}"
148+
f"\n\tПуть к нейронке денойза: {ai_waifu2x_path}"
122149
f"\n\tПуть к нейронке апскейла: {ai_realesrgan_path}"
123150
)
124151

@@ -134,18 +161,19 @@ async def main():
134161
print_bottom("`сырьё` из видео извлечено")
135162

136163
# определяем диапазон батчей для обработки
137-
print_header("генерируем апскейленные короткие видео...")
164+
print_header("генерируем улучшенные короткие видео...")
138165
end_batch_to_upscale = calculate_batches()
139166
logger.info(f"Всего батчей для обработки: {end_batch_to_upscale}")
140167
await process_batches(
141168
process_threads,
142169
ai_threads,
143170
video,
171+
ai_waifu2x_path,
144172
ai_realesrgan_path,
145173
START_BATCH_TO_UPSCALE,
146174
end_batch_to_upscale,
147175
)
148-
print_bottom("апскейленные короткие видео сгенерированы")
176+
print_bottom("улучшенные короткие видео сгенерированы")
149177

150178
print_header("начало финальной сборки видео...")
151179
total_short_videos = ceil(end_batch_to_upscale / process_threads)

src/config/comp_params.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,13 +145,31 @@ def ai_realesrgan_path(self) -> str:
145145
ROOT_DIR, "src", "utils", "realesrgan", f"realesrgan-{self.os}", executable
146146
)
147147
if not Path(path).exists():
148-
logger.warning(f"AI исполняемый файл не найден {path}")
149-
raise FileNotFoundError(f"AI исполняемый файл не найден {path}")
148+
msg = f"AI RealESRGAN-ncnn-vulkan исполняемый файл не найден {path}"
149+
logger.warning(msg)
150+
raise FileNotFoundError(msg)
150151
return path
151152
except Exception as e:
152153
logger.error(f"Ошибка при получении пути к исполняемому файлу realesrgan: {str(e)}")
153154
raise
154155

156+
@cached_property
157+
def ai_waifu2x_path(self) -> str:
158+
"""Получает AI Waifu2x-ncnn-vulkan путь к исполняемому файлу"""
159+
try:
160+
executable = "waifu2x-ncnn-vulkan" + (".exe" if self.os == "win" else "")
161+
path = os.path.join(
162+
ROOT_DIR, "src", "utils", "waifu2x", f"waifu2x-{self.os}", executable
163+
)
164+
if not Path(path).exists():
165+
msg = f"AI Waifu2x-ncnn-vulkan исполняемый файл не найд {path}"
166+
logger.warning(msg)
167+
raise FileNotFoundError(msg)
168+
return path
169+
except Exception as e:
170+
logger.error(f"Ошибка при получении пути к исполняемому файлу waifu2x: {str(e)}")
171+
raise
172+
155173
@staticmethod
156174
def _is_nvidia_smi_installed() -> bool:
157175
"""Проверяет если nvidia-smi доступен на ПК"""

src/config/settings.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from dotenv import load_dotenv
44

5-
load_dotenv()
5+
load_dotenv(verbose=True)
66
ROOT_DIR = os.getcwd()
77

88
# Пути к файлам
@@ -17,8 +17,8 @@
1717
)
1818
BATCH_VIDEO_PATH = os.path.join(ROOT_DIR, "data", "video_batches")
1919
INPUT_BATCHES_DIR = os.path.join(ROOT_DIR, "data", "default_frame_batches")
20-
OUTPUT_BATCHES_DIR = os.path.join(ROOT_DIR, "data", "upscaled_frame_batches")
2120
LOGS_DIR = os.path.join(ROOT_DIR)
21+
OUTPUT_IMAGE_FORMAT = os.getenv("OUTPUT_IMAGE_FORMAT", "jpg")
2222

2323
# Файловые параметры апскейлера
2424
RESOLUTION = os.getenv("RESOLUTION", "4K")
@@ -27,7 +27,21 @@
2727
FRAMES_PER_BATCH = int(os.getenv("FRAMES_PER_BATCH", 1000))
2828

2929
# Настройка апскейла
30-
MODEL_DIR = os.path.join(ROOT_DIR, "src", "utils", "realesrgan", "models")
31-
MODEL_NAME = os.getenv("MODEL_NAME", "realesr-animevideov3")
30+
UPSCALED_BATCHES_DIR = os.path.join(ROOT_DIR, "data", "upscaled_frame_batches")
31+
REALESRGAN_MODEL_DIR = os.path.join(ROOT_DIR, "src", "utils", "realesrgan", "models")
32+
REALESRGAN_MODEL_NAME = os.getenv("REALESRGAN_MODEL_NAME", "realesr-animevideov3")
3233
UPSCALE_FACTOR = int(os.getenv("UPSCALE_FACTOR", 2))
33-
OUTPUT_IMAGE_FORMAT = os.getenv("OUTPUT_IMAGE_FORMAT", "jpg")
34+
35+
# Настройка денойза
36+
DENOISED_BATCHES_DIR = os.path.join(ROOT_DIR, "data", "denoised_frame_batches")
37+
WAIFU2X_MODEL_DIR = os.path.join(
38+
ROOT_DIR, "src", "utils", "waifu2x", "models", "models-cunet"
39+
)
40+
DENOISE_FACTOR = int(os.getenv("DENOISE_FACTOR", 3))
41+
WAIFU2X_UPSCALE_FACTOR = int(os.getenv("WAIFU2X_UPSCALE_FACTOR", 1))
42+
43+
# Настройка интерполяции
44+
INTERPOLATED_BATCHES_DIR = os.path.join(ROOT_DIR, "data", "interpolated_frame_batches")
45+
RIFE_MODEL_DIR = os.path.join(ROOT_DIR, "src", "utils", "rife", "models", "rife-anime")
46+
FRAMES_MULTIPLY_FACTOR = int(os.getenv("FRAMES_MULTIPLY_FACTOR", 4))
47+
ENABLE_UHD_MODE = bool(os.getenv("ENABLE_UHD_MODE", True))

0 commit comments

Comments
 (0)