From 42b4f945276ce7657905c74bf2aaa3487e8ca4bc Mon Sep 17 00:00:00 2001 From: Vijaysrinivas Rajagopal Date: Wed, 18 May 2022 23:28:54 -0700 Subject: [PATCH] YOLOv3 TRT8 support * yolov3 trt8 fix * move the if,else to macro header like yolov5 * reset imagesize to 608 and other stuff --- yolov3/calibrator.cpp | 8 +++--- yolov3/calibrator.h | 11 ++++---- yolov3/logging.h | 9 ++++++- yolov3/macros.h | 12 +++++++++ yolov3/yololayer.cu | 44 ++++++++++++++++---------------- yolov3/yololayer.h | 58 ++++++++++++++++++++++--------------------- 6 files changed, 82 insertions(+), 60 deletions(-) create mode 100644 yolov3/macros.h diff --git a/yolov3/calibrator.cpp b/yolov3/calibrator.cpp index 67b5fb2..93d2b47 100644 --- a/yolov3/calibrator.cpp +++ b/yolov3/calibrator.cpp @@ -26,12 +26,12 @@ Int8EntropyCalibrator2::~Int8EntropyCalibrator2() CUDA_CHECK(cudaFree(device_input_)); } -int Int8EntropyCalibrator2::getBatchSize() const +int Int8EntropyCalibrator2::getBatchSize() const TRT_NOEXCEPT { return batchsize_; } -bool Int8EntropyCalibrator2::getBatch(void* bindings[], const char* names[], int nbBindings) +bool Int8EntropyCalibrator2::getBatch(void* bindings[], const char* names[], int nbBindings) TRT_NOEXCEPT { if (img_idx_ + batchsize_ > (int)img_files_.size()) { return false; @@ -57,7 +57,7 @@ bool Int8EntropyCalibrator2::getBatch(void* bindings[], const char* names[], int return true; } -const void* Int8EntropyCalibrator2::readCalibrationCache(size_t& length) +const void* Int8EntropyCalibrator2::readCalibrationCache(size_t& length) TRT_NOEXCEPT { std::cout << "reading calib cache: " << calib_table_name_ << std::endl; calib_cache_.clear(); @@ -71,7 +71,7 @@ const void* Int8EntropyCalibrator2::readCalibrationCache(size_t& length) return length ? calib_cache_.data() : nullptr; } -void Int8EntropyCalibrator2::writeCalibrationCache(const void* cache, size_t length) +void Int8EntropyCalibrator2::writeCalibrationCache(const void* cache, size_t length) TRT_NOEXCEPT { std::cout << "writing calib cache: " << calib_table_name_ << " size: " << length << std::endl; std::ofstream output(calib_table_name_, std::ios::binary); diff --git a/yolov3/calibrator.h b/yolov3/calibrator.h index 1cc9dbb..3657366 100644 --- a/yolov3/calibrator.h +++ b/yolov3/calibrator.h @@ -4,6 +4,7 @@ #include "NvInfer.h" #include #include +#include "macros.h" //! \class Int8EntropyCalibrator2 //! @@ -16,11 +17,11 @@ public: Int8EntropyCalibrator2(int batchsize, int input_w, int input_h, const char* img_dir, const char* calib_table_name, const char* input_blob_name, bool read_cache = true); virtual ~Int8EntropyCalibrator2(); - int getBatchSize() const override; - bool getBatch(void* bindings[], const char* names[], int nbBindings) override; - const void* readCalibrationCache(size_t& length) override; - void writeCalibrationCache(const void* cache, size_t length) override; - + int getBatchSize() const TRT_NOEXCEPT override; + bool getBatch(void* bindings[], const char* names[], int nbBindings) TRT_NOEXCEPT override; + const void* readCalibrationCache(size_t& length) TRT_NOEXCEPT override; + void writeCalibrationCache(const void* cache, size_t length) TRT_NOEXCEPT override; + private: int batchsize_; int input_w_; diff --git a/yolov3/logging.h b/yolov3/logging.h index 602b69f..322e8a7 100644 --- a/yolov3/logging.h +++ b/yolov3/logging.h @@ -25,6 +25,13 @@ #include #include #include +#include "macros.h" + +#if NV_TENSORRT_MAJOR >= 8 +#define TRT_NOEXCEPT noexcept +#else +#define TRT_NOEXCEPT +#endif using Severity = nvinfer1::ILogger::Severity; @@ -236,7 +243,7 @@ public: //! Note samples should not be calling this function directly; it will eventually go away once we eliminate the //! inheritance from nvinfer1::ILogger //! - void log(Severity severity, const char* msg) override + void log(Severity severity, const char* msg) TRT_NOEXCEPT override { LogStreamConsumer(mReportableSeverity, severity) << "[TRT] " << std::string(msg) << std::endl; } diff --git a/yolov3/macros.h b/yolov3/macros.h new file mode 100644 index 0000000..0555103 --- /dev/null +++ b/yolov3/macros.h @@ -0,0 +1,12 @@ +#ifndef __MACROS_H +#define __MACROS_H + +#if NV_TENSORRT_MAJOR >= 8 +#define TRT_NOEXCEPT noexcept +#define TRT_CONST_ENQUEUE const +#else +#define TRT_NOEXCEPT +#define TRT_CONST_ENQUEUE +#endif + +#endif // __MACROS_H diff --git a/yolov3/yololayer.cu b/yolov3/yololayer.cu index ee90aac..a9a220e 100644 --- a/yolov3/yololayer.cu +++ b/yolov3/yololayer.cu @@ -37,7 +37,7 @@ namespace nvinfer1 assert(d == a + length); } - void YoloLayerPlugin::serialize(void* buffer) const + void YoloLayerPlugin::serialize(void* buffer) const TRT_NOEXCEPT { using namespace Tn; char* d = static_cast(buffer), *a = d; @@ -51,17 +51,17 @@ namespace nvinfer1 assert(d == a + getSerializationSize()); } - size_t YoloLayerPlugin::getSerializationSize() const + size_t YoloLayerPlugin::getSerializationSize() const TRT_NOEXCEPT { return sizeof(mClassCount) + sizeof(mThreadCount) + sizeof(mKernelCount) + sizeof(Yolo::YoloKernel) * mYoloKernel.size(); } - int YoloLayerPlugin::initialize() + int YoloLayerPlugin::initialize() TRT_NOEXCEPT { return 0; } - Dims YoloLayerPlugin::getOutputDimensions(int index, const Dims* inputs, int nbInputDims) + Dims YoloLayerPlugin::getOutputDimensions(int index, const Dims* inputs, int nbInputDims) TRT_NOEXCEPT { //output the result to channel int totalsize = MAX_OUTPUT_BBOX_COUNT * sizeof(Detection) / sizeof(float); @@ -70,63 +70,63 @@ namespace nvinfer1 } // Set plugin namespace - void YoloLayerPlugin::setPluginNamespace(const char* pluginNamespace) + void YoloLayerPlugin::setPluginNamespace(const char* pluginNamespace) TRT_NOEXCEPT { mPluginNamespace = pluginNamespace; } - const char* YoloLayerPlugin::getPluginNamespace() const + const char* YoloLayerPlugin::getPluginNamespace() const TRT_NOEXCEPT { return mPluginNamespace; } // Return the DataType of the plugin output at the requested index - DataType YoloLayerPlugin::getOutputDataType(int index, const nvinfer1::DataType* inputTypes, int nbInputs) const + DataType YoloLayerPlugin::getOutputDataType(int index, const nvinfer1::DataType* inputTypes, int nbInputs) const TRT_NOEXCEPT { return DataType::kFLOAT; } // Return true if output tensor is broadcast across a batch. - bool YoloLayerPlugin::isOutputBroadcastAcrossBatch(int outputIndex, const bool* inputIsBroadcasted, int nbInputs) const + bool YoloLayerPlugin::isOutputBroadcastAcrossBatch(int outputIndex, const bool* inputIsBroadcasted, int nbInputs) const TRT_NOEXCEPT { return false; } // Return true if plugin can use input that is broadcast across batch without replication. - bool YoloLayerPlugin::canBroadcastInputAcrossBatch(int inputIndex) const + bool YoloLayerPlugin::canBroadcastInputAcrossBatch(int inputIndex) const TRT_NOEXCEPT { return false; } - void YoloLayerPlugin::configurePlugin(const PluginTensorDesc* in, int nbInput, const PluginTensorDesc* out, int nbOutput) + void YoloLayerPlugin::configurePlugin(const PluginTensorDesc* in, int nbInput, const PluginTensorDesc* out, int nbOutput) TRT_NOEXCEPT { } // Attach the plugin object to an execution context and grant the plugin the access to some context resource. - void YoloLayerPlugin::attachToContext(cudnnContext* cudnnContext, cublasContext* cublasContext, IGpuAllocator* gpuAllocator) + void YoloLayerPlugin::attachToContext(cudnnContext* cudnnContext, cublasContext* cublasContext, IGpuAllocator* gpuAllocator) TRT_NOEXCEPT { } // Detach the plugin object from its execution context. - void YoloLayerPlugin::detachFromContext() {} + void YoloLayerPlugin::detachFromContext() TRT_NOEXCEPT {} - const char* YoloLayerPlugin::getPluginType() const + const char* YoloLayerPlugin::getPluginType() const TRT_NOEXCEPT { return "YoloLayer_TRT"; } - const char* YoloLayerPlugin::getPluginVersion() const + const char* YoloLayerPlugin::getPluginVersion() const TRT_NOEXCEPT { return "1"; } - void YoloLayerPlugin::destroy() + void YoloLayerPlugin::destroy() TRT_NOEXCEPT { delete this; } // Clone the plugin - IPluginV2IOExt* YoloLayerPlugin::clone() const + IPluginV2IOExt* YoloLayerPlugin::clone() const TRT_NOEXCEPT { YoloLayerPlugin *p = new YoloLayerPlugin(); p->setPluginNamespace(mPluginNamespace); @@ -206,7 +206,7 @@ namespace nvinfer1 } - int YoloLayerPlugin::enqueue(int batchSize, const void*const * inputs, void** outputs, void* workspace, cudaStream_t stream) + int YoloLayerPlugin::enqueue(int batchSize, const void*const * inputs, void* TRT_CONST_ENQUEUE* outputs, void* workspace, cudaStream_t stream) TRT_NOEXCEPT { //assert(batchSize == 1); //GPU @@ -227,29 +227,29 @@ namespace nvinfer1 mFC.fields = mPluginAttributes.data(); } - const char* YoloPluginCreator::getPluginName() const + const char* YoloPluginCreator::getPluginName() const TRT_NOEXCEPT { return "YoloLayer_TRT"; } - const char* YoloPluginCreator::getPluginVersion() const + const char* YoloPluginCreator::getPluginVersion() const TRT_NOEXCEPT { return "1"; } - const PluginFieldCollection* YoloPluginCreator::getFieldNames() + const PluginFieldCollection* YoloPluginCreator::getFieldNames() TRT_NOEXCEPT { return &mFC; } - IPluginV2IOExt* YoloPluginCreator::createPlugin(const char* name, const PluginFieldCollection* fc) + IPluginV2IOExt* YoloPluginCreator::createPlugin(const char* name, const PluginFieldCollection* fc) TRT_NOEXCEPT { YoloLayerPlugin* obj = new YoloLayerPlugin(); obj->setPluginNamespace(mNamespace.c_str()); return obj; } - IPluginV2IOExt* YoloPluginCreator::deserializePlugin(const char* name, const void* serialData, size_t serialLength) + IPluginV2IOExt* YoloPluginCreator::deserializePlugin(const char* name, const void* serialData, size_t serialLength) TRT_NOEXCEPT { // This object will be deleted when the network is destroyed, which will // call MishPlugin::destroy() diff --git a/yolov3/yololayer.h b/yolov3/yololayer.h index d1173c3..5621056 100644 --- a/yolov3/yololayer.h +++ b/yolov3/yololayer.h @@ -4,6 +4,8 @@ #include #include #include "NvInfer.h" +#include "macros.h" + namespace Yolo { @@ -57,53 +59,53 @@ namespace nvinfer1 ~YoloLayerPlugin(); - int getNbOutputs() const override + int getNbOutputs() const TRT_NOEXCEPT override { return 1; } - Dims getOutputDimensions(int index, const Dims* inputs, int nbInputDims) override; + Dims getOutputDimensions(int index, const Dims* inputs, int nbInputDims) TRT_NOEXCEPT override; - int initialize() override; + int initialize() TRT_NOEXCEPT override; - virtual void terminate() override {}; + virtual void terminate() TRT_NOEXCEPT override {}; - virtual size_t getWorkspaceSize(int maxBatchSize) const override { return 0;} + virtual size_t getWorkspaceSize(int maxBatchSize) const TRT_NOEXCEPT override { return 0;} - virtual int enqueue(int batchSize, const void*const * inputs, void** outputs, void* workspace, cudaStream_t stream) override; + virtual int enqueue(int batchSize, const void*const * inputs, void*TRT_CONST_ENQUEUE* outputs, void* workspace, cudaStream_t stream) TRT_NOEXCEPT override; - virtual size_t getSerializationSize() const override; + virtual size_t getSerializationSize() const TRT_NOEXCEPT override; - virtual void serialize(void* buffer) const override; + virtual void serialize(void* buffer) const TRT_NOEXCEPT override; - bool supportsFormatCombination(int pos, const PluginTensorDesc* inOut, int nbInputs, int nbOutputs) const override { + bool supportsFormatCombination(int pos, const PluginTensorDesc* inOut, int nbInputs, int nbOutputs) const TRT_NOEXCEPT override { return inOut[pos].format == TensorFormat::kLINEAR && inOut[pos].type == DataType::kFLOAT; } - const char* getPluginType() const override; + const char* getPluginType() const TRT_NOEXCEPT override; - const char* getPluginVersion() const override; + const char* getPluginVersion() const TRT_NOEXCEPT override; - void destroy() override; + void destroy() TRT_NOEXCEPT override; - IPluginV2IOExt* clone() const override; + IPluginV2IOExt* clone() const TRT_NOEXCEPT override; - void setPluginNamespace(const char* pluginNamespace) override; + void setPluginNamespace(const char* pluginNamespace) TRT_NOEXCEPT override; - const char* getPluginNamespace() const override; + const char* getPluginNamespace() const TRT_NOEXCEPT override; - DataType getOutputDataType(int index, const nvinfer1::DataType* inputTypes, int nbInputs) const override; + DataType getOutputDataType(int index, const nvinfer1::DataType* inputTypes, int nbInputs) const TRT_NOEXCEPT override; - bool isOutputBroadcastAcrossBatch(int outputIndex, const bool* inputIsBroadcasted, int nbInputs) const override; + bool isOutputBroadcastAcrossBatch(int outputIndex, const bool* inputIsBroadcasted, int nbInputs) const TRT_NOEXCEPT override; - bool canBroadcastInputAcrossBatch(int inputIndex) const override; + bool canBroadcastInputAcrossBatch(int inputIndex) const TRT_NOEXCEPT override; void attachToContext( - cudnnContext* cudnnContext, cublasContext* cublasContext, IGpuAllocator* gpuAllocator) override; + cudnnContext* cudnnContext, cublasContext* cublasContext, IGpuAllocator* gpuAllocator) TRT_NOEXCEPT override; - void configurePlugin(const PluginTensorDesc* in, int nbInput, const PluginTensorDesc* out, int nbOutput) override; + void configurePlugin(const PluginTensorDesc* in, int nbInput, const PluginTensorDesc* out, int nbOutput) TRT_NOEXCEPT override; - void detachFromContext() override; + void detachFromContext() TRT_NOEXCEPT override; private: void forwardGpu(const float *const * inputs,float * output, cudaStream_t stream,int batchSize = 1); @@ -121,22 +123,22 @@ namespace nvinfer1 ~YoloPluginCreator() override = default; - const char* getPluginName() const override; + const char* getPluginName() const TRT_NOEXCEPT override; - const char* getPluginVersion() const override; + const char* getPluginVersion() const TRT_NOEXCEPT override; - const PluginFieldCollection* getFieldNames() override; + const PluginFieldCollection* getFieldNames() TRT_NOEXCEPT override; - IPluginV2IOExt* createPlugin(const char* name, const PluginFieldCollection* fc) override; + IPluginV2IOExt* createPlugin(const char* name, const PluginFieldCollection* fc) TRT_NOEXCEPT override; - IPluginV2IOExt* deserializePlugin(const char* name, const void* serialData, size_t serialLength) override; + IPluginV2IOExt* deserializePlugin(const char* name, const void* serialData, size_t serialLength) TRT_NOEXCEPT override; - void setPluginNamespace(const char* libNamespace) override + void setPluginNamespace(const char* libNamespace) TRT_NOEXCEPT override { mNamespace = libNamespace; } - const char* getPluginNamespace() const override + const char* getPluginNamespace() const TRT_NOEXCEPT override { return mNamespace.c_str(); }