waifu2x-caffe/common/waifu2x.h

146 lines
4.4 KiB
C
Raw 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
2016-05-07 23:48:02 +09:00
#define CUDNN_DLL_NAME "cudnn64_5.dll"
#define CUDNN_REQUIRE_VERION_TEXT "v5 RC"
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;
2015-06-03 03:01:56 +09:00
class Waifu2x
{
public:
2016-07-03 17:13:02 +09:00
enum eWaifu2xModelType
{
eWaifu2xModelTypeNoise,
eWaifu2xModelTypeScale,
eWaifu2xModelTypeNoiseScale,
eWaifu2xModelTypeAutoScale,
};
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;
bool mIsCuda;
2015-05-29 01:47:26 +09:00
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>
2016-07-03 17:13:02 +09:00
bool mHasNoiseScale;
2015-11-19 01:50:11 +09:00
float *mOutputBlock;
size_t mOutputBlockSize;
2016-05-16 23:15:14 +09:00
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);
Waifu2x::eWaifu2xError ReconstructImage(const double 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);
// double CalcScaleRatio(const cv::Size_<int> &size) const;
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();
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);
2015-06-03 03:01:56 +09:00
eWaifu2xError waifu2x(const boost::filesystem::path &input_file, const boost::filesystem::path &output_file,
const double factor, 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-07-10 04:09:22 +09:00
const std::string& used_process() const;
static std::string GetModelName(const boost::filesystem::path &model_dir);
2015-06-03 03:01:56 +09:00
};