101 lines
3.6 KiB
C++
101 lines
3.6 KiB
C++
/*
|
|
* Copyright(C) 2020. Huawei Technologies Co.,Ltd. All rights reserved.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef MODELPROCSS_H
|
|
#define MODELPROCSS_H
|
|
|
|
#include <cstdio>
|
|
#include <vector>
|
|
#include <unordered_map>
|
|
#include <mutex>
|
|
#include "acl/acl.h"
|
|
#include "CommonDataType.h"
|
|
#include "Log.h"
|
|
#include "ErrorCode.h"
|
|
#ifdef USE_DCMI_INTERFACE
|
|
#include "dcmi_interface_api.h"
|
|
#endif
|
|
|
|
// Class of model inference
|
|
class ModelProcess
|
|
{
|
|
public:
|
|
// Construct a new Model Process object for model in the device
|
|
ModelProcess(const int deviceId, const std::string &modelName);
|
|
ModelProcess();
|
|
~ModelProcess();
|
|
|
|
int Init(std::string modelPath);
|
|
#ifdef USE_DCMI_INTERFACE
|
|
int Init(const std::string &modelPath, bool isEncrypted, int cardId = 0, int deviceId = 0);
|
|
#endif
|
|
int DeInit();
|
|
|
|
APP_ERROR InputBufferWithSizeMalloc(aclrtMemMallocPolicy policy = ACL_MEM_MALLOC_HUGE_FIRST);
|
|
APP_ERROR OutputBufferWithSizeMalloc(aclrtMemMallocPolicy policy = ACL_MEM_MALLOC_HUGE_FIRST);
|
|
|
|
//自己添加的重载
|
|
int ModelInference_from_dvpp(void *buffer, uint32_t buffer_size);
|
|
|
|
int ModelInference(const std::vector<void *> &inputBufs, const std::vector<size_t> &inputSizes,
|
|
const std::vector<void *> &ouputBufs, const std::vector<size_t> &outputSizes,
|
|
size_t dynamicBatchSize = 0);
|
|
int ModelInferDynamicHW(const std::vector<void *> &inputBufs, const std::vector<size_t> &inputSizes,
|
|
const std::vector<void *> &ouputBufs, const std::vector<size_t> &outputSizes);
|
|
|
|
aclmdlDesc *GetModelDesc() const;
|
|
size_t GetModelNumInputs() const;
|
|
size_t GetModelNumOutputs() const;
|
|
size_t GetModelInputSizeByIndex(const size_t &i) const;
|
|
size_t GetModelOutputSizeByIndex(const size_t &i) const;
|
|
void ReleaseModelBuffer(std::vector<void *> &modelBuffers) const;
|
|
void SetModelWH(uint32_t width, uint32_t height);
|
|
|
|
std::vector<void *> inputBuffers_ = {};
|
|
std::vector<size_t> inputSizes_ = {};
|
|
std::vector<void *> outputBuffers_ = {};
|
|
std::vector<size_t> outputSizes_ = {};
|
|
|
|
private:
|
|
aclmdlDataset *CreateAndFillDataset(const std::vector<void *> &bufs, const std::vector<size_t> &sizes) const;
|
|
void DestroyDataset(const aclmdlDataset *dataset) const;
|
|
APP_ERROR LoadModel(const std::shared_ptr<uint8_t> &modelData, int modelSize);
|
|
#ifdef USE_DCMI_INTERFACE
|
|
static void SetConsoleDispMode(int fd, int option);
|
|
APP_ERROR GetKeyIdPassword(unsigned int &id, unsigned char password[], unsigned int &passwordLen) const;
|
|
#endif
|
|
|
|
std::mutex mtx_ = {};
|
|
|
|
int deviceId_ = 0; // Device used
|
|
std::string modelName_ = "";
|
|
uint32_t modelId_ = 0; // Id of import model
|
|
uint32_t modelWidth_ = 0;
|
|
uint32_t modelHeight_ = 0;
|
|
void *modelDevPtr_ = nullptr;
|
|
size_t modelDevPtrSize_ = 0;
|
|
void *weightDevPtr_ = nullptr;
|
|
size_t weightDevPtrSize_ = 0;
|
|
aclrtContext contextModel_ = nullptr;
|
|
std::shared_ptr<aclmdlDesc> modelDesc_ = nullptr;
|
|
bool isDeInit_ = false;
|
|
#ifdef USE_DCMI_INTERFACE
|
|
DCMI_ENCRYPTED_DATA_NODE encryptModelData_ = {}; // information for encrypted model
|
|
#endif
|
|
};
|
|
|
|
#endif
|