2015-05-29 01:47:26 +09:00
|
|
|
|
#include <stdio.h>
|
2015-11-19 02:34:46 +09:00
|
|
|
|
#include <algorithm>
|
2015-05-29 01:47:26 +09:00
|
|
|
|
#include <tclap/CmdLine.h>
|
|
|
|
|
#include <boost/filesystem.hpp>
|
|
|
|
|
#include <boost/foreach.hpp>
|
|
|
|
|
#include <functional>
|
|
|
|
|
#include <boost/tokenizer.hpp>
|
2015-12-07 17:00:01 +09:00
|
|
|
|
#include <boost/tokenizer.hpp>
|
|
|
|
|
#include <glog/logging.h>
|
2015-05-29 01:47:26 +09:00
|
|
|
|
#include "../common/waifu2x.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// http://stackoverflow.com/questions/10167382/boostfilesystem-get-relative-path
|
|
|
|
|
boost::filesystem::path relativePath(const boost::filesystem::path &path, const boost::filesystem::path &relative_to)
|
|
|
|
|
{
|
|
|
|
|
// create absolute paths
|
|
|
|
|
boost::filesystem::path p = boost::filesystem::absolute(path);
|
|
|
|
|
boost::filesystem::path r = boost::filesystem::absolute(relative_to);
|
|
|
|
|
|
|
|
|
|
// if root paths are different, return absolute path
|
|
|
|
|
if (p.root_path() != r.root_path())
|
|
|
|
|
return p;
|
|
|
|
|
|
|
|
|
|
// initialize relative path
|
|
|
|
|
boost::filesystem::path result;
|
|
|
|
|
|
|
|
|
|
// find out where the two paths diverge
|
|
|
|
|
boost::filesystem::path::const_iterator itr_path = p.begin();
|
|
|
|
|
boost::filesystem::path::const_iterator itr_relative_to = r.begin();
|
|
|
|
|
while (*itr_path == *itr_relative_to && itr_path != p.end() && itr_relative_to != r.end()) {
|
|
|
|
|
++itr_path;
|
|
|
|
|
++itr_relative_to;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// add "../" for each remaining token in relative_to
|
|
|
|
|
if (itr_relative_to != r.end()) {
|
|
|
|
|
++itr_relative_to;
|
|
|
|
|
while (itr_relative_to != r.end()) {
|
|
|
|
|
result /= "..";
|
|
|
|
|
++itr_relative_to;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// add remaining path
|
|
|
|
|
while (itr_path != p.end()) {
|
|
|
|
|
result /= *itr_path;
|
|
|
|
|
++itr_path;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main(int argc, char** argv)
|
|
|
|
|
{
|
2016-07-03 22:36:06 +09:00
|
|
|
|
Waifu2x::init_liblary(argc, argv);
|
2015-12-04 00:48:55 +09:00
|
|
|
|
|
2015-12-07 17:00:01 +09:00
|
|
|
|
// Caffe<66>̃G<CC83><47><EFBFBD>[<5B>łȂ<C582><C882><EFBFBD><EFBFBD>O<EFBFBD><4F><EFBFBD>ۑ<EFBFBD><DB91><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>悤<EFBFBD>ɂ<EFBFBD><C982><EFBFBD>
|
|
|
|
|
google::SetLogDestination(google::INFO, "");
|
|
|
|
|
google::SetLogDestination(google::WARNING, "");
|
|
|
|
|
|
|
|
|
|
// Caffe<66>̃G<CC83><47><EFBFBD>[<5B><><EFBFBD>O<EFBFBD><4F><EFBFBD>uerror_log_<67>`<60>v<EFBFBD>ɏo<C98F><6F>
|
|
|
|
|
google::SetLogDestination(google::ERROR, "error_log_");
|
|
|
|
|
google::SetLogDestination(google::FATAL, "error_log_");
|
|
|
|
|
|
2015-05-29 01:47:26 +09:00
|
|
|
|
// definition of command line arguments
|
|
|
|
|
TCLAP::CmdLine cmd("waifu2x reimplementation using Caffe", ' ', "1.0.0");
|
|
|
|
|
|
|
|
|
|
TCLAP::ValueArg<std::string> cmdInputFile("i", "input_path",
|
|
|
|
|
"path to input image file", true, "",
|
|
|
|
|
"string", cmd);
|
|
|
|
|
|
|
|
|
|
TCLAP::ValueArg<std::string> cmdOutputFile("o", "output_path",
|
|
|
|
|
"path to output image file (when input_path is folder, output_path must be folder)", false,
|
|
|
|
|
"(auto)", "string", cmd);
|
|
|
|
|
|
|
|
|
|
TCLAP::ValueArg<std::string> cmdInputFileExt("l", "input_extention_list",
|
2015-07-11 04:50:05 +09:00
|
|
|
|
"extention to input image file when input_path is folder", false, "png:jpg:jpeg:tif:tiff:bmp:tga",
|
2015-05-29 01:47:26 +09:00
|
|
|
|
"string", cmd);
|
|
|
|
|
|
|
|
|
|
TCLAP::ValueArg<std::string> cmdOutputFileExt("e", "output_extention",
|
|
|
|
|
"extention to output image file when output_path is (auto) or input_path is folder", false,
|
|
|
|
|
"png", "string", cmd);
|
|
|
|
|
|
|
|
|
|
std::vector<std::string> cmdModeConstraintV;
|
|
|
|
|
cmdModeConstraintV.push_back("noise");
|
|
|
|
|
cmdModeConstraintV.push_back("scale");
|
|
|
|
|
cmdModeConstraintV.push_back("noise_scale");
|
|
|
|
|
cmdModeConstraintV.push_back("auto_scale");
|
|
|
|
|
TCLAP::ValuesConstraint<std::string> cmdModeConstraint(cmdModeConstraintV);
|
|
|
|
|
TCLAP::ValueArg<std::string> cmdMode("m", "mode", "image processing mode",
|
|
|
|
|
false, "noise_scale", &cmdModeConstraint, cmd);
|
|
|
|
|
|
|
|
|
|
std::vector<int> cmdNRLConstraintV;
|
2016-07-12 01:47:53 +09:00
|
|
|
|
cmdNRLConstraintV.push_back(0);
|
2015-05-29 01:47:26 +09:00
|
|
|
|
cmdNRLConstraintV.push_back(1);
|
|
|
|
|
cmdNRLConstraintV.push_back(2);
|
2016-04-20 19:11:53 +09:00
|
|
|
|
cmdNRLConstraintV.push_back(3);
|
2015-05-29 01:47:26 +09:00
|
|
|
|
TCLAP::ValuesConstraint<int> cmdNRLConstraint(cmdNRLConstraintV);
|
|
|
|
|
TCLAP::ValueArg<int> cmdNRLevel("n", "noise_level", "noise reduction level",
|
2016-07-11 00:33:52 +09:00
|
|
|
|
false, 0, &cmdNRLConstraint, cmd);
|
2015-05-29 01:47:26 +09:00
|
|
|
|
|
|
|
|
|
TCLAP::ValueArg<double> cmdScaleRatio("s", "scale_ratio",
|
|
|
|
|
"custom scale ratio", false, 2.0, "double", cmd);
|
|
|
|
|
|
2016-03-19 18:25:30 +09:00
|
|
|
|
TCLAP::ValueArg<double> cmdScaleWidth("w", "scale_width",
|
|
|
|
|
"custom scale width", false, 0, "double", cmd);
|
|
|
|
|
|
|
|
|
|
TCLAP::ValueArg<double> cmdScaleHeight("h", "scale_height",
|
|
|
|
|
"custom scale height", false, 0, "double", cmd);
|
|
|
|
|
|
2015-05-29 01:47:26 +09:00
|
|
|
|
TCLAP::ValueArg<std::string> cmdModelPath("", "model_dir",
|
|
|
|
|
"path to custom model directory (don't append last / )", false,
|
2016-08-03 01:23:15 +09:00
|
|
|
|
"models/upconv_7_anime_style_art_rgb", "string", cmd);
|
2015-05-29 01:47:26 +09:00
|
|
|
|
|
|
|
|
|
std::vector<std::string> cmdProcessConstraintV;
|
|
|
|
|
cmdProcessConstraintV.push_back("cpu");
|
|
|
|
|
cmdProcessConstraintV.push_back("gpu");
|
|
|
|
|
cmdProcessConstraintV.push_back("cudnn");
|
|
|
|
|
TCLAP::ValuesConstraint<std::string> cmdProcessConstraint(cmdProcessConstraintV);
|
|
|
|
|
TCLAP::ValueArg<std::string> cmdProcess("p", "process", "process mode",
|
|
|
|
|
false, "gpu", &cmdProcessConstraint, cmd);
|
|
|
|
|
|
2015-12-27 06:39:13 +09:00
|
|
|
|
TCLAP::ValueArg<int> cmdOutputQuality("q", "output_quality",
|
|
|
|
|
"output image quality", false,
|
|
|
|
|
-1, "int", cmd);
|
|
|
|
|
|
|
|
|
|
TCLAP::ValueArg<int> cmdOutputDepth("d", "output_depth",
|
|
|
|
|
"output image chaneel depth bit", false,
|
|
|
|
|
8, "int", cmd);
|
|
|
|
|
|
2015-06-03 03:24:01 +09:00
|
|
|
|
TCLAP::ValueArg<int> cmdCropSizeFile("c", "crop_size",
|
|
|
|
|
"input image split size", false,
|
|
|
|
|
128, "int", cmd);
|
|
|
|
|
|
2016-07-04 21:54:52 +09:00
|
|
|
|
TCLAP::ValueArg<int> cmdCropWidth("", "crop_w",
|
|
|
|
|
"input image split size(width)", false,
|
|
|
|
|
128, "int", cmd);
|
|
|
|
|
|
|
|
|
|
TCLAP::ValueArg<int> cmdCropHeight("", "crop_h",
|
|
|
|
|
"input image split size(height)", false,
|
|
|
|
|
128, "int", cmd);
|
|
|
|
|
|
2015-06-03 03:24:01 +09:00
|
|
|
|
TCLAP::ValueArg<int> cmdBatchSizeFile("b", "batch_size",
|
|
|
|
|
"input batch size", false,
|
|
|
|
|
1, "int", cmd);
|
|
|
|
|
|
2016-06-08 11:11:36 +09:00
|
|
|
|
TCLAP::ValueArg<int> cmdGPUNoFile("", "gpu",
|
|
|
|
|
"gpu device no", false,
|
|
|
|
|
0, "int", cmd);
|
|
|
|
|
|
2015-11-19 01:50:11 +09:00
|
|
|
|
std::vector<int> cmdTTAConstraintV;
|
|
|
|
|
cmdTTAConstraintV.push_back(0);
|
|
|
|
|
cmdTTAConstraintV.push_back(1);
|
|
|
|
|
TCLAP::ValuesConstraint<int> cmdTTAConstraint(cmdTTAConstraintV);
|
|
|
|
|
TCLAP::ValueArg<int> cmdTTALevel("t", "tta", "8x slower and slightly high quality",
|
|
|
|
|
false, 0, &cmdTTAConstraint, cmd);
|
|
|
|
|
|
2015-05-29 01:47:26 +09:00
|
|
|
|
// definition of command line argument : end
|
|
|
|
|
|
|
|
|
|
TCLAP::Arg::enableIgnoreMismatched();
|
|
|
|
|
|
|
|
|
|
// parse command line arguments
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
cmd.parse(argc, argv);
|
|
|
|
|
}
|
|
|
|
|
catch (std::exception &e)
|
|
|
|
|
{
|
|
|
|
|
printf("<EFBFBD>G<EFBFBD><EFBFBD><EFBFBD>[: %s\n", e.what());
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-19 18:25:30 +09:00
|
|
|
|
boost::optional<double> ScaleRatio;
|
|
|
|
|
boost::optional<int> ScaleWidth;
|
|
|
|
|
boost::optional<int> ScaleHeight;
|
|
|
|
|
|
|
|
|
|
int valid_num = 0;
|
|
|
|
|
if (cmdScaleWidth.getValue() > 0)
|
|
|
|
|
valid_num++;
|
|
|
|
|
if (cmdScaleHeight.getValue() > 0)
|
|
|
|
|
valid_num++;
|
|
|
|
|
|
|
|
|
|
if (valid_num > 1)
|
|
|
|
|
{
|
|
|
|
|
printf("<EFBFBD>G<EFBFBD><EFBFBD><EFBFBD>[: scale_width<74><68>scale_height<68>͓<EFBFBD><CD93><EFBFBD><EFBFBD>Ɏw<C98E><77><EFBFBD>ł<EFBFBD><C582>܂<EFBFBD><DC82><EFBFBD>\n");
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-04 21:54:52 +09:00
|
|
|
|
int crop_w = cmdCropSizeFile.getValue();
|
|
|
|
|
int crop_h = cmdCropSizeFile.getValue();
|
|
|
|
|
|
|
|
|
|
if (cmdCropWidth.isSet())
|
|
|
|
|
crop_w = cmdCropWidth.getValue();
|
|
|
|
|
|
|
|
|
|
if (cmdCropHeight.isSet())
|
|
|
|
|
crop_h = cmdCropHeight.getValue();
|
|
|
|
|
|
2016-03-19 18:25:30 +09:00
|
|
|
|
if (cmdScaleWidth.getValue() > 0)
|
|
|
|
|
ScaleWidth = cmdScaleWidth.getValue();
|
|
|
|
|
else if (cmdScaleHeight.getValue() > 0)
|
|
|
|
|
ScaleHeight = cmdScaleHeight.getValue();
|
|
|
|
|
else
|
|
|
|
|
ScaleRatio = cmdScaleRatio.getValue();
|
|
|
|
|
|
2015-05-29 01:47:26 +09:00
|
|
|
|
const boost::filesystem::path input_path(boost::filesystem::absolute((cmdInputFile.getValue())));
|
|
|
|
|
|
|
|
|
|
std::string outputExt = cmdOutputFileExt.getValue();
|
|
|
|
|
if (outputExt.length() > 0 && outputExt[0] != '.')
|
|
|
|
|
outputExt = "." + outputExt;
|
|
|
|
|
|
2016-07-03 22:46:53 +09:00
|
|
|
|
const std::string ModelName = Waifu2x::GetModelName(cmdModelPath.getValue());
|
|
|
|
|
|
2015-11-19 02:48:30 +09:00
|
|
|
|
const bool use_tta = cmdTTALevel.getValue() == 1;
|
|
|
|
|
|
2015-06-03 03:01:56 +09:00
|
|
|
|
std::vector<std::pair<std::string, std::string>> file_paths;
|
2015-05-29 01:47:26 +09:00
|
|
|
|
if (boost::filesystem::is_directory(input_path)) // input_path<74><68><EFBFBD>t<EFBFBD>H<EFBFBD><48><EFBFBD>_<EFBFBD>Ȃ炻<C882>̃f<CC83>B<EFBFBD><42><EFBFBD>N<EFBFBD>g<EFBFBD><67><EFBFBD>ȉ<EFBFBD><C889>̉摜<CC89>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>ꊇ<EFBFBD>ϊ<EFBFBD>
|
|
|
|
|
{
|
|
|
|
|
boost::filesystem::path output_path;
|
|
|
|
|
|
|
|
|
|
if (cmdOutputFile.getValue() == "(auto)")
|
|
|
|
|
{
|
|
|
|
|
// <20>utest<73>v<EFBFBD>Ȃ<EFBFBD><C882>utest_noise_scale(Level1)(x2.000000)<29>v<EFBFBD>݂<EFBFBD><DD82><EFBFBD><EFBFBD>Ȋ<EFBFBD><C88A><EFBFBD><EFBFBD>ɂ<EFBFBD><C982><EFBFBD>
|
|
|
|
|
|
2016-07-03 22:46:53 +09:00
|
|
|
|
std::string addstr("(");
|
|
|
|
|
addstr += ModelName;
|
|
|
|
|
addstr += ")";
|
2015-05-29 01:47:26 +09:00
|
|
|
|
|
|
|
|
|
const std::string &mode = cmdMode.getValue();
|
2016-07-03 22:46:53 +09:00
|
|
|
|
|
|
|
|
|
addstr += "(" + mode + ")";
|
|
|
|
|
|
2015-05-29 01:47:26 +09:00
|
|
|
|
if (mode.find("noise") != mode.npos || mode.find("auto_scale") != mode.npos)
|
|
|
|
|
addstr += "(Level" + std::to_string(cmdNRLevel.getValue()) + ")";
|
2016-07-03 22:46:53 +09:00
|
|
|
|
|
2015-11-19 02:48:30 +09:00
|
|
|
|
if (use_tta)
|
|
|
|
|
addstr += "(tta)";
|
2015-05-29 01:47:26 +09:00
|
|
|
|
if (mode.find("scale") != mode.npos)
|
2016-03-19 18:25:30 +09:00
|
|
|
|
{
|
|
|
|
|
if(ScaleRatio)
|
|
|
|
|
addstr += "(x" + std::to_string(*ScaleRatio) + ")";
|
|
|
|
|
else if (ScaleWidth)
|
|
|
|
|
addstr += "(width " + std::to_string(*ScaleWidth) + ")";
|
|
|
|
|
else
|
|
|
|
|
addstr += "(height " + std::to_string(*ScaleHeight) + ")";
|
|
|
|
|
}
|
2015-05-29 01:47:26 +09:00
|
|
|
|
|
2016-07-03 22:46:53 +09:00
|
|
|
|
if (cmdOutputDepth.getValue() != 8)
|
|
|
|
|
addstr += "(" + std::to_string(cmdOutputDepth.getValue()) + "bit)";
|
|
|
|
|
|
2015-05-29 01:47:26 +09:00
|
|
|
|
output_path = input_path.branch_path() / (input_path.stem().string() + addstr);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
output_path = cmdOutputFile.getValue();
|
|
|
|
|
|
|
|
|
|
output_path = boost::filesystem::absolute(output_path);
|
|
|
|
|
|
|
|
|
|
if (!boost::filesystem::exists(output_path))
|
|
|
|
|
{
|
|
|
|
|
if (!boost::filesystem::create_directory(output_path))
|
|
|
|
|
{
|
|
|
|
|
printf("<EFBFBD>G<EFBFBD><EFBFBD><EFBFBD>[: <20>o<EFBFBD>̓t<CD83>H<EFBFBD><48><EFBFBD>_<EFBFBD>u%s<>v<EFBFBD>̍쐬<CC8D>Ɏ<EFBFBD><C98E>s<EFBFBD><73><EFBFBD>܂<EFBFBD><DC82><EFBFBD>\n", output_path.string().c_str());
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::vector<std::string> extList;
|
|
|
|
|
{
|
|
|
|
|
// input_extention_list<73><EFBFBD><F095B68E><EFBFBD><EFBFBD>̔z<CC94><7A><EFBFBD>ɂ<EFBFBD><C982><EFBFBD>
|
|
|
|
|
|
|
|
|
|
typedef boost::char_separator<char> char_separator;
|
|
|
|
|
typedef boost::tokenizer<char_separator> tokenizer;
|
|
|
|
|
|
|
|
|
|
char_separator sep(":", "", boost::drop_empty_tokens);
|
|
|
|
|
tokenizer tokens(cmdInputFileExt.getValue(), sep);
|
|
|
|
|
|
|
|
|
|
for (tokenizer::iterator tok_iter = tokens.begin(); tok_iter != tokens.end(); ++tok_iter)
|
2015-11-19 02:34:46 +09:00
|
|
|
|
{
|
|
|
|
|
std::string ext(*tok_iter);
|
|
|
|
|
std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower);
|
|
|
|
|
extList.push_back("." + ext);
|
|
|
|
|
}
|
2015-05-29 01:47:26 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20>ϊ<EFBFBD><CF8A><EFBFBD><EFBFBD><EFBFBD><EFBFBD>摜<EFBFBD>̓<EFBFBD><CC93>́A<CD81>o<EFBFBD>̓p<CD83>X<EFBFBD><58><EFBFBD>擾
|
|
|
|
|
const auto func = [&extList, &input_path, &output_path, &outputExt, &file_paths](const boost::filesystem::path &path)
|
|
|
|
|
{
|
|
|
|
|
BOOST_FOREACH(const boost::filesystem::path& p, std::make_pair(boost::filesystem::recursive_directory_iterator(path),
|
|
|
|
|
boost::filesystem::recursive_directory_iterator()))
|
|
|
|
|
{
|
|
|
|
|
if (boost::filesystem::is_directory(p))
|
|
|
|
|
{
|
|
|
|
|
const auto out_relative = relativePath(p, input_path);
|
|
|
|
|
const auto out_absolute = output_path / out_relative;
|
|
|
|
|
|
|
|
|
|
if (!boost::filesystem::exists(out_absolute))
|
|
|
|
|
{
|
|
|
|
|
if (!boost::filesystem::create_directory(out_absolute))
|
|
|
|
|
{
|
|
|
|
|
printf("<EFBFBD>G<EFBFBD><EFBFBD><EFBFBD>[: <20>o<EFBFBD>̓t<CD83>H<EFBFBD><48><EFBFBD>_<EFBFBD>u%s<>v<EFBFBD>̍쐬<CC8D>Ɏ<EFBFBD><C98E>s<EFBFBD><73><EFBFBD>܂<EFBFBD><DC82><EFBFBD>\n", out_absolute.string().c_str());
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2015-11-19 02:34:46 +09:00
|
|
|
|
else
|
2015-05-29 01:47:26 +09:00
|
|
|
|
{
|
2015-11-19 02:34:46 +09:00
|
|
|
|
std::string ext(p.extension().string());
|
|
|
|
|
std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower);
|
|
|
|
|
if (std::find(extList.begin(), extList.end(), ext) != extList.end())
|
|
|
|
|
{
|
|
|
|
|
const auto out_relative = relativePath(p, input_path);
|
|
|
|
|
const auto out_absolute = output_path / out_relative;
|
2015-05-29 01:47:26 +09:00
|
|
|
|
|
2015-11-19 02:34:46 +09:00
|
|
|
|
const auto out = (out_absolute.branch_path() / out_absolute.stem()).string() + outputExt;
|
2015-05-29 01:47:26 +09:00
|
|
|
|
|
2015-11-19 02:34:46 +09:00
|
|
|
|
file_paths.emplace_back(p.string(), out);
|
|
|
|
|
}
|
2015-05-29 01:47:26 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (!func(input_path))
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
std::string outputFileName = cmdOutputFile.getValue();
|
|
|
|
|
|
|
|
|
|
if (outputFileName == "(auto)")
|
|
|
|
|
{
|
|
|
|
|
// <20>umiku_small.png<6E>v<EFBFBD>Ȃ<EFBFBD><C882>umiku_small(noise_scale)(Level1)(x2.000000).png<6E>v<EFBFBD>݂<EFBFBD><DD82><EFBFBD><EFBFBD>Ȋ<EFBFBD><C88A><EFBFBD><EFBFBD>ɂ<EFBFBD><C982><EFBFBD>
|
|
|
|
|
|
|
|
|
|
outputFileName = cmdInputFile.getValue();
|
|
|
|
|
const auto tailDot = outputFileName.find_last_of('.');
|
|
|
|
|
outputFileName.erase(tailDot, outputFileName.length());
|
2016-07-03 22:46:53 +09:00
|
|
|
|
|
|
|
|
|
std::string addstr("(");
|
|
|
|
|
addstr += ModelName;
|
|
|
|
|
addstr += ")";
|
|
|
|
|
|
|
|
|
|
const std::string &mode = cmdMode.getValue();
|
|
|
|
|
|
|
|
|
|
addstr += "(" + mode + ")";
|
|
|
|
|
|
2015-05-29 01:47:26 +09:00
|
|
|
|
if (mode.find("noise") != mode.npos || mode.find("auto_scale") != mode.npos)
|
2016-07-03 22:46:53 +09:00
|
|
|
|
addstr += "(Level" + std::to_string(cmdNRLevel.getValue()) + ")";
|
|
|
|
|
|
2015-11-19 02:48:30 +09:00
|
|
|
|
if (use_tta)
|
2016-07-03 22:46:53 +09:00
|
|
|
|
addstr += "(tta)";
|
2015-05-29 01:47:26 +09:00
|
|
|
|
if (mode.find("scale") != mode.npos)
|
2016-07-03 22:46:53 +09:00
|
|
|
|
{
|
|
|
|
|
if (ScaleRatio)
|
|
|
|
|
addstr += "(x" + std::to_string(*ScaleRatio) + ")";
|
|
|
|
|
else if (ScaleWidth)
|
|
|
|
|
addstr += "(width " + std::to_string(*ScaleWidth) + ")";
|
|
|
|
|
else
|
|
|
|
|
addstr += "(height " + std::to_string(*ScaleHeight) + ")";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (cmdOutputDepth.getValue() != 8)
|
|
|
|
|
addstr += "(" + std::to_string(cmdOutputDepth.getValue()) + "bit)";
|
|
|
|
|
|
|
|
|
|
outputFileName += addstr + outputExt;
|
2015-05-29 01:47:26 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
file_paths.emplace_back(cmdInputFile.getValue(), outputFileName);
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-03 22:36:06 +09:00
|
|
|
|
Waifu2x::eWaifu2xModelType mode;
|
|
|
|
|
if (cmdMode.getValue() == "noise")
|
|
|
|
|
mode = Waifu2x::eWaifu2xModelTypeNoise;
|
|
|
|
|
else if (cmdMode.getValue() == "scale")
|
|
|
|
|
mode = Waifu2x::eWaifu2xModelTypeScale;
|
|
|
|
|
else if (cmdMode.getValue() == "noise_scale")
|
|
|
|
|
mode = Waifu2x::eWaifu2xModelTypeNoiseScale;
|
|
|
|
|
else if (cmdMode.getValue() == "auto_scale")
|
|
|
|
|
mode = Waifu2x::eWaifu2xModelTypeAutoScale;
|
|
|
|
|
|
2015-06-03 03:01:56 +09:00
|
|
|
|
Waifu2x::eWaifu2xError ret;
|
|
|
|
|
Waifu2x w;
|
2016-07-03 22:36:06 +09:00
|
|
|
|
ret = w.Init(mode, cmdNRLevel.getValue(), cmdModelPath.getValue(), cmdProcess.getValue(), cmdGPUNoFile.getValue());
|
2015-06-03 03:01:56 +09:00
|
|
|
|
switch (ret)
|
2015-05-29 01:47:26 +09:00
|
|
|
|
{
|
2015-06-03 03:01:56 +09:00
|
|
|
|
case Waifu2x::eWaifu2xError_InvalidParameter:
|
|
|
|
|
printf("<EFBFBD>G<EFBFBD><EFBFBD><EFBFBD>[: <20>p<EFBFBD><70><EFBFBD><EFBFBD><EFBFBD>[<5B>^<5E><><EFBFBD>s<EFBFBD><73><EFBFBD>ł<EFBFBD>\n");
|
|
|
|
|
return 1;
|
|
|
|
|
case Waifu2x::eWaifu2xError_FailedOpenModelFile:
|
|
|
|
|
printf("<EFBFBD>G<EFBFBD><EFBFBD><EFBFBD>[: <20><><EFBFBD>f<EFBFBD><66><EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>J<EFBFBD><4A><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>ł<EFBFBD><C582><EFBFBD>\n");
|
|
|
|
|
return 1;
|
|
|
|
|
case Waifu2x::eWaifu2xError_FailedParseModelFile:
|
|
|
|
|
printf("<EFBFBD>G<EFBFBD><EFBFBD><EFBFBD>[: <20><><EFBFBD>f<EFBFBD><66><EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482>܂<EFBFBD>\n");
|
|
|
|
|
return 1;
|
|
|
|
|
case Waifu2x::eWaifu2xError_FailedConstructModel:
|
|
|
|
|
printf("<EFBFBD>G<EFBFBD><EFBFBD><EFBFBD>[: <20>l<EFBFBD>b<EFBFBD>g<EFBFBD><67><EFBFBD>[<5B>N<EFBFBD>̍\<EFBFBD>z<EFBFBD>Ɏ<EFBFBD><EFBFBD>s<EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD>\n");
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
2015-05-29 01:47:26 +09:00
|
|
|
|
|
2015-06-03 03:01:56 +09:00
|
|
|
|
bool isError = false;
|
|
|
|
|
for (const auto &p : file_paths)
|
|
|
|
|
{
|
2016-07-03 22:36:06 +09:00
|
|
|
|
const Waifu2x::eWaifu2xError ret = w.waifu2x(p.first, p.second, ScaleRatio, ScaleWidth, ScaleHeight, nullptr,
|
2016-07-04 21:54:52 +09:00
|
|
|
|
crop_w, crop_h,
|
2016-07-03 22:36:06 +09:00
|
|
|
|
cmdOutputQuality.getValue() == -1 ? boost::optional<int>() : cmdOutputQuality.getValue(), cmdOutputDepth.getValue(), use_tta, cmdBatchSizeFile.getValue());
|
2015-06-03 03:01:56 +09:00
|
|
|
|
if (ret != Waifu2x::eWaifu2xError_OK)
|
2015-05-29 01:47:26 +09:00
|
|
|
|
{
|
2015-06-03 03:01:56 +09:00
|
|
|
|
switch (ret)
|
2015-05-29 01:47:26 +09:00
|
|
|
|
{
|
2015-06-03 03:01:56 +09:00
|
|
|
|
case Waifu2x::eWaifu2xError_InvalidParameter:
|
2015-05-29 01:47:26 +09:00
|
|
|
|
printf("<EFBFBD>G<EFBFBD><EFBFBD><EFBFBD>[: <20>p<EFBFBD><70><EFBFBD><EFBFBD><EFBFBD>[<5B>^<5E><><EFBFBD>s<EFBFBD><73><EFBFBD>ł<EFBFBD>\n");
|
|
|
|
|
break;
|
2015-06-03 03:01:56 +09:00
|
|
|
|
case Waifu2x::eWaifu2xError_FailedOpenInputFile:
|
|
|
|
|
printf("<EFBFBD>G<EFBFBD><EFBFBD><EFBFBD>[: <20><><EFBFBD>͉摜<CD89>u%s<>v<EFBFBD><76><EFBFBD>J<EFBFBD><4A><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>ł<EFBFBD><C582><EFBFBD>\n", p.first.c_str());
|
2015-05-29 01:47:26 +09:00
|
|
|
|
break;
|
2015-06-03 03:01:56 +09:00
|
|
|
|
case Waifu2x::eWaifu2xError_FailedOpenOutputFile:
|
|
|
|
|
printf("<EFBFBD>G<EFBFBD><EFBFBD><EFBFBD>[: <20>o<EFBFBD>͉摜<CD89>u%s<>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߂܂<DF82><DC82><EFBFBD><EFBFBD>ł<EFBFBD><C582><EFBFBD>\n", p.second.c_str());
|
2015-05-29 01:47:26 +09:00
|
|
|
|
break;
|
2015-06-03 03:01:56 +09:00
|
|
|
|
case Waifu2x::eWaifu2xError_FailedProcessCaffe:
|
2015-05-29 01:47:26 +09:00
|
|
|
|
printf("<EFBFBD>G<EFBFBD><EFBFBD><EFBFBD>[: <20><><EFBFBD>ԏ<EFBFBD><D48F><EFBFBD><EFBFBD>Ɏ<EFBFBD><C98E>s<EFBFBD><73><EFBFBD>܂<EFBFBD><DC82><EFBFBD>\n");
|
|
|
|
|
break;
|
|
|
|
|
}
|
2015-06-03 03:01:56 +09:00
|
|
|
|
|
|
|
|
|
isError = true;
|
2015-05-29 01:47:26 +09:00
|
|
|
|
}
|
2015-06-03 03:01:56 +09:00
|
|
|
|
}
|
2015-05-29 01:47:26 +09:00
|
|
|
|
|
2015-06-03 03:01:56 +09:00
|
|
|
|
if (isError)
|
|
|
|
|
{
|
|
|
|
|
printf("<EFBFBD>ϊ<EFBFBD><EFBFBD>Ɏ<EFBFBD><EFBFBD>s<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD>\n");
|
2015-05-29 01:47:26 +09:00
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-03 03:01:56 +09:00
|
|
|
|
printf("<EFBFBD>ϊ<EFBFBD><EFBFBD>ɐ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD>\n");
|
|
|
|
|
|
2015-12-04 00:48:55 +09:00
|
|
|
|
Waifu2x::quit_liblary();
|
|
|
|
|
|
2015-05-29 01:47:26 +09:00
|
|
|
|
return 0;
|
|
|
|
|
}
|