waifu2x-caffe/common/waifu2x.h

212 lines
6.2 KiB
C
Raw Permalink Normal View History

2015-05-29 01:47:26 +09:00
#pragma once
#include <stdint.h>
2015-05-29 01:47:26 +09:00
#include <string>
#include <vector>
#include <utility>
#include <functional>
2015-06-03 03:01:56 +09:00
#include <boost/shared_ptr.hpp>
#include <boost/filesystem.hpp>
2015-12-27 06:39:13 +09:00
#include <boost/optional.hpp>
2016-05-11 22:55:16 +09:00
#include <opencv2/core.hpp>
2015-05-29 01:47:26 +09:00
2017-09-17 17:26:13 +09:00
#define CUDNN_DLL_NAME "cudnn64_7.dll"
2020-06-28 01:42:01 +09:00
#define CUDNN_REQUIRE_VERION_TEXT "v7.6"
#define CUDNN_REQUIRE_VERION 7600
2015-06-03 03:01:56 +09:00
namespace caffe
2015-05-29 01:47:26 +09:00
{
2015-06-03 03:01:56 +09:00
template <typename Dtype>
class Net;
class NetParameter;
2015-05-29 01:47:26 +09:00
};
class cNet;
class stImage;
class Factor
{
private:
double mNumerator; // <20><><EFBFBD>q
double mDenominator; // <20>
public:
Factor() : mNumerator(1.0), mDenominator(1.0)
{
}
Factor(const double numerator, const double denominator) : mNumerator(numerator), mDenominator(denominator)
{
}
Factor MultiNumerator(const double numerator) const
{
return Factor(mNumerator * numerator, mDenominator);
}
Factor MultiDenominator(const double denominator) const
{
return Factor(mNumerator, mDenominator * denominator);
}
double toDouble() const
{
return mNumerator / mDenominator;
}
};
2015-06-03 03:01:56 +09:00
class Waifu2x
{
public:
struct stInfo
{
struct stParam
{
int scale_factor;
int offset;
int recommended_crop_size;
stParam() : scale_factor(1), offset(0), recommended_crop_size(-1) {}
};
std::string name;
std::string arch_name;
bool has_noise_scale;
bool has_noise_only;
int channels;
int force_divisible_crop_size;
stParam noise;
stParam scale;
stParam noise_scale;
};
2016-07-03 17:13:02 +09:00
enum eWaifu2xModelType
{
eWaifu2xModelTypeNoise = 0,
eWaifu2xModelTypeScale = 1,
eWaifu2xModelTypeNoiseScale = 2,
eWaifu2xModelTypeAutoScale = 3,
2016-07-03 17:13:02 +09:00
};
2015-06-03 03:01:56 +09:00
enum eWaifu2xError
{
eWaifu2xError_OK = 0,
eWaifu2xError_Cancel,
eWaifu2xError_NotInitialized,
eWaifu2xError_InvalidParameter,
eWaifu2xError_FailedOpenInputFile,
eWaifu2xError_FailedOpenOutputFile,
eWaifu2xError_FailedOpenModelFile,
eWaifu2xError_FailedParseModelFile,
eWaifu2xError_FailedWriteModelFile,
2015-06-03 03:01:56 +09:00
eWaifu2xError_FailedConstructModel,
eWaifu2xError_FailedProcessCaffe,
eWaifu2xError_FailedCudaCheck,
eWaifu2xError_FailedUnknownType,
};
enum eWaifu2xCudaError
{
eWaifu2xCudaError_OK = 0,
eWaifu2xCudaError_NotFind,
eWaifu2xCudaError_OldVersion,
eWaifu2xCudaError_OldDevice,
2015-06-03 03:01:56 +09:00
};
enum eWaifu2xcuDNNError
{
eWaifu2xcuDNNError_OK = 0,
eWaifu2xcuDNNError_NotFind,
eWaifu2xcuDNNError_OldVersion,
eWaifu2xcuDNNError_CannotCreate,
};
2015-06-03 03:01:56 +09:00
typedef std::function<bool()> waifu2xCancelFunc;
static std::string ExeDir;
2015-12-27 06:39:13 +09:00
2015-06-03 03:01:56 +09:00
private:
bool mIsInited;
2016-07-03 17:13:02 +09:00
eWaifu2xModelType mMode;
int mNoiseLevel;
std::string mProcess;
int mGPUNo;
bool mIsCuda;
std::shared_ptr<cNet> mNoiseNet;
std::shared_ptr<cNet> mScaleNet;
int mInputPlane; // <20>l<EFBFBD>b<EFBFBD>g<EFBFBD>ւ̓<D682><CC93>̓`<60><><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD>
int mMaxNetOffset; // <20>l<EFBFBD>b<EFBFBD>g<EFBFBD>ɓ<EFBFBD><C993>͂<EFBFBD><CD82><EFBFBD><EFBFBD>Ƃǂꂭ<C782><EFBFBD><E782A2><EFBFBD><EFBFBD><EFBFBD>
bool mHasNoiseScaleOnly;
2015-05-29 01:47:26 +09:00
float *mOutputBlock;
size_t mOutputBlockSize;
2015-06-03 03:01:56 +09:00
private:
static boost::filesystem::path GetModeDirPath(const boost::filesystem::path &model_dir);
static boost::filesystem::path GetInfoPath(const boost::filesystem::path &model_dir);
static Factor CalcScaleRatio(const boost::optional<double> scale_ratio, const boost::optional<int> scale_width, const boost::optional<int> scale_height,
2016-07-03 21:55:20 +09:00
const stImage &image);
static int GetcuDNNAlgorithm(const char *layer_name, int num_input, int num_output, int batch_size,
int width, int height, int kernel_w, int kernel_h, int pad_w, int pad_h, int stride_w, int stride_h);
static void SetcuDNNAlgorithm(int algo, const char *layer_name, int num_input, int num_output, int batch_size,
int width, int height, int kernel_w, int kernel_h, int pad_w, int pad_h, int stride_w, int stride_h);
Waifu2x::eWaifu2xError ReconstructImage(const Factor factor, const int crop_w, const int crop_h, const bool use_tta, const int batch_size,
const bool isReconstructNoise, const bool isReconstructScale, const Waifu2x::waifu2xCancelFunc cancel_func, stImage &image);
Waifu2x::eWaifu2xError ReconstructScale(const int crop_w, const int crop_h, const bool use_tta, const int batch_size,
const Waifu2x::waifu2xCancelFunc cancel_func, stImage &image);
2016-07-03 17:13:02 +09:00
Waifu2x::eWaifu2xError ReconstructNoiseScale(const int crop_w, const int crop_h, const bool use_tta, const int batch_size,
const Waifu2x::waifu2xCancelFunc cancel_func, stImage &image);
Waifu2x::eWaifu2xError ReconstructByNet(std::shared_ptr<cNet> net, const int crop_w, const int crop_h, const bool use_tta, const int batch_size,
const Waifu2x::waifu2xCancelFunc cancel_func, cv::Mat &im);
Waifu2x::eWaifu2xError ProcessNet(std::shared_ptr<cNet> net, const int crop_w, const int crop_h, const bool use_tta, const int batch_size, cv::Mat &im);
2015-06-03 03:01:56 +09:00
public:
Waifu2x();
~Waifu2x();
static eWaifu2xCudaError can_use_CUDA();
static eWaifu2xcuDNNError can_use_cuDNN();
2015-06-03 03:01:56 +09:00
static void init_liblary(int argc, char** argv);
static void quit_liblary();
static void quit_thread_liblary();
2015-06-03 03:01:56 +09:00
// mode: noise or scale or noise_scale or auto_scale
// process: cpu or gpu or cudnn
2016-07-03 17:13:02 +09:00
eWaifu2xError Init(const eWaifu2xModelType mode, const int noise_level,
const boost::filesystem::path &model_dir, const std::string &process, const int gpu_no = 0);
2015-06-03 03:01:56 +09:00
eWaifu2xError waifu2x(const boost::filesystem::path &input_file, const boost::filesystem::path &output_file,
2016-07-03 21:55:20 +09:00
const boost::optional<double> scale_ratio, const boost::optional<int> scale_width, const boost::optional<int> scale_height,
const waifu2xCancelFunc cancel_func = nullptr, const int crop_w = 128, const int crop_h = 128,
const boost::optional<int> output_quality = boost::optional<int>(), const int output_depth = 8, const bool use_tta = false,
const int batch_size = 1);
2015-06-03 03:01:56 +09:00
// factor: <20>{<7B><>
2016-02-06 01:14:20 +09:00
// source: (4<>`<60><><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C><EFBFBD>̏ꍇ<CC8F><EA8D87>)RGBA<42>ȉ<EFBFBD><C889>f<EFBFBD>z<EFBFBD><7A>
// dest: (4<>`<60><><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C><EFBFBD>̏ꍇ<CC8F><EA8D87>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RGBA<42>ȉ<EFBFBD><C889>f<EFBFBD>z<EFBFBD><7A>
// in_stride: source<63>̃X<CC83>g<EFBFBD><67><EFBFBD>C<EFBFBD>h(<28>o<EFBFBD>C<EFBFBD>g<EFBFBD>P<EFBFBD><50>)
// out_stride: dest<73>̃X<CC83>g<EFBFBD><67><EFBFBD>C<EFBFBD>h(<28>o<EFBFBD>C<EFBFBD>g<EFBFBD>P<EFBFBD><50>)
eWaifu2xError waifu2x(const double factor, const void* source, void* dest, const int width, const int height,
const int in_channel, const int in_stride, const int out_channel, const int out_stride,
const int crop_w = 128, const int crop_h = 128, const bool use_tta = false, const int batch_size = 1);
void Destroy();
2015-06-03 03:01:56 +09:00
const std::string& used_process() const;
2015-07-10 04:09:22 +09:00
static std::string GetModelName(const boost::filesystem::path &model_dir);
static bool GetInfo(const boost::filesystem::path &model_dir, stInfo &info);
2015-06-03 03:01:56 +09:00
};