#ifndef __PLUGIN_LAYER_H__ #define __PLUGIN_LAYER_H__ #include #include #include #include #include #include "NvInferPlugin.h" #define NV_CUDA_CHECK(status) \ { \ if (status != 0) \ { \ std::cout << "Cuda failure: " << cudaGetErrorString(status) << " in file " << __FILE__ \ << " at line " << __LINE__ << std::endl; \ abort(); \ } \ } cudaError_t cudaSLayerV3(const void* input, void* output, const uint32_t& batchSize, const uint32_t& n_grid_h_, const uint32_t& n_grid_w_, const uint32_t& numOutputClasses, const uint32_t& numBBoxes, uint64_t outputSize, cudaStream_t stream); class PluginFactory : public nvinfer1::IPluginFactory { public: PluginFactory(); nvinfer1::IPlugin* createPlugin(const char* layerName, const void* serialData, size_t serialLength) override; bool isPlugin(const char* name); void destroy(); private: static const int m_MaxLeakyLayers = 72; static const int m_ReorgStride = 2; static constexpr float m_LeakyNegSlope = 0.1f; static const int m_NumBoxes = 5; static const int m_NumCoords = 4; static const int m_NumClasses = 80; static const int m_MaxSLayers = 3; int m_LeakyReLUCount = 0; int m_SLayerCount = 0; nvinfer1::plugin::RegionParameters m_RegionParameters{m_NumBoxes, m_NumCoords, m_NumClasses, nullptr}; struct INvPluginDeleter { void operator()(nvinfer1::plugin::INvPlugin* ptr) { if (ptr) { ptr->destroy(); } } }; struct IPluginDeleter { void operator()(nvinfer1::IPlugin* ptr) { if (ptr) { ptr->terminate(); } } }; typedef std::unique_ptr unique_ptr_INvPlugin; typedef std::unique_ptr unique_ptr_IPlugin; unique_ptr_INvPlugin m_ReorgLayer; unique_ptr_INvPlugin m_RegionLayer; unique_ptr_INvPlugin m_LeakyReLULayers[m_MaxLeakyLayers]; unique_ptr_IPlugin m_SLayers[m_MaxSLayers]; }; class SLayerV3 : public nvinfer1::IPlugin { public: SLayerV3(const void* data, size_t length); SLayerV3(const uint32_t& numBoxes, const uint32_t& numClasses, const uint32_t& grid_h_,const uint32_t &grid_w_); int getNbOutputs() const override; nvinfer1::Dims getOutputDimensions(int index, const nvinfer1::Dims* inputs, int nbInputDims) override; void configure(const nvinfer1::Dims* inputDims, int nbInputs, const nvinfer1::Dims* outputDims, int nbOutputs, int maxBatchSize) override; int initialize() override; void terminate() override; size_t getWorkspaceSize(int maxBatchSize) const override; int enqueue(int batchSize, const void* const* intputs, void** outputs, void* workspace, cudaStream_t stream) override; size_t getSerializationSize() override; void serialize(void* buffer) override; private: template void write(char*& buffer, const T& val) { *reinterpret_cast(buffer) = val; buffer += sizeof(T); } template void read(const char*& buffer, T& val) { val = *reinterpret_cast(buffer); buffer += sizeof(T); } uint32_t m_NumBoxes; uint32_t m_NumClasses; uint32_t m_GridSize; uint64_t m_OutputSize; uint32_t _n_grid_h; uint32_t _n_grid_w; }; #endif // __PLUGIN_LAYER_H__