diff --git a/bin/video2x.json b/bin/video2x.json index 79178e1..772857d 100644 --- a/bin/video2x.json +++ b/bin/video2x.json @@ -40,12 +40,14 @@ "input": null }, "waifu2x_ncnn_vulkan": { - "waifu2x_ncnn_vulkan_path": "C:\\Users\\K4YT3X\\AppData\\Local\\video2x\\waifu2x-ncnn-vulkan\\waifu2x.exe", + "waifu2x_ncnn_vulkan_path": "C:\\Users\\K4YT3X\\AppData\\Local\\video2x\\waifu2x-ncnn-vulkan\\waifu2x-ncnn-vulkan.exe", "input": null, "output": null, "noise-level": 2, "scale-ratio": null, - "block-size": 400 + "tile-size": 400, + "model-path": null, + "gpu": 0 }, "ffmpeg": { "ffmpeg_path": "C:\\Users\\K4YT3X\\AppData\\Local\\video2x\\ffmpeg-latest-win64-static\\bin", diff --git a/bin/video2x_setup.py b/bin/video2x_setup.py index 4dbd0b0..f9b84f8 100644 --- a/bin/video2x_setup.py +++ b/bin/video2x_setup.py @@ -196,15 +196,13 @@ class Video2xSetup: if self.driver == 'all': template_dict['waifu2x_caffe']['waifu2x_caffe_path'] = os.path.join(local_app_data, 'video2x', 'waifu2x-caffe', 'waifu2x-caffe-cui.exe') template_dict['waifu2x_converter']['waifu2x_converter_path'] = os.path.join(local_app_data, 'video2x', 'waifu2x-converter-cpp') - # TODO: after version 20190611 executable changes to waifu2x-ncnn-vulkan so rename this when it breaks - template_dict['waifu2x_ncnn_vulkan']['waifu2x_ncnn_vulkan_path'] = os.path.join(local_app_data, 'video2x', 'waifu2x-ncnn-vulkan', 'waifu2x.exe') + template_dict['waifu2x_ncnn_vulkan']['waifu2x_ncnn_vulkan_path'] = os.path.join(local_app_data, 'video2x', 'waifu2x-ncnn-vulkan', 'waifu2x-ncnn-vulkan.exe') elif self.driver == 'waifu2x_caffe': template_dict['waifu2x_caffe']['waifu2x_caffe_path'] = os.path.join(local_app_data, 'video2x', 'waifu2x-caffe', 'waifu2x-caffe-cui.exe') elif self.driver == 'waifu2x_converter': template_dict['waifu2x_converter']['waifu2x_converter_path'] = os.path.join(local_app_data, 'video2x', 'waifu2x-converter-cpp') elif self.driver == 'waifu2x_ncnn_vulkan': - # TODO: after version 20190611 executable changes to waifu2x-ncnn-vulkan so rename this when it breaks - template_dict['waifu2x_ncnn_vulkan']['waifu2x_ncnn_vulkan_path'] = os.path.join(local_app_data, 'video2x', 'waifu2x-ncnn-vulkan', 'waifu2x.exe') + template_dict['waifu2x_ncnn_vulkan']['waifu2x_ncnn_vulkan_path'] = os.path.join(local_app_data, 'video2x', 'waifu2x-ncnn-vulkan', 'waifu2x-ncnn-vulkan.exe') template_dict['ffmpeg']['ffmpeg_path'] = os.path.join(local_app_data, 'video2x', 'ffmpeg-latest-win64-static', 'bin') template_dict['video2x']['video2x_cache_directory'] = None diff --git a/bin/waifu2x_ncnn_vulkan.py b/bin/waifu2x_ncnn_vulkan.py index 38b51ad..caeb9bb 100644 --- a/bin/waifu2x_ncnn_vulkan.py +++ b/bin/waifu2x_ncnn_vulkan.py @@ -50,47 +50,73 @@ class Waifu2xNcnnVulkan: try: # overwrite config file settings - self.waifu2x_settings['input_path'] = input_directory - self.waifu2x_settings['output_path'] = output_directory + self.waifu2x_settings['input'] = input_directory + self.waifu2x_settings['output'] = output_directory # print thread start message self.print_lock.acquire() Avalon.debug_info(f'[upscaler] Thread {threading.current_thread().name} started') self.print_lock.release() - # waifu2x_ncnn_vulkan accepts arguments in a positional manner - # See: https://github.com/nihui/waifu2x_ncnn_vulkan#usage - # waifu2x_ncnn_vulkan.exe [input image] [output png] [noise=-1/0/1/2/3] [scale=1/2] [blocksize=400] - # noise = noise level, large value means strong denoise effect, -1=no effect - # scale = scale level, 1=no scale, 2=upscale 2x - # blocksize = tile size, use smaller value to reduce GPU memory usage, default is 400 + # waifu2x_ncnn_vulkan does not have long-opts, we'll have a dictionary that maps "our" config long-opt + # names to their short opts + waifu2x_ncnn_vulkan_opt_flag = { + 'input': '-i', + 'output': '-o', + 'noise-level': '-n', + 'scale-ratio': '-s', + 'tile-size': '-t', + 'model-path': '-m', + 'gpu': '-g' + } # waifu2x_ncnn_vulkan does not accept an arbitrary scale ratio, max is 2 if scale_ratio == 1: for raw_frame in os.listdir(input_directory): - command = [ - os.path.join(input_directory, raw_frame), - os.path.join(output_directory, raw_frame), - str(self.waifu2x_settings['noise-level']), - '1', - str(self.waifu2x_settings['block-size']) - ] execute = [self.waifu2x_settings['waifu2x_ncnn_vulkan_path']] - execute.extend(command) + for key in self.waifu2x_settings.keys(): + value = self.waifu2x_settings[key] + if key == 'waifu2x_ncnn_vulkan_path': + continue + elif key == 'input': + execute.append(waifu2x_ncnn_vulkan_opt_flag[key]) + execute.append(os.path.join(input_directory, raw_frame)) + elif key == 'output': + execute.append(waifu2x_ncnn_vulkan_opt_flag[key]) + execute.append(os.path.join(output_directory, raw_frame)) + elif key == 'scale-ratio': + execute.append(waifu2x_ncnn_vulkan_opt_flag[key]) + execute.append('1') + # allow upper if cases to take precedence + elif value is None or value is False: + continue + else: + execute.append(waifu2x_ncnn_vulkan_opt_flag[key]) + execute.append(str(value)) Avalon.debug_info(f'Executing: {execute}') subprocess.run(execute, check=True, stderr=subprocess.DEVNULL) else: for raw_frame in os.listdir(input_directory): - command = [ - os.path.join(input_directory, raw_frame), - os.path.join(output_directory, raw_frame), - str(self.waifu2x_settings['noise-level']), - '2', - str(self.waifu2x_settings['block-size']) - ] execute = [self.waifu2x_settings['waifu2x_ncnn_vulkan_path']] - execute.extend(command) + for key in self.waifu2x_settings.keys(): + value = self.waifu2x_settings[key] + if key == 'waifu2x_ncnn_vulkan_path': + continue + elif key == 'input': + execute.append(waifu2x_ncnn_vulkan_opt_flag[key]) + execute.append(os.path.join(input_directory, raw_frame)) + elif key == 'output': + execute.append(waifu2x_ncnn_vulkan_opt_flag[key]) + execute.append(os.path.join(output_directory, raw_frame)) + elif key == 'scale-ratio': + execute.append(waifu2x_ncnn_vulkan_opt_flag[key]) + execute.append('2') + elif value is None or value is False: + continue + else: + execute.append(waifu2x_ncnn_vulkan_opt_flag[key]) + execute.append(str(value)) Avalon.debug_info(f'Executing: {execute}') subprocess.run(execute, check=True, stderr=subprocess.DEVNULL)