Apollo 11.0
自动驾驶开放平台
rt_net.h
浏览该文件的文档.
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
17#pragma once
18
19#include <NvInfer.h>
20#include <NvInferVersion.h>
21
22#ifdef NV_TENSORRT_MAJOR
23#if NV_TENSORRT_MAJOR == 8
25#endif
26#endif
27
28#include <map>
29#include <memory>
30#include <string>
31#include <vector>
32
33#include "modules/perception/common/proto/rt.pb.h"
34
37
38namespace apollo {
39namespace perception {
40namespace inference {
41class ArgMax1Plugin;
42class DFMBPSROIAlignPlugin;
43class RCNNProposalPlugin;
44class RPNProposalSSDPlugin;
45class ReLUPlugin;
46class SLICEPlugin;
47class SoftmaxPlugin;
48
49typedef std::map<std::string, std::vector<nvinfer1::Weights>> WeightMap;
50typedef std::map<std::string, nvinfer1::ITensor *> TensorMap;
51typedef std::map<std::string, nvinfer1::DimsCHW> TensorDimsMap;
52typedef std::map<std::string, std::string> TensorModifyMap;
53
54const std::map<EltwiseParameter::EltwiseOp, nvinfer1::ElementWiseOperation>
56 {EltwiseParameter_EltwiseOp_PROD,
57 nvinfer1::ElementWiseOperation::kPROD},
58 {EltwiseParameter_EltwiseOp_SUM, nvinfer1::ElementWiseOperation::kSUM},
59 {EltwiseParameter_EltwiseOp_MAX, nvinfer1::ElementWiseOperation::kMAX}};
60const std::map<std::string, nvinfer1::ActivationType> active_map{
61 {"Sigmoid", nvinfer1::ActivationType::kSIGMOID},
62 {"TanH", nvinfer1::ActivationType::kTANH},
63 {"ReLU", nvinfer1::ActivationType::kRELU}};
64const std::vector<std::string> _gpu_checklist{"GeForce GTX 1080",
65 "GeForce GTX 1080 Ti",
66 "Tesla P4",
67 "Tesla P40",
68 "GeForce GTX 1070",
69 "GeForce GTX 1060",
70 "Tesla V100-SXM2-16GB",
71 "Orin"};
72
73class RTNet : public Inference {
74 public:
75 RTNet(const std::string &net_file, const std::string &model_file,
76 const std::vector<std::string> &outputs,
77 const std::vector<std::string> &inputs);
78 RTNet(const std::string &net_file, const std::string &model_file,
79 const std::vector<std::string> &outputs,
80 const std::vector<std::string> &inputs,
82 RTNet(const std::string &net_file, const std::string &model_file,
83 const std::vector<std::string> &outputs,
84 const std::vector<std::string> &inputs, const std::string &model_root);
85
86 virtual ~RTNet();
87
88 bool Init(const std::map<std::string, std::vector<int>> &shapes) override;
89
90 void Infer() override;
91
92 base::BlobPtr<float> get_blob(const std::string &name) override;
93
94 protected:
95 bool addInput(const TensorDimsMap &tensor_dims_map,
96 const std::map<std::string, std::vector<int>> &shapes,
97 TensorMap *tensor_map);
98 bool shape(const std::string &name, std::vector<int> *res);
99
100 void ConstructMap(const LayerParameter &layer_param, nvinfer1::ILayer *layer,
101 TensorMap *tensor_map, TensorModifyMap *tensor_modify_map);
102 void parse_with_api(const std::map<std::string, std::vector<int>> &shapes);
103 void addLayer(const LayerParameter &layer_param,
104 nvinfer1::ITensor *const *inputs, int nbInputs,
105 WeightMap *weight_map, nvinfer1::INetworkDefinition *net,
106 TensorMap *tensor_map, TensorModifyMap *tensor_modify_map);
107
108 void addConvLayer(const LayerParameter &layer_param,
109 nvinfer1::ITensor *const *inputs, WeightMap *weight_map,
110 nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
111 TensorModifyMap *tensor_modify_map);
112
113 void addDeconvLayer(const LayerParameter &layer_param,
114 nvinfer1::ITensor *const *inputs, WeightMap *weight_map,
115 nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
116 TensorModifyMap *tensor_modify_map);
117
118 void addActiveLayer(const LayerParameter &layer_param,
119 nvinfer1::ITensor *const *inputs, int nbInputs,
120 nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
121 TensorModifyMap *tensor_modify_map);
122
123 void addConcatLayer(const LayerParameter &layer_param,
124 nvinfer1::ITensor *const *inputs, int nbInputs,
125 nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
126 TensorModifyMap *tensor_modify_map);
127
128 void addPoolingLayer(const LayerParameter &layer_param,
129 nvinfer1::ITensor *const *inputs,
130 nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
131 TensorModifyMap *tensor_modify_map);
132 void addSliceLayer(const LayerParameter &layer_param,
133 nvinfer1::ITensor *const *inputs, int nbInputs,
134 nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
135 TensorModifyMap *tensor_modify_map);
136
137 void addInnerproductLayer(const LayerParameter &layer_param,
138 nvinfer1::ITensor *const *inputs,
139 WeightMap *weight_map,
140 nvinfer1::INetworkDefinition *net,
141 TensorMap *tensor_map,
142 TensorModifyMap *tensor_modify_map);
143
144 void addScaleLayer(const LayerParameter &layer_param,
145 nvinfer1::ITensor *const *inputs, WeightMap *weight_map,
146 nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
147 TensorModifyMap *tensor_modify_map);
148
149 void addBatchnormLayer(const LayerParameter &layer_param,
150 nvinfer1::ITensor *const *inputs,
151 WeightMap *weight_map,
152 nvinfer1::INetworkDefinition *net,
153 TensorMap *tensor_map,
154 TensorModifyMap *tensor_modify_map);
155
156 void addSoftmaxLayer(const LayerParameter &layer_param,
157 nvinfer1::ITensor *const *inputs, int nbInputs,
158 nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
159 TensorModifyMap *tensor_modify_map);
160
161 void addEltwiseLayer(const LayerParameter &layer_param,
162 nvinfer1::ITensor *const *inputs,
163 nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
164 TensorModifyMap *tensor_modify_map);
165
166 void addArgmaxLayer(const LayerParameter &layer_param,
167 nvinfer1::ITensor *const *inputs, int nbInputs,
168 nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
169 TensorModifyMap *tensor_modify_map);
170
171 void addPermuteLayer(const LayerParameter &layer_param,
172 nvinfer1::ITensor *const *inputs, int nbInputs,
173 nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
174 TensorModifyMap *tensor_modify_map);
175
176 void addReshapeLayer(const LayerParameter &layer_param,
177 nvinfer1::ITensor *const *inputs,
178 nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
179 TensorModifyMap *tensor_modify_map);
180
181 void addPaddingLayer(const LayerParameter &layer_param,
182 nvinfer1::ITensor *const *inputs,
183 nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
184 TensorModifyMap *tensor_modify_map);
185
186 void addDFMBPSROIAlignLayer(const LayerParameter &layer_param,
187 nvinfer1::ITensor *const *inputs, int nbInputs,
188 nvinfer1::INetworkDefinition *net,
189 TensorMap *tensor_map,
190 TensorModifyMap *tensor_modify_map);
191
192 void addRCNNProposalLayer(const LayerParameter &layer_param,
193 nvinfer1::ITensor *const *inputs, int nbInputs,
194 nvinfer1::INetworkDefinition *net,
195 TensorMap *tensor_map,
196 TensorModifyMap *tensor_modify_map);
197
198 void addRPNProposalSSDLayer(const LayerParameter &layer_param,
199 nvinfer1::ITensor *const *inputs, int nbInputs,
200 nvinfer1::INetworkDefinition *net,
201 TensorMap *tensor_map,
202 TensorModifyMap *tensor_modify_map);
203
204 bool checkInt8(const std::string &gpu_name,
205 nvinfer1::IInt8Calibrator *calibrator);
206 void mergeBN(int index, LayerParameter *layer_param);
207 nvinfer1::Weights loadLayerWeights(const float *data, int size);
208 nvinfer1::Weights loadLayerWeights(float data, int size);
209
210 bool loadWeights(const std::string &model_file, WeightMap *weight_map);
211 void init_blob(std::vector<std::string> *names);
212
213 private:
214 nvinfer1::IExecutionContext *context_ = nullptr;
215 cudaStream_t stream_ = 0;
216 std::vector<std::shared_ptr<ArgMax1Plugin>> argmax_plugins_;
217 std::vector<std::shared_ptr<DFMBPSROIAlignPlugin>> dfmb_psroi_align_plugins_;
218 std::vector<std::shared_ptr<RCNNProposalPlugin>> rcnn_proposal_plugins_;
219 std::vector<std::shared_ptr<RPNProposalSSDPlugin>> rpn_proposal_ssd_plugins_;
220 std::vector<std::shared_ptr<SoftmaxPlugin>> softmax_plugins_;
221 std::vector<std::shared_ptr<SLICEPlugin>> slice_plugins_;
222 std::vector<std::shared_ptr<ReLUPlugin>> relu_plugins_;
223 std::vector<std::string> output_names_;
224 std::vector<std::string> input_names_;
225 std::map<std::string, std::string> tensor_modify_map_;
226
227 std::shared_ptr<NetParameter> net_param_;
228 WeightMap weight_map_;
229 std::vector<void *> buffers_;
230 int workspaceSize_ = 1;
231 nvinfer1::Int8EntropyCalibrator *calibrator_ = nullptr;
232 bool is_own_calibrator_ = true;
233 std::string model_root_;
234 nvinfer1::IBuilder *builder_ = nullptr;
235 nvinfer1::IBuilderConfig *builder_config_ = nullptr;
236 nvinfer1::INetworkDefinition *network_ = nullptr;
237 std::vector<std::shared_ptr<float>> weights_mem_;
238 BlobMap blobs_;
239};
240
241} // namespace inference
242} // namespace perception
243} // namespace apollo
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
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
std::shared_ptr< Blob< Dtype > > BlobPtr
Definition blob.h:313
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
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
std::map< std::string, TensorDims > TensorDimsMap
Definition mi_common.h:33
std::map< std::string, base::BlobPtr< float > > BlobMap
Definition inference.h:39
std::map< std::string, std::vector< Weights > > WeightMap
Definition mi_net.h:63
class register implement
Definition arena_queue.h:37