Apollo 11.0
自动驾驶开放平台
mi_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 <map>
20#include <memory>
21#include <string>
22#include <vector>
23
24#include <migraphx/argument.hpp>
25#include <migraphx/gpu/context.hpp>
26#include <migraphx/gpu/hip.hpp>
27#include <migraphx/gpu/target.hpp>
28#include <migraphx/instruction.hpp>
29#include <migraphx/make_op.hpp>
30#include <migraphx/program.hpp>
31#include <migraphx/ref/target.hpp>
32#include <migraphx/target.hpp>
33
34#include "modules/perception/common/proto/rt.pb.h"
35
39
40namespace apollo {
41namespace perception {
42namespace inference {
43class DFMBPSROIAlignPlugin;
44class RCNNProposalPlugin;
45class RPNProposalSSDPlugin;
46
47struct Weights {
48 private:
49 size_t size_;
50 std::shared_ptr<float> value_ptr_;
51
52 public:
53 Weights(size_t size, std::shared_ptr<float> value_ptr)
54 : size_(size), value_ptr_(value_ptr) {}
55
56 char *data() const { return reinterpret_cast<char *>(value_ptr_.get()); }
57 size_t bytes() const { return size_ * sizeof(float); }
58};
59
60typedef migraphx::instruction_ref Tensor;
61typedef migraphx::shape Shape;
62typedef migraphx::operation Operation;
63typedef std::map<std::string, std::vector<Weights>> WeightMap;
64typedef std::map<std::string, Tensor> TensorMap;
65typedef std::map<std::string, std::vector<int>> TensorDimsMap;
66typedef std::map<std::string, std::string> TensorModifyMap;
67
68const std::map<std::string, std::string> active_map{
69 {"Sigmoid", "sigmoid"},
70 {"TanH", "tanh"},
71 {"ReLU", "relu"},
72 {"LeakyReLU", "leaky_relu"}};
73
74const std::map<EltwiseParameter::EltwiseOp, std::string> eltwise_map{
75 {EltwiseParameter_EltwiseOp_PROD, "mul"},
76 {EltwiseParameter_EltwiseOp_SUM, "add"},
77 {EltwiseParameter_EltwiseOp_MAX, "max"}};
78
79class MINet : public Inference {
80 public:
81 MINet(const std::string &net_file, const std::string &model_file,
82 const std::vector<std::string> &outputs,
83 const std::vector<std::string> &inputs);
84 MINet(const std::string &net_file, const std::string &model_file,
85 const std::vector<std::string> &outputs,
86 const std::vector<std::string> &inputs, const std::string &model_root);
87
88 virtual ~MINet();
89
90 bool Init(const std::map<std::string, std::vector<int>> &shapes) override;
91
92 void Infer() override;
93
94 std::shared_ptr<apollo::perception::base::Blob<float>> get_blob(
95 const std::string &name) override;
96
97 protected:
98 bool addInput(TensorDimsMap *tensor_dims_map,
99 const std::map<std::string, std::vector<int>> &shapes,
100 TensorMap *tensor_map);
101
102 void ConstructMap(const LayerParameter &layer_param,
103 std::vector<Tensor> outputs, TensorMap *tensor_map,
104 TensorModifyMap *tensor_modify_map);
105
106 void parse_with_api(const std::map<std::string, std::vector<int>> &shapes);
107
108 void addLayer(const LayerParameter &layer_param, Tensor const *inputs,
109 int nbInputs, WeightMap *weight_map, migraphx::module *net,
110 TensorMap *tensor_map, TensorModifyMap *tensor_modify_map);
111
112 void addConvLayer(const LayerParameter &layer_param, Tensor const *inputs,
113 WeightMap *weight_map, migraphx::module *net,
114 TensorMap *tensor_map, TensorModifyMap *tensor_modify_map);
115
116 void addDeconvLayer(const LayerParameter &layer_param, Tensor const *inputs,
117 WeightMap *weight_map, migraphx::module *net,
118 TensorMap *tensor_map,
119 TensorModifyMap *tensor_modify_map);
120
121 void addActiveLayer(const LayerParameter &layer_param, Tensor const *inputs,
122 int nbInputs, migraphx::module *net,
123 TensorMap *tensor_map,
124 TensorModifyMap *tensor_modify_map);
125
126 void addConcatLayer(const LayerParameter &layer_param, Tensor const *inputs,
127 int nbInputs, migraphx::module *net,
128 TensorMap *tensor_map,
129 TensorModifyMap *tensor_modify_map);
130
131 void addPoolingLayer(const LayerParameter &layer_param, Tensor const *inputs,
132 migraphx::module *net, TensorMap *tensor_map,
133 TensorModifyMap *tensor_modify_map);
134
135 void addSliceLayer(const LayerParameter &layer_param, Tensor const *inputs,
136 int nbInputs, migraphx::module *net, TensorMap *tensor_map,
137 TensorModifyMap *tensor_modify_map);
138
139 void addInnerproductLayer(const LayerParameter &layer_param,
140 Tensor const *inputs, WeightMap *weight_map,
141 migraphx::module *net, TensorMap *tensor_map,
142 TensorModifyMap *tensor_modify_map);
143
144 void addScaleLayer(const LayerParameter &layer_param, Tensor const *inputs,
145 WeightMap *weight_map, migraphx::module *net,
146 TensorMap *tensor_map, TensorModifyMap *tensor_modify_map);
147
148 void addBatchnormLayer(const LayerParameter &layer_param,
149 Tensor const *inputs, WeightMap *weight_map,
150 migraphx::module *net, TensorMap *tensor_map,
151 TensorModifyMap *tensor_modify_map);
152
153 void addSoftmaxLayer(const LayerParameter &layer_param, Tensor const *inputs,
154 int nbInputs, migraphx::module *net,
155 TensorMap *tensor_map,
156 TensorModifyMap *tensor_modify_map);
157
158 void addEltwiseLayer(const LayerParameter &layer_param, Tensor const *inputs,
159 migraphx::module *net, TensorMap *tensor_map,
160 TensorModifyMap *tensor_modify_map);
161
162 void addArgmaxLayer(const LayerParameter &layer_param, Tensor const *inputs,
163 int nbInputs, migraphx::module *net,
164 TensorMap *tensor_map,
165 TensorModifyMap *tensor_modify_map);
166
167 void addPermuteLayer(const LayerParameter &layer_param, Tensor const *inputs,
168 int nbInputs, migraphx::module *net,
169 TensorMap *tensor_map,
170 TensorModifyMap *tensor_modify_map);
171
172 void addReshapeLayer(const LayerParameter &layer_param, Tensor const *inputs,
173 migraphx::module *net, TensorMap *tensor_map,
174 TensorModifyMap *tensor_modify_map);
175
176 void addPaddingLayer(const LayerParameter &layer_param, Tensor const *inputs,
177 migraphx::module *net, TensorMap *tensor_map,
178 TensorModifyMap *tensor_modify_map);
179
180 void addSilenceLayer(const LayerParameter &layer_param, Tensor const *inputs,
181 migraphx::module *net, TensorMap *tensor_map,
182 TensorModifyMap *tensor_modify_map);
183
184 void addDFMBPSROIAlignLayer(const LayerParameter &layer_param,
185 Tensor const *inputs, int nbInputs,
186 migraphx::module *net, TensorMap *tensor_map,
187 TensorModifyMap *tensor_modify_map);
188
189 void addRCNNProposalLayer(const LayerParameter &layer_param,
190 Tensor const *inputs, int nbInputs,
191 migraphx::module *net, TensorMap *tensor_map,
192 TensorModifyMap *tensor_modify_map);
193
194 void addRPNProposalSSDLayer(const LayerParameter &layer_param,
195 Tensor const *inputs, int nbInputs,
196 migraphx::module *net, TensorMap *tensor_map,
197 TensorModifyMap *tensor_modify_map);
198
199 bool checkInt8(const std::string &gpu_name);
200
201 void mergeBN(int index, LayerParameter *layer_param);
202 Weights loadLayerWeights(const float *data, size_t size);
203 Weights loadLayerWeights(float data, size_t size);
204
205 bool loadWeights(const std::string &model_file, WeightMap *weight_map);
206 void init_blob(std::map<std::string, Tensor> *tensors);
207
208 private:
209 std::vector<std::shared_ptr<DFMBPSROIAlignPlugin>> dfmb_psroi_align_plugins_;
210 std::vector<std::shared_ptr<RCNNProposalPlugin>> rcnn_proposal_plugins_;
211 std::vector<std::shared_ptr<RPNProposalSSDPlugin>> rpn_proposal_ssd_plugins_;
212
213 std::vector<std::string> output_names_;
214 std::vector<std::string> input_names_;
215 std::map<std::string, Tensor> outputs_;
216 std::map<std::string, Tensor> inputs_;
217 std::map<std::string, std::string> tensor_modify_map_;
218 std::map<std::string, std::string> input_param_map_;
219 std::map<std::string, std::string> output_param_map_;
220
221 migraphx::module *network_;
222 migraphx::program program_;
223 migraphx::parameter_map parameter_map_;
224
225 std::shared_ptr<NetParameter> net_param_;
226 WeightMap weight_map_;
227 std::map<std::string, void *> buffers_;
228 std::string model_root_;
229 BlobMap blobs_;
230};
231
232} // namespace inference
233} // namespace perception
234} // namespace apollo
bool checkInt8(const std::string &gpu_name)
Definition mi_net.cc:979
void ConstructMap(const LayerParameter &layer_param, std::vector< Tensor > outputs, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:72
void addReshapeLayer(const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:567
void addInnerproductLayer(const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:346
void addConcatLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:240
void addScaleLayer(const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:396
void addLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:753
bool addInput(TensorDimsMap *tensor_dims_map, const std::map< std::string, std::vector< int > > &shapes, TensorMap *tensor_map)
Definition mi_net.cc:984
void addConvLayer(const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:110
void addSilenceLayer(const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:608
void addDeconvLayer(const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:160
bool loadWeights(const std::string &model_file, WeightMap *weight_map)
Definition mi_net.cc:822
void addDFMBPSROIAlignLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:622
Weights loadLayerWeights(const float *data, size_t size)
Definition mi_net.cc:876
void init_blob(std::map< std::string, Tensor > *tensors)
Definition mi_net.cc:919
void addArgmaxLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:516
void addBatchnormLayer(const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:442
bool Init(const std::map< std::string, std::vector< int > > &shapes) override
Definition mi_net.cc:937
std::shared_ptr< apollo::perception::base::Blob< float > > get_blob(const std::string &name) override
Definition mi_net.cc:1080
void addEltwiseLayer(const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:498
void addSliceLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:296
void addRPNProposalSSDLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:704
void addSoftmaxLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:474
void addRCNNProposalLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:669
void addPaddingLayer(const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:601
void parse_with_api(const std::map< std::string, std::vector< int > > &shapes)
Definition mi_net.cc:1012
void addPoolingLayer(const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:271
void mergeBN(int index, LayerParameter *layer_param)
Definition mi_net.cc:849
void addActiveLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:211
void addPermuteLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:538
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
migraphx::shape Shape
Definition mi_net.h:61
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
migraphx::operation Operation
Definition mi_net.h:62
std::map< std::string, TensorDims > TensorDimsMap
Definition mi_common.h:33
migraphx::instruction_ref Tensor
Definition mi_net.h:60
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
Weights(size_t size, std::shared_ptr< float > value_ptr)
Definition mi_net.h:53