mirror of
https://github.com/k4yt3x/video2x.git
synced 2025-01-30 23:58:11 +00:00
adding amd support
This commit is contained in:
parent
754bb69a3c
commit
374d3b5b1d
@ -16,9 +16,11 @@ from avalon_framework import Avalon
|
|||||||
from exceptions import *
|
from exceptions import *
|
||||||
from ffmpeg import Ffmpeg
|
from ffmpeg import Ffmpeg
|
||||||
from fractions import Fraction
|
from fractions import Fraction
|
||||||
from waifu2x import Waifu2x
|
from waifu2x_caffe import Waifu2xCaffe
|
||||||
|
from waifu2x_converter import Waifu2xConverter
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
import tempfile
|
import tempfile
|
||||||
@ -30,20 +32,25 @@ MODELS_AVAILABLE = ['upconv_7_anime_style_art_rgb', 'upconv_7_photo',
|
|||||||
|
|
||||||
class Upscaler:
|
class Upscaler:
|
||||||
|
|
||||||
def __init__(self, input_video, output_video, method, waifu2x_path, ffmpeg_path, ffmpeg_arguments=[], ffmpeg_hwaccel='gpu', output_width=False, output_height=False, factor=False, model_type='anime_style_art_rgb', threads=3, extracted_frames=False, upscaled_frames=False, preserve_frames=False):
|
def __init__(self, input_video, output_video, method, waifu2x_path, ffmpeg_path, waifu2x_driver='waifu2x_caffe', ffmpeg_arguments=[], ffmpeg_hwaccel='gpu', output_width=False, output_height=False, ratio=False, model_type='anime_style_art_rgb', threads=3, extracted_frames=False, upscaled_frames=False, preserve_frames=False):
|
||||||
# Mandatory arguments
|
# Mandatory arguments
|
||||||
self.input_video = input_video
|
self.input_video = input_video
|
||||||
self.output_video = output_video
|
self.output_video = output_video
|
||||||
self.method = method
|
self.method = method
|
||||||
self.waifu2x_path = waifu2x_path
|
self.waifu2x_path = waifu2x_path
|
||||||
self.ffmpeg_path = ffmpeg_path
|
self.ffmpeg_path = ffmpeg_path
|
||||||
|
self.waifu2x_driver = waifu2x_driver
|
||||||
|
|
||||||
|
# Check sanity of waifu2x_driver option
|
||||||
|
if waifu2x_driver != 'waifu2x_caffe' and waifu2x_driver != 'waifu2x_converter':
|
||||||
|
raise Exception('Unrecognized waifu2x driver: {}'.format(waifu2x_driver))
|
||||||
|
|
||||||
# Optional arguments
|
# Optional arguments
|
||||||
self.ffmpeg_arguments = ffmpeg_arguments
|
self.ffmpeg_arguments = ffmpeg_arguments
|
||||||
self.ffmpeg_hwaccel = ffmpeg_hwaccel
|
self.ffmpeg_hwaccel = ffmpeg_hwaccel
|
||||||
self.output_width = output_width
|
self.output_width = output_width
|
||||||
self.output_height = output_height
|
self.output_height = output_height
|
||||||
self.factor = factor
|
self.ratio = ratio
|
||||||
self.model_type = model_type
|
self.model_type = model_type
|
||||||
self.threads = threads
|
self.threads = threads
|
||||||
|
|
||||||
@ -62,10 +69,12 @@ class Upscaler:
|
|||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
# Delete temp directories when done
|
# Delete temp directories when done
|
||||||
|
# Avalon framework cannot be used if python is shutting down
|
||||||
|
# Therefore, plain print is used
|
||||||
if not self.preserve_frames:
|
if not self.preserve_frames:
|
||||||
Avalon.debug_info('Deleting cache directory: {}'.format(self.extracted_frames))
|
print('Deleting cache directory: {}'.format(self.extracted_frames))
|
||||||
shutil.rmtree(self.extracted_frames)
|
shutil.rmtree(self.extracted_frames)
|
||||||
Avalon.debug_info('Deleting cache directory: {}'.format(self.upscaled_frames))
|
print('Deleting cache directory: {}'.format(self.upscaled_frames))
|
||||||
shutil.rmtree(self.upscaled_frames)
|
shutil.rmtree(self.upscaled_frames)
|
||||||
|
|
||||||
def _get_video_info(self):
|
def _get_video_info(self):
|
||||||
@ -86,7 +95,7 @@ class Upscaler:
|
|||||||
# values are specified
|
# values are specified
|
||||||
if not self.input_video:
|
if not self.input_video:
|
||||||
raise ArgumentError('You need to specify the video to process')
|
raise ArgumentError('You need to specify the video to process')
|
||||||
elif (not self.output_width or not self.output_height) and not self.factor:
|
elif (not self.output_width or not self.output_height) and not self.ratio:
|
||||||
raise ArgumentError('You must specify output video width and height or upscale factor')
|
raise ArgumentError('You must specify output video width and height or upscale factor')
|
||||||
elif not self.output_video:
|
elif not self.output_video:
|
||||||
raise ArgumentError('You need to specify the output video name')
|
raise ArgumentError('You need to specify the output video name')
|
||||||
@ -103,6 +112,15 @@ class Upscaler:
|
|||||||
w2 {Waifu2x Object} -- initialized waifu2x object
|
w2 {Waifu2x Object} -- initialized waifu2x object
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# 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.upscale(self.extracted_frames, self.upscaled_frames, self.ratio, self.threads)
|
||||||
|
for image in [f for f in os.listdir(self.upscaled_frames) if os.path.isfile(os.path.join(self.upscaled_frames, f))]:
|
||||||
|
renamed = re.sub('_\[.*-.*\]\[x(\d+(\.\d+)?)\]\.png', '.png', image)
|
||||||
|
shutil.move('{}\\{}'.format(self.upscaled_frames, image), '{}\\{}'.format(self.upscaled_frames, renamed))
|
||||||
|
return
|
||||||
|
|
||||||
# Create a container for all upscaler threads
|
# Create a container for all upscaler threads
|
||||||
upscaler_threads = []
|
upscaler_threads = []
|
||||||
|
|
||||||
@ -178,12 +196,19 @@ class Upscaler:
|
|||||||
# Check if FFMPEG and waifu2x are present
|
# Check if FFMPEG and waifu2x are present
|
||||||
if not os.path.isdir(self.ffmpeg_path):
|
if not os.path.isdir(self.ffmpeg_path):
|
||||||
raise FileNotFoundError(self.ffmpeg_path)
|
raise FileNotFoundError(self.ffmpeg_path)
|
||||||
if not os.path.isfile(self.waifu2x_path):
|
if not os.path.isfile(self.waifu2x_path) and not os.path.isdir(self.waifu2x_path):
|
||||||
raise FileNotFoundError(self.waifu2x_path)
|
raise FileNotFoundError(self.waifu2x_path)
|
||||||
|
|
||||||
# Initialize objects for ffmpeg and waifu2x-caffe
|
# Initialize objects for ffmpeg and waifu2x-caffe
|
||||||
fm = Ffmpeg(self.ffmpeg_path, self.output_video, self.ffmpeg_arguments)
|
fm = Ffmpeg(self.ffmpeg_path, self.output_video, self.ffmpeg_arguments)
|
||||||
w2 = Waifu2x(self.waifu2x_path, self.method, self.model_type)
|
|
||||||
|
# Initialize waifu2x driver
|
||||||
|
if self.waifu2x_driver == 'waifu2x_caffe':
|
||||||
|
w2 = Waifu2xCaffe(self.waifu2x_path, self.method, self.model_type)
|
||||||
|
elif self.waifu2x_driver == 'waifu2x_converter':
|
||||||
|
w2 = Waifu2xConverter(self.waifu2x_path)
|
||||||
|
else:
|
||||||
|
raise Exception('Unrecognized waifu2x driver: {}'.format(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)
|
||||||
@ -209,11 +234,11 @@ class Upscaler:
|
|||||||
Avalon.info('Framerate: {}'.format(framerate))
|
Avalon.info('Framerate: {}'.format(framerate))
|
||||||
|
|
||||||
# Width/height will be coded width/height x upscale factor
|
# Width/height will be coded width/height x upscale factor
|
||||||
if self.factor:
|
if self.ratio:
|
||||||
coded_width = info['streams'][video_stream_index]['coded_width']
|
coded_width = info['streams'][video_stream_index]['coded_width']
|
||||||
coded_height = info['streams'][video_stream_index]['coded_height']
|
coded_height = info['streams'][video_stream_index]['coded_height']
|
||||||
self.output_width = self.factor * coded_width
|
self.output_width = self.ratio * coded_width
|
||||||
self.output_height = self.factor * coded_height
|
self.output_height = self.ratio * coded_height
|
||||||
|
|
||||||
# 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')
|
||||||
|
Loading…
Reference in New Issue
Block a user