Apollo  v5.5.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 
26 #include "modules/perception/proto/rt.pb.h"
27 
28 namespace apollo {
29 namespace perception {
30 namespace inference {
31 class ArgMax1Plugin;
32 class ReLUPlugin;
33 class SLICEPlugin;
34 class SoftmaxPlugin;
35 
36 typedef std::map<std::string, std::vector<nvinfer1::Weights>> WeightMap;
37 typedef std::map<std::string, nvinfer1::ITensor *> TensorMap;
38 typedef std::map<std::string, nvinfer1::DimsCHW> TensorDimsMap;
39 typedef std::map<std::string, std::string> TensorModifyMap;
40 
41 const std::map<EltwiseParameter::EltwiseOp, nvinfer1::ElementWiseOperation>
43  {EltwiseParameter_EltwiseOp_PROD,
44  nvinfer1::ElementWiseOperation::kPROD},
45  {EltwiseParameter_EltwiseOp_SUM, nvinfer1::ElementWiseOperation::kSUM},
46  {EltwiseParameter_EltwiseOp_MAX, nvinfer1::ElementWiseOperation::kMAX}};
47 const std::map<std::string, nvinfer1::ActivationType> active_map{
48  {"Sigmoid", nvinfer1::ActivationType::kSIGMOID},
49  {"TanH", nvinfer1::ActivationType::kTANH},
50  {"ReLU", nvinfer1::ActivationType::kRELU}};
51 const std::vector<std::string> _gpu_checklist{
52  "GeForce GTX 1080", "GeForce GTX 1080 Ti", "Tesla P4",
53  "Tesla P40", "GeForce GTX 1070", "GeForce GTX 1060",
54  "Tesla V100-SXM2-16GB"};
55 
56 class RTNet : public Inference {
57  public:
58  RTNet(const std::string &net_file, const std::string &model_file,
59  const std::vector<std::string> &outputs,
60  const std::vector<std::string> &inputs);
61  RTNet(const std::string &net_file, const std::string &model_file,
62  const std::vector<std::string> &outputs,
63  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, const std::string &model_root);
68 
69  virtual ~RTNet();
70 
71  bool Init(const std::map<std::string, std::vector<int>> &shapes) override;
72 
73  void Infer() override;
74 
75  std::shared_ptr<apollo::perception::base::Blob<float>> get_blob(
76  const std::string &name) override;
77 
78  protected:
79  bool addInput(const TensorDimsMap &tensor_dims_map,
80  const std::map<std::string, std::vector<int>> &shapes,
81  TensorMap *tensor_map);
82  bool shape(const std::string &name, std::vector<int> *res);
83 
84  void ConstructMap(const LayerParameter &layer_param, nvinfer1::ILayer *layer,
85  TensorMap *tensor_map, TensorModifyMap *tensor_modify_map);
86  void parse_with_api(const std::map<std::string, std::vector<int>> &shapes);
87  void addLayer(const LayerParameter &layer_param,
88  nvinfer1::ITensor *const *inputs, int nbInputs,
89  WeightMap *weight_map, nvinfer1::INetworkDefinition *net,
90  TensorMap *tensor_map, TensorModifyMap *tensor_modify_map);
91 
92  void addConvLayer(const LayerParameter &layer_param,
93  nvinfer1::ITensor *const *inputs, WeightMap *weight_map,
94  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
95  TensorModifyMap *tensor_modify_map);
96 
97  void addDeconvLayer(const LayerParameter &layer_param,
98  nvinfer1::ITensor *const *inputs, WeightMap *weight_map,
99  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
100  TensorModifyMap *tensor_modify_map);
101 
102  void addActiveLayer(const LayerParameter &layer_param,
103  nvinfer1::ITensor *const *inputs, int nbInputs,
104  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
105  TensorModifyMap *tensor_modify_map);
106 
107  void addConcatLayer(const LayerParameter &layer_param,
108  nvinfer1::ITensor *const *inputs, int nbInputs,
109  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
110  TensorModifyMap *tensor_modify_map);
111 
112  void addPoolingLayer(const LayerParameter &layer_param,
113  nvinfer1::ITensor *const *inputs,
114  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
115  TensorModifyMap *tensor_modify_map);
116  void addSliceLayer(const LayerParameter &layer_param,
117  nvinfer1::ITensor *const *inputs, int nbInputs,
118  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
119  TensorModifyMap *tensor_modify_map);
120 
121  void addInnerproductLayer(const LayerParameter &layer_param,
122  nvinfer1::ITensor *const *inputs,
123  WeightMap *weight_map,
124  nvinfer1::INetworkDefinition *net,
125  TensorMap *tensor_map,
126  TensorModifyMap *tensor_modify_map);
127 
128  void addScaleLayer(const LayerParameter &layer_param,
129  nvinfer1::ITensor *const *inputs, WeightMap *weight_map,
130  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
131  TensorModifyMap *tensor_modify_map);
132 
133  void addBatchnormLayer(const LayerParameter &layer_param,
134  nvinfer1::ITensor *const *inputs,
135  WeightMap *weight_map,
136  nvinfer1::INetworkDefinition *net,
137  TensorMap *tensor_map,
138  TensorModifyMap *tensor_modify_map);
139 
140  void addSoftmaxLayer(const LayerParameter &layer_param,
141  nvinfer1::ITensor *const *inputs, int nbInputs,
142  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
143  TensorModifyMap *tensor_modify_map);
144 
145  void addEltwiseLayer(const LayerParameter &layer_param,
146  nvinfer1::ITensor *const *inputs,
147  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
148  TensorModifyMap *tensor_modify_map);
149 
150  void addArgmaxLayer(const LayerParameter &layer_param,
151  nvinfer1::ITensor *const *inputs, int nbInputs,
152  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
153  TensorModifyMap *tensor_modify_map);
154 
155  void addPermuteLayer(const LayerParameter &layer_param,
156  nvinfer1::ITensor *const *inputs, int nbInputs,
157  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
158  TensorModifyMap *tensor_modify_map);
159 
160  void addReshapeLayer(const LayerParameter &layer_param,
161  nvinfer1::ITensor *const *inputs,
162  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
163  TensorModifyMap *tensor_modify_map);
164 
165  void addPaddingLayer(const LayerParameter &layer_param,
166  nvinfer1::ITensor *const *inputs,
167  nvinfer1::INetworkDefinition *net, TensorMap *tensor_map,
168  TensorModifyMap *tensor_modify_map);
169  bool checkInt8(const std::string &gpu_name,
170  nvinfer1::IInt8Calibrator *calibrator);
171  void mergeBN(int index, LayerParameter *layer_param);
172  nvinfer1::Weights loadLayerWeights(const float *data, int size);
173  nvinfer1::Weights loadLayerWeights(float data, int size);
174 
175  bool loadWeights(const std::string &model_file, WeightMap *weight_map);
176  void init_blob(std::vector<std::string> *names);
177 
178  private:
179  nvinfer1::IExecutionContext *context_ = nullptr;
180  cudaStream_t stream_ = 0;
181  std::vector<std::shared_ptr<ArgMax1Plugin>> argmax_plugins_;
182  std::vector<std::shared_ptr<SoftmaxPlugin>> softmax_plugins_;
183  std::vector<std::shared_ptr<SLICEPlugin>> slice_plugins_;
184  std::vector<std::shared_ptr<ReLUPlugin>> relu_plugins_;
185  std::vector<std::string> output_names_;
186  std::vector<std::string> input_names_;
187  std::map<std::string, std::string> tensor_modify_map_;
188 
189  std::shared_ptr<NetParameter> net_param_;
190  WeightMap weight_map_;
191  std::vector<void *> buffers_;
192  int workspaceSize_ = 1;
193  nvinfer1::Int8EntropyCalibrator *calibrator_ = nullptr;
194  bool is_own_calibrator_ = true;
195  std::string model_root_;
196  nvinfer1::IBuilder *builder_ = nullptr;
197  nvinfer1::INetworkDefinition *network_ = nullptr;
198  std::vector<std::shared_ptr<float>> weights_mem_;
199  BlobMap blobs_;
200 };
201 
202 } // namespace inference
203 } // namespace perception
204 } // 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 init_blob(std::vector< std::string > *names)
std::map< std::string, nvinfer1::DimsCHW > TensorDimsMap
Definition: rt_common.h:37
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)
Definition: blob.h:72
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:35
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:36
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:47
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 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:42
Definition: entropy_calibrator.h:58
void addPermuteLayer(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:51
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:39
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)