样例插件代码
样例插件头文件(MxpiSamplePlugin.h)
/*
* Copyright(C) 2023. 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 SDKMEMORY_MXPISAMPLEPLUGIN_H
#define SDKMEMORY_MXPISAMPLEPLUGIN_H
#include "MxTools/PluginToolkit/base/MxPluginGenerator.h"
#include "MxTools/PluginToolkit/base/MxPluginBase.h"
#include "MxTools/PluginToolkit/metadata/MxpiMetadataManager.h"
#include "MxTools/Proto/MxpiDataType.pb.h"
#include "MxBase/ErrorCode/ErrorCode.h"
/**
* @api
* @brief Definition of MxpiSamplePlugin class.
*/
namespace MxPlugins {
class MxpiSamplePlugin : public MxTools::MxPluginBase {
public:
/**
* @api
* @brief Initialize configure parameter.
* @param configParamMap
* @return APP_ERROR
*/
APP_ERROR Init(std::map<std::string, std::shared_ptr<void>>& configParamMap) override;
/**
* @api
* @brief DeInitialize configure parameter.
* @return APP_ERROR
*/
APP_ERROR DeInit() override;
/**
* @api
* @brief Process the data of MxpiBuffer.
* @param mxpiBuffer
* @return APP_ERROR
*/
APP_ERROR Process(std::vector<MxTools::MxpiBuffer*>& mxpiBuffer) override;
/**
* @api
* @brief Definition the parameter of configure properties.
* @return std::vector<std::shared_ptr<void>>
*/
static std::vector<std::shared_ptr<void>> DefineProperties();
/**
* @api
* @brief Get the number of class id and confidence from model inference.
* @param key
* @param buffer
* @return APP_ERROR
*/
APP_ERROR GenerateSampleOutput(const MxTools::MxpiObjectList srcMxpiObjectList,MxTools::MxpiClassList& dstMxpiClassList);
private:
APP_ERROR SetMxpiErrorInfo(MxTools::MxpiBuffer& buffer, const std::string pluginName,
const MxTools::MxpiErrorInfo mxpiErrorInfo);
std::string parentName_;
std::string descriptionMessage_;
std::ostringstream ErrorInfo_;
};
}
#endif //SDKMEMORY_MXPISAMPLEPLUGIN_H
样例插件源文件(MxpiSamplePlugin.cpp)
/*
* Copyright(C) 2023. 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.
*/
#include "MxpiSamplePlugin.h"
#include "MxBase/Log/Log.h"
using namespace MxPlugins;
using namespace MxTools;
using namespace std;
namespace {
const string SAMPLE_KEY = "MxpiObjectList";
}
APP_ERROR MxpiSamplePlugin::Init(std::map<std::string, std::shared_ptr<void>>& configParamMap)
{
LogInfo << "MxpiSamplePlugin::Init start.";
APP_ERROR ret = APP_ERR_OK;
// Get the property values by key
std::shared_ptr<string> parentNamePropSptr = std::static_pointer_cast<string>(configParamMap["dataSource"]);
parentName_ = *parentNamePropSptr.get();
std::shared_ptr<string> descriptionMessageProSptr = std::static_pointer_cast<string>(configParamMap["descriptionMessage"]);
descriptionMessage_ = *descriptionMessageProSptr.get();
return APP_ERR_OK;
}
APP_ERROR MxpiSamplePlugin::DeInit()
{
LogInfo << "MxpiSamplePlugin::DeInit end.";
return APP_ERR_OK;
}
APP_ERROR MxpiSamplePlugin::SetMxpiErrorInfo(MxpiBuffer& buffer, const std::string pluginName,const MxpiErrorInfo mxpiErrorInfo)
{
APP_ERROR ret = APP_ERR_OK;
// Define an object of MxpiMetadataManager
MxpiMetadataManager mxpiMetadataManager(buffer);
ret = mxpiMetadataManager.AddErrorInfo(pluginName, mxpiErrorInfo);
if (ret != APP_ERR_OK) {
LogError << "Failed to AddErrorInfo.";
return ret;
}
ret = SendData(0, buffer);
return ret;
}
APP_ERROR MxpiSamplePlugin::GenerateSampleOutput(const MxpiObjectList srcMxpiObjectList, MxpiClassList& dstMxpiClassList)
{
for (int i = 0; i < srcMxpiObjectList.objectvec_size(); i++) {
MxpiObject srcMxpiObject = srcMxpiObjectList.objectvec(i);
for (int j = 0; j < srcMxpiObject.classvec_size(); j++) {
MxpiClass srcMxpiClass = srcMxpiObject.classvec(j);
MxpiClass* dstMxpiClass = dstMxpiClassList.add_classvec();
MxpiMetaHeader* dstMxpiMetaHeaderList = dstMxpiClass->add_headervec();
dstMxpiMetaHeaderList->set_datasource(parentName_);
dstMxpiMetaHeaderList->set_memberid(j);
dstMxpiClass->set_classid(srcMxpiClass.classid());
dstMxpiClass->set_confidence(srcMxpiClass.confidence());
dstMxpiClass->set_classname(srcMxpiClass.classname() + "," + descriptionMessage_);
}
}
return APP_ERR_OK;
}
APP_ERROR MxpiSamplePlugin::Process(std::vector<MxpiBuffer*>& mxpiBuffer)
{
LogInfo << "MxpiSamplePlugin::Process start";
MxpiBuffer* buffer = mxpiBuffer[0];
MxpiMetadataManager mxpiMetadataManager(*buffer);
MxpiErrorInfo mxpiErrorInfo;
ErrorInfo_.str("");
auto errorInfoPtr = mxpiMetadataManager.GetErrorInfo();
if (errorInfoPtr != nullptr) {
ErrorInfo_ << GetError(APP_ERR_COMM_FAILURE, pluginName_) << "MxpiSamplePlugin process is not implemented";
mxpiErrorInfo.ret = APP_ERR_COMM_FAILURE;
mxpiErrorInfo.errorInfo = ErrorInfo_.str();
SetMxpiErrorInfo(*buffer, pluginName_, mxpiErrorInfo);
LogError << "MxpiSamplePlugin process is not implemented";
return APP_ERR_COMM_FAILURE;
}
// Get the data from buffer
shared_ptr<void> metadata = mxpiMetadataManager.GetMetadata(parentName_);
if (metadata == nullptr) {
ErrorInfo_ << GetError(APP_ERR_METADATA_IS_NULL, pluginName_) << "Metadata is NULL, failed";
mxpiErrorInfo.ret = APP_ERR_METADATA_IS_NULL;
mxpiErrorInfo.errorInfo = ErrorInfo_.str();
SetMxpiErrorInfo(*buffer, pluginName_, mxpiErrorInfo);
return APP_ERR_METADATA_IS_NULL; // self define the error code
}
// check whether the proto struct name is MxpiObjectList
google::protobuf::Message* msg = (google::protobuf::Message*)metadata.get();
const google::protobuf::Descriptor* desc = msg->GetDescriptor();
if (desc->name() != SAMPLE_KEY) {
ErrorInfo_ << GetError(APP_ERR_PROTOBUF_NAME_MISMATCH, pluginName_) << "Proto struct name is not MxpiObjectList, failed";
mxpiErrorInfo.ret = APP_ERR_PROTOBUF_NAME_MISMATCH;
mxpiErrorInfo.errorInfo = ErrorInfo_.str();
SetMxpiErrorInfo(*buffer, pluginName_, mxpiErrorInfo);
return APP_ERR_PROTOBUF_NAME_MISMATCH; // self define the error code
}
// Generate sample output
shared_ptr<MxpiObjectList> srcMxpiObjectListSptr = static_pointer_cast<MxpiObjectList>(metadata);
shared_ptr<MxpiClassList> dstMxpiClassListSptr = make_shared<MxpiClassList>();
APP_ERROR ret = GenerateSampleOutput(*srcMxpiObjectListSptr, *dstMxpiClassListSptr);
if (ret != APP_ERR_OK) {
LogError << GetError(ret, pluginName_) << "MxpiSamplePlugin gets inference information failed.";
mxpiErrorInfo.ret = ret;
mxpiErrorInfo.errorInfo = ErrorInfo_.str();
SetMxpiErrorInfo(*buffer, pluginName_, mxpiErrorInfo);
return ret;
}
// Add Generated data to metedata
ret = mxpiMetadataManager.AddProtoMetadata(pluginName_, static_pointer_cast<void>(dstMxpiClassListSptr));
if (ret != APP_ERR_OK) {
ErrorInfo_ << GetError(ret, pluginName_) << "MxpiSamplePlugin add metadata failed.";
mxpiErrorInfo.ret = ret;
mxpiErrorInfo.errorInfo = ErrorInfo_.str();
SetMxpiErrorInfo(*buffer, pluginName_, mxpiErrorInfo);
return ret;
}
// Send the data to downstream plugin
SendData(0, *buffer);
LogInfo << "MxpiSamplePlugin::Process end";
return APP_ERR_OK;
}
std::vector<std::shared_ptr<void>> MxpiSamplePlugin::DefineProperties()
{
// Define an A to store properties
std::vector<std::shared_ptr<void>> properties;
// Set the type and related information of the properties, and the key is the name
auto parentNameProSptr = std::make_shared<ElementProperty<string>>(ElementProperty<string>{
STRING, "dataSource", "name", "the name of previous plugin", "mxpi_modelinfer0", "NULL", "NULL"});
auto descriptionMessageProSptr = std::make_shared<ElementProperty<string>>(ElementProperty<string>{
STRING, "descriptionMessage", "message", "Description mesasge of plugin", "This is MxpiSamplePlugin", "NULL", "NULL"});
properties.push_back(parentNameProSptr);
properties.push_back(descriptionMessageProSptr);
return properties;
}
// Register the Sample plugin through macro
MX_PLUGIN_GENERATE(MxpiSamplePlugin)
样例插件CMakeLists(CMakeLists.txt)
cmake_minimum_required(VERSION 3.5.2)
project(mxplugins)
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
add_definitions(-Dgoogle=mindxsdk_private)
set(PLUGIN_NAME "mxpi_sampleplugin")
set(TARGET_LIBRARY ${PLUGIN_NAME})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
include_directories(${PROJECT_SOURCE_DIR}/../../include)
include_directories(${PROJECT_SOURCE_DIR}/../../opensource/include)
include_directories(${PROJECT_SOURCE_DIR}/../../opensource/include/gstreamer-1.0)
include_directories(${PROJECT_SOURCE_DIR}/../../opensource/include/glib-2.0)
include_directories(${PROJECT_SOURCE_DIR}/../../opensource/lib/glib-2.0/include)
link_directories(${PROJECT_SOURCE_DIR}/../../lib)
link_directories(${PROJECT_SOURCE_DIR}/../../opensource/lib)
add_compile_options(-std=c++11 -fPIC -fstack-protector-all -pie -Wno-deprecated-declarations)
add_compile_options("-DPLUGIN_NAME=${PLUGIN_NAME}")
add_definitions(-DENABLE_DVPP_INTERFACE)
add_library(${TARGET_LIBRARY} SHARED MxpiSamplePlugin.cpp)
target_link_libraries(${TARGET_LIBRARY} glib-2.0 gstreamer-1.0 gobject-2.0 gstbase-1.0 gmodule-2.0)
target_link_libraries(${TARGET_LIBRARY} mxpidatatype plugintoolkit mxbase mindxsdk_protobuf)
install(TARGETS ${TARGET_LIBRARY} PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ LIBRARY DESTINATION
${MX_SDK_HOME}/lib/plugins)
父主题: 代码参考