in lab1/deepstream_plugin/neodlr_plugin.cc [158:247]
int NeoDLRLayer::LoadDLRInfo() {
std::string dlr_lib_path = model_path_ + "/libdlr.so";
libdlr_ = dlopen(dlr_lib_path.c_str(), RTLD_LAZY | RTLD_LOCAL);
if (libdlr_ == nullptr) {
std::cout << "Could not load libdlr.so: " << dlerror();
return -1;
}
// Load functions from libdlr.so
*(void**)(&CreateDLRModel) = dlsym(libdlr_, "CreateDLRModel");
*(void**)(&DeleteDLRModel) = dlsym(libdlr_, "DeleteDLRModel");
*(void**)(&RunDLRModel) = dlsym(libdlr_, "RunDLRModel");
*(void**)(&GetDLRNumInputs) = dlsym(libdlr_, "GetDLRNumInputs");
*(void**)(&GetDLRNumWeights) = dlsym(libdlr_, "GetDLRNumWeights");
*(void**)(&GetDLRInputName) = dlsym(libdlr_, "GetDLRInputName");
*(void**)(&GetDLRInputType) = dlsym(libdlr_, "GetDLRInputType");
*(void**)(&GetDLRWeightName) = dlsym(libdlr_, "GetDLRWeightName");
*(void**)(&SetDLRInput) = dlsym(libdlr_, "SetDLRInput");
*(void**)(&SetDLRInputTensor) = dlsym(libdlr_, "SetDLRInputTensor");
*(void**)(&GetDLRInput) = dlsym(libdlr_, "GetDLRInput");
*(void**)(&GetDLRInputShape) = dlsym(libdlr_, "GetDLRInputShape");
*(void**)(&GetDLRInputSizeDim) = dlsym(libdlr_, "GetDLRInputSizeDim");
*(void**)(&GetDLROutputShape) = dlsym(libdlr_, "GetDLROutputShape");
*(void**)(&GetDLROutput) = dlsym(libdlr_, "GetDLROutput");
*(void**)(&GetDLROutputPtr) = dlsym(libdlr_, "GetDLROutputPtr");
*(void**)(&GetDLROutputTensor) = dlsym(libdlr_, "GetDLROutputTensor");
*(void**)(&GetDLRNumOutputs) = dlsym(libdlr_, "GetDLRNumOutputs");
*(void**)(&GetDLROutputSizeDim) = dlsym(libdlr_, "GetDLROutputSizeDim");
*(void**)(&GetDLROutputType) = dlsym(libdlr_, "GetDLROutputType");
*(void**)(&GetDLRHasMetadata) = dlsym(libdlr_, "GetDLRHasMetadata");
*(void**)(&GetDLROutputName) = dlsym(libdlr_, "GetDLROutputName");
*(void**)(&GetDLROutputIndex) = dlsym(libdlr_, "GetDLROutputIndex");
*(void**)(&GetDLROutputByName) = dlsym(libdlr_, "GetDLROutputByName");
*(void**)(&DLRGetLastError) = dlsym(libdlr_, "DLRGetLastError");
*(void**)(&GetDLRBackend) = dlsym(libdlr_, "GetDLRBackend");
*(void**)(&GetDLRDeviceType) = dlsym(libdlr_, "GetDLRDeviceType");
// Load model
int dev_type = GetDLRDeviceType(model_path_.c_str());
if (dev_type == -1) {
// Device type couldn't be read from model. Assume it is GPU.
dev_type = kDLCUDA;
}
if (CreateDLRModel(&model_, model_path_.c_str(), dev_type, 0) != 0) {
std::cout << DLRGetLastError() << std::endl;
return -1;
}
// Read model info
// Inputs
int num_inputs = 0;
if (GetDLRNumInputs(&model_, &num_inputs) != 0) {
std::cout << DLRGetLastError() << std::endl;
return -1;
}
for (int i = 0; i < num_inputs; ++i) {
// Get name
const char* input_name;
GetDLRInputName(&model_, i, &input_name);
input_names_.emplace_back(input_name);
// Get shape
int64_t input_size;
int input_dim;
GetDLRInputSizeDim(&model_, i, &input_size, &input_dim);
std::vector<int64_t> shape(input_dim);
GetDLRInputShape(&model_, i, shape.data());
input_shapes_.emplace_back(shape);
}
// Outputs
// TODO: Check if dynamic
int num_outputs = 0;
if (GetDLRNumOutputs(&model_, &num_outputs) != 0) {
std::cout << DLRGetLastError() << std::endl;
return -1;
}
for (int i = 0; i < num_outputs; ++i) {
// Get shape
int64_t output_size;
int output_dim;
GetDLROutputSizeDim(&model_, i, &output_size, &output_dim);
std::vector<int64_t> shape(output_dim);
GetDLROutputShape(&model_, i, shape.data());
output_shapes_.emplace_back(shape);
// Type
const char* dtype;
GetDLROutputType(&model_, i, &dtype);
output_types_.emplace_back(dtype);
}
return 0;
}