mirror of
https://github.com/k4yt3x/video2x.git
synced 2024-12-29 16:09:10 +00:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
fafd5fadd3
@ -152,7 +152,7 @@ class Ffmpeg:
|
|||||||
input_video
|
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([
|
execute.extend([
|
||||||
output_video
|
output_video
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
Name: Video2X Upscaler
|
Name: Video2X Upscaler
|
||||||
Author: K4YT3X
|
Author: K4YT3X
|
||||||
Date Created: December 10, 2018
|
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),
|
Licensed under the GNU General Public License Version 3 (GNU GPL v3),
|
||||||
available at: https://www.gnu.org/licenses/gpl-3.0.txt
|
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 tqdm import tqdm
|
||||||
from waifu2x_caffe import Waifu2xCaffe
|
from waifu2x_caffe import Waifu2xCaffe
|
||||||
from waifu2x_converter import Waifu2xConverter
|
from waifu2x_converter import Waifu2xConverter
|
||||||
|
import copy
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
@ -126,7 +127,7 @@ class Upscaler:
|
|||||||
|
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
def _upscale_frames(self, w2):
|
def _upscale_frames(self):
|
||||||
""" Upscale video frames with waifu2x-caffe
|
""" Upscale video frames with waifu2x-caffe
|
||||||
|
|
||||||
This function upscales all the frames extracted
|
This function upscales all the frames extracted
|
||||||
@ -143,9 +144,14 @@ class Upscaler:
|
|||||||
# if this thread is not empty, then an exception has occured
|
# if this thread is not empty, then an exception has occured
|
||||||
self.upscaler_exceptions = []
|
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
|
# it's easier to do multi-threading with waifu2x_converter
|
||||||
# the number of threads can be passed directly to waifu2x_converter
|
# the number of threads can be passed directly to waifu2x_converter
|
||||||
if self.waifu2x_driver == '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 = threading.Thread(target=self._progress_bar, args=([self.extracted_frames],))
|
||||||
progress_bar.start()
|
progress_bar.start()
|
||||||
@ -197,6 +203,10 @@ class Upscaler:
|
|||||||
|
|
||||||
# create threads and start them
|
# create threads and start them
|
||||||
for thread_info in thread_pool:
|
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
|
# create thread
|
||||||
if self.scale_ratio:
|
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))
|
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
|
# initialize objects for ffmpeg and waifu2x-caffe
|
||||||
fm = Ffmpeg(self.ffmpeg_settings, self.image_format)
|
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
|
# extract frames from video
|
||||||
fm.extract_frames(self.input_video, self.extracted_frames)
|
fm.extract_frames(self.input_video, self.extracted_frames)
|
||||||
|
|
||||||
@ -292,7 +294,7 @@ class Upscaler:
|
|||||||
|
|
||||||
# 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')
|
||||||
self._upscale_frames(w2)
|
self._upscale_frames()
|
||||||
Avalon.info('Upscaling completed')
|
Avalon.info('Upscaling completed')
|
||||||
|
|
||||||
# frames to Video
|
# frames to Video
|
||||||
|
@ -13,7 +13,7 @@ __ __ _ _ ___ __ __
|
|||||||
Name: Video2X Controller
|
Name: Video2X Controller
|
||||||
Author: K4YT3X
|
Author: K4YT3X
|
||||||
Date Created: Feb 24, 2018
|
Date Created: Feb 24, 2018
|
||||||
Last Modified: April 28, 2019
|
Last Modified: June 13, 2019
|
||||||
|
|
||||||
Licensed under the GNU General Public License Version 3 (GNU GPL v3),
|
Licensed under the GNU General Public License Version 3 (GNU GPL v3),
|
||||||
available at: https://www.gnu.org/licenses/gpl-3.0.txt
|
available at: https://www.gnu.org/licenses/gpl-3.0.txt
|
||||||
@ -52,7 +52,7 @@ import tempfile
|
|||||||
import time
|
import time
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
VERSION = '2.7.1'
|
VERSION = '2.7.2'
|
||||||
|
|
||||||
# each thread might take up to 2.5 GB during initialization.
|
# each thread might take up to 2.5 GB during initialization.
|
||||||
# (system memory, not to be confused with GPU memory)
|
# (system memory, not to be confused with GPU memory)
|
||||||
@ -71,23 +71,27 @@ def process_arguments():
|
|||||||
|
|
||||||
# video options
|
# video options
|
||||||
file_options = parser.add_argument_group('File 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('-i', '--input', help='source video file/directory', action='store')
|
||||||
file_options.add_argument('-o', '--output', help='Output video file/directory', action='store', required=True)
|
file_options.add_argument('-o', '--output', help='output video file/directory', action='store')
|
||||||
|
|
||||||
# upscaler options
|
# upscaler options
|
||||||
upscaler_options = parser.add_argument_group('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('-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('-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('-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('-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('-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('-b', '--batch', help='enable batch mode (select all default values to questions)', action='store_true')
|
||||||
|
|
||||||
# scaling options
|
# scaling options
|
||||||
scaling_options = parser.add_argument_group('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('--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('--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('-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
|
# parse arguments
|
||||||
return parser.parse_args()
|
return parser.parse_args()
|
||||||
@ -212,12 +216,28 @@ if __name__ != '__main__':
|
|||||||
Avalon.error('This file cannot be imported')
|
Avalon.error('This file cannot be imported')
|
||||||
raise ImportError(f'{__file__} cannot be imported')
|
raise ImportError(f'{__file__} cannot be imported')
|
||||||
|
|
||||||
|
# print video2x logo
|
||||||
print_logo()
|
print_logo()
|
||||||
|
|
||||||
# process CLI arguments
|
# process CLI arguments
|
||||||
args = process_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
|
# 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:
|
if args.driver == 'waifu2x_converter' and args.width and args.height:
|
||||||
Avalon.error('Waifu2x Converter CPP accepts only scaling ratio')
|
Avalon.error('Waifu2x Converter CPP accepts only scaling ratio')
|
||||||
exit(1)
|
exit(1)
|
||||||
@ -249,10 +269,7 @@ elif args.driver == 'waifu2x_converter':
|
|||||||
Avalon.error('Please check the configuration file settings')
|
Avalon.error('Please check the configuration file settings')
|
||||||
raise FileNotFoundError(waifu2x_settings['waifu2x_converter_path'])
|
raise FileNotFoundError(waifu2x_settings['waifu2x_converter_path'])
|
||||||
|
|
||||||
# check if waifu2x path is valid
|
# read FFmpeg configuration
|
||||||
|
|
||||||
|
|
||||||
# read FFMPEG configuration
|
|
||||||
ffmpeg_settings = config['ffmpeg']
|
ffmpeg_settings = config['ffmpeg']
|
||||||
|
|
||||||
# load video2x settings
|
# load video2x settings
|
||||||
@ -287,7 +304,8 @@ try:
|
|||||||
|
|
||||||
# if input specified is a single file
|
# if input specified is a single file
|
||||||
if os.path.isfile(args.input):
|
if os.path.isfile(args.input):
|
||||||
""" Upscale single video file """
|
|
||||||
|
# upscale single video file
|
||||||
Avalon.info(f'Upscaling single video file: {args.input}')
|
Avalon.info(f'Upscaling single video file: {args.input}')
|
||||||
|
|
||||||
# check for input output format mismatch
|
# check for input output format mismatch
|
||||||
@ -320,7 +338,7 @@ try:
|
|||||||
|
|
||||||
# if input specified is a directory
|
# if input specified is a directory
|
||||||
elif os.path.isdir(args.input):
|
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}')
|
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))]:
|
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}'
|
output_video = f'{args.output}\\{input_video}'
|
||||||
@ -350,7 +368,7 @@ except Exception:
|
|||||||
Avalon.error('An exception has occurred')
|
Avalon.error('An exception has occurred')
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
finally:
|
finally:
|
||||||
# remove Video2X Cache directory
|
# remove Video2X cache directory
|
||||||
try:
|
try:
|
||||||
if not preserve_frames:
|
if not preserve_frames:
|
||||||
shutil.rmtree(video2x_cache_directory)
|
shutil.rmtree(video2x_cache_directory)
|
||||||
|
Loading…
Reference in New Issue
Block a user