Apollo 11.0
自动驾驶开放平台
rt_net.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2018 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16#include <NvInferPlugin.h>
17#include <NvInferRuntimeCommon.h>
18#include <NvInferVersion.h>
19
20#ifdef NV_TENSORRT_MAJOR
21#if NV_TENSORRT_MAJOR == 8
23#endif
24#endif
25#include <sys/stat.h>
26
27#include <algorithm>
28#include <cmath>
29#include <fstream>
30#include <utility>
31
32#include <cuda_runtime_api.h>
33
34#include "absl/strings/str_cat.h"
35
36#include "cyber/common/log.h"
45
46class RTLogger : public nvinfer1::ILogger {
47 void log(Severity severity, const char *msg) noexcept override {
48 switch (severity) {
49 case Severity::kINTERNAL_ERROR:
50 case Severity::kERROR:
51 AERROR << msg;
52 break;
53 case Severity::kWARNING:
54 AWARN << msg;
55 break;
56 case Severity::kINFO:
57 case Severity::kVERBOSE:
58 ADEBUG << msg;
59 break;
60 default:
61 break;
62 }
63 }
65#define LOAD_DEBUG 0
66
67namespace apollo {
68namespace perception {
69namespace inference {
70
71void RTNet::ConstructMap(const LayerParameter &layer_param,
72 nvinfer1::ILayer *layer, TensorMap *tensor_map,
73 TensorModifyMap *tensor_modify_map) {
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}
91
92void RTNet::addConvLayer(const LayerParameter &layer_param,
93 nvinfer1::ITensor *const *inputs,
94 WeightMap *weight_map,
95 nvinfer1::INetworkDefinition *net,
96 TensorMap *tensor_map,
97 TensorModifyMap *tensor_modify_map) {
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}
144
145void RTNet::addDeconvLayer(const LayerParameter &layer_param,
146 nvinfer1::ITensor *const *inputs,
147 WeightMap *weight_map,
148 nvinfer1::INetworkDefinition *net,
149 TensorMap *tensor_map,
150 TensorModifyMap *tensor_modify_map) {
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}
185void RTNet::addActiveLayer(const LayerParameter &layer_param,
186 nvinfer1::ITensor *const *inputs, int nbInputs,
187 nvinfer1::INetworkDefinition *net,
188 TensorMap *tensor_map,
189 TensorModifyMap *tensor_modify_map) {
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}
220
221void RTNet::addConcatLayer(const LayerParameter &layer_param,
222 nvinfer1::ITensor *const *inputs, int nbInputs,
223 nvinfer1::INetworkDefinition *net,
224 TensorMap *tensor_map,
225 TensorModifyMap *tensor_modify_map) {
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}
248
250 nvinfer1::ITensor *const *inputs,
251 nvinfer1::INetworkDefinition *net,
252 TensorMap *tensor_map,
253 TensorModifyMap *tensor_modify_map) {
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}
286
287void RTNet::addSliceLayer(const LayerParameter &layer_param,
288 nvinfer1::ITensor *const *inputs, int nbInputs,
289 nvinfer1::INetworkDefinition *net,
290 TensorMap *tensor_map,
291 TensorModifyMap *tensor_modify_map) {
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}
341
343 nvinfer1::ITensor *const *inputs,
344 WeightMap *weight_map,
345 nvinfer1::INetworkDefinition *net,
346 TensorMap *tensor_map,
347 TensorModifyMap *tensor_modify_map) {
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}
359
360void RTNet::addScaleLayer(const LayerParameter &layer_param,
361 nvinfer1::ITensor *const *inputs,
362 WeightMap *weight_map,
363 nvinfer1::INetworkDefinition *net,
364 TensorMap *tensor_map,
365 TensorModifyMap *tensor_modify_map) {
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}
389
391 nvinfer1::ITensor *const *inputs,
392 WeightMap *weight_map,
393 nvinfer1::INetworkDefinition *net,
394 TensorMap *tensor_map,
395 TensorModifyMap *tensor_modify_map) {
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}
408 nvinfer1::ITensor *const *inputs, int nbInputs,
409 nvinfer1::INetworkDefinition *net,
410 TensorMap *tensor_map,
411 TensorModifyMap *tensor_modify_map) {
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}
458
460 nvinfer1::ITensor *const *inputs,
461 nvinfer1::INetworkDefinition *net,
462 TensorMap *tensor_map,
463 TensorModifyMap *tensor_modify_map) {
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}
475
476void RTNet::addArgmaxLayer(const LayerParameter &layer_param,
477 nvinfer1::ITensor *const *inputs, int nbInputs,
478 nvinfer1::INetworkDefinition *net,
479 TensorMap *tensor_map,
480 TensorModifyMap *tensor_modify_map) {
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}
498
500 nvinfer1::ITensor *const *inputs, int nbInputs,
501 nvinfer1::INetworkDefinition *net,
502 TensorMap *tensor_map,
503 TensorModifyMap *tensor_modify_map) {
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}
520
522 nvinfer1::ITensor *const *inputs,
523 nvinfer1::INetworkDefinition *net,
524 TensorMap *tensor_map,
525 TensorModifyMap *tensor_modify_map) {
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}
535
537 nvinfer1::ITensor *const *inputs,
538 nvinfer1::INetworkDefinition *net,
539 TensorMap *tensor_map,
540 TensorModifyMap *tensor_modify_map) {
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}
550
552 nvinfer1::ITensor *const *inputs,
553 int nbInputs,
554 nvinfer1::INetworkDefinition *net,
555 TensorMap *tensor_map,
556 TensorModifyMap *tensor_modify_map) {
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}
579
581 nvinfer1::ITensor *const *inputs, int nbInputs,
582 nvinfer1::INetworkDefinition *net,
583 TensorMap *tensor_map,
584 TensorModifyMap *tensor_modify_map) {
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}
607
609 nvinfer1::ITensor *const *inputs,
610 int nbInputs,
611 nvinfer1::INetworkDefinition *net,
612 TensorMap *tensor_map,
613 TensorModifyMap *tensor_modify_map) {
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}
637
638void RTNet::addLayer(const LayerParameter &layer_param,
639 nvinfer1::ITensor *const *inputs, int nbInputs,
640 WeightMap *weight_map, nvinfer1::INetworkDefinition *net,
641 TensorMap *tensor_map,
642 TensorModifyMap *tensor_modify_map) {
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}
703bool RTNet::loadWeights(const std::string &model_file, WeightMap *weight_map) {
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}
728void RTNet::mergeBN(int index, LayerParameter *layer_param) {
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}
754nvinfer1::Weights RTNet::loadLayerWeights(const float *data, int size) {
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}
766nvinfer1::Weights RTNet::loadLayerWeights(float data, int size) {
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}
778
779RTNet::RTNet(const std::string &net_file, const std::string &model_file,
780 const std::vector<std::string> &outputs,
781 const std::vector<std::string> &inputs)
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}
787RTNet::RTNet(const std::string &net_file, const std::string &model_file,
788 const std::vector<std::string> &outputs,
789 const std::vector<std::string> &inputs,
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}
798RTNet::RTNet(const std::string &net_file, const std::string &model_file,
799 const std::vector<std::string> &outputs,
800 const std::vector<std::string> &inputs,
801 const std::string &model_root)
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}
812
813bool RTNet::shape(const std::string &name, std::vector<int> *res) {
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}
832void RTNet::init_blob(std::vector<std::string> *names) {
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));
850
851 blob->set_gpu_data(reinterpret_cast<float *>(buffers_[bindingIndex]));
852
853 blobs_.insert(std::make_pair(name, blob));
854 }
855}
856
857bool LoadCache(const std::string &path) {
858 // auto hash_path = path + ".hash";
859 struct stat buffer;
860 if (stat(path.c_str(), &buffer) != 0) {
861 AERROR << "[INFO] cannot find model cache : " << path
862 << ", it will take minutes to generate...";
863 return false;
864 }
865 return true;
866}
867
868bool RTNet::Init(const std::map<std::string, std::vector<int>> &shapes) {
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}
956bool RTNet::checkInt8(const std::string &gpu_name,
957 nvinfer1::IInt8Calibrator *calibrator) {
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}
972bool RTNet::addInput(const TensorDimsMap &tensor_dims_map,
973 const std::map<std::string, std::vector<int>> &shapes,
974 TensorMap *tensor_map) {
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}
996
998 const std::map<std::string, std::vector<int>> &shapes) {
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}
1029
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}
1048
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}
1080base::BlobPtr<float> RTNet::get_blob(const std::string &name) {
1081 auto iter = blobs_.find(name);
1082 if (iter == blobs_.end()) {
1083 return nullptr;
1084 }
1085 return iter->second;
1086}
1087
1088} // namespace inference
1089} // namespace perception
1090} // namespace apollo
double f
A wrapper around SyncedMemory holders serving as the basic computational unit for images,...
Definition blob.h:88
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 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 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 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 loadWeights(const std::string &model_file, WeightMap *weight_map)
Definition rt_net.cc:703
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 init_blob(std::vector< std::string > *names)
Definition rt_net.cc:832
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
RTNet(const std::string &net_file, const std::string &model_file, const std::vector< std::string > &outputs, const std::vector< std::string > &inputs)
Definition rt_net.cc:779
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
bool addInput(const TensorDimsMap &tensor_dims_map, const std::map< std::string, std::vector< int > > &shapes, TensorMap *tensor_map)
Definition rt_net.cc:972
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
base::BlobPtr< float > get_blob(const std::string &name) override
Definition rt_net.cc:1080
nvinfer1::Weights loadLayerWeights(const float *data, int size)
Definition rt_net.cc:754
bool shape(const std::string &name, std::vector< int > *res)
Definition rt_net.cc:813
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
bool Init(const std::map< std::string, std::vector< int > > &shapes) override
Definition rt_net.cc:868
void mergeBN(int index, LayerParameter *layer_param)
Definition rt_net.cc:728
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
void ConstructMap(const LayerParameter &layer_param, nvinfer1::ILayer *layer, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition rt_net.cc:71
int32_t & h()
Definition rt_legacy.h:77
int32_t & w()
Definition rt_legacy.h:85
int32_t & c()
Definition rt_legacy.h:69
#define ACHECK(cond)
Definition log.h:80
#define ADEBUG
Definition log.h:41
#define AERROR
Definition log.h:44
#define AFATAL
Definition log.h:45
#define AINFO
Definition log.h:42
#define AWARN
Definition log.h:43
std::shared_ptr< Blob< Dtype > > BlobPtr
Definition blob.h:313
bool ParserConvParam(const ConvolutionParameter &conv, ConvParam *param)
Definition mi_common.cc:51
std::map< std::string, Tensor > TensorMap
Definition mi_net.h:64
const std::map< EltwiseParameter::EltwiseOp, std::string > eltwise_map
Definition mi_net.h:74
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, std::string > TensorModifyMap
Definition mi_net.h:66
const std::map< std::string, std::string > active_map
Definition mi_net.h:68
const std::vector< std::string > _gpu_checklist
Definition rt_net.h:64
bool loadNetParams(const std::string &param_file, NetParameter *param)
Definition mi_utils.cc:60
std::map< std::string, TensorDims > TensorDimsMap
Definition mi_common.h:33
bool ReadProtoFromBinaryFile(const std::string &filename, google::protobuf::Message *proto)
Definition mi_utils.cc:44
bool modify_pool_param(PoolingParameter *pool_param)
Definition mi_common.cc:101
std::map< std::string, std::vector< Weights > > WeightMap
Definition mi_net.h:63
class register implement
Definition arena_queue.h:37
RTLogger rt_gLogger
optional ReshapeParameter reshape_param
Definition rt.proto:390
optional ConvolutionParameter convolution_param
Definition rt.proto:341
optional BatchNormParameter batch_norm_param
Definition rt.proto:336
optional ConcatParameter concat_param
Definition rt.proto:339
optional InnerProductParameter inner_product_param
Definition rt.proto:362
optional SoftmaxParameter softmax_param
Definition rt.proto:394
optional DetectionOutputSSDParameter detection_output_ssd_param
Definition rt.proto:346
optional DFMBPSROIAlignParameter dfmb_psroi_pooling_param
Definition rt.proto:347
optional PermuteParameter permute_param
Definition rt.proto:381
optional BBoxRegParameter bbox_reg_param
Definition rt.proto:337
optional EltwiseParameter eltwise_param
Definition rt.proto:350
optional PoolingParameter pooling_param
Definition rt.proto:382
optional PaddingParameter padding_param
Definition rt.proto:375
optional ArgMaxParameter argmax_param
Definition rt.proto:335