#include #include using namespace nvinfer1; using namespace tk::dnn; std::vector DeformableConvRTPluginCreator::mPluginAttributes; PluginFieldCollection DeformableConvRTPluginCreator::mFC{}; static const char* DEFORMABLECONVRT_PLUGIN_VERSION{"1"}; static const char* DEFORMABLECONVRT_PLUGIN_NAME{"DeformableConvRT_tkDNN"}; DeformableConvRT::DeformableConvRT(int chunk_dim, int kh, int kw, int sh, int sw, int ph, int pw, int deformableGroup, int i_n, int i_c, int i_h, int i_w, int o_n, int o_c, int o_h, int o_w,std::vector data_H,std::vector bias2_H, std::vector ones_d1_h,std::vector ones_d2_h,std::vector offsetH,std::vector maskH,int height_ones,int width_ones,int dim_ones) { this->chunk_dim = chunk_dim; this->kh = kh; this->kw = kw; this->sh = sh; this->sw = sw; this->ph = ph; this->pw = pw; this->deformableGroup = deformableGroup; this->i_n = i_n; this->i_c = i_c; this->i_h = i_h; this->i_w = i_w; this->o_n = o_n; this->o_c = o_c; this->o_h = o_h; this->o_w = o_w; this->mask_v = std::move(maskH); this->offset_v = std::move(offsetH); this->ones_d2_v = std::move(ones_d2_h); this->ones_d1_v = std::move(ones_d1_h); this->data_d_v = std::move(data_H); this->bias2_d_v = std::move(bias2_H); this->height_ones = height_ones; this->width_ones = width_ones; this->dim_ones = dim_ones; checkCuda( cudaMalloc(&data_d, i_c * o_c * kh * kw * 1 * sizeof(dnnType))); checkCuda( cudaMalloc(&bias2_d, o_c*sizeof(dnnType))); checkCuda( cudaMalloc(&ones_d1, height_ones * width_ones * sizeof(dnnType))); checkCuda( cudaMalloc(&offset, 2*chunk_dim*sizeof(dnnType))); checkCuda( cudaMalloc(&mask, chunk_dim*sizeof(dnnType))); checkCuda( cudaMalloc(&ones_d2, dim_ones*sizeof(dnnType))); if(!data_d_v.empty() && !bias2_d_v.empty() && !ones_d1_v.empty() && !ones_d2_v.empty() && !mask_v.empty() && !offset_v.empty()) { checkCuda(cudaMemcpy(data_d, data_d_v.data(), sizeof(dnnType) * data_d_v.size(), cudaMemcpyHostToDevice)); checkCuda(cudaMemcpy(bias2_d, bias2_d_v.data(), sizeof(dnnType) * bias2_d_v.size(), cudaMemcpyHostToDevice)); checkCuda(cudaMemcpy(ones_d1, ones_d1_v.data(), sizeof(dnnType) * ones_d1_v.size(), cudaMemcpyHostToDevice)); checkCuda(cudaMemcpy(offset, offset_v.data(), sizeof(dnnType) * offset_v.size(), cudaMemcpyHostToDevice)); checkCuda(cudaMemcpy(mask, mask_v.data(), sizeof(dnnType) * mask_v.size(), cudaMemcpyHostToDevice)); checkCuda(cudaMemcpy(ones_d2, ones_d2_v.data(), sizeof(dnnType) * ones_d2_v.size(), cudaMemcpyHostToDevice)); } } DeformableConvRT::~DeformableConvRT() { checkCuda( cudaFree(data_d) ); checkCuda( cudaFree(bias2_d) ); checkCuda( cudaFree(ones_d1) ); checkCuda( cudaFree(offset) ); checkCuda( cudaFree(mask) ); checkCuda( cudaFree(ones_d2) ); } DeformableConvRT::DeformableConvRT(const void *data, size_t length) { const char* buf = reinterpret_cast(data),*bufCheck = buf; chunk_dim = readBUF(buf); kh = readBUF(buf); kw = readBUF(buf); sh = readBUF(buf); sw = readBUF(buf); ph = readBUF(buf); pw = readBUF(buf); deformableGroup = readBUF(buf); i_n = readBUF(buf); i_c = readBUF(buf); i_h = readBUF(buf); i_w = readBUF(buf); o_n = readBUF(buf); o_c = readBUF(buf); o_h = readBUF(buf); o_w = readBUF(buf); height_ones = readBUF(buf); width_ones = readBUF(buf); dim_ones = readBUF(buf); offset_v.resize(chunk_dim*2); for(int i=0;i(buf); mask_v.resize(chunk_dim); for(int i=0;i(buf); data_d_v.resize(i_c*o_c*kh*kw*1); for(int i=0;i<(i_c*o_c*kh*kw*1);i++) data_d_v[i] = readBUF(buf); bias2_d_v.resize(o_c); for(int i=0; i < o_c; i++) bias2_d_v[i] = readBUF(buf); ones_d1_v.resize(height_ones*width_ones); for(int i=0; i(buf); ones_d2_v.resize(dim_ones); for(int i=0; i(buf); assert(buf == bufCheck + length); } int DeformableConvRT::getNbOutputs() const NOEXCEPT { return 1; } Dims DeformableConvRT::getOutputDimensions(int index, const Dims *inputs, int nbInputDims) NOEXCEPT { return Dims3{o_c, o_h, o_w}; } int DeformableConvRT::initialize() NOEXCEPT { return 0; } void DeformableConvRT::terminate() NOEXCEPT {} size_t DeformableConvRT::getWorkspaceSize(int maxBatchSize) const NOEXCEPT {return 0;} #if NV_TENSORRT_MAJOR > 7 int DeformableConvRT::enqueue(int batchSize, const void *const *inputs, void *const *outputs, void *workspace, cudaStream_t stream) NOEXCEPT { dnnType *srcData = (dnnType*)reinterpret_cast(inputs[0]); dnnType *output_conv = (dnnType*)reinterpret_cast(inputs[1]); // split conv2d outputs into offset to mask for(int b=0; b(outputs[0]), ones_d2, kh, kw, sh, sw, ph, pw, 1, 1, deformableGroup, b, i_n, i_c, i_h, i_w, o_n, o_c, o_h, o_w, chunk_dim); } return 0; } #elif NV_TENSORRT_MAJOR <= 7 int32_t DeformableConvRT::enqueue(int32_t batchSize, const void *const *inputs, void **outputs, void *workspace, cudaStream_t stream) { dnnType *srcData = (dnnType*)reinterpret_cast(inputs[0]); dnnType *output_conv = (dnnType*)reinterpret_cast(inputs[1]); // split conv2d outputs into offset to mask for(int b=0; b(outputs[0]), ones_d2, kh, kw, sh, sw, ph, pw, 1, 1, deformableGroup, b, i_n, i_c, i_h, i_w, o_n, o_c, o_h, o_w, chunk_dim); } return 0; } #endif size_t DeformableConvRT::getSerializationSize() const NOEXCEPT { return 19 * sizeof(int) + chunk_dim * 3 * sizeof(dnnType) + (i_c * o_c * kh * kw * 1 ) * sizeof(dnnType) + o_c * sizeof(dnnType) + height_ones * width_ones * sizeof(dnnType) + dim_ones * sizeof(dnnType); } void DeformableConvRT::serialize(void *buffer) const NOEXCEPT { char *buf = reinterpret_cast(buffer),*a=buf; writeBUF(buf, chunk_dim); writeBUF(buf, kh); writeBUF(buf, kw); writeBUF(buf, sh); writeBUF(buf, sw); writeBUF(buf, ph); writeBUF(buf, pw); writeBUF(buf, deformableGroup); writeBUF(buf, i_n); writeBUF(buf, i_c); writeBUF(buf, i_h); writeBUF(buf, i_w); writeBUF(buf, o_n); writeBUF(buf, o_c); writeBUF(buf, o_h); writeBUF(buf, o_w); writeBUF(buf,height_ones); writeBUF(buf,width_ones); writeBUF(buf,dim_ones); for(int i=0; isetPluginNamespace(mPluginNamespace.c_str()); return p; } DataType DeformableConvRT::getOutputDataType(int index, const nvinfer1::DataType *inputTypes, int nbInputs) const NOEXCEPT { return DataType::kFLOAT; } void DeformableConvRT::attachToContext(cudnnContext *cudnnContext, cublasContext *cublasContext, IGpuAllocator *gpuAllocator) NOEXCEPT { handle = cublasContext; } bool DeformableConvRT::isOutputBroadcastAcrossBatch(int outputIndex, const bool *inputIsBroadcasted, int nbInputs) const NOEXCEPT { return false; } bool DeformableConvRT::canBroadcastInputAcrossBatch(int inputIndex) const NOEXCEPT { return false; } void DeformableConvRT::configurePlugin(const Dims *inputDims, int32_t nbInputs, const Dims *outputDims, int32_t nbOutputs, const DataType *inputTypes, const DataType *outputTypes, const bool *inputIsBroadcast, const bool *outputIsBroadcast, PluginFormat floatFormat, int32_t maxBatchSize) NOEXCEPT { } void DeformableConvRT::detachFromContext() NOEXCEPT { } bool DeformableConvRT::supportsFormat(DataType type, PluginFormat format) const NOEXCEPT { return (type == DataType::kFLOAT && format == PluginFormat::kLINEAR); } DeformableConvRTPluginCreator::DeformableConvRTPluginCreator() { mPluginAttributes.clear(); mFC.nbFields = mPluginAttributes.size(); mFC.fields = mPluginAttributes.data(); } void DeformableConvRTPluginCreator::setPluginNamespace(const char *pluginNamespace) NOEXCEPT { mPluginNamespace = pluginNamespace; } const char *DeformableConvRTPluginCreator::getPluginNamespace() const NOEXCEPT { return mPluginNamespace.c_str(); } IPluginV2Ext *DeformableConvRTPluginCreator::deserializePlugin(const char *name, const void *serialData, size_t serialLength) NOEXCEPT { auto *pluginObj = new DeformableConvRT(serialData,serialLength); pluginObj->setPluginNamespace(mPluginNamespace.c_str()); return pluginObj; } IPluginV2Ext *DeformableConvRTPluginCreator::createPlugin(const char *name, const PluginFieldCollection *fc) NOEXCEPT { const PluginField *fields = fc->fields; int chunk_dim = *(static_cast(fields[0].data)); int kh = *(static_cast(fields[1].data)); int kw = *(static_cast(fields[2].data)); int sh = *(static_cast(fields[3].data)); int sw = *(static_cast(fields[4].data)); int ph = *(static_cast(fields[5].data)); int pw = *(static_cast(fields[6].data)); int deformableGroup = *(static_cast(fields[7].data)); int i_n = *(static_cast(fields[8].data)); int i_c = *(static_cast(fields[9].data)); int i_h = *(static_cast(fields[10].data)); int i_w = *(static_cast(fields[11].data)); int o_n = *(static_cast(fields[12].data)); int o_c = *(static_cast(fields[13].data)); int o_h = *(static_cast(fields[14].data)); int o_w = *(static_cast(fields[15].data)); std::vector mask_v(static_cast(fields[16].data),static_cast(fields[16].data)+fields[16].length); std::vector offset_v(static_cast(fields[17].data),static_cast(fields[17].data)+fields[17].length); std::vector ones_d2_v(static_cast(fields[18].data),static_cast(fields[18].data)+fields[18].length); std::vector ones_d1_v(static_cast(fields[19].data),static_cast(fields[19].data)+fields[19].length); std::vector data_d_v(static_cast(fields[20].data),static_cast(fields[20].data)+fields[20].length); std::vector bias2_d_v(static_cast(fields[21].data),static_cast(fields[21].data)+fields[21].length); int height_ones = *(static_cast(fields[22].data)); int width_ones = *(static_cast(fields[23].data)); int dim_ones = *(static_cast(fields[24].data)); auto *pluginObj = new DeformableConvRT(chunk_dim,kh,kw,sh,sw,ph,pw,deformableGroup,i_n,i_c,i_h,i_w,o_n,o_c,o_h,o_w,data_d_v,bias2_d_v,ones_d1_v,ones_d2_v,offset_v,mask_v,height_ones,width_ones,dim_ones); pluginObj->setPluginNamespace(mPluginNamespace.c_str()); return pluginObj; } const char *DeformableConvRTPluginCreator::getPluginName() const NOEXCEPT { return DEFORMABLECONVRT_PLUGIN_NAME; } const char *DeformableConvRTPluginCreator::getPluginVersion() const NOEXCEPT { return DEFORMABLECONVRT_PLUGIN_VERSION; } const PluginFieldCollection *DeformableConvRTPluginCreator::getFieldNames() NOEXCEPT { return &mFC; }