From a6666c3c3b770174d9a52d045b96c9bdaecbbb09 Mon Sep 17 00:00:00 2001 From: k4yt3x Date: Thu, 13 Jun 2019 23:42:43 -0400 Subject: [PATCH 1/4] added version option --- bin/video2x.py | 54 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/bin/video2x.py b/bin/video2x.py index eceb841..5c073f2 100644 --- a/bin/video2x.py +++ b/bin/video2x.py @@ -13,7 +13,7 @@ __ __ _ _ ___ __ __ Name: Video2X Controller Author: K4YT3X Date Created: Feb 24, 2018 -Last Modified: April 28, 2019 +Last Modified: June 10, 2019 Licensed under the GNU General Public License Version 3 (GNU GPL v3), available at: https://www.gnu.org/licenses/gpl-3.0.txt @@ -71,23 +71,27 @@ def process_arguments(): # video options file_options = parser.add_argument_group('File Options') - file_options.add_argument('-i', '--input', help='Source video file/directory', action='store', required=True) - file_options.add_argument('-o', '--output', help='Output video file/directory', action='store', required=True) + file_options.add_argument('-i', '--input', help='source video file/directory', action='store') + file_options.add_argument('-o', '--output', help='output video file/directory', action='store') # upscaler options upscaler_options = parser.add_argument_group('Upscaler Options') - upscaler_options.add_argument('-m', '--method', help='Upscaling method', action='store', default='gpu', choices=['cpu', 'gpu', 'cudnn'], required=True) - upscaler_options.add_argument('-d', '--driver', help='Waifu2x driver', action='store', default='waifu2x_caffe', choices=['waifu2x_caffe', 'waifu2x_converter']) + upscaler_options.add_argument('-m', '--method', help='upscaling method', action='store', default='gpu', choices=['cpu', 'gpu', 'cudnn']) + upscaler_options.add_argument('-d', '--driver', help='waifu2x driver', action='store', default='waifu2x_caffe', choices=['waifu2x_caffe', 'waifu2x_converter']) upscaler_options.add_argument('-y', '--model_dir', help='directory containing model JSON files', action='store') - upscaler_options.add_argument('-t', '--threads', help='Number of threads to use for upscaling', action='store', type=int, default=1) - upscaler_options.add_argument('-c', '--config', help='Video2X config file location', action='store', default=f'{os.path.dirname(os.path.abspath(sys.argv[0]))}\\video2x.json') - upscaler_options.add_argument('-b', '--batch', help='Enable batch mode (select all default values to questions)', action='store_true') + upscaler_options.add_argument('-t', '--threads', help='number of threads to use for upscaling', action='store', type=int, default=1) + upscaler_options.add_argument('-c', '--config', help='video2x config file location', action='store', default=f'{os.path.dirname(os.path.abspath(sys.argv[0]))}\\video2x.json') + upscaler_options.add_argument('-b', '--batch', help='enable batch mode (select all default values to questions)', action='store_true') # scaling options scaling_options = parser.add_argument_group('Scaling Options') - scaling_options.add_argument('--width', help='Output video width', action='store', type=int) - scaling_options.add_argument('--height', help='Output video height', action='store', type=int) - scaling_options.add_argument('-r', '--ratio', help='Scaling ratio', action='store', type=float) + scaling_options.add_argument('--width', help='output video width', action='store', type=int) + scaling_options.add_argument('--height', help='output video height', action='store', type=int) + scaling_options.add_argument('-r', '--ratio', help='scaling ratio', action='store', type=float) + + # extra options + extra_options = parser.add_argument_group('Extra Options') + extra_options.add_argument('-v', '--version', help='display version, lawful information and exit', action='store_true') # parse arguments return parser.parse_args() @@ -212,12 +216,28 @@ if __name__ != '__main__': Avalon.error('This file cannot be imported') raise ImportError(f'{__file__} cannot be imported') +# print video2x logo print_logo() # process CLI arguments args = process_arguments() +# display version and lawful informaition +if args.version: + print(f'Video2X Version: {VERSION}') + print('Author: K4YT3X') + print('License: GNU GPL v3') + print('Github Page: https://github.com/k4yt3x/video2x') + print('Contact: k4yt3x@k4yt3x.com') + exit(0) + # arguments sanity check +if not args.input: + Avalon.error('You must specify input video file/directory path') + exit(1) +if not args.output: + Avalon.error('You must specify output video file/directory path') + exit(1) if args.driver == 'waifu2x_converter' and args.width and args.height: Avalon.error('Waifu2x Converter CPP accepts only scaling ratio') exit(1) @@ -249,10 +269,7 @@ elif args.driver == 'waifu2x_converter': Avalon.error('Please check the configuration file settings') raise FileNotFoundError(waifu2x_settings['waifu2x_converter_path']) -# check if waifu2x path is valid - - -# read FFMPEG configuration +# read FFmpeg configuration ffmpeg_settings = config['ffmpeg'] # load video2x settings @@ -287,7 +304,8 @@ try: # if input specified is a single file if os.path.isfile(args.input): - """ Upscale single video file """ + + # upscale single video file Avalon.info(f'Upscaling single video file: {args.input}') # check for input output format mismatch @@ -320,7 +338,7 @@ try: # if input specified is a directory elif os.path.isdir(args.input): - """ Upscale videos in a directory """ + # upscale videos in a directory Avalon.info(f'Upscaling videos in directory: {args.input}') for input_video in [f for f in os.listdir(args.input) if os.path.isfile(os.path.join(args.input, f))]: output_video = f'{args.output}\\{input_video}' @@ -350,7 +368,7 @@ except Exception: Avalon.error('An exception has occurred') traceback.print_exc() finally: - # remove Video2X Cache directory + # remove Video2X cache directory try: if not preserve_frames: shutil.rmtree(video2x_cache_directory) From 8b0f82e95e2fa4f66e7ea3e08fcacf9121b67460 Mon Sep 17 00:00:00 2001 From: k4yt3x Date: Thu, 13 Jun 2019 23:49:10 -0400 Subject: [PATCH 2/4] 2.7.2 fixed threading bugs found by @Aidolii --- bin/video2x.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/video2x.py b/bin/video2x.py index 5c073f2..2df9f0b 100644 --- a/bin/video2x.py +++ b/bin/video2x.py @@ -13,7 +13,7 @@ __ __ _ _ ___ __ __ Name: Video2X Controller Author: K4YT3X Date Created: Feb 24, 2018 -Last Modified: June 10, 2019 +Last Modified: June 13, 2019 Licensed under the GNU General Public License Version 3 (GNU GPL v3), available at: https://www.gnu.org/licenses/gpl-3.0.txt @@ -52,7 +52,7 @@ import tempfile import time import traceback -VERSION = '2.7.1' +VERSION = '2.7.2' # each thread might take up to 2.5 GB during initialization. # (system memory, not to be confused with GPU memory) From 8e85d6a6d37796f70938fa81c81e3e0962ad6bbc Mon Sep 17 00:00:00 2001 From: k4yt3x Date: Thu, 13 Jun 2019 23:49:18 -0400 Subject: [PATCH 3/4] fixed threading bugs found by @Aidolii --- bin/upscaler.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/bin/upscaler.py b/bin/upscaler.py index 6fb736b..791f004 100644 --- a/bin/upscaler.py +++ b/bin/upscaler.py @@ -4,7 +4,7 @@ Name: Video2X Upscaler Author: K4YT3X Date Created: December 10, 2018 -Last Modified: April 28, 2019 +Last Modified: June 13, 2019 Licensed under the GNU General Public License Version 3 (GNU GPL v3), available at: https://www.gnu.org/licenses/gpl-3.0.txt @@ -20,6 +20,7 @@ from image_cleaner import ImageCleaner from tqdm import tqdm from waifu2x_caffe import Waifu2xCaffe from waifu2x_converter import Waifu2xConverter +import copy import os import re import shutil @@ -126,7 +127,7 @@ class Upscaler: time.sleep(1) - def _upscale_frames(self, w2): + def _upscale_frames(self): """ Upscale video frames with waifu2x-caffe This function upscales all the frames extracted @@ -143,9 +144,14 @@ class Upscaler: # if this thread is not empty, then an exception has occured self.upscaler_exceptions = [] + # initialize waifu2x driver + if self.waifu2x_driver != 'waifu2x_caffe' and self.waifu2x_driver != 'waifu2x_converter': + raise Exception(f'Unrecognized waifu2x driver: {self.waifu2x_driver}') + # it's easier to do multi-threading with waifu2x_converter # the number of threads can be passed directly to waifu2x_converter if self.waifu2x_driver == 'waifu2x_converter': + w2 = Waifu2xConverter(self.waifu2x_settings, self.model_dir) progress_bar = threading.Thread(target=self._progress_bar, args=([self.extracted_frames],)) progress_bar.start() @@ -197,6 +203,10 @@ class Upscaler: # create threads and start them for thread_info in thread_pool: + + # create a separate w2 instance for each thread + w2 = Waifu2xCaffe(copy.deepcopy(self.waifu2x_settings), self.method, self.model_dir) + # create thread if self.scale_ratio: thread = threading.Thread(target=w2.upscale, args=(thread_info[0], self.upscaled_frames, self.scale_ratio, False, False, self.image_format, self.upscaler_exceptions)) @@ -251,14 +261,6 @@ class Upscaler: # initialize objects for ffmpeg and waifu2x-caffe fm = Ffmpeg(self.ffmpeg_settings, self.image_format) - # initialize waifu2x driver - if self.waifu2x_driver == 'waifu2x_caffe': - w2 = Waifu2xCaffe(self.waifu2x_settings, self.method, self.model_dir) - elif self.waifu2x_driver == 'waifu2x_converter': - w2 = Waifu2xConverter(self.waifu2x_settings, self.model_dir) - else: - raise Exception(f'Unrecognized waifu2x driver: {self.waifu2x_driver}') - # extract frames from video fm.extract_frames(self.input_video, self.extracted_frames) @@ -292,7 +294,7 @@ class Upscaler: # upscale images one by one using waifu2x Avalon.info('Starting to upscale extracted images') - self._upscale_frames(w2) + self._upscale_frames() Avalon.info('Upscaling completed') # frames to Video From 1280a791ecaa94c11e0b46f305d36cc30190f8b7 Mon Sep 17 00:00:00 2001 From: k4yt3x Date: Fri, 14 Jun 2019 01:15:13 -0400 Subject: [PATCH 4/4] fixing issue #102 --- bin/ffmpeg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/ffmpeg.py b/bin/ffmpeg.py index 91daf55..166f6a3 100644 --- a/bin/ffmpeg.py +++ b/bin/ffmpeg.py @@ -152,7 +152,7 @@ class Ffmpeg: input_video ] - execute.extend(self._read_configuration(phase='frames_to_video', section='output_options')) + execute.extend(self._read_configuration(phase='migrating_tracks', section='output_options')) execute.extend([ output_video