2.1.0 added multithreading according to @wuast94 's suggestions

This commit is contained in:
K4YT3X 2018-10-22 15:00:50 -04:00
parent 7cd10a85f3
commit 7da46ef76d

View File

@ -26,18 +26,20 @@ video, enlarge it by a number of times without losing any
details or quality, keeping lines smooth and edges sharp. details or quality, keeping lines smooth and edges sharp.
""" """
from avalon_framework import Avalon from avalon_framework import Avalon
from ffmpeg import FFMPEG from ffmpeg import Ffmpeg
from fractions import Fraction from fractions import Fraction
from waifu2x import WAIFU2X from waifu2x import Waifu2x
import argparse import argparse
import inspect import inspect
import json import json
import os import os
import shutil import shutil
import subprocess import subprocess
import threading
import time
import traceback import traceback
VERSION = '2.0.5' VERSION = '2.1.0'
EXEC_PATH = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) EXEC_PATH = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
FRAMES = '{}\\frames'.format(EXEC_PATH) # Folder containing extracted frames FRAMES = '{}\\frames'.format(EXEC_PATH) # Folder containing extracted frames
@ -63,6 +65,7 @@ def process_arguments():
control_group.add_argument('-v', '--video', help='Specify source video file', action='store', default=False) control_group.add_argument('-v', '--video', help='Specify source video file', action='store', default=False)
control_group.add_argument('-o', '--output', help='Specify output file', action='store', default=False) control_group.add_argument('-o', '--output', help='Specify output file', action='store', default=False)
control_group.add_argument('-y', '--model_type', help='Specify model to use', action='store', default='anime_style_art_rgb') control_group.add_argument('-y', '--model_type', help='Specify model to use', action='store', default='anime_style_art_rgb')
control_group.add_argument('-t', '--threads', help='Specify model to use', action='store', type=int, default=5)
control_group.add_argument('--cpu', help='Use CPU for enlarging', action='store_true', default=False) control_group.add_argument('--cpu', help='Use CPU for enlarging', action='store_true', default=False)
control_group.add_argument('--gpu', help='Use GPU for enlarging', action='store_true', default=False) control_group.add_argument('--gpu', help='Use GPU for enlarging', action='store_true', default=False)
control_group.add_argument('--cudnn', help='Use CUDNN for enlarging', action='store_true', default=False) control_group.add_argument('--cudnn', help='Use CUDNN for enlarging', action='store_true', default=False)
@ -78,8 +81,7 @@ def print_logo():
print(' \\/ |_| \\__,_| \\___| \\___/ |____| /_/ \\_\\') print(' \\/ |_| \\__,_| \\___| \\___/ |____| /_/ \\_\\')
print('\n Video2X Video Enlarger') print('\n Video2X Video Enlarger')
spaces = ((44 - len("Version " + VERSION)) // 2) * " " spaces = ((44 - len("Version " + VERSION)) // 2) * " "
print(Avalon.FM.BD + "\n" + spaces + print('{}\n{} Version {}\n{}'.format(Avalon.FM.BD, spaces, VERSION, Avalon.FM.RST))
' Version ' + VERSION + '\n' + Avalon.FM.RST)
def get_vid_info(): def get_vid_info():
@ -122,6 +124,7 @@ def video2x():
check_model_type(args) check_model_type(args)
# Parse arguments for waifu2x
if args.cpu: if args.cpu:
method = 'cpu' method = 'cpu'
elif args.gpu: elif args.gpu:
@ -129,8 +132,9 @@ def video2x():
elif args.cudnn: elif args.cudnn:
method = 'cudnn' method = 'cudnn'
fm = FFMPEG('\"' + FFMPEG_PATH + 'ffmpeg.exe\"', args.output) # Initialize objects for ffmpeg and waifu2x-caffe
w2 = WAIFU2X(WAIFU2X_PATH, method, args.model_type) fm = Ffmpeg('\"' + FFMPEG_PATH + 'ffmpeg.exe\"', args.output)
w2 = Waifu2x(WAIFU2X_PATH, method, args.model_type)
# Clear and create directories # Clear and create directories
if os.path.isdir(FRAMES): if os.path.isdir(FRAMES):
@ -151,8 +155,49 @@ def video2x():
# Upscale images one by one using waifu2x # Upscale images one by one using waifu2x
Avalon.info('Starting to upscale extracted images') Avalon.info('Starting to upscale extracted images')
w2.upscale(FRAMES, UPSCALED, args.width, args.height)
Avalon.info('Conversion complete') upscaler_threads = []
frames = [os.path.join(FRAMES, f) for f in os.listdir(FRAMES) if os.path.isfile(os.path.join(FRAMES, f))]
# If we have less images than threads,
# create only the threads necessary
if len(frames) < args.threads:
args.threads = len(frames)
# Move an equal amount of images into separate
# folders for each thread
images_per_thread = len(frames) // args.threads
for thread_id in range(args.threads):
thread_folder = '{}\\{}'.format(FRAMES, str(thread_id))
# Delete old folders and create new folders
if os.path.isdir(thread_folder):
shutil.rmtree(thread_folder)
os.mkdir(thread_folder)
# Begin moving images into corresponding folders
for _ in range(images_per_thread):
try:
shutil.move(frames.pop(0), thread_folder)
except IndexError:
pass
# Create thread
thread = threading.Thread(target=w2.upscale, args=(thread_folder, UPSCALED, args.width, args.height))
thread.name = str(thread_id)
# Add threads into the pool
upscaler_threads.append(thread)
# Start all threads
for thread in upscaler_threads:
thread.start()
# Wait for threads to finish
for thread in upscaler_threads:
thread.join()
Avalon.info('Upscaling complete')
# Frames to Video # Frames to Video
Avalon.info('Converting extracted frames into video') Avalon.info('Converting extracted frames into video')
@ -204,7 +249,9 @@ elif not args.cpu and not args.gpu and not args.cudnn:
if __name__ == '__main__': if __name__ == '__main__':
try: try:
begin_time = time.time()
video2x() video2x()
except Exception as e: Avalon.info('Program completed, taking {} seconds'.format(round((time.time() - begin_time), 5)))
except Exception:
Avalon.error('An exception occurred') Avalon.error('An exception occurred')
traceback.print_exc() traceback.print_exc()