// モデルファイルからネットワークを構築 // processでcudnnが指定されなかった場合はcuDNNが呼び出されないように変更する Waifu2x::eWaifu2xError cNet::ConstractNet(const Waifu2x::eWaifu2xModelType mode, const boost::filesystem::path &model_path, const boost::filesystem::path ¶m_path, const stInfo &info, const std::string &process) { Waifu2x::eWaifu2xError ret; mMode = mode; LoadParamFromInfo(mode, info); boost::filesystem::path modelbin_path = model_path; modelbin_path += ".protobin"; boost::filesystem::path caffemodel_path = param_path; caffemodel_path += ".caffemodel"; caffe::NetParameter param_model; caffe::NetParameter param_caffemodel; const auto retModelBin = readProtoBinary(modelbin_path, ¶m_model); const auto retParamBin = readProtoBinary(caffemodel_path, ¶m_caffemodel); if (retModelBin == Waifu2x::eWaifu2xError_OK && retParamBin == Waifu2x::eWaifu2xError_OK) { ret = SetParameter(param_model, process); if (ret != Waifu2x::eWaifu2xError_OK) return ret; if (!caffe::UpgradeNetAsNeeded(caffemodel_path.string(), ¶m_caffemodel)) return Waifu2x::eWaifu2xError_FailedParseModelFile; mNet = boost::shared_ptr<caffe::Net<float>>(new caffe::Net<float>(param_model)); mNet->CopyTrainedLayersFrom(param_caffemodel); } else { const auto ret = LoadParameterFromJson(model_path, param_path, modelbin_path, caffemodel_path, process); if (ret != Waifu2x::eWaifu2xError_OK) return ret; } const auto &inputs = mNet->input_blobs(); if (inputs.empty()) return Waifu2x::eWaifu2xError_FailedConstructModel; if (mInputPlane != inputs[0]->channels()) return Waifu2x::eWaifu2xError_FailedConstructModel; return Waifu2x::eWaifu2xError_OK; }
// モデルファイルからネットワークを構築 // processでcudnnが指定されなかった場合はcuDNNが呼び出されないように変更する Waifu2x::eWaifu2xError Waifu2x::ConstractNet(boost::shared_ptr<caffe::Net<float>> &net, const boost::filesystem::path &model_path, const boost::filesystem::path ¶m_path, const std::string &process) { boost::filesystem::path modelbin_path = model_path; modelbin_path += ".protobin"; boost::filesystem::path caffemodel_path = param_path; caffemodel_path += ".caffemodel"; caffe::NetParameter param_model; caffe::NetParameter param_caffemodel; const auto retModelBin = readProtoBinary(modelbin_path, ¶m_model); const auto retParamBin = readProtoBinary(caffemodel_path, ¶m_caffemodel); if (retModelBin == eWaifu2xError_OK && retParamBin == eWaifu2xError_OK) { Waifu2x::eWaifu2xError ret; ret = SetParameter(param_model, process); if (ret != eWaifu2xError_OK) return ret; if (!caffe::UpgradeNetAsNeeded(caffemodel_path.string(), ¶m_caffemodel)) return Waifu2x::eWaifu2xError_FailedParseModelFile; net = boost::shared_ptr<caffe::Net<float>>(new caffe::Net<float>(param_model)); net->CopyTrainedLayersFrom(param_caffemodel); input_plane = param_model.input_dim(1); } else { const auto ret = LoadParameterFromJson(net, model_path, param_path, modelbin_path, caffemodel_path, process); if (ret != eWaifu2xError_OK) return ret; } return eWaifu2xError_OK; }