Apollo  6.0
Open source self driving car software
rt_net.h
Go to the documentation of this file.
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 <map>
20 #include <memory>
21 #include <string>
22 #include <vector>
23 
24 #include "modules/perception/proto/rt.pb.h"
25 
28 
29 namespace apollo {
30 namespace perception {
31 namespace inference {
32 class ArgMax1Plugin;
33 class DFMBPSROIAlignPlugin;
34 class RCNNProposalPlugin;
35 class RPNProposalSSDPlugin;
36 class ReLUPlugin;
37 class SLICEPlugin;
38 class SoftmaxPlugin;
39 
40 typedef std::map<std::string, std::vector<nvinfer1::Weights>> WeightMap;
41 typedef std::map<std::string, nvinfer1::ITensor *> TensorMap;
42 typedef std::map<std::string, nvinfer1::DimsCHW> TensorDimsMap;
43 typedef std::map<std::string, std::string> TensorModifyMap;
44 
45 const std::map<EltwiseParameter::EltwiseOp, nvinfer1::ElementWiseOperation>
47  {EltwiseParameter_EltwiseOp_PROD,
48  nvinfer1::ElementWiseOperation::kPROD},
49  {EltwiseParameter_EltwiseOp_SUM, nvinfer1::ElementWiseOperation::kSUM},
50  {EltwiseParameter_EltwiseOp_MAX, nvinfer1::ElementWiseOperation::kMAX}};
51 const std::map<std::string, nvinfer1::ActivationType> active_map{
52  {"Sigmoid", nvinfer1::ActivationType::kSIGMOID},
53  {"TanH", nvinfer1::ActivationType::kTANH},
54  {"ReLU", nvinfer1::ActivationType::kRELU}};
55 const std::vector<std::string> _gpu_checklist{
56  "GeForce GTX 1080", "GeForce GTX 1080 Ti", "Tesla P4",
57  "Tesla P40", "GeForce GTX 1070", "GeForce GTX 1060",
58  "Tesla V100-SXM2-16GB"};
59 
60 class RTNet : public Inference {
61  public:
62  RTNet(const std::string &net_file, const std::string &model_file,
63  const std::vector<std::string> &outputs,
64  const std::vector<std::string> &inputs);
65  RTNet(const std::string &net_file, const std::string &model_file,
66  const std::vector<std::string> &outputs,
67  const std::vector<std::string> &inputs,
69  RTNet(const std::string &net_file, const std::string &model_file,
70  const std::vector<std::string> &outputs,
71  const std::vector<std::string> &inputs, const std::string &model_root);
72 
73  virtual ~RTNet();
74 
75  bool Init(const std::map<std::string, std::vector<int>> &shapes) override;
76 
77  void Infer() override;
78 
79  std::shared_ptr<apollo::perception::base::Blob<float>> get_blob(
80  const std::string &name) override;
81 
82  protected:
83  bool addInput(const TensorDimsMap &tensor_dims_map,
84  const std::map<std::string, std::vector<int>> &shapes,
85  TensorMap *tensor_map);
86  bool shape(const std::string &name, std::vector<int> *res);
87 
88  void ConstructMap(const LayerParameter &layer_param, nvinfer1::ILayer *layer,
89  TensorMap *tensor_map, TensorModifyMap *tensor_modify_map);
90  void parse_with_api(const std::map<std::string, std::vector<int>> &shapes);
91  void addLayer(const LayerParameter &layer_param,
92  nvinfer1::ITensor *const *inputs, int nbInputs,
93  WeightMap *weight_map, nvinfer1::INetworkDefinition *net,
94  TensorMap *tensor_map, TensorModifyMap *tensor_modify_map);
95 
96  void addConvLayer(const LayerParameter &layer_param,
97  nvinfer1::ITensor *const *inputs, WeightMap *weight_map,
98  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
99  TensorModifyMap *tensor_modify_map);
100 
101  void addDeconvLayer(const LayerParameter &layer_param,
102  nvinfer1::ITensor *const *inputs, WeightMap *weight_map,
103  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
104  TensorModifyMap *tensor_modify_map);
105 
106  void addActiveLayer(const LayerParameter &layer_param,
107  nvinfer1::ITensor *const *inputs, int nbInputs,
108  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
109  TensorModifyMap *tensor_modify_map);
110 
111  void addConcatLayer(const LayerParameter &layer_param,
112  nvinfer1::ITensor *const *inputs, int nbInputs,
113  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
114  TensorModifyMap *tensor_modify_map);
115 
116  void addPoolingLayer(const LayerParameter &layer_param,
117  nvinfer1::ITensor *const *inputs,
118  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
119  TensorModifyMap *tensor_modify_map);
120  void addSliceLayer(const LayerParameter &layer_param,
121  nvinfer1::ITensor *const *inputs, int nbInputs,
122  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
123  TensorModifyMap *tensor_modify_map);
124 
125  void addInnerproductLayer(const LayerParameter &layer_param,
126  nvinfer1::ITensor *const *inputs,
127  WeightMap *weight_map,
128  nvinfer1::INetworkDefinition *net,
129  TensorMap *tensor_map,
130  TensorModifyMap *tensor_modify_map);
131 
132  void addScaleLayer(const LayerParameter &layer_param,
133  nvinfer1::ITensor *const *inputs, WeightMap *weight_map,
134  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
135  TensorModifyMap *tensor_modify_map);
136 
137  void addBatchnormLayer(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 addSoftmaxLayer(const LayerParameter &layer_param,
145  nvinfer1::ITensor *const *inputs, int nbInputs,
146  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
147  TensorModifyMap *tensor_modify_map);
148 
149  void addEltwiseLayer(const LayerParameter &layer_param,
150  nvinfer1::ITensor *const *inputs,
151  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
152  TensorModifyMap *tensor_modify_map);
153 
154  void addArgmaxLayer(const LayerParameter &layer_param,
155  nvinfer1::ITensor *const *inputs, int nbInputs,
156  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
157  TensorModifyMap *tensor_modify_map);
158 
159  void addPermuteLayer(const LayerParameter &layer_param,
160  nvinfer1::ITensor *const *inputs, int nbInputs,
161  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
162  TensorModifyMap *tensor_modify_map);
163 
164  void addReshapeLayer(const LayerParameter &layer_param,
165  nvinfer1::ITensor *const *inputs,
166  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
167  TensorModifyMap *tensor_modify_map);
168 
169  void addPaddingLayer(const LayerParameter &layer_param,
170  nvinfer1::ITensor *const *inputs,
171  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
172  TensorModifyMap *tensor_modify_map);
173 
174  void addDFMBPSROIAlignLayer(const LayerParameter &layer_param,
175  nvinfer1::ITensor *const *inputs, int nbInputs,
176  nvinfer1::INetworkDefinition *net,
177  TensorMap *tensor_map,
178  TensorModifyMap *tensor_modify_map);
179 
180  void addRCNNProposalLayer(const LayerParameter &layer_param,
181  nvinfer1::ITensor *const *inputs, int nbInputs,
182  nvinfer1::INetworkDefinition *net,
183  TensorMap *tensor_map,
184  TensorModifyMap *tensor_modify_map);
185 
186  void addRPNProposalSSDLayer(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  bool checkInt8(const std::string &gpu_name,
193  nvinfer1::IInt8Calibrator *calibrator);
194  void mergeBN(int index, LayerParameter *layer_param);
195  nvinfer1::Weights loadLayerWeights(const float *data, int size);
196  nvinfer1::Weights loadLayerWeights(float data, int size);
197 
198  bool loadWeights(const std::string &model_file, WeightMap *weight_map);
199  void init_blob(std::vector<std::string> *names);
200 
201  private:
202  nvinfer1::IExecutionContext *context_ = nullptr;
203  cudaStream_t stream_ = 0;
204  std::vector<std::shared_ptr<ArgMax1Plugin>> argmax_plugins_;
205  std::vector<std::shared_ptr<DFMBPSROIAlignPlugin>> dfmb_psroi_align_plugins_;
206  std::vector<std::shared_ptr<RCNNProposalPlugin>> rcnn_proposal_plugins_;
207  std::vector<std::shared_ptr<RPNProposalSSDPlugin>> rpn_proposal_ssd_plugins_;
208  std::vector<std::shared_ptr<SoftmaxPlugin>> softmax_plugins_;
209  std::vector<std::shared_ptr<SLICEPlugin>> slice_plugins_;
210  std::vector<std::shared_ptr<ReLUPlugin>> relu_plugins_;
211  std::vector<std::string> output_names_;
212  std::vector<std::string> input_names_;
213  std::map<std::string, std::string> tensor_modify_map_;
214 
215  std::shared_ptr<NetParameter> net_param_;
216  WeightMap weight_map_;
217  std::vector<void *> buffers_;
218  int workspaceSize_ = 1;
219  nvinfer1::Int8EntropyCalibrator *calibrator_ = nullptr;
220  bool is_own_calibrator_ = true;
221  std::string model_root_;
222  nvinfer1::IBuilder *builder_ = nullptr;
223  nvinfer1::INetworkDefinition *network_ = nullptr;
224  std::vector<std::shared_ptr<float>> weights_mem_;
225  BlobMap blobs_;
226 };
227 
228 } // namespace inference
229 } // namespace perception
230 } // namespace apollo
void addReshapeLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
std::shared_ptr< apollo::perception::base::Blob< float > > get_blob(const std::string &name) override
void addArgmaxLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
bool loadWeights(const std::string &model_file, WeightMap *weight_map)
void addRPNProposalSSDLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
void init_blob(std::vector< std::string > *names)
std::map< std::string, nvinfer1::DimsCHW > TensorDimsMap
Definition: rt_common.h:38
RTNet(const std::string &net_file, const std::string &model_file, const std::vector< std::string > &outputs, const std::vector< std::string > &inputs)
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)
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
void addScaleLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, WeightMap *weight_map, 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 addDeconvLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, WeightMap *weight_map, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
nvinfer1::Weights loadLayerWeights(const float *data, int size)
void addBatchnormLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, WeightMap *weight_map, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
std::map< std::string, std::shared_ptr< apollo::perception::base::Blob< float > > > BlobMap
Definition: inference.h:34
std::map< std::string, std::vector< nvinfer1::Weights > > WeightMap
Definition: rt_common.h:36
void addConvLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, WeightMap *weight_map, 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 addConcatLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
std::map< std::string, nvinfer1::ITensor * > TensorMap
Definition: rt_common.h:37
bool Init(const std::map< std::string, std::vector< int >> &shapes) override
const std::map< std::string, nvinfer1::ActivationType > active_map
Definition: rt_net.h:51
bool shape(const std::string &name, std::vector< int > *res)
void parse_with_api(const std::map< std::string, std::vector< int >> &shapes)
bool addInput(const TensorDimsMap &tensor_dims_map, const std::map< std::string, std::vector< int >> &shapes, TensorMap *tensor_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 addPoolingLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
void mergeBN(int index, LayerParameter *layer_param)
void addDFMBPSROIAlignLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, int nbInputs, nvinfer1::INetworkDefinition *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
void ConstructMap(const LayerParameter &layer_param, nvinfer1::ILayer *layer, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
const std::map< EltwiseParameter::EltwiseOp, nvinfer1::ElementWiseOperation > eltwise_map
Definition: rt_net.h:46
Definition: entropy_calibrator.h:29
void addPermuteLayer(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)
const std::vector< std::string > _gpu_checklist
Definition: rt_net.h:55
void addEltwiseLayer(const LayerParameter &layer_param, nvinfer1::ITensor *const *inputs, 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)
std::map< std::string, std::string > TensorModifyMap
Definition: rt_net.h:43
void addActiveLayer(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)