Apollo 11.0
自动驾驶开放平台
apollo::perception::inference::RTNet类 参考

#include <rt_net.h>

类 apollo::perception::inference::RTNet 继承关系图:
apollo::perception::inference::RTNet 的协作图:

Public 成员函数

 RTNet (const std::string &net_file, const std::string &model_file, const std::vector< std::string > &outputs, const std::vector< std::string > &inputs)
 
 RTNet (const std::string &net_file, const std::string &model_file, const std::vector< std::string > &outputs, const std::vector< std::string > &inputs, nvinfer1::Int8EntropyCalibrator *calibrator)
 
 RTNet (const std::string &net_file, const std::string &model_file, const std::vector< std::string > &outputs, const std::vector< std::string > &inputs, const std::string &model_root)
 
virtual ~RTNet ()
 
bool Init (const std::map< std::string, std::vector< int > > &shapes) override
 
void Infer () override
 
base::BlobPtr< float > get_blob (const std::string &name) override
 
- Public 成员函数 继承自 apollo::perception::inference::Inference
 Inference ()=default
 
virtual ~Inference ()=default
 
virtual void SetStream (cudaStream_t stream)
 
void set_max_batch_size (const int &batch_size)
 
void set_gpu_id (const int &gpu_id)
 
void set_model_info (const std::string &proto_file, const std::vector< std::string > &net_input_names, const std::vector< std::string > &net_output_names)
 

Protected 成员函数

bool addInput (const TensorDimsMap &tensor_dims_map, const std::map< std::string, std::vector< int > > &shapes, TensorMap *tensor_map)
 
bool shape (const std::string &name, std::vector< int > *res)
 
void ConstructMap (const LayerParameter &layer_param, nvinfer1::ILayer *layer, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void parse_with_api (const std::map< std::string, std::vector< int > > &shapes)
 
void addLayer (const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, WeightMap *weight_map, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addConvLayer (const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, WeightMap *weight_map, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addDeconvLayer (const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, WeightMap *weight_map, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addActiveLayer (const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addConcatLayer (const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addPoolingLayer (const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addSliceLayer (const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addInnerproductLayer (const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, WeightMap *weight_map, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addScaleLayer (const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, WeightMap *weight_map, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addBatchnormLayer (const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, WeightMap *weight_map, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addSoftmaxLayer (const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addEltwiseLayer (const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addArgmaxLayer (const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addPermuteLayer (const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addReshapeLayer (const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addPaddingLayer (const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addDFMBPSROIAlignLayer (const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addRCNNProposalLayer (const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addRPNProposalSSDLayer (const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
bool checkInt8 (const std::string &gpu_name, nvinfer1::IInt8Calibrator *calibrator)
 
void mergeBN (int index, LayerParameter *layer_param)
 
nvinfer1::Weights loadLayerWeights (const float *data, int size)
 
nvinfer1::Weights loadLayerWeights (float data, int size)
 
bool loadWeights (const std::string &model_file, WeightMap *weight_map)
 
void init_blob (std::vector< std::string > *names)
 

额外继承的成员函数

- Protected 属性 继承自 apollo::perception::inference::Inference
int max_batch_size_ = 1
 
int gpu_id_ = 0
 
std::string proto_file_ = ""
 
std::vector< std::string > net_output_names_
 
std::vector< std::string > net_input_names_
 

详细描述

在文件 rt_net.h 第 73 行定义.

构造及析构函数说明

◆ RTNet() [1/3]

apollo::perception::inference::RTNet::RTNet ( const std::string &  net_file,
const std::string &  model_file,
const std::vector< std::string > &  outputs,
const std::vector< std::string > &  inputs 
)

在文件 rt_net.cc 第 779 行定义.

782 : output_names_(outputs), input_names_(inputs) {
783 loadWeights(model_file, &weight_map_);
784 net_param_.reset(new NetParameter);
785 loadNetParams(net_file, net_param_.get());
786}
bool loadWeights(const std::string &model_file, WeightMap *weight_map)
Definition rt_net.cc:703
bool loadNetParams(const std::string &param_file, NetParameter *param)
Definition mi_utils.cc:60

◆ RTNet() [2/3]

apollo::perception::inference::RTNet::RTNet ( const std::string &  net_file,
const std::string &  model_file,
const std::vector< std::string > &  outputs,
const std::vector< std::string > &  inputs,
nvinfer1::Int8EntropyCalibrator *  calibrator 
)

在文件 rt_net.cc 第 787 行定义.

791 : output_names_(outputs), input_names_(inputs) {
792 loadWeights(model_file, &weight_map_);
793 net_param_.reset(new NetParameter);
794 loadNetParams(net_file, net_param_.get());
795 calibrator_ = calibrator;
796 is_own_calibrator_ = false;
797}

◆ RTNet() [3/3]

apollo::perception::inference::RTNet::RTNet ( const std::string &  net_file,
const std::string &  model_file,
const std::vector< std::string > &  outputs,
const std::vector< std::string > &  inputs,
const std::string &  model_root 
)

在文件 rt_net.cc 第 798 行定义.

802 : output_names_(outputs), input_names_(inputs), is_own_calibrator_(true) {
803 loadWeights(model_file, &weight_map_);
804 net_param_.reset(new NetParameter);
805 loadNetParams(net_file, net_param_.get());
806 model_root_ = model_root;
807 BatchStream stream;
808
809 calibrator_ =
810 new nvinfer1::Int8EntropyCalibrator(stream, 0, true, model_root_);
811}

◆ ~RTNet()

apollo::perception::inference::RTNet::~RTNet ( )
virtual

在文件 rt_net.cc 第 1030 行定义.

1030 {
1031 if (is_own_calibrator_ && calibrator_ != nullptr) {
1032 delete calibrator_;
1033 }
1034 if (gpu_id_ >= 0) {
1035 BASE_GPU_CHECK(cudaStreamDestroy(stream_));
1036 network_->destroy();
1037#ifdef NV_TENSORRT_MAJOR
1038#if NV_TENSORRT_MAJOR != 8
1039 builder_config_->destroy();
1040#endif
1041#endif
1042 context_->destroy();
1043 for (auto buf : buffers_) {
1044 cudaFree(buf);
1045 }
1046 }
1047}

成员函数说明

◆ addActiveLayer()

void apollo::perception::inference::RTNet::addActiveLayer ( const LayerParameter &  layer_param,
nvinfer1::ITensor *const *  inputs,
int  nbInputs,
nvinfer1::INetworkDefinition *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 185 行定义.

189 {
190 if (layer_param.type() == "ReLU" &&
191 layer_param.relu_param().negative_slope() > 0.0f) {
192 std::shared_ptr<ReLUPlugin> relu_plugin;
193 relu_plugin.reset(
194 new ReLUPlugin(layer_param.relu_param(), inputs[0]->getDimensions()));
195#ifdef NV_TENSORRT_MAJOR
196#if NV_TENSORRT_MAJOR != 8
197 nvinfer1::IPluginLayer *ReLU_Layer =
198 net->addPlugin(inputs, nbInputs, *relu_plugin);
199#else
200 nvinfer1::IPluginV2Layer *ReLU_Layer =
201 net->addPluginV2(inputs, nbInputs, *relu_plugin);
202#endif
203#endif
204 relu_plugins_.push_back(relu_plugin);
205 ReLU_Layer->setName(layer_param.name().c_str());
206 ConstructMap(layer_param, ReLU_Layer, tensor_map, tensor_modify_map);
207 } else {
208 nvinfer1::ActivationType type = nvinfer1::ActivationType::kSIGMOID;
209 auto pair = active_map.find(layer_param.type());
210 if (pair != active_map.end()) {
211 type = pair->second;
212 }
213 nvinfer1::IActivationLayer *reluLayer =
214 net->addActivation(*inputs[0], type);
215 reluLayer->setName(layer_param.name().c_str());
216
217 ConstructMap(layer_param, reluLayer, tensor_map, tensor_modify_map);
218 }
219}
void ConstructMap(const LayerParameter &layer_param, nvinfer1::ILayer *layer, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:71
const std::map< std::string, std::string > active_map
Definition mi_net.h:68

◆ addArgmaxLayer()

void apollo::perception::inference::RTNet::addArgmaxLayer ( const LayerParameter &  layer_param,
nvinfer1::ITensor *const *  inputs,
int  nbInputs,
nvinfer1::INetworkDefinition *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 476 行定义.

480 {
481 std::shared_ptr<ArgMax1Plugin> argmax_plugin;
482 argmax_plugin.reset(new ArgMax1Plugin(layer_param.argmax_param(),
483 inputs[0]->getDimensions()));
484 argmax_plugins_.push_back(argmax_plugin);
485#ifdef NV_TENSORRT_MAJOR
486#if NV_TENSORRT_MAJOR != 8
487 nvinfer1::IPluginLayer *argmaxLayer =
488 net->addPlugin(inputs, nbInputs, *argmax_plugin);
489#else
490 nvinfer1::IPluginV2Layer *argmaxLayer =
491 net->addPluginV2(inputs, nbInputs, *argmax_plugin);
492#endif
493#endif
494
495 argmaxLayer->setName(layer_param.name().c_str());
496 ConstructMap(layer_param, argmaxLayer, tensor_map, tensor_modify_map);
497}

◆ addBatchnormLayer()

void apollo::perception::inference::RTNet::addBatchnormLayer ( const LayerParameter &  layer_param,
nvinfer1::ITensor *const *  inputs,
WeightMap *  weight_map,
nvinfer1::INetworkDefinition *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 390 行定义.

395 {
396 BatchNormParameter param = layer_param.batch_norm_param();
397 nvinfer1::Weights power{nvinfer1::DataType::kFLOAT, nullptr, 0};
398 // shift scale power
399 nvinfer1::IScaleLayer *scaleLayer =
400 net->addScale(*inputs[0], nvinfer1::ScaleMode::kCHANNEL,
401 (*weight_map)[layer_param.name().c_str()][0],
402 (*weight_map)[layer_param.name().c_str()][1], power);
403 scaleLayer->setName(layer_param.name().c_str());
404
405 ConstructMap(layer_param, scaleLayer, tensor_map, tensor_modify_map);
406}

◆ addConcatLayer()

void apollo::perception::inference::RTNet::addConcatLayer ( const LayerParameter &  layer_param,
nvinfer1::ITensor *const *  inputs,
int  nbInputs,
nvinfer1::INetworkDefinition *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 221 行定义.

225 {
226 ConcatParameter concat = layer_param.concat_param();
227 nvinfer1::IConcatenationLayer *concatLayer =
228 net->addConcatenation(inputs, nbInputs);
229 // tensorrt ignore the first channel(batch channel), so when load caffe
230 // model axis should -1
231 concatLayer->setAxis(concat.axis() - 1);
232 concatLayer->setName(layer_param.name().c_str());
233 CHECK_EQ(nbInputs, layer_param.bottom_size());
234
235#if LOAD_DEBUG
236 std::string dim_string = "";
237 for (int i = 0; i < nbInputs; ++i) {
238 auto dim_tmp = inputs[i]->getDimensions();
239 for (int i = 0; i < 3; ++i) {
240 absl::StrAppend(&dim_string, " ", dim_tmp.d[i]);
241 }
242 AINFO << layer_param.name() << ": " << layer_param.bottom(i) << " "
243 << (*tensor_modify_map)[layer_param.bottom(i)] << " " << dim_string;
244 }
245#endif
246 ConstructMap(layer_param, concatLayer, tensor_map, tensor_modify_map);
247}
#define AINFO
Definition log.h:42

◆ addConvLayer()

void apollo::perception::inference::RTNet::addConvLayer ( const LayerParameter &  layer_param,
nvinfer1::ITensor *const *  inputs,
WeightMap *  weight_map,
nvinfer1::INetworkDefinition *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 92 行定义.

97 {
98 ConvolutionParameter conv = layer_param.convolution_param();
99 ConvParam param;
100 CHECK(ParserConvParam(conv, &param));
101 nvinfer1::IConvolutionLayer *convLayer = NULL;
102 int size = conv.num_output() * param.kernel_w * param.kernel_h *
103 inputs[0]->getDimensions().d[0];
104
105 auto wt = loadLayerWeights(conv.weight_filler().value(), size);
106 nvinfer1::Weights bias_weight{nvinfer1::DataType::kFLOAT, nullptr, 0};
107 convLayer = net->addConvolution(
108 *inputs[0], static_cast<int>((conv.num_output())),
109 nvinfer1::DimsHW{param.kernel_h, param.kernel_w}, wt, bias_weight);
110 if ((*weight_map)[layer_param.name().c_str()].size() > 0) {
111 convLayer->setKernelWeights((*weight_map)[layer_param.name().c_str()][0]);
112
113 if ((*weight_map)[layer_param.name().c_str()].size() > 1) {
114 convLayer->setBiasWeights((*weight_map)[layer_param.name().c_str()][1]);
115 }
116 }
117 std::vector<nvinfer1::Weights> lw;
118 lw.resize(2);
119 lw[0] = convLayer->getKernelWeights();
120 lw[1] = convLayer->getBiasWeights();
121 (*weight_map)[layer_param.name().c_str()] = lw;
122
123 convLayer->setStride(nvinfer1::DimsHW{param.stride_h, param.stride_w});
124 convLayer->setPadding(nvinfer1::DimsHW{param.padding_h, param.padding_w});
125 convLayer->setNbGroups(conv.group());
126 convLayer->setName(layer_param.name().c_str());
127 convLayer->setDilation(nvinfer1::DimsHW{param.dilation, param.dilation});
128 ConstructMap(layer_param, convLayer, tensor_map, tensor_modify_map);
129
130#if LOAD_DEBUG
131 auto tmp_out_dims = convLayer->getOutput(0)->getDimensions();
132 std::string dim_string = "input: ";
133 for (int i = 0; i < 3; ++i) {
134 absl::StrAppend(&dim_string, " ",
135 convLayer->getInput(0)->getDimensions().d[i]);
136 }
137 absl::StrAppend(&dim_string, " | output: ");
138 for (int i = 0; i < 3; ++i) {
139 absl::StrAppend(&dim_string, " ", tmp_out_dims.d[i]);
140 }
141 AINFO << layer_param.name() << dim_string;
142#endif
143}
nvinfer1::Weights loadLayerWeights(const float *data, int size)
Definition rt_net.cc:754
bool ParserConvParam(const ConvolutionParameter &conv, ConvParam *param)
Definition mi_common.cc:51

◆ addDeconvLayer()

void apollo::perception::inference::RTNet::addDeconvLayer ( const LayerParameter &  layer_param,
nvinfer1::ITensor *const *  inputs,
WeightMap *  weight_map,
nvinfer1::INetworkDefinition *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 145 行定义.

150 {
151 ConvolutionParameter conv = layer_param.convolution_param();
152 ConvParam param;
153 ParserConvParam(conv, &param);
154 nvinfer1::IDeconvolutionLayer *deconvLayer = nullptr;
155 if ((*weight_map)[layer_param.name().c_str()].size() == 2) {
156 deconvLayer =
157 net->addDeconvolution(*inputs[0], conv.num_output(),
158 nvinfer1::DimsHW{param.kernel_h, param.kernel_w},
159 (*weight_map)[layer_param.name().c_str()][0],
160 (*weight_map)[layer_param.name().c_str()][1]);
161 } else {
162 nvinfer1::Weights bias_weight{nvinfer1::DataType::kFLOAT, nullptr, 0};
163 deconvLayer = net->addDeconvolution(
164 *inputs[0], conv.num_output(),
165 nvinfer1::DimsHW{param.kernel_h, param.kernel_w},
166 (*weight_map)[layer_param.name().c_str()][0], bias_weight);
167 }
168 deconvLayer->setStride(nvinfer1::DimsHW{param.stride_h, param.stride_w});
169 deconvLayer->setPadding(nvinfer1::DimsHW{param.padding_h, param.padding_w});
170 deconvLayer->setPaddingMode(nvinfer1::PaddingMode::kCAFFE_ROUND_DOWN);
171 deconvLayer->setNbGroups(conv.group());
172
173 deconvLayer->setName(layer_param.name().c_str());
174 ConstructMap(layer_param, deconvLayer, tensor_map, tensor_modify_map);
175
176#if LOAD_DEBUG
177 std::string dim_string = "input: ";
178 for (int i = 0; i < 3; ++i) {
179 absl::StrAppend(&dim_string, " ", inputs[0]->getDimensions().d[i]);
180 }
181 absl::StrAppend(&dim_string, " | output: ");
182 AINFO << layer_param.name() << dim_string;
183#endif
184}

◆ addDFMBPSROIAlignLayer()

void apollo::perception::inference::RTNet::addDFMBPSROIAlignLayer ( const LayerParameter &  layer_param,
nvinfer1::ITensor *const *  inputs,
int  nbInputs,
nvinfer1::INetworkDefinition *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 551 行定义.

556 {
557 std::shared_ptr<DFMBPSROIAlignPlugin> dfmb_psroi_align_plugin;
558 nvinfer1::Dims input_dims[3];
559 for (int i = 0; i < nbInputs && i < 3; ++i) {
560 input_dims[i] = inputs[i]->getDimensions();
561 }
562 dfmb_psroi_align_plugin.reset(new DFMBPSROIAlignPlugin(
563 layer_param.dfmb_psroi_pooling_param(), input_dims, nbInputs));
564 dfmb_psroi_align_plugins_.push_back(dfmb_psroi_align_plugin);
565#ifdef NV_TENSORRT_MAJOR
566#if NV_TENSORRT_MAJOR != 8
567 nvinfer1::IPluginLayer *dfmb_psroi_align_layer =
568 net->addPlugin(inputs, nbInputs, *dfmb_psroi_align_plugin);
569#else
570 nvinfer1::IPluginV2Layer *dfmb_psroi_align_layer =
571 net->addPluginV2(inputs, nbInputs, *dfmb_psroi_align_plugin);
572#endif
573#endif
574 dfmb_psroi_align_layer->setName(layer_param.name().c_str());
575
576 ConstructMap(layer_param, dfmb_psroi_align_layer, tensor_map,
577 tensor_modify_map);
578}

◆ addEltwiseLayer()

void apollo::perception::inference::RTNet::addEltwiseLayer ( const LayerParameter &  layer_param,
nvinfer1::ITensor *const *  inputs,
nvinfer1::INetworkDefinition *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 459 行定义.

463 {
464 auto pair = eltwise_map.find(layer_param.eltwise_param().operation());
465 nvinfer1::ElementWiseOperation op = nvinfer1::ElementWiseOperation::kSUM;
466 if (pair != eltwise_map.end()) {
467 op = pair->second;
468 }
469 nvinfer1::IElementWiseLayer *eltwiseLayer =
470 net->addElementWise(*inputs[0], *inputs[1], op);
471
472 eltwiseLayer->setName(layer_param.name().c_str());
473 ConstructMap(layer_param, eltwiseLayer, tensor_map, tensor_modify_map);
474}
const std::map< EltwiseParameter::EltwiseOp, std::string > eltwise_map
Definition mi_net.h:74

◆ addInnerproductLayer()

void apollo::perception::inference::RTNet::addInnerproductLayer ( const LayerParameter &  layer_param,
nvinfer1::ITensor *const *  inputs,
WeightMap *  weight_map,
nvinfer1::INetworkDefinition *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 342 行定义.

347 {
348 InnerProductParameter fc = layer_param.inner_product_param();
349 nvinfer1::Weights bias{nvinfer1::DataType::kFLOAT, nullptr, 0};
350 if ((*weight_map)[layer_param.name().c_str()].size() == 2) {
351 bias = (*weight_map)[layer_param.name().c_str()][1];
352 }
353 nvinfer1::IFullyConnectedLayer *fcLayer = net->addFullyConnected(
354 *inputs[0], fc.num_output(), (*weight_map)[layer_param.name().c_str()][0],
355 bias);
356 fcLayer->setName(layer_param.name().c_str());
357 ConstructMap(layer_param, fcLayer, tensor_map, tensor_modify_map);
358}

◆ addInput()

bool apollo::perception::inference::RTNet::addInput ( const TensorDimsMap &  tensor_dims_map,
const std::map< std::string, std::vector< int > > &  shapes,
TensorMap *  tensor_map 
)
protected

在文件 rt_net.cc 第 972 行定义.

974 {
975 CHECK_GT(net_param_->layer_size(), 0);
976 input_names_.clear();
977 for (auto dims_pair : tensor_dims_map) {
978 if (shapes.find(dims_pair.first) != shapes.end()) {
979 auto shape = shapes.at(dims_pair.first);
980 if (static_cast<int>(shape.size()) == dims_pair.second.nbDims + 1) {
981 max_batch_size_ = std::max(max_batch_size_, shape[0]);
982 for (int i = 0; i < dims_pair.second.nbDims; ++i) {
983 dims_pair.second.d[i] = shape[i + 1];
984 }
985 }
986 }
987 auto data = network_->addInput(
988 dims_pair.first.c_str(), nvinfer1::DataType::kFLOAT, dims_pair.second);
989 CHECK_NOTNULL(data);
990 data->setName(dims_pair.first.c_str());
991 tensor_map->insert(std::make_pair(dims_pair.first, data));
992 input_names_.push_back(dims_pair.first);
993 }
994 return true;
995}
bool shape(const std::string &name, std::vector< int > *res)
Definition rt_net.cc:813

◆ addLayer()

void apollo::perception::inference::RTNet::addLayer ( const LayerParameter &  layer_param,
nvinfer1::ITensor *const *  inputs,
int  nbInputs,
WeightMap *  weight_map,
nvinfer1::INetworkDefinition *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 638 行定义.

642 {
643 if (layer_param.type() == "Convolution") {
644 addConvLayer(layer_param, inputs, weight_map, net, tensor_map,
645 tensor_modify_map);
646 } else if (layer_param.type() == "Deconvolution") {
647 addDeconvLayer(layer_param, inputs, weight_map, net, tensor_map,
648 tensor_modify_map);
649 } else if (layer_param.type() == "Sigmoid" || layer_param.type() == "TanH" ||
650 layer_param.type() == "ReLU") {
651 addActiveLayer(layer_param, inputs, nbInputs, net, tensor_map,
652 tensor_modify_map);
653 } else if (layer_param.type() == "Concat") {
654 addConcatLayer(layer_param, inputs, nbInputs, net, tensor_map,
655 tensor_modify_map);
656 } else if (layer_param.type() == "Slice") {
657 addSliceLayer(layer_param, inputs, nbInputs, net, tensor_map,
658 tensor_modify_map);
659 } else if (layer_param.type() == "Reshape") {
660 addReshapeLayer(layer_param, inputs, net, tensor_map, tensor_modify_map);
661 } else if (layer_param.type() == "Padding") {
662 addPaddingLayer(layer_param, inputs, net, tensor_map, tensor_modify_map);
663 } else if (layer_param.type() == "Pooling") {
664 addPoolingLayer(layer_param, inputs, net, tensor_map, tensor_modify_map);
665 } else if (layer_param.type() == "Permute") {
666 addPermuteLayer(layer_param, inputs, nbInputs, net, tensor_map,
667 tensor_modify_map);
668 } else if (layer_param.type() == "InnerProduct") {
669 addInnerproductLayer(layer_param, inputs, weight_map, net, tensor_map,
670 tensor_modify_map);
671 } else if (layer_param.type() == "BatchNorm") {
672 addBatchnormLayer(layer_param, inputs, weight_map, net, tensor_map,
673 tensor_modify_map);
674 } else if (layer_param.type() == "Scale") {
675 addScaleLayer(layer_param, inputs, weight_map, net, tensor_map,
676 tensor_modify_map);
677 } else if (layer_param.type() == "Softmax") {
678 addSoftmaxLayer(layer_param, inputs, nbInputs, net, tensor_map,
679 tensor_modify_map);
680 } else if (layer_param.type() == "Eltwise") {
681 addEltwiseLayer(layer_param, inputs, net, tensor_map, tensor_modify_map);
682 } else if (layer_param.type() == "ArgMax") {
683 addArgmaxLayer(layer_param, inputs, nbInputs, net, tensor_map,
684 tensor_modify_map);
685 } else if (layer_param.type() == "Dropout") {
686 AINFO << "skip dropout";
687 } else if (layer_param.type() == "Power") {
688 addScaleLayer(layer_param, inputs, weight_map, net, tensor_map,
689 tensor_modify_map);
690 } else if (layer_param.type() == "DFMBPSROIAlign") {
691 addDFMBPSROIAlignLayer(layer_param, inputs, nbInputs, net, tensor_map,
692 tensor_modify_map);
693 } else if (layer_param.type() == "RCNNProposal") {
694 addRCNNProposalLayer(layer_param, inputs, nbInputs, net, tensor_map,
695 tensor_modify_map);
696 } else if (layer_param.type() == "RPNProposalSSD") {
697 addRPNProposalSSDLayer(layer_param, inputs, nbInputs, net, tensor_map,
698 tensor_modify_map);
699 } else {
700 AWARN << "unknown layer type:" << layer_param.type();
701 }
702}
void addScaleLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, WeightMap *weight_map, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:360
void addRCNNProposalLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:580
void addSoftmaxLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:407
void addPermuteLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:499
void addConcatLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:221
void addDFMBPSROIAlignLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:551
void addConvLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, WeightMap *weight_map, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:92
void addRPNProposalSSDLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:608
void addArgmaxLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:476
void addInnerproductLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, WeightMap *weight_map, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:342
void addActiveLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:185
void addSliceLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:287
void addBatchnormLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, WeightMap *weight_map, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:390
void addEltwiseLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:459
void addPaddingLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:536
void addDeconvLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, WeightMap *weight_map, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:145
void addPoolingLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:249
void addReshapeLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:521
#define AWARN
Definition log.h:43

◆ addPaddingLayer()

void apollo::perception::inference::RTNet::addPaddingLayer ( const LayerParameter &  layer_param,
nvinfer1::ITensor *const *  inputs,
nvinfer1::INetworkDefinition *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 536 行定义.

540 {
541 nvinfer1::DimsHW pre_dims(layer_param.padding_param().pad_t(),
542 layer_param.padding_param().pad_l());
543 nvinfer1::DimsHW post_dims(layer_param.padding_param().pad_b(),
544 layer_param.padding_param().pad_r());
545 nvinfer1::IPaddingLayer *padding_layer =
546 net->addPadding(*inputs[0], pre_dims, post_dims);
547 padding_layer->setName(layer_param.name().c_str());
548 ConstructMap(layer_param, padding_layer, tensor_map, tensor_modify_map);
549}

◆ addPermuteLayer()

void apollo::perception::inference::RTNet::addPermuteLayer ( const LayerParameter &  layer_param,
nvinfer1::ITensor *const *  inputs,
int  nbInputs,
nvinfer1::INetworkDefinition *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 499 行定义.

503 {
504 CHECK_LE(layer_param.permute_param().order_size(), nvinfer1::Dims::MAX_DIMS);
505 nvinfer1::IShuffleLayer *permuteLayer = net->addShuffle(*inputs[0]);
506 nvinfer1::Permutation permutation;
507
508 // For loading Caffe's permute param,
509 // e.g. Caffe: [0, 2, 1, 3] -> TensorRT: [1, 0, 2], omitting 1st dim N.
510 ACHECK(layer_param.permute_param().order(0) == 0);
511 for (int i = 1; i < layer_param.permute_param().order_size(); ++i) {
512 int order = layer_param.permute_param().order(i);
513 permutation.order[i - 1] = order - 1;
514 }
515 permuteLayer->setFirstTranspose(permutation);
516
517 permuteLayer->setName(layer_param.name().c_str());
518 ConstructMap(layer_param, permuteLayer, tensor_map, tensor_modify_map);
519}
#define ACHECK(cond)
Definition log.h:80

◆ addPoolingLayer()

void apollo::perception::inference::RTNet::addPoolingLayer ( const LayerParameter &  layer_param,
nvinfer1::ITensor *const *  inputs,
nvinfer1::INetworkDefinition *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 249 行定义.

253 {
254 PoolingParameter pool = layer_param.pooling_param();
255 nvinfer1::PoolingType pool_type =
256 (pool.pool() == PoolingParameter_PoolMethod_MAX)
257 ? nvinfer1::PoolingType::kMAX
258 : nvinfer1::PoolingType::kAVERAGE;
259 nvinfer1::PaddingMode padding_mode = nvinfer1::PaddingMode::kCAFFE_ROUND_UP;
260 if (pool.has_round_mode()) {
261 switch (static_cast<int>(pool.round_mode())) {
262 case 0:
263 padding_mode = nvinfer1::PaddingMode::kCAFFE_ROUND_UP;
264 break;
265 case 1:
266 padding_mode = nvinfer1::PaddingMode::kCAFFE_ROUND_DOWN;
267 break;
268 default:
269 padding_mode = nvinfer1::PaddingMode::kCAFFE_ROUND_UP;
270 }
271 }
273 nvinfer1::IPoolingLayer *poolLayer = net->addPooling(
274 *inputs[0], pool_type,
275 {static_cast<int>(pool.kernel_h()), static_cast<int>(pool.kernel_w())});
276 poolLayer->setStride(nvinfer1::DimsHW{static_cast<int>(pool.stride_h()),
277 static_cast<int>(pool.stride_w())});
278 poolLayer->setPadding(nvinfer1::DimsHW{static_cast<int>(pool.pad_h()),
279 static_cast<int>(pool.pad_w())});
280 poolLayer->setPaddingMode(padding_mode);
281 // unlike other frameworks, caffe use inclusive counting for padded averaging
282 poolLayer->setAverageCountExcludesPadding(false);
283 poolLayer->setName(layer_param.name().c_str());
284 ConstructMap(layer_param, poolLayer, tensor_map, tensor_modify_map);
285}
bool modify_pool_param(PoolingParameter *pool_param)
Definition mi_common.cc:101

◆ addRCNNProposalLayer()

void apollo::perception::inference::RTNet::addRCNNProposalLayer ( const LayerParameter &  layer_param,
nvinfer1::ITensor *const *  inputs,
int  nbInputs,
nvinfer1::INetworkDefinition *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 580 行定义.

584 {
585 std::shared_ptr<RCNNProposalPlugin> rcnn_proposal_plugin;
586 nvinfer1::Dims input_dims[4];
587 for (int i = 0; i < nbInputs && i < 4; ++i) {
588 input_dims[i] = inputs[i]->getDimensions();
589 }
590 rcnn_proposal_plugin.reset(new RCNNProposalPlugin(
591 layer_param.bbox_reg_param(), layer_param.detection_output_ssd_param(),
592 input_dims));
593 rcnn_proposal_plugins_.push_back(rcnn_proposal_plugin);
594#ifdef NV_TENSORRT_MAJOR
595#if NV_TENSORRT_MAJOR != 8
596 nvinfer1::IPluginLayer *rcnn_proposal_layer =
597 net->addPlugin(inputs, nbInputs, *rcnn_proposal_plugin);
598#else
599 nvinfer1::IPluginV2Layer *rcnn_proposal_layer =
600 net->addPluginV2(inputs, nbInputs, *rcnn_proposal_plugin);
601#endif
602#endif
603 rcnn_proposal_layer->setName(layer_param.name().c_str());
604
605 ConstructMap(layer_param, rcnn_proposal_layer, tensor_map, tensor_modify_map);
606}

◆ addReshapeLayer()

void apollo::perception::inference::RTNet::addReshapeLayer ( const LayerParameter &  layer_param,
nvinfer1::ITensor *const *  inputs,
nvinfer1::INetworkDefinition *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 521 行定义.

525 {
527 dims.d[0] = static_cast<int>(layer_param.reshape_param().shape().dim(1));
528 dims.d[1] = static_cast<int>(layer_param.reshape_param().shape().dim(2));
529 dims.d[2] = static_cast<int>(layer_param.reshape_param().shape().dim(3));
530 nvinfer1::IShuffleLayer *reshapeLayer = net->addShuffle(*inputs[0]);
531 reshapeLayer->setReshapeDimensions(dims);
532 reshapeLayer->setName(layer_param.name().c_str());
533 ConstructMap(layer_param, reshapeLayer, tensor_map, tensor_modify_map);
534}

◆ addRPNProposalSSDLayer()

void apollo::perception::inference::RTNet::addRPNProposalSSDLayer ( const LayerParameter &  layer_param,
nvinfer1::ITensor *const *  inputs,
int  nbInputs,
nvinfer1::INetworkDefinition *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 608 行定义.

613 {
614 std::shared_ptr<RPNProposalSSDPlugin> rpn_proposal_ssd_plugin;
615 nvinfer1::Dims input_dims[3];
616 for (int i = 0; i < nbInputs && i < 3; ++i) {
617 input_dims[i] = inputs[i]->getDimensions();
618 }
619 rpn_proposal_ssd_plugin.reset(new RPNProposalSSDPlugin(
620 layer_param.bbox_reg_param(), layer_param.detection_output_ssd_param(),
621 input_dims));
622 rpn_proposal_ssd_plugins_.push_back(rpn_proposal_ssd_plugin);
623#ifdef NV_TENSORRT_MAJOR
624#if NV_TENSORRT_MAJOR != 8
625 nvinfer1::IPluginLayer *rpn_proposal_ssd_layer =
626 net->addPlugin(inputs, nbInputs, *rpn_proposal_ssd_plugin);
627#else
628 nvinfer1::IPluginV2Layer *rpn_proposal_ssd_layer =
629 net->addPluginV2(inputs, nbInputs, *rpn_proposal_ssd_plugin);
630#endif
631#endif
632 rpn_proposal_ssd_layer->setName(layer_param.name().c_str());
633
634 ConstructMap(layer_param, rpn_proposal_ssd_layer, tensor_map,
635 tensor_modify_map);
636}

◆ addScaleLayer()

void apollo::perception::inference::RTNet::addScaleLayer ( const LayerParameter &  layer_param,
nvinfer1::ITensor *const *  inputs,
WeightMap *  weight_map,
nvinfer1::INetworkDefinition *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 360 行定义.

365 {
366 std::vector<nvinfer1::Weights> lw(
367 3, nvinfer1::Weights{nvinfer1::DataType::kFLOAT, nullptr, 0});
368 if (layer_param.type() == "Power") {
369 auto power_param = layer_param.power_param();
370 nvinfer1::Dims input_dim = inputs[0]->getDimensions();
371 int size = input_dim.d[0];
372 lw[0] = loadLayerWeights(power_param.scale(), size);
373 lw[1] = loadLayerWeights(power_param.shift(), size);
374 lw[2] = loadLayerWeights(power_param.power(), size);
375 } else {
376 ACHECK(weight_map->find(layer_param.name().c_str()) != weight_map->end());
377 for (size_t i = 0; i < (*weight_map)[layer_param.name().c_str()].size();
378 ++i) {
379 lw[i] = (*weight_map)[layer_param.name().c_str()][i];
380 }
381 }
382 (*weight_map)[layer_param.name().c_str()] = lw;
383
384 nvinfer1::IScaleLayer *scaleLayer = net->addScale(
385 *inputs[0], nvinfer1::ScaleMode::kCHANNEL, lw[1], lw[0], lw[2]);
386 scaleLayer->setName(layer_param.name().c_str());
387 ConstructMap(layer_param, scaleLayer, tensor_map, tensor_modify_map);
388}

◆ addSliceLayer()

void apollo::perception::inference::RTNet::addSliceLayer ( const LayerParameter &  layer_param,
nvinfer1::ITensor *const *  inputs,
int  nbInputs,
nvinfer1::INetworkDefinition *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 287 行定义.

291 {
292#ifdef NV_TENSORRT_MAJOR
293#if NV_TENSORRT_MAJOR != 8
294 CHECK_GT(layer_param.slice_param().axis(), 0);
295 std::shared_ptr<SLICEPlugin> slice_plugin;
296 slice_plugin.reset(
297 new SLICEPlugin(layer_param.slice_param(), inputs[0]->getDimensions()));
298
299 nvinfer1::IPluginLayer *sliceLayer =
300 net->addPlugin(inputs, nbInputs, *slice_plugin);
301
302 slice_plugins_.push_back(slice_plugin);
303 sliceLayer->setName(layer_param.name().c_str());
304 ConstructMap(layer_param, sliceLayer, tensor_map, tensor_modify_map);
305#else
306 const auto mPluginRegistry = getPluginRegistry();
307 auto creator =
308 mPluginRegistry->getPluginCreator("slice_plugin", "1", "camera");
309
310 auto slice_param = layer_param.slice_param();
311 int axis = slice_param.axis();
312 int slice_point_num = slice_param.slice_point_size();
313 std::vector<int> slice_point(slice_point_num);
314
315 for (int i = 0; i < slice_point_num; i++) {
316 slice_point[i] = slice_param.slice_point(i);
317 }
318 nvinfer1::Dims in_dims = inputs[0]->getDimensions();
319 std::vector<nvinfer1::PluginField> f;
320 f.emplace_back(nvinfer1::PluginField("axis", &axis,
321 nvinfer1::PluginFieldType::kINT32, 1));
322 f.emplace_back(nvinfer1::PluginField("slice_point", &slice_point[0],
323 nvinfer1::PluginFieldType::kINT32,
324 slice_point_num));
325 f.emplace_back(nvinfer1::PluginField("in_dims", &in_dims,
326 nvinfer1::PluginFieldType::kDIMS, 1));
327 nvinfer1::PluginFieldCollection fc;
328 fc.nbFields = f.size();
329 fc.fields = f.data();
330
331 nvinfer1::IPluginV2 *slice_plugin = creator->createPlugin("slice_layer", &fc);
332
333 nvinfer1::IPluginV2Layer *sliceLayer =
334 net->addPluginV2(inputs, nbInputs, *slice_plugin);
335 sliceLayer->setName(layer_param.name().c_str());
336
337 ConstructMap(layer_param, sliceLayer, tensor_map, tensor_modify_map);
338#endif
339#endif
340}
double f

◆ addSoftmaxLayer()

void apollo::perception::inference::RTNet::addSoftmaxLayer ( const LayerParameter &  layer_param,
nvinfer1::ITensor *const *  inputs,
int  nbInputs,
nvinfer1::INetworkDefinition *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 407 行定义.

411 {
412 if (layer_param.has_softmax_param()) {
413#ifdef NV_TENSORRT_MAJOR
414#if NV_TENSORRT_MAJOR != 8
415 std::shared_ptr<SoftmaxPlugin> softmax_plugin;
416 softmax_plugin.reset(new SoftmaxPlugin(layer_param.softmax_param(),
417 inputs[0]->getDimensions()));
418 softmax_plugins_.push_back(softmax_plugin);
419
420 nvinfer1::IPluginLayer *softmaxLayer =
421 net->addPlugin(inputs, nbInputs, *softmax_plugin);
422
423 softmaxLayer->setName(layer_param.name().c_str());
424
425 ConstructMap(layer_param, softmaxLayer, tensor_map, tensor_modify_map);
426#else
427 const auto mPluginRegistry = getPluginRegistry();
428 auto creator =
429 mPluginRegistry->getPluginCreator("softmax_plugin", "1", "camera");
430
431 auto softmax_param = layer_param.softmax_param();
432 int axis = softmax_param.axis();
433 nvinfer1::Dims in_dims = inputs[0]->getDimensions();
434 std::vector<nvinfer1::PluginField> f;
435 f.emplace_back(nvinfer1::PluginField("axis", &axis,
436 nvinfer1::PluginFieldType::kINT32, 1));
437 f.emplace_back(nvinfer1::PluginField("in_dims", &in_dims,
438 nvinfer1::PluginFieldType::kDIMS, 1));
439
440 nvinfer1::PluginFieldCollection fc;
441 fc.nbFields = f.size();
442 fc.fields = f.data();
443 nvinfer1::IPluginV2 *softmax_plugin =
444 creator->createPlugin("softmax_layer", &fc);
445
446 nvinfer1::IPluginV2Layer *softmaxLayer =
447 net->addPluginV2(inputs, nbInputs, *softmax_plugin);
448 softmaxLayer->setName(layer_param.name().c_str());
449 ConstructMap(layer_param, softmaxLayer, tensor_map, tensor_modify_map);
450#endif
451#endif
452 } else {
453 nvinfer1::ISoftMaxLayer *softmaxLayer = net->addSoftMax(*inputs[0]);
454 softmaxLayer->setName(layer_param.name().c_str());
455 ConstructMap(layer_param, softmaxLayer, tensor_map, tensor_modify_map);
456 }
457}

◆ checkInt8()

bool apollo::perception::inference::RTNet::checkInt8 ( const std::string &  gpu_name,
nvinfer1::IInt8Calibrator *  calibrator 
)
protected

在文件 rt_net.cc 第 956 行定义.

957 {
958 if (calibrator == nullptr) {
959 AINFO << "Device Works on FP32 Mode.";
960 return false;
961 }
962 for (auto ref : _gpu_checklist) {
963 if (ref == gpu_name) {
964 AINFO << "Device Works on Int8 Mode.";
965 return true;
966 }
967 }
968 AWARN << "Device Not Supports Int8 Mode. Use FP32 Mode.";
969 calibrator_ = nullptr;
970 return false;
971}
const std::vector< std::string > _gpu_checklist
Definition rt_net.h:64

◆ ConstructMap()

void apollo::perception::inference::RTNet::ConstructMap ( const LayerParameter &  layer_param,
nvinfer1::ILayer *  layer,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 rt_net.cc 第 71 行定义.

73 {
74 for (int i = 0; i < layer_param.top_size(); ++i) {
75 std::string top_name = layer_param.top(i);
76 TensorModifyMap::iterator it;
77 it = tensor_modify_map->find(top_name);
78 if (it != tensor_modify_map->end()) {
79 std::string modify_name = top_name + "_" + layer_param.name();
80 top_name = modify_name;
81 it->second = top_name;
82 } else {
83 tensor_modify_map->insert(
84 std::pair<std::string, std::string>(top_name, top_name));
85 }
86 tensor_map->insert(std::pair<std::string, nvinfer1::ITensor *>(
87 top_name, layer->getOutput(i)));
88 layer->getOutput(i)->setName(top_name.c_str());
89 }
90}

◆ get_blob()

base::BlobPtr< float > apollo::perception::inference::RTNet::get_blob ( const std::string &  name)
overridevirtual

实现了 apollo::perception::inference::Inference.

在文件 rt_net.cc 第 1080 行定义.

1080 {
1081 auto iter = blobs_.find(name);
1082 if (iter == blobs_.end()) {
1083 return nullptr;
1084 }
1085 return iter->second;
1086}

◆ Infer()

void apollo::perception::inference::RTNet::Infer ( )
overridevirtual

实现了 apollo::perception::inference::Inference.

在文件 rt_net.cc 第 1049 行定义.

1049 {
1050 BASE_GPU_CHECK(cudaSetDevice(gpu_id_));
1051 BASE_GPU_CHECK(cudaStreamSynchronize(stream_));
1052 for (auto name : input_names_) {
1053 auto blob = get_blob(name);
1054 if (blob != nullptr) {
1055 blob->gpu_data();
1056 }
1057 }
1058 // If `out_blob->mutable_cpu_data()` is invoked outside,
1059 // HEAD will be set to CPU, and `out_blob->mutable_gpu_data()`
1060 // after `enqueue` will copy data from CPU to GPU,
1061 // which will overwrite the `inference` results.
1062 // `out_blob->gpu_data()` will set HEAD to SYNCED,
1063 // then no copy happends after `enqueue`.
1064 for (auto name : output_names_) {
1065 auto blob = get_blob(name);
1066 if (blob != nullptr) {
1067 blob->gpu_data();
1068 }
1069 }
1070 context_->enqueue(max_batch_size_, &buffers_[0], stream_, nullptr);
1071 BASE_GPU_CHECK(cudaStreamSynchronize(stream_));
1072
1073 for (auto name : output_names_) {
1074 auto blob = get_blob(name);
1075 if (blob != nullptr) {
1076 blob->mutable_gpu_data();
1077 }
1078 }
1079}
base::BlobPtr< float > get_blob(const std::string &name) override
Definition rt_net.cc:1080

◆ Init()

bool apollo::perception::inference::RTNet::Init ( const std::map< std::string, std::vector< int > > &  shapes)
overridevirtual

实现了 apollo::perception::inference::Inference.

在文件 rt_net.cc 第 868 行定义.

868 {
869 if (gpu_id_ < 0) {
870 AINFO << "must use gpu mode";
871 return false;
872 }
873 BASE_GPU_CHECK(cudaSetDevice(gpu_id_));
874 // stream will only be destoried for gpu_id_ >= 0
875 cudaStreamCreate(&stream_);
876
877 builder_ = nvinfer1::createInferBuilder(rt_gLogger);
878
879 workspaceSize_ = 1 << 30;
880 cudaDeviceProp prop;
881 cudaGetDeviceProperties(&prop, gpu_id_);
882 bool int8_mode = checkInt8(prop.name, calibrator_);
883
884#ifdef NV_TENSORRT_MAJOR
885#if NV_TENSORRT_MAJOR != 8
886 network_ = builder_->createNetwork();
887
888 parse_with_api(shapes);
889 builder_->setMaxBatchSize(max_batch_size_);
890 builder_->setMaxWorkspaceSize(workspaceSize_);
891
892 builder_->setInt8Mode(int8_mode);
893 builder_->setInt8Calibrator(calibrator_);
894
895 builder_->setDebugSync(true);
896
897 nvinfer1::ICudaEngine *engine = builder_->buildCudaEngine(*network_);
898#else
899 network_ = builder_->createNetworkV2(0U);
900 parse_with_api(shapes);
901 builder_config_ = builder_->createBuilderConfig();
902 builder_->setMaxBatchSize(max_batch_size_);
903 builder_config_->setMaxWorkspaceSize(workspaceSize_);
904
905 if (int8_mode) {
906 builder_config_->setFlag(nvinfer1::BuilderFlag::kINT8);
907 } else {
908 builder_config_->setFlag(nvinfer1::BuilderFlag::kDEBUG);
909 }
910 builder_config_->setInt8Calibrator(calibrator_);
911
912 // serialize trt engine the first time
913 nvinfer1::ICudaEngine *engine = nullptr;
914 auto trt_cache_path = model_root_ + "/TRTengine.cache";
915 if (!LoadCache(trt_cache_path)) {
916 engine = builder_->buildEngineWithConfig(*network_, *builder_config_);
917
918 if (engine->serialize()) {
919 nvinfer1::IHostMemory *serialized_model(engine->serialize());
920 std::ofstream f(trt_cache_path, std::ios::binary);
921
922 f.write(reinterpret_cast<char *>(serialized_model->data()),
923 serialized_model->size());
924 serialized_model->destroy();
925 AERROR << "Saving serialized model file to " << trt_cache_path;
926 }
927 } else {
928 AINFO << "Loading TensorRT engine from serialized model file...";
929 std::ifstream planFile(trt_cache_path);
930
931 if (!planFile.is_open()) {
932 AERROR << "Could not open serialized model";
933 return false;
934 }
935 initLibNvInferPlugins(&rt_gLogger, "");
936
937 AINFO << "success open serialized model";
938 std::stringstream planBuffer;
939 planBuffer << planFile.rdbuf();
940 std::string plan = planBuffer.str();
941 nvinfer1::IRuntime *runtime = nvinfer1::createInferRuntime(rt_gLogger);
942
943 engine = runtime->deserializeCudaEngine(
944 static_cast<const void *>(plan.data()), plan.size(), nullptr);
945 runtime->destroy();
946 }
947#endif
948#endif
949 context_ = engine->createExecutionContext();
950 buffers_.resize(input_names_.size() + output_names_.size());
951 init_blob(&input_names_);
952 init_blob(&output_names_);
953 AINFO << "engine init success";
954 return true;
955}
void parse_with_api(const std::map< std::string, std::vector< int > > &shapes)
Definition rt_net.cc:997
bool checkInt8(const std::string &gpu_name, nvinfer1::IInt8Calibrator *calibrator)
Definition rt_net.cc:956
void init_blob(std::vector< std::string > *names)
Definition rt_net.cc:832
#define AERROR
Definition log.h:44
RTLogger rt_gLogger

◆ init_blob()

void apollo::perception::inference::RTNet::init_blob ( std::vector< std::string > *  names)
protected

在文件 rt_net.cc 第 832 行定义.

832 {
833 auto engine = &(context_->getEngine());
834
835 for (auto name : *names) {
836 int bindingIndex =
837 engine->getBindingIndex(tensor_modify_map_[name].c_str());
838 CHECK_LT(static_cast<size_t>(bindingIndex), buffers_.size());
839 CHECK_GE(bindingIndex, 0);
840
841 nvinfer1::DimsCHW dims = static_cast<nvinfer1::DimsCHW &&>(
842 engine->getBindingDimensions(bindingIndex));
843 int count = dims.c() * dims.h() * dims.w() * max_batch_size_;
844 cudaMalloc(&buffers_[bindingIndex], count * sizeof(float));
845
846 std::vector<int> shape;
847 ACHECK(this->shape(name, &shape));
848 base::BlobPtr<float> blob;
850
851 blob->set_gpu_data(reinterpret_cast<float *>(buffers_[bindingIndex]));
852
853 blobs_.insert(std::make_pair(name, blob));
854 }
855}
A wrapper around SyncedMemory holders serving as the basic computational unit for images,...
Definition blob.h:88
int32_t & h()
Definition rt_legacy.h:77
int32_t & w()
Definition rt_legacy.h:85
int32_t & c()
Definition rt_legacy.h:69

◆ loadLayerWeights() [1/2]

nvinfer1::Weights apollo::perception::inference::RTNet::loadLayerWeights ( const float *  data,
int  size 
)
protected

在文件 rt_net.cc 第 754 行定义.

754 {
755 nvinfer1::Weights wt{nvinfer1::DataType::kFLOAT, nullptr, 0};
756 std::shared_ptr<float> val;
757 val.reset(new float[size]);
758 weights_mem_.push_back(val);
759 for (int k = 0; k < size; ++k) {
760 val.get()[k] = data[k];
761 }
762 wt.values = val.get();
763 wt.count = size;
764 return wt;
765}

◆ loadLayerWeights() [2/2]

nvinfer1::Weights apollo::perception::inference::RTNet::loadLayerWeights ( float  data,
int  size 
)
protected

在文件 rt_net.cc 第 766 行定义.

766 {
767 nvinfer1::Weights wt{nvinfer1::DataType::kFLOAT, nullptr, 0};
768 std::shared_ptr<float> val;
769 val.reset(new float[size]);
770 weights_mem_.push_back(val);
771 for (int k = 0; k < size; ++k) {
772 val.get()[k] = data;
773 }
774 wt.values = val.get();
775 wt.count = size;
776 return wt;
777}

◆ loadWeights()

bool apollo::perception::inference::RTNet::loadWeights ( const std::string &  model_file,
WeightMap *  weight_map 
)
protected

在文件 rt_net.cc 第 703 行定义.

703 {
704 NetParameter net;
705 if (!ReadProtoFromBinaryFile(model_file.c_str(), &net)) {
706 AFATAL << "open file " << model_file << " failed";
707 return false;
708 }
709 for (int i = 0; i < net.layer_size(); ++i) {
710 std::vector<nvinfer1::Weights> lw;
711 for (int j = 0; j < net.layer(i).blobs_size(); ++j) {
712 // val memory will be released when deconstructor is called
713 auto blob = &(net.layer(i).blobs(j));
714 CHECK_EQ(blob->double_data_size(), 0);
715 CHECK_EQ(blob->double_diff_size(), 0);
716 CHECK_EQ(blob->diff_size(), 0);
717 CHECK_NE(blob->data_size(), 0);
718 if (net.layer(i).type() == "BatchNorm") {
719 mergeBN(j, net.mutable_layer(i));
720 }
721 auto wt = loadLayerWeights(blob->data().data(), blob->data_size());
722 lw.push_back(wt);
723 }
724 (*weight_map)[net.layer(i).name().c_str()] = lw;
725 }
726 return true;
727}
void mergeBN(int index, LayerParameter *layer_param)
Definition rt_net.cc:728
#define AFATAL
Definition log.h:45
bool ReadProtoFromBinaryFile(const std::string &filename, google::protobuf::Message *proto)
Definition mi_utils.cc:44

◆ mergeBN()

void apollo::perception::inference::RTNet::mergeBN ( int  index,
LayerParameter *  layer_param 
)
protected

在文件 rt_net.cc 第 728 行定义.

728 {
729 auto blob = (layer_param->mutable_blobs(index));
730 CHECK_EQ(blob->double_data_size(), 0);
731 CHECK_EQ(blob->double_diff_size(), 0);
732 CHECK_EQ(blob->diff_size(), 0);
733 CHECK_NE(blob->data_size(), 0);
734 int size = blob->data_size();
735
736 auto scale = (layer_param->blobs(2));
737 const float scale_factor = scale.data(0) == 0 ? 0 : 1 / scale.data(0);
738 auto epsilon = layer_param->batch_norm_param().eps();
739 if (index == 0) {
740 const BlobProto *var = (layer_param->mutable_blobs(index + 1));
741 for (int k = 0; k < size; ++k) {
742 auto data = blob->data(k);
743 blob->set_data(
744 k, static_cast<float>(-data * scale_factor /
745 sqrt(var->data(k) * scale_factor + epsilon)));
746 }
747 } else if (index == 1) {
748 for (int k = 0; k < size; ++k) {
749 blob->set_data(k, 1.0f / static_cast<float>(sqrt(
750 blob->data(k) * scale_factor + epsilon)));
751 }
752 }
753}

◆ parse_with_api()

void apollo::perception::inference::RTNet::parse_with_api ( const std::map< std::string, std::vector< int > > &  shapes)
protected

在文件 rt_net.cc 第 997 行定义.

998 {
999 CHECK_GT(net_param_->layer_size(), 0);
1000 std::vector<LayerParameter> order;
1001 TensorMap tensor_map;
1002 TensorDimsMap tensor_dims_map;
1003 ParseNetParam(*net_param_, &tensor_dims_map, &tensor_modify_map_, &order);
1004 addInput(tensor_dims_map, shapes, &tensor_map);
1005 for (auto layer_param : order) {
1006 std::vector<nvinfer1::ITensor *> inputs;
1007 for (int j = 0; j < layer_param.bottom_size(); ++j) {
1008 CHECK_NOTNULL(tensor_map[tensor_modify_map_[layer_param.bottom(j)]]);
1009 inputs.push_back(tensor_map[tensor_modify_map_[layer_param.bottom(j)]]);
1010 }
1011 addLayer(layer_param, inputs.data(), layer_param.bottom_size(),
1012 &weight_map_, network_, &tensor_map, &tensor_modify_map_);
1013 }
1014
1015 CHECK_NE(output_names_.size(), static_cast<size_t>(0));
1016 std::sort(output_names_.begin(), output_names_.end());
1017 auto last = std::unique(output_names_.begin(), output_names_.end());
1018 output_names_.erase(last, output_names_.end());
1019 for (auto iter = output_names_.begin(); iter != output_names_.end();) {
1020 if (tensor_map.find(tensor_modify_map_[*iter]) != tensor_map.end()) {
1021 network_->markOutput(*tensor_map[tensor_modify_map_[*iter]]);
1022 iter++;
1023 } else {
1024 AINFO << "Erase output: " << *iter;
1025 iter = output_names_.erase(iter);
1026 }
1027 }
1028}
void addLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, WeightMap *weight_map, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:638
bool addInput(const TensorDimsMap &tensor_dims_map, const std::map< std::string, std::vector< int > > &shapes, TensorMap *tensor_map)
Definition rt_net.cc:972
std::map< std::string, Tensor > TensorMap
Definition mi_net.h:64
void ParseNetParam(const NetParameter &net_param, TensorDimsMap *tensor_dims_map, std::map< std::string, std::string > *tensor_modify_map, std::vector< LayerParameter > *order)
Definition mi_common.cc:27
std::map< std::string, TensorDims > TensorDimsMap
Definition mi_common.h:33

◆ shape()

bool apollo::perception::inference::RTNet::shape ( const std::string &  name,
std::vector< int > *  res 
)
protected

在文件 rt_net.cc 第 813 行定义.

813 {
814 auto engine = &(context_->getEngine());
815 if (tensor_modify_map_.find(name) == tensor_modify_map_.end()) {
816 AINFO << "can't get the shape of " << name;
817 return false;
818 }
819 int bindingIndex = engine->getBindingIndex(tensor_modify_map_[name].c_str());
820 if (bindingIndex > static_cast<int>(buffers_.size())) {
821 return false;
822 }
823 nvinfer1::DimsCHW dims = static_cast<nvinfer1::DimsCHW &&>(
824 engine->getBindingDimensions(bindingIndex));
825 res->resize(4);
826 (*res)[0] = max_batch_size_;
827 (*res)[1] = dims.c();
828 (*res)[2] = dims.h();
829 (*res)[3] = dims.w();
830 return true;
831}

该类的文档由以下文件生成: