chore(models): add the Real-ESRGAN general models (#1319)
Some checks failed
Build / ubuntu (push) Has been cancelled
Build / windows (push) Has been cancelled
Build / container (push) Has been cancelled
Build / appimage (push) Has been cancelled

Signed-off-by: k4yt3x <i@k4yt3x.com>
This commit is contained in:
k4yt3x 2025-02-02 00:00:00 +00:00
parent 2c5a059d39
commit afa37f9e58
No known key found for this signature in database
10 changed files with 195 additions and 22 deletions

View File

@ -5,12 +5,18 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added
- Real-ESRGAN models `realesr-general-x4v3` and `realesr-general-wdn-x4v3` (#1319).
## [6.4.0] - 2025-01-24
### Added
- Multi-versioning to critical functions to enhance performance in generic architecture builds.
- RIFE models v4.25 and v4.26 (#1304).
- RIFE models `v4.25` and `v4.26` (#1304).
- Support for processing videos without PTS information (#1278).
- The feature to copy input streams' metadata to the output streams (#1282).
- (Video2X Qt6) German translation (#1279).

View File

@ -18,6 +18,7 @@ class FilterRealesrgan : public Filter {
int gpuid = 0,
bool tta_mode = false,
int scaling_factor = 4,
int noise_level = 0,
const fsutils::StringType model_name = STR("realesr-animevideov3")
);
@ -47,6 +48,7 @@ class FilterRealesrgan : public Filter {
int gpuid_;
bool tta_mode_;
int scaling_factor_;
int noise_level_;
const fsutils::StringType model_name_;
AVRational in_time_base_;
AVRational out_time_base_;

Binary file not shown.

View File

@ -0,0 +1,75 @@
7767517
73 74
Input data 0 1 data
Split splitncnn_input0 1 2 data data_splitncnn_0 data_splitncnn_1
Convolution /Conv 1 1 data_splitncnn_1 /Conv_output_0 0=64 1=3 4=1 5=1 6=1728
PReLU /PRelu 1 1 /Conv_output_0 /PRelu_output_0 0=64
Convolution /Conv_1 1 1 /PRelu_output_0 /Conv_1_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_1 1 1 /Conv_1_output_0 /PRelu_1_output_0 0=64
Convolution /Conv_2 1 1 /PRelu_1_output_0 /Conv_2_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_2 1 1 /Conv_2_output_0 /PRelu_2_output_0 0=64
Convolution /Conv_3 1 1 /PRelu_2_output_0 /Conv_3_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_3 1 1 /Conv_3_output_0 /PRelu_3_output_0 0=64
Convolution /Conv_4 1 1 /PRelu_3_output_0 /Conv_4_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_4 1 1 /Conv_4_output_0 /PRelu_4_output_0 0=64
Convolution /Conv_5 1 1 /PRelu_4_output_0 /Conv_5_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_5 1 1 /Conv_5_output_0 /PRelu_5_output_0 0=64
Convolution /Conv_6 1 1 /PRelu_5_output_0 /Conv_6_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_6 1 1 /Conv_6_output_0 /PRelu_6_output_0 0=64
Convolution /Conv_7 1 1 /PRelu_6_output_0 /Conv_7_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_7 1 1 /Conv_7_output_0 /PRelu_7_output_0 0=64
Convolution /Conv_8 1 1 /PRelu_7_output_0 /Conv_8_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_8 1 1 /Conv_8_output_0 /PRelu_8_output_0 0=64
Convolution /Conv_9 1 1 /PRelu_8_output_0 /Conv_9_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_9 1 1 /Conv_9_output_0 /PRelu_9_output_0 0=64
Convolution /Conv_10 1 1 /PRelu_9_output_0 /Conv_10_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_10 1 1 /Conv_10_output_0 /PRelu_10_output_0 0=64
Convolution /Conv_11 1 1 /PRelu_10_output_0 /Conv_11_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_11 1 1 /Conv_11_output_0 /PRelu_11_output_0 0=64
Convolution /Conv_12 1 1 /PRelu_11_output_0 /Conv_12_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_12 1 1 /Conv_12_output_0 /PRelu_12_output_0 0=64
Convolution /Conv_13 1 1 /PRelu_12_output_0 /Conv_13_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_13 1 1 /Conv_13_output_0 /PRelu_13_output_0 0=64
Convolution /Conv_14 1 1 /PRelu_13_output_0 /Conv_14_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_14 1 1 /Conv_14_output_0 /PRelu_14_output_0 0=64
Convolution /Conv_15 1 1 /PRelu_14_output_0 /Conv_15_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_15 1 1 /Conv_15_output_0 /PRelu_15_output_0 0=64
Convolution /Conv_16 1 1 /PRelu_15_output_0 /Conv_16_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_16 1 1 /Conv_16_output_0 /PRelu_16_output_0 0=64
Convolution /Conv_17 1 1 /PRelu_16_output_0 /Conv_17_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_17 1 1 /Conv_17_output_0 /PRelu_17_output_0 0=64
Convolution /Conv_18 1 1 /PRelu_17_output_0 /Conv_18_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_18 1 1 /Conv_18_output_0 /PRelu_18_output_0 0=64
Convolution /Conv_19 1 1 /PRelu_18_output_0 /Conv_19_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_19 1 1 /Conv_19_output_0 /PRelu_19_output_0 0=64
Convolution /Conv_20 1 1 /PRelu_19_output_0 /Conv_20_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_20 1 1 /Conv_20_output_0 /PRelu_20_output_0 0=64
Convolution /Conv_21 1 1 /PRelu_20_output_0 /Conv_21_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_21 1 1 /Conv_21_output_0 /PRelu_21_output_0 0=64
Convolution /Conv_22 1 1 /PRelu_21_output_0 /Conv_22_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_22 1 1 /Conv_22_output_0 /PRelu_22_output_0 0=64
Convolution /Conv_23 1 1 /PRelu_22_output_0 /Conv_23_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_23 1 1 /Conv_23_output_0 /PRelu_23_output_0 0=64
Convolution /Conv_24 1 1 /PRelu_23_output_0 /Conv_24_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_24 1 1 /Conv_24_output_0 /PRelu_24_output_0 0=64
Convolution /Conv_25 1 1 /PRelu_24_output_0 /Conv_25_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_25 1 1 /Conv_25_output_0 /PRelu_25_output_0 0=64
Convolution /Conv_26 1 1 /PRelu_25_output_0 /Conv_26_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_26 1 1 /Conv_26_output_0 /PRelu_26_output_0 0=64
Convolution /Conv_27 1 1 /PRelu_26_output_0 /Conv_27_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_27 1 1 /Conv_27_output_0 /PRelu_27_output_0 0=64
Convolution /Conv_28 1 1 /PRelu_27_output_0 /Conv_28_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_28 1 1 /Conv_28_output_0 /PRelu_28_output_0 0=64
Convolution /Conv_29 1 1 /PRelu_28_output_0 /Conv_29_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_29 1 1 /Conv_29_output_0 /PRelu_29_output_0 0=64
Convolution /Conv_30 1 1 /PRelu_29_output_0 /Conv_30_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_30 1 1 /Conv_30_output_0 /PRelu_30_output_0 0=64
Convolution /Conv_31 1 1 /PRelu_30_output_0 /Conv_31_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_31 1 1 /Conv_31_output_0 /PRelu_31_output_0 0=64
Convolution /Conv_32 1 1 /PRelu_31_output_0 /Conv_32_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_32 1 1 /Conv_32_output_0 /PRelu_32_output_0 0=64
Convolution /Conv_33 1 1 /PRelu_32_output_0 /Conv_33_output_0 0=48 1=3 4=1 5=1 6=27648
PixelShuffle /DepthToSpace 1 1 /Conv_33_output_0 /DepthToSpace_output_0 0=4
Interp /Resize 1 1 data_splitncnn_0 /Resize_output_0 0=1 1=4.000000e+00 2=4.000000e+00
BinaryOp /Add 2 1 /DepthToSpace_output_0 /Resize_output_0 /Add_output_0
Clip /Clip 1 1 /Add_output_0 output 0=0.000000e+00 1=1.000000e+00

Binary file not shown.

View File

@ -0,0 +1,75 @@
7767517
73 74
Input data 0 1 data
Split splitncnn_input0 1 2 data data_splitncnn_0 data_splitncnn_1
Convolution /Conv 1 1 data_splitncnn_1 /Conv_output_0 0=64 1=3 4=1 5=1 6=1728
PReLU /PRelu 1 1 /Conv_output_0 /PRelu_output_0 0=64
Convolution /Conv_1 1 1 /PRelu_output_0 /Conv_1_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_1 1 1 /Conv_1_output_0 /PRelu_1_output_0 0=64
Convolution /Conv_2 1 1 /PRelu_1_output_0 /Conv_2_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_2 1 1 /Conv_2_output_0 /PRelu_2_output_0 0=64
Convolution /Conv_3 1 1 /PRelu_2_output_0 /Conv_3_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_3 1 1 /Conv_3_output_0 /PRelu_3_output_0 0=64
Convolution /Conv_4 1 1 /PRelu_3_output_0 /Conv_4_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_4 1 1 /Conv_4_output_0 /PRelu_4_output_0 0=64
Convolution /Conv_5 1 1 /PRelu_4_output_0 /Conv_5_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_5 1 1 /Conv_5_output_0 /PRelu_5_output_0 0=64
Convolution /Conv_6 1 1 /PRelu_5_output_0 /Conv_6_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_6 1 1 /Conv_6_output_0 /PRelu_6_output_0 0=64
Convolution /Conv_7 1 1 /PRelu_6_output_0 /Conv_7_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_7 1 1 /Conv_7_output_0 /PRelu_7_output_0 0=64
Convolution /Conv_8 1 1 /PRelu_7_output_0 /Conv_8_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_8 1 1 /Conv_8_output_0 /PRelu_8_output_0 0=64
Convolution /Conv_9 1 1 /PRelu_8_output_0 /Conv_9_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_9 1 1 /Conv_9_output_0 /PRelu_9_output_0 0=64
Convolution /Conv_10 1 1 /PRelu_9_output_0 /Conv_10_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_10 1 1 /Conv_10_output_0 /PRelu_10_output_0 0=64
Convolution /Conv_11 1 1 /PRelu_10_output_0 /Conv_11_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_11 1 1 /Conv_11_output_0 /PRelu_11_output_0 0=64
Convolution /Conv_12 1 1 /PRelu_11_output_0 /Conv_12_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_12 1 1 /Conv_12_output_0 /PRelu_12_output_0 0=64
Convolution /Conv_13 1 1 /PRelu_12_output_0 /Conv_13_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_13 1 1 /Conv_13_output_0 /PRelu_13_output_0 0=64
Convolution /Conv_14 1 1 /PRelu_13_output_0 /Conv_14_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_14 1 1 /Conv_14_output_0 /PRelu_14_output_0 0=64
Convolution /Conv_15 1 1 /PRelu_14_output_0 /Conv_15_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_15 1 1 /Conv_15_output_0 /PRelu_15_output_0 0=64
Convolution /Conv_16 1 1 /PRelu_15_output_0 /Conv_16_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_16 1 1 /Conv_16_output_0 /PRelu_16_output_0 0=64
Convolution /Conv_17 1 1 /PRelu_16_output_0 /Conv_17_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_17 1 1 /Conv_17_output_0 /PRelu_17_output_0 0=64
Convolution /Conv_18 1 1 /PRelu_17_output_0 /Conv_18_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_18 1 1 /Conv_18_output_0 /PRelu_18_output_0 0=64
Convolution /Conv_19 1 1 /PRelu_18_output_0 /Conv_19_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_19 1 1 /Conv_19_output_0 /PRelu_19_output_0 0=64
Convolution /Conv_20 1 1 /PRelu_19_output_0 /Conv_20_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_20 1 1 /Conv_20_output_0 /PRelu_20_output_0 0=64
Convolution /Conv_21 1 1 /PRelu_20_output_0 /Conv_21_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_21 1 1 /Conv_21_output_0 /PRelu_21_output_0 0=64
Convolution /Conv_22 1 1 /PRelu_21_output_0 /Conv_22_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_22 1 1 /Conv_22_output_0 /PRelu_22_output_0 0=64
Convolution /Conv_23 1 1 /PRelu_22_output_0 /Conv_23_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_23 1 1 /Conv_23_output_0 /PRelu_23_output_0 0=64
Convolution /Conv_24 1 1 /PRelu_23_output_0 /Conv_24_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_24 1 1 /Conv_24_output_0 /PRelu_24_output_0 0=64
Convolution /Conv_25 1 1 /PRelu_24_output_0 /Conv_25_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_25 1 1 /Conv_25_output_0 /PRelu_25_output_0 0=64
Convolution /Conv_26 1 1 /PRelu_25_output_0 /Conv_26_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_26 1 1 /Conv_26_output_0 /PRelu_26_output_0 0=64
Convolution /Conv_27 1 1 /PRelu_26_output_0 /Conv_27_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_27 1 1 /Conv_27_output_0 /PRelu_27_output_0 0=64
Convolution /Conv_28 1 1 /PRelu_27_output_0 /Conv_28_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_28 1 1 /Conv_28_output_0 /PRelu_28_output_0 0=64
Convolution /Conv_29 1 1 /PRelu_28_output_0 /Conv_29_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_29 1 1 /Conv_29_output_0 /PRelu_29_output_0 0=64
Convolution /Conv_30 1 1 /PRelu_29_output_0 /Conv_30_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_30 1 1 /Conv_30_output_0 /PRelu_30_output_0 0=64
Convolution /Conv_31 1 1 /PRelu_30_output_0 /Conv_31_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_31 1 1 /Conv_31_output_0 /PRelu_31_output_0 0=64
Convolution /Conv_32 1 1 /PRelu_31_output_0 /Conv_32_output_0 0=64 1=3 4=1 5=1 6=36864
PReLU /PRelu_32 1 1 /Conv_32_output_0 /PRelu_32_output_0 0=64
Convolution /Conv_33 1 1 /PRelu_32_output_0 /Conv_33_output_0 0=48 1=3 4=1 5=1 6=27648
PixelShuffle /DepthToSpace 1 1 /Conv_33_output_0 /DepthToSpace_output_0 0=4
Interp /Resize 1 1 data_splitncnn_0 /Resize_output_0 0=1 1=4.000000e+00 2=4.000000e+00
BinaryOp /Add 2 1 /DepthToSpace_output_0 /Resize_output_0 /Add_output_0
Clip /Clip 1 1 /Add_output_0 output 0=0.000000e+00 1=1.000000e+00

View File

@ -17,12 +17,14 @@ FilterRealesrgan::FilterRealesrgan(
int gpuid,
bool tta_mode,
int scaling_factor,
int noise_level,
const fsutils::StringType model_name
)
: realesrgan_(nullptr),
gpuid_(gpuid),
tta_mode_(tta_mode),
scaling_factor_(scaling_factor),
noise_level_(noise_level),
model_name_(std::move(model_name)) {}
FilterRealesrgan::~FilterRealesrgan() {
@ -35,10 +37,16 @@ int FilterRealesrgan::init(AVCodecContext* dec_ctx, AVCodecContext* enc_ctx, AVB
std::filesystem::path model_param_path;
std::filesystem::path model_bin_path;
fsutils::StringType param_file_name =
model_name_ + STR("-x") + fsutils::to_string_type(scaling_factor_) + STR(".param");
fsutils::StringType bin_file_name =
model_name_ + STR("-x") + fsutils::to_string_type(scaling_factor_) + STR(".bin");
fsutils::StringType param_file_name = model_name_;
fsutils::StringType bin_file_name = model_name_;
if (model_name_ == STR("realesr-generalv3") && noise_level_ > 0) {
param_file_name += STR("-wdn");
bin_file_name += STR("-wdn");
}
param_file_name += STR("-x") + fsutils::to_string_type(scaling_factor_) + STR(".param");
bin_file_name += STR("-x") + fsutils::to_string_type(scaling_factor_) + STR(".bin");
// Find the model paths by model name if provided
model_param_path = std::filesystem::path(STR("models")) / STR("realesrgan") / param_file_name;

View File

@ -91,6 +91,7 @@ void ProcessorFactory::init_default_processors(ProcessorFactory& factory) {
static_cast<int>(vk_device_index),
config.tta_mode,
proc_cfg.scaling_factor,
proc_cfg.noise_level,
config.model_name
);
}

View File

@ -156,23 +156,23 @@ int parse_args(
"anime4k-v4-b, anime4k-v4-b+b, anime4k-v4-c, anime4k-v4-c+a, anime4k-v4.1-gan)")
;
po::options_description realesrgan_opts("RealESRGAN options");
po::options_description realesrgan_opts("Real-ESRGAN options");
realesrgan_opts.add_options()
("realesrgan-model", PO_STR_VALUE<video2x::fsutils::StringType>()
->default_value(STR("realesr-animevideov3"), "realesr-animevideov3")
->notifier(validate_realesrgan_model_name),
"Name of the RealESRGAN model to use (realesr-animevideov3, realesrgan-plus-anime, "
"realesrgan-plus)")
"Name of the Real-ESRGAN model to use (realesr-animevideov3, "
"realesrgan-plus-anime, realesrgan-plus, realesr-generalv3)")
;
po::options_description realcugan_opts("RealCUGAN options");
po::options_description realcugan_opts("Real-CUGAN options");
realcugan_opts.add_options()
("realcugan-model", PO_STR_VALUE<video2x::fsutils::StringType>()
->default_value(STR("models-se"), "models-se")
->notifier(validate_realcugan_model_name),
"Name of the RealCUGAN model to use (models-nose, models-pro, models-se)")
"Name of the Real-CUGAN model to use (models-nose, models-pro, models-se)")
("realcugan-threads", po::value<int>()->default_value(1),
"Number of threads to use for RealCUGAN")
"Number of threads to use for Real-CUGAN")
("realcugan-syncgap", po::value<int>()->default_value(3),
"Sync gap mode; 0:no sync, 1: accurate sync: 2 = rough sync, 3: very rough sync")
;
@ -212,7 +212,7 @@ int parse_args(
<< " video2x -i input.mp4 -o output.mp4 -w 3840 -h 2160 \\" << std::endl
<< " -p libplacebo --libplacebo-shader anime4k-v4-a+a" << std::endl
<< std::endl
<< " Upscale a film by 4x using RealESRGAN with custom encoder options:"
<< " Upscale a film by 4x using Real-ESRGAN with custom encoder options:"
<< std::endl
<< " video2x -i input.mkv -o output.mkv -s 4 \\" << std::endl
<< " -p realesrgan --realesrgan-model realesrgan-plus \\" << std::endl
@ -385,16 +385,19 @@ int parse_args(
}
case video2x::processors::ProcessorType::RealESRGAN: {
if (!vm.count("realesrgan-model")) {
video2x::logger()->critical("RealESRGAN model name must be set for RealESRGAN."
);
video2x::logger()->critical("The model name must be set for Real-ESRGAN.");
return -1;
}
if (proc_cfg.scaling_factor < 2 || proc_cfg.scaling_factor > 4) {
video2x::logger()->critical(
"Scaling factor must be set to 2, 3, or 4 for RealESRGAN."
"Scaling factor must be set to 2, 3, or 4 for Real-ESRGAN."
);
return -1;
}
if (proc_cfg.noise_level < 0 || proc_cfg.noise_level > 1) {
video2x::logger()->critical("Noise level must be 0 or 1 for Real-ESRGAN.");
return -1;
}
proc_cfg.processor_type = video2x::processors::ProcessorType::RealESRGAN;
video2x::processors::RealESRGANConfig realesrgan_config;
@ -406,31 +409,31 @@ int parse_args(
}
case video2x::processors::ProcessorType::RealCUGAN: {
if (!vm.count("realcugan-model")) {
video2x::logger()->critical("RealCUGAN model name must be set for RealCUGAN.");
video2x::logger()->critical("The model name must be set for Real-CUGAN.");
return -1;
}
if (vm.count("realcugan-threads") && vm["realcugan-threads"].as<int>() < 1) {
video2x::logger()->critical(
"Number of threads must be at least 1 for RealCUGAN."
"Number of threads must be at least 1 for Real-CUGAN."
);
return -1;
}
if (vm.count("realcugan-syncgap") && (vm["realcugan-syncgap"].as<int>() < 0 ||
vm["realcugan-syncgap"].as<int>() > 3)) {
video2x::logger()->critical(
"Sync gap mode must be set to 0, 1, 2, or 3 for RealCUGAN."
"Sync gap mode must be set to 0, 1, 2, or 3 for Real-CUGAN."
);
return -1;
}
if (proc_cfg.scaling_factor < 2 || proc_cfg.scaling_factor > 4) {
video2x::logger()->critical(
"Scaling factor must be set to 2, 3, or 4 for RealCUGAN."
"Scaling factor must be set to 2, 3, or 4 for Real-CUGAN."
);
return -1;
}
if (proc_cfg.noise_level < -1 || proc_cfg.noise_level > 3) {
video2x::logger()->critical(
"Noise level must be set to -1, 0, 1, 2, or 3 for RealCUGAN."
"Noise level must be set to -1, 0, 1, 2, or 3 for Real-CUGAN."
);
return -1;
}
@ -447,7 +450,7 @@ int parse_args(
}
case video2x::processors::ProcessorType::RIFE: {
if (!vm.count("rife-model")) {
video2x::logger()->critical("RIFE model name must be set for RIFE.");
video2x::logger()->critical("The model name must be set for RIFE.");
return -1;
}
if (proc_cfg.frm_rate_mul < 2) {

View File

@ -24,7 +24,10 @@ void validate_anime4k_shader_name(const video2x::fsutils::StringType& shader_nam
void validate_realesrgan_model_name(const video2x::fsutils::StringType& model_name) {
static const std::unordered_set<video2x::fsutils::StringType> valid_realesrgan_models = {
STR("realesrgan-plus"), STR("realesrgan-plus-anime"), STR("realesr-animevideov3")
STR("realesrgan-plus"),
STR("realesrgan-plus-anime"),
STR("realesr-animevideov3"),
STR("realesr-generalv3"),
};
if (valid_realesrgan_models.count(model_name) == 0) {
throw po::validation_error(