Apollo 11.0
自动驾驶开放平台
apollo::perception::inference::MINet类 参考

#include <mi_net.h>

类 apollo::perception::inference::MINet 继承关系图:
apollo::perception::inference::MINet 的协作图:

Public 成员函数

 MINet (const std::string &net_file, const std::string &model_file, const std::vector< std::string > &outputs, const std::vector< std::string > &inputs)
 
 MINet (const std::string &net_file, const std::string &model_file, const std::vector< std::string > &outputs, const std::vector< std::string > &inputs, const std::string &model_root)
 
virtual ~MINet ()
 
bool Init (const std::map< std::string, std::vector< int > > &shapes) override
 
void Infer () override
 
std::shared_ptr< apollo::perception::base::Blob< float > > get_blob (const std::string &name) override
 
- Public 成员函数 继承自 apollo::perception::inference::Inference
 Inference ()=default
 
virtual ~Inference ()=default
 
virtual void SetStream (cudaStream_t stream)
 
void set_max_batch_size (const int &batch_size)
 
void set_gpu_id (const int &gpu_id)
 
void set_model_info (const std::string &proto_file, const std::vector< std::string > &net_input_names, const std::vector< std::string > &net_output_names)
 

Protected 成员函数

bool addInput (TensorDimsMap *tensor_dims_map, const std::map< std::string, std::vector< int > > &shapes, TensorMap *tensor_map)
 
void ConstructMap (const LayerParameter &layer_param, std::vector< Tensor > outputs, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void parse_with_api (const std::map< std::string, std::vector< int > > &shapes)
 
void addLayer (const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addConvLayer (const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addDeconvLayer (const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addActiveLayer (const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addConcatLayer (const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addPoolingLayer (const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addSliceLayer (const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addInnerproductLayer (const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addScaleLayer (const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addBatchnormLayer (const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addSoftmaxLayer (const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addEltwiseLayer (const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addArgmaxLayer (const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addPermuteLayer (const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addReshapeLayer (const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addPaddingLayer (const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addSilenceLayer (const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addDFMBPSROIAlignLayer (const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addRCNNProposalLayer (const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
void addRPNProposalSSDLayer (const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
 
bool checkInt8 (const std::string &gpu_name)
 
void mergeBN (int index, LayerParameter *layer_param)
 
Weights loadLayerWeights (const float *data, size_t size)
 
Weights loadLayerWeights (float data, size_t size)
 
bool loadWeights (const std::string &model_file, WeightMap *weight_map)
 
void init_blob (std::map< std::string, Tensor > *tensors)
 

额外继承的成员函数

- Protected 属性 继承自 apollo::perception::inference::Inference
int max_batch_size_ = 1
 
int gpu_id_ = 0
 
std::string proto_file_ = ""
 
std::vector< std::string > net_output_names_
 
std::vector< std::string > net_input_names_
 

详细描述

在文件 mi_net.h 第 79 行定义.

构造及析构函数说明

◆ MINet() [1/2]

apollo::perception::inference::MINet::MINet ( const std::string &  net_file,
const std::string &  model_file,
const std::vector< std::string > &  outputs,
const std::vector< std::string > &  inputs 
)

在文件 mi_net.cc 第 900 行定义.

903 : output_names_(outputs), input_names_(inputs) {
904 loadWeights(model_file, &weight_map_);
905 net_param_.reset(new NetParameter);
906 loadNetParams(net_file, net_param_.get());
907}
bool loadWeights(const std::string &model_file, WeightMap *weight_map)
Definition mi_net.cc:822
bool loadNetParams(const std::string &param_file, NetParameter *param)
Definition mi_utils.cc:60

◆ MINet() [2/2]

apollo::perception::inference::MINet::MINet ( const std::string &  net_file,
const std::string &  model_file,
const std::vector< std::string > &  outputs,
const std::vector< std::string > &  inputs,
const std::string &  model_root 
)

在文件 mi_net.cc 第 909 行定义.

913 : output_names_(outputs), input_names_(inputs), model_root_(model_root) {
914 loadWeights(model_file, &weight_map_);
915 net_param_.reset(new NetParameter);
916 loadNetParams(net_file, net_param_.get());
917}

◆ ~MINet()

apollo::perception::inference::MINet::~MINet ( )
virtual

在文件 mi_net.cc 第 1037 行定义.

1037 {
1038 if (gpu_id_ >= 0) {
1039 for (auto buf : buffers_) {
1040 cudaFree(buf.second);
1041 }
1042 }
1043}

成员函数说明

◆ addActiveLayer()

void apollo::perception::inference::MINet::addActiveLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
int  nbInputs,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 211 行定义.

214 {
215 const auto input = inputs[0];
216
217 if (layer_param.type() == "ReLU" &&
218 layer_param.relu_param().negative_slope() > 0.0f) {
219 const Operation leaky_relu = migraphx::make_op(
220 "leaky_relu", {{"alpha", layer_param.relu_param().negative_slope()}});
221 const Tensor out = net->add_instruction(leaky_relu, input);
222
223 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
224 } else {
225 // caffe default activation type is sigmoid
226 std::string activation_type = "sigmoid";
227
228 auto pair = active_map.find(layer_param.type());
229 if (pair != active_map.end()) {
230 activation_type = pair->second;
231 }
232
233 const Operation activation = migraphx::make_op(activation_type);
234 const Tensor out = net->add_instruction(activation, input);
235
236 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
237 }
238}
void ConstructMap(const LayerParameter &layer_param, std::vector< Tensor > outputs, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:72
const std::map< std::string, std::string > active_map
Definition mi_net.h:68
migraphx::operation Operation
Definition mi_net.h:62
migraphx::instruction_ref Tensor
Definition mi_net.h:60

◆ addArgmaxLayer()

void apollo::perception::inference::MINet::addArgmaxLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
int  nbInputs,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 516 行定义.

519 {
520 const auto params = layer_param.argmax_param();
521 const size_t axis = params.axis();
522
523 // TODO(B1tway): Caffe also defines out_max_val and top_k argmax parameters,
524 // but they are not supported yet
525 ACHECK(!(params.has_out_max_val() || params.has_top_k()));
526
527 const Tensor input = inputs[0];
528 const Shape input_shape = input->get_shape();
529
530 CHECK_GT(input_shape.lens().size(), axis);
531
532 const Operation argmax = migraphx::make_op("argmax", {{"axis", axis}});
533 const Tensor out = net->add_instruction(argmax, input);
534
535 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
536}
#define ACHECK(cond)
Definition log.h:80
migraphx::shape Shape
Definition mi_net.h:61

◆ addBatchnormLayer()

void apollo::perception::inference::MINet::addBatchnormLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
WeightMap *  weight_map,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 442 行定义.

445 {
446 const auto input = inputs[0];
447 const auto input_shape = input->get_shape();
448 const Shape params_shape{input_shape.type(), {input_shape.lens()[1]}};
449
450 const auto weights = (*weight_map)[layer_param.name().c_str()];
451
452 CHECK_EQ(weights[0].bytes(), params_shape.bytes());
453 CHECK_EQ(weights[1].bytes(), params_shape.bytes());
454
455 const Tensor shift =
456 net->add_literal(migraphx::literal(params_shape, weights[0].data()));
457 const Tensor scale =
458 net->add_literal(migraphx::literal(params_shape, weights[1].data()));
459
460 const Operation broadcast = migraphx::make_op(
461 "broadcast", {{"axis", 1}, {"out_lens", input_shape.lens()}});
462
463 const Tensor scale_broadcast = net->add_instruction(broadcast, scale);
464 const Tensor mul_out =
465 net->add_instruction(migraphx::make_op("mul"), input, scale_broadcast);
466
467 const Tensor shift_broadcast = net->add_instruction(broadcast, shift);
468 const Tensor out =
469 net->add_instruction(migraphx::make_op("add"), mul_out, shift_broadcast);
470
471 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
472}

◆ addConcatLayer()

void apollo::perception::inference::MINet::addConcatLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
int  nbInputs,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 240 行定义.

243 {
244 const ConcatParameter params = layer_param.concat_param();
245 // default caffe concat axis is 1
246 const size_t axis = params.has_axis() ? params.axis() : 1;
247
248 CHECK_EQ(nbInputs, layer_param.bottom_size());
249
250 Tensor out = inputs[0];
251
252 for (int i = 1; i < nbInputs; ++i) {
253 const Tensor input_first = out;
254 const Tensor input_second = inputs[i];
255 const Shape first_shape = input_first->get_shape();
256 const Shape second_shape = input_second->get_shape();
257
258 CHECK_EQ(first_shape.lens().size(), second_shape.lens().size());
259 for (size_t j = 0; j < first_shape.lens().size(); ++j) {
260 if (j == axis) continue;
261 CHECK_EQ(first_shape.lens()[j], second_shape.lens()[j]);
262 }
263
264 const Operation concat = migraphx::make_op("concat", {{"axis", axis}});
265 out = net->add_instruction(concat, input_first, input_second);
266 }
267
268 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
269}

◆ addConvLayer()

void apollo::perception::inference::MINet::addConvLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
WeightMap *  weight_map,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 110 行定义.

113 {
114 const ConvolutionParameter conv_param = layer_param.convolution_param();
115 ConvParam param;
116
117 ACHECK(ParserConvParam(conv_param, &param));
118
119 const auto input = inputs[0];
120 const auto data_shape = input->get_shape();
121
122 const size_t K = conv_param.num_output();
123 const size_t C = data_shape.lens()[1] / param.group;
124 const size_t R = param.kernel_h;
125 const size_t S = param.kernel_w;
126
127 const auto weights = (*weight_map)[layer_param.name().c_str()];
128 const Shape filter_shape{Shape::float_type, {K, C, R, S}};
129
130 CHECK_EQ(weights[0].bytes(), filter_shape.bytes());
131
132 const Tensor filter =
133 net->add_literal(migraphx::literal(filter_shape, weights[0].data()));
134
135 const Operation conv = migraphx::make_op(
136 "convolution", {{"padding", {param.padding_h, param.padding_w}},
137 {"stride", {param.stride_h, param.stride_w}},
138 {"dilation", {param.dilation, param.dilation}},
139 {"group", param.group}});
140 Tensor out = net->add_instruction(conv, input, filter);
141
142 if (weights.size() > 1) {
143 const Shape out_shape = out->get_shape();
144 const Shape bias_shape{Shape::float_type, {out_shape.lens()[1]}};
145
146 CHECK_EQ(weights[1].bytes(), bias_shape.bytes());
147
148 const Operation broadcast = migraphx::make_op(
149 "broadcast", {{"axis", 1}, {"out_lens", out_shape.lens()}});
150 const Tensor bias =
151 net->add_literal(migraphx::literal(bias_shape, weights[1].data()));
152 const Tensor broadcasted_bias = net->add_instruction(broadcast, bias);
153
154 out = net->add_instruction(migraphx::make_op("add"), out, broadcasted_bias);
155 }
156
157 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
158}
bool ParserConvParam(const ConvolutionParameter &conv, ConvParam *param)
Definition mi_common.cc:51

◆ addDeconvLayer()

void apollo::perception::inference::MINet::addDeconvLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
WeightMap *  weight_map,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 160 行定义.

163 {
164 const ConvolutionParameter conv = layer_param.convolution_param();
165 ConvParam param;
166
167 ACHECK(ParserConvParam(conv, &param));
168
169 const auto input = inputs[0];
170 const auto data_shape = input->get_shape();
171
172 const size_t K = data_shape.lens()[1] / param.group;
173 const size_t C = conv.num_output();
174 const size_t R = param.kernel_h;
175 const size_t S = param.kernel_w;
176
177 const auto weights = (*weight_map)[layer_param.name().c_str()];
178
179 const Shape filter_shape{Shape::float_type, {K, C, R, S}};
180 CHECK_EQ(weights[0].bytes(), filter_shape.bytes());
181
182 const Tensor filter =
183 net->add_literal(migraphx::literal(filter_shape, weights[0].data()));
184
185 const Operation deconv = migraphx::make_op(
186 "deconvolution", {{"padding", {param.padding_h, param.padding_w}},
187 {"stride", {param.stride_h, param.stride_w}},
188 {"dilation", {param.dilation, param.dilation}},
189 {"group", param.group}});
190
191 Tensor out = net->add_instruction(deconv, input, filter);
192
193 if (weights.size() > 1) {
194 const Shape out_shape = out->get_shape();
195 const Shape bias_shape{Shape::float_type, {out_shape.lens()[1]}};
196
197 CHECK_EQ(weights[1].bytes(), bias_shape.bytes());
198
199 const Operation broadcast = migraphx::make_op(
200 "broadcast", {{"axis", 1}, {"out_lens", out_shape.lens()}});
201 const Tensor bias =
202 net->add_literal(migraphx::literal(bias_shape, weights[1].data()));
203 const Tensor broadcasted_bias = net->add_instruction(broadcast, bias);
204
205 out = net->add_instruction(migraphx::make_op("add"), out, broadcasted_bias);
206 }
207
208 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
209}

◆ addDFMBPSROIAlignLayer()

void apollo::perception::inference::MINet::addDFMBPSROIAlignLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
int  nbInputs,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 622 行定义.

625 {
626 std::shared_ptr<DFMBPSROIAlignPlugin> plugin;
627 std::vector<Dims> input_dims;
628
629 CHECK_GE(nbInputs, 2);
630 CHECK_LE(nbInputs, 3);
631 CHECK_EQ(max_batch_size_, 1);
632
633 for (int i = 0; i < nbInputs; ++i) {
634 auto input_lens = inputs[i]->get_shape().lens();
635 input_dims.push_back(GetDims(input_lens));
636 }
637
638 plugin.reset(new DFMBPSROIAlignPlugin(layer_param.dfmb_psroi_pooling_param(),
639 input_dims.data(), nbInputs));
640 dfmb_psroi_align_plugins_.push_back(plugin);
641
642 // output dims without batchsize
643 Dims out_dims = plugin->getOutputDimensions(0, nullptr, 0);
644 Shape out_shape{Shape::float_type,
645 {std::size_t(out_dims.d[0]), std::size_t(out_dims.d[1]),
646 std::size_t(out_dims.d[2]), std::size_t(out_dims.d[3])}};
647
648 const Tensor allocated_out = net->add_instruction(migraphx::make_op(
649 "hip::allocate", {{"shape", migraphx::to_value(out_shape)}}));
650
651 Tensor out;
652 bool no_trans = nbInputs < 3;
653
654 if (no_trans) {
655 out =
656 net->add_instruction(dfmb_psroi_align_op{size_t(max_batch_size_),
657 [plugin]() { return plugin; }},
658 inputs[0], inputs[1], allocated_out);
659 } else {
660 out =
661 net->add_instruction(dfmb_psroi_align_op{size_t(max_batch_size_),
662 [plugin]() { return plugin; }},
663 inputs[0], inputs[1], inputs[2], allocated_out);
664 }
665
666 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
667}
Definition plugin.h:24
int32_t d[MAX_DIMS]
Definition plugin.h:28
Dims GetDims(std::vector< size_t > lens, bool remove_batch=true)
Definition mi_net.cc:58

◆ addEltwiseLayer()

void apollo::perception::inference::MINet::addEltwiseLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 498 行定义.

501 {
502 // default caffe elemwise operation type is SUM
503 std::string eltwise_op = "add";
504
505 const auto pair = eltwise_map.find(layer_param.eltwise_param().operation());
506 if (pair != eltwise_map.end()) {
507 eltwise_op = pair->second;
508 }
509
510 const Operation eltwise = migraphx::make_op(eltwise_op);
511 const Tensor out = net->add_instruction(eltwise, inputs[0], inputs[1]);
512
513 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
514}
const std::map< EltwiseParameter::EltwiseOp, std::string > eltwise_map
Definition mi_net.h:74

◆ addInnerproductLayer()

void apollo::perception::inference::MINet::addInnerproductLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
WeightMap *  weight_map,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 346 行定义.

349 {
350 InnerProductParameter params = layer_param.inner_product_param();
351 const size_t num_outputs = params.num_output();
352
353 const auto input = inputs[0];
354 const auto input_shape = input->get_shape();
355 const auto input_lens = input_shape.lens();
356
357 // Add FullyConnected layer as convolution
358 const size_t K = num_outputs;
359 const size_t C = input_lens[1];
360 const size_t R = input_lens[2];
361 const size_t S = input_lens[3];
362
363 const Operation conv = migraphx::make_op("convolution", {{"padding", {0, 0}},
364 {"stride", {1, 1}},
365 {"dilation", {1, 1}},
366 {"group", 1}});
367
368 const auto weights = (*weight_map)[layer_param.name().c_str()];
369 const Shape filter_shape{Shape::float_type, {K, C, R, S}};
370
371 CHECK_EQ(weights[0].bytes(), filter_shape.bytes());
372
373 const Tensor filter =
374 net->add_literal(migraphx::literal(filter_shape, weights[0].data()));
375
376 Tensor out = net->add_instruction(conv, input, filter);
377
378 if (weights.size() > 1) {
379 const Shape out_shape = out->get_shape();
380 const Shape bias_shape{Shape::float_type, {out_shape.lens()[1]}};
381
382 CHECK_EQ(weights[1].bytes(), bias_shape.bytes());
383
384 const Operation broadcast = migraphx::make_op(
385 "broadcast", {{"axis", 1}, {"out_lens", out_shape.lens()}});
386 const Tensor bias =
387 net->add_literal(migraphx::literal(bias_shape, weights[1].data()));
388 const Tensor broadcasted_bias = net->add_instruction(broadcast, bias);
389
390 out = net->add_instruction(migraphx::make_op("add"), out, broadcasted_bias);
391 }
392
393 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
394}

◆ addInput()

bool apollo::perception::inference::MINet::addInput ( TensorDimsMap *  tensor_dims_map,
const std::map< std::string, std::vector< int > > &  shapes,
TensorMap *  tensor_map 
)
protected

在文件 mi_net.cc 第 984 行定义.

986 {
987 CHECK_GT(net_param_->layer_size(), 0);
988
989 for (auto &dims_pair : *tensor_dims_map) {
990 if (shapes.find(dims_pair.first) != shapes.end()) {
991 auto shape = shapes.at(dims_pair.first);
992 if (shape.size() == dims_pair.second.size()) {
993 max_batch_size_ = std::max(max_batch_size_, shape[0]);
994 for (size_t i = 0; i < dims_pair.second.size(); ++i) {
995 dims_pair.second[i] = shape[i];
996 }
997 }
998 }
999 const Shape shape{Shape::float_type, dims_pair.second};
1000 const std::string name = dims_pair.first;
1001 const Tensor input = network_->add_parameter(name, shape);
1002
1003 tensor_map->insert(std::make_pair(name, input));
1004
1005 input_param_map_[name] = name;
1006 inputs_[name] = input;
1007 }
1008
1009 return true;
1010}

◆ addLayer()

void apollo::perception::inference::MINet::addLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
int  nbInputs,
WeightMap *  weight_map,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 753 行定义.

756 {
757 DEBUG_LOG(layer_param.type());
758
759 if (layer_param.type() == "Convolution") {
760 addConvLayer(layer_param, inputs, weight_map, net, tensor_map,
761 tensor_modify_map);
762 } else if (layer_param.type() == "Deconvolution") {
763 addDeconvLayer(layer_param, inputs, weight_map, net, tensor_map,
764 tensor_modify_map);
765 } else if (layer_param.type() == "Sigmoid" || layer_param.type() == "TanH" ||
766 layer_param.type() == "ReLU") {
767 addActiveLayer(layer_param, inputs, nbInputs, net, tensor_map,
768 tensor_modify_map);
769 } else if (layer_param.type() == "Concat") {
770 addConcatLayer(layer_param, inputs, nbInputs, net, tensor_map,
771 tensor_modify_map);
772 } else if (layer_param.type() == "Slice") {
773 addSliceLayer(layer_param, inputs, nbInputs, net, tensor_map,
774 tensor_modify_map);
775 } else if (layer_param.type() == "Reshape") {
776 addReshapeLayer(layer_param, inputs, net, tensor_map, tensor_modify_map);
777 } else if (layer_param.type() == "Padding") {
778 addPaddingLayer(layer_param, inputs, net, tensor_map, tensor_modify_map);
779 } else if (layer_param.type() == "Pooling") {
780 addPoolingLayer(layer_param, inputs, net, tensor_map, tensor_modify_map);
781 } else if (layer_param.type() == "Permute") {
782 addPermuteLayer(layer_param, inputs, nbInputs, net, tensor_map,
783 tensor_modify_map);
784 } else if (layer_param.type() == "InnerProduct") {
785 addInnerproductLayer(layer_param, inputs, weight_map, net, tensor_map,
786 tensor_modify_map);
787 } else if (layer_param.type() == "BatchNorm") {
788 addBatchnormLayer(layer_param, inputs, weight_map, net, tensor_map,
789 tensor_modify_map);
790 } else if (layer_param.type() == "Scale") {
791 addScaleLayer(layer_param, inputs, weight_map, net, tensor_map,
792 tensor_modify_map);
793 } else if (layer_param.type() == "Softmax") {
794 addSoftmaxLayer(layer_param, inputs, nbInputs, net, tensor_map,
795 tensor_modify_map);
796 } else if (layer_param.type() == "Eltwise") {
797 addEltwiseLayer(layer_param, inputs, net, tensor_map, tensor_modify_map);
798 } else if (layer_param.type() == "ArgMax") {
799 addArgmaxLayer(layer_param, inputs, nbInputs, net, tensor_map,
800 tensor_modify_map);
801 } else if (layer_param.type() == "Dropout") {
802 AINFO << "skip dropout";
803 } else if (layer_param.type() == "Power") {
804 addScaleLayer(layer_param, inputs, weight_map, net, tensor_map,
805 tensor_modify_map);
806 } else if (layer_param.type() == "Silence") {
807 addSilenceLayer(layer_param, inputs, net, tensor_map, tensor_modify_map);
808 } else if (layer_param.type() == "DFMBPSROIAlign") {
809 addDFMBPSROIAlignLayer(layer_param, inputs, nbInputs, net, tensor_map,
810 tensor_modify_map);
811 } else if (layer_param.type() == "RCNNProposal") {
812 addRCNNProposalLayer(layer_param, inputs, nbInputs, net, tensor_map,
813 tensor_modify_map);
814 } else if (layer_param.type() == "RPNProposalSSD") {
815 addRPNProposalSSDLayer(layer_param, inputs, nbInputs, net, tensor_map,
816 tensor_modify_map);
817 } else {
818 AWARN << "unknown layer type:" << layer_param.type();
819 }
820}
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 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
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
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
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 addPoolingLayer(const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:271
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
#define AINFO
Definition log.h:42
#define AWARN
Definition log.h:43
#define DEBUG_LOG(...)
Definition mi_net.cc:35

◆ addPaddingLayer()

void apollo::perception::inference::MINet::addPaddingLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 601 行定义.

604 {
605 AWARN << "migraphx dont support Padding layer yet";
606}

◆ addPermuteLayer()

void apollo::perception::inference::MINet::addPermuteLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
int  nbInputs,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 538 行定义.

541 {
542 const auto params = layer_param.permute_param();
543 const auto input = inputs[0];
544 const auto input_shape = input->get_shape();
545
546 CHECK_EQ(static_cast<size_t>(params.order_size()), input_shape.lens().size());
547
548 std::vector<uint32_t> order;
549 for (int i = 0; i < params.order_size(); ++i) {
550 const auto dim = params.order(i);
551 CHECK_LT(dim, input_shape.lens().size());
552
553 order.push_back(dim);
554 }
555
556 const Operation transpose =
557 migraphx::make_op("transpose", {{"permutation", order}});
558 const Tensor transposed_out = net->add_instruction(transpose, inputs[0]);
559
560 // keep standard NCHW layout
561 const Tensor out =
562 net->add_instruction(migraphx::make_op("contiguous"), transposed_out);
563
564 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
565}

◆ addPoolingLayer()

void apollo::perception::inference::MINet::addPoolingLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 271 行定义.

274 {
275 PoolingParameter params = layer_param.pooling_param();
276
277 // dont support STOCHASTIC pooling mode yet
278 CHECK_NE(params.pool(), PoolingParameter_PoolMethod_STOCHASTIC);
279
280 // caffe default pooling mode is MAX
281 const std::string pool_mode =
282 (params.pool() == PoolingParameter_PoolMethod_AVE) ? "average" : "max";
283
284 ACHECK(modify_pool_param(&params));
285
286 const Operation pooling = migraphx::make_op(
287 "pooling", {{"mode", pool_mode},
288 {"padding", {params.pad_h(), params.pad_w()}},
289 {"stride", {params.stride_h(), params.stride_w()}},
290 {"lengths", {params.kernel_h(), params.kernel_w()}}});
291 const Tensor out = net->add_instruction(pooling, inputs[0]);
292
293 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
294}
bool modify_pool_param(PoolingParameter *pool_param)
Definition mi_common.cc:101

◆ addRCNNProposalLayer()

void apollo::perception::inference::MINet::addRCNNProposalLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
int  nbInputs,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 669 行定义.

672 {
673 std::shared_ptr<RCNNProposalPlugin> plugin;
674 std::vector<Dims> input_dims;
675
676 CHECK_EQ(nbInputs, 4);
677
678 for (int i = 0; i < nbInputs; ++i) {
679 auto input_lens = inputs[i]->get_shape().lens();
680 input_dims.push_back(GetDims(input_lens, i == 2 || i == 3));
681 }
682
683 plugin.reset(new RCNNProposalPlugin(layer_param.bbox_reg_param(),
684 layer_param.detection_output_ssd_param(),
685 input_dims.data()));
686 rcnn_proposal_plugins_.push_back(plugin);
687
688 // output dims without batchsize
689 Dims out_dims = plugin->getOutputDimensions(0, nullptr, 0);
690 Shape out_shape{Shape::float_type,
691 {std::size_t(max_batch_size_), std::size_t(out_dims.d[0]),
692 std::size_t(out_dims.d[1]), std::size_t(out_dims.d[2])}};
693
694 const Tensor allocated_out = net->add_instruction(migraphx::make_op(
695 "hip::allocate", {{"shape", migraphx::to_value(out_shape)}}));
696
697 const Tensor out = net->add_instruction(
698 rcnn_proposal_op{size_t(max_batch_size_), [plugin]() { return plugin; }},
699 inputs[0], inputs[1], inputs[2], inputs[3], allocated_out);
700
701 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
702}

◆ addReshapeLayer()

void apollo::perception::inference::MINet::addReshapeLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 567 行定义.

570 {
571 const auto params = layer_param.reshape_param();
572 const auto input_shape = inputs[0]->get_shape();
573 const auto input_lens = input_shape.lens();
574
575 // For compatibility with tensorrt inference
576 // skip batch size as it shouldn't be reshaped
577 std::vector<int64_t> new_shape{int64_t(input_lens[0])};
578
579 for (int i = 1; i < params.shape().dim_size(); ++i) {
580 auto dim_param = params.shape().dim(i);
581
582 // For compatibility with tensorrt inference reffer to:
583 // void IShuffleLayer::setReshapeDimensions()
584 // Ref: https://docs.nvidia.com/deeplearning/tensorrt/api/c_api
585
586 int64_t new_dim = -1;
587 if (dim_param == 0)
588 new_dim = input_lens[i];
589 else if (dim_param > 0)
590 new_dim = dim_param;
591
592 new_shape.push_back(new_dim);
593 }
594
595 const Operation reshape = migraphx::make_op("reshape", {{"dims", new_shape}});
596 const Tensor out = net->add_instruction(reshape, inputs[0]);
597
598 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
599}

◆ addRPNProposalSSDLayer()

void apollo::perception::inference::MINet::addRPNProposalSSDLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
int  nbInputs,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 704 行定义.

707 {
708 std::shared_ptr<RPNProposalSSDPlugin> plugin;
709 std::vector<Dims> input_dims;
710
711 CHECK_EQ(nbInputs, 3);
712
713 for (int i = 0; i < nbInputs; ++i) {
714 auto input_lens = inputs[i]->get_shape().lens();
715 Dims dims;
716
717 // remove batch size for compatibility with Dims
718 if (i == 0 || i == 1 || i == 2) {
719 input_lens.erase(input_lens.begin());
720 }
721
722 for (size_t j = 0; j < input_lens.size(); ++j) {
723 dims.d[j] = input_lens[j];
724 }
725
726 dims.nbDims = input_lens.size();
727 input_dims.push_back(dims);
728 }
729
730 plugin.reset(new RPNProposalSSDPlugin(
731 layer_param.bbox_reg_param(), layer_param.detection_output_ssd_param(),
732 input_dims.data()));
733 rpn_proposal_ssd_plugins_.push_back(plugin);
734
735 // output dims without batchsize
736 Dims out_dims = plugin->getOutputDimensions(0, nullptr, 0);
737 Shape out_shape{
738 Shape::float_type,
739 {std::size_t(max_batch_size_ * out_dims.d[0]), std::size_t(out_dims.d[1]),
740 std::size_t(out_dims.d[2]), std::size_t(out_dims.d[3])}};
741
742 const Tensor allocated_out = net->add_instruction(migraphx::make_op(
743 "hip::allocate", {{"shape", migraphx::to_value(out_shape)}}));
744
745 const Tensor out =
746 net->add_instruction(rpn_proposal_ssd_op{size_t(max_batch_size_),
747 [plugin]() { return plugin; }},
748 inputs[0], inputs[1], inputs[2], allocated_out);
749
750 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
751}
int32_t nbDims
Definition plugin.h:27

◆ addScaleLayer()

void apollo::perception::inference::MINet::addScaleLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
WeightMap *  weight_map,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 396 行定义.

399 {
400 const auto input = inputs[0];
401 const auto input_shape = input->get_shape();
402 const auto C = input_shape.lens()[1];
403
404 std::vector<Weights> weights;
405
406 if (layer_param.type() == "Power") {
407 const auto power_param = layer_param.power_param();
408
409 weights.push_back(loadLayerWeights(power_param.scale(), C));
410 weights.push_back(loadLayerWeights(power_param.shift(), C));
411 weights.push_back(loadLayerWeights(power_param.power(), C));
412 } else {
413 const auto lw = (*weight_map)[layer_param.name().c_str()];
414
415 for (size_t i = 0; i < lw.size(); ++i) {
416 weights.push_back(lw[i]);
417 }
418 }
419
420 static const std::vector<std::string> scale_ops = {"mul", "add", "pow"};
421 CHECK_LE(weights.size(), scale_ops.size());
422
423 Tensor out = input;
424 const Shape param_shape{Shape::float_type, {C}};
425
426 for (size_t i = 0; i < weights.size(); ++i) {
427 CHECK_EQ(weights[i].bytes(), param_shape.bytes());
428
429 const Operation broadcast = migraphx::make_op(
430 "broadcast", {{"axis", 1}, {"out_lens", input_shape.lens()}});
431 const Tensor param =
432 net->add_literal(migraphx::literal(param_shape, weights[i].data()));
433 const Tensor broadcasted_param = net->add_instruction(broadcast, param);
434
435 out = net->add_instruction(migraphx::make_op(scale_ops[i]), out,
436 broadcasted_param);
437 }
438
439 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
440}
Weights loadLayerWeights(const float *data, size_t size)
Definition mi_net.cc:876

◆ addSilenceLayer()

void apollo::perception::inference::MINet::addSilenceLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 608 行定义.

611 {
612 // default caffe elemwise operation type is SUM
613 std::string eltwise_op = "add";
614
615 for (int i = 0; i < layer_param.bottom_size(); ++i) {
616 const auto name = layer_param.bottom(i);
617 const Tensor tensor = tensor_map->at(tensor_modify_map_[name]);
618 net->remove_instruction(tensor);
619 }
620}

◆ addSliceLayer()

void apollo::perception::inference::MINet::addSliceLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
int  nbInputs,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 296 行定义.

299 {
300 const SliceParameter param = layer_param.slice_param();
301 // default caffe concat axis is 1
302 const size_t axis = param.has_axis() ? param.axis() : 1;
303
304 const auto input = inputs[0];
305 const auto input_shape = input->get_shape();
306
307 CHECK_GT(param.slice_point_size(), 0);
308 CHECK_GT(input_shape.lens().size(), axis);
309
310 std::vector<Operation> ops;
311
312 for (int i = 0; i < param.slice_point_size(); ++i) {
313 const size_t slice_point = param.slice_point(i);
314
315 if (i == 0) {
316 ops.push_back(migraphx::make_op(
317 "slice",
318 {{"axes", {axis}}, {"starts", {0}}, {"ends", {slice_point}}}));
319 } else {
320 const size_t slice_point_prev = param.slice_point(i - 1);
321 ops.push_back(migraphx::make_op("slice", {{"axes", {axis}},
322 {"starts", {slice_point_prev}},
323 {"ends", {slice_point}}}));
324 }
325 }
326
327 const size_t last_slice_point =
328 param.slice_point(param.slice_point_size() - 1);
329 const size_t axis_size = input_shape.lens()[axis];
330
331 ops.push_back(migraphx::make_op("slice", {{"axes", {axis}},
332 {"starts", {last_slice_point}},
333 {"ends", {axis_size}}}));
334
335 std::vector<Tensor> outputs;
336 for (auto &op : ops) {
337 Tensor out = net->add_instruction(op, input);
338 // keep standard NCHW layout
339 out = net->add_instruction(migraphx::make_op("contiguous"), out);
340 outputs.push_back(out);
341 }
342
343 ConstructMap(layer_param, outputs, tensor_map, tensor_modify_map);
344}

◆ addSoftmaxLayer()

void apollo::perception::inference::MINet::addSoftmaxLayer ( const LayerParameter &  layer_param,
Tensor const *  inputs,
int  nbInputs,
migraphx::module *  net,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 474 行定义.

477 {
478 const SoftmaxParameter params = layer_param.softmax_param();
479 // default caffe softmax axis is 1
480 size_t axis = params.has_axis() ? params.axis() : 1;
481 // Workaround for baidu_iter_14000 model:
482 // Batch dimension is omitted in the DFMBPSROIAlign output; due to specifics
483 // of tensor definition in TensorRT it works correctly, but with MIGraphX,
484 // the tensor dimension needs to be reduced.
485 if (dfmb_psroi_align_plugins_.size() != 0) --axis;
486
487 const auto input = inputs[0];
488 const auto input_shape = input->get_shape();
489
490 CHECK_GT(input_shape.lens().size(), axis);
491
492 const Operation softmax = migraphx::make_op("softmax", {{"axis", axis}});
493 const Tensor out = net->add_instruction(softmax, input);
494
495 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
496}

◆ checkInt8()

bool apollo::perception::inference::MINet::checkInt8 ( const std::string &  gpu_name)
protected

在文件 mi_net.cc 第 979 行定义.

979 {
980 AWARN << "MIGraphX Inference Not Supports Int8 Mode. Use FP32 Mode.";
981 return false;
982}

◆ ConstructMap()

void apollo::perception::inference::MINet::ConstructMap ( const LayerParameter &  layer_param,
std::vector< Tensor >  outputs,
TensorMap *  tensor_map,
TensorModifyMap *  tensor_modify_map 
)
protected

在文件 mi_net.cc 第 72 行定义.

74 {
75 CHECK_EQ(outputs.size(), static_cast<size_t>(layer_param.top_size()));
76
77 for (int i = 0; i < layer_param.top_size(); ++i) {
78 std::string top_name = layer_param.top(i);
79 TensorModifyMap::iterator it;
80 it = tensor_modify_map->find(top_name);
81 if (it != tensor_modify_map->end()) {
82 std::string modify_name = top_name + "_" + layer_param.name();
83 top_name = modify_name;
84 it->second = top_name;
85 } else {
86 tensor_modify_map->insert(
87 std::pair<std::string, std::string>(top_name, top_name));
88 }
89
90 const Tensor layer_out = outputs[i];
91
92 if (std::find(output_names_.begin(), output_names_.end(), top_name) !=
93 output_names_.end()) {
94 const auto out_param_name =
95 "main:#output_" + std::to_string(outputs_.size());
96 const Tensor out_param =
97 network_->add_parameter(out_param_name, layer_out->get_shape());
98 const Tensor out = network_->add_instruction(
99 migraphx::make_op("hip::copy"), layer_out, out_param);
100
101 output_param_map_[top_name] = out_param_name;
102 outputs_[top_name] = out;
103 }
104
105 DEBUG_LOG(top_name << ", " << layer_out->get_shape());
106 tensor_map->insert(std::pair<std::string, Tensor>(top_name, layer_out));
107 }
108}

◆ get_blob()

std::shared_ptr< apollo::perception::base::Blob< float > > apollo::perception::inference::MINet::get_blob ( const std::string &  name)
overridevirtual

实现了 apollo::perception::inference::Inference.

在文件 mi_net.cc 第 1080 行定义.

1081 {
1082 auto iter = blobs_.find(name);
1083 if (iter == blobs_.end()) {
1084 return nullptr;
1085 }
1086 return iter->second;
1087}

◆ Infer()

void apollo::perception::inference::MINet::Infer ( )
overridevirtual

实现了 apollo::perception::inference::Inference.

在文件 mi_net.cc 第 1045 行定义.

1045 {
1046 migraphx::gpu::set_device(gpu_id_);
1047 migraphx::gpu::gpu_sync();
1048
1049 for (auto pair : input_param_map_) {
1050 const auto name = pair.first;
1051 const auto param_name = pair.second;
1052 const auto tensor = inputs_[name];
1053 auto blob = get_blob(name);
1054 if (blob != nullptr) {
1055 auto input_ptr = blob->mutable_gpu_data();
1056 auto input_shape = tensor->get_shape();
1057 parameter_map_[param_name] = migraphx::argument(input_shape, input_ptr);
1058 }
1059 }
1060
1061 for (auto pair : output_param_map_) {
1062 const auto name = pair.first;
1063 const auto param_name = pair.second;
1064 const auto tensor = outputs_[name];
1065 auto blob = get_blob(name);
1066 if (blob != nullptr) {
1067 auto out_ptr = blob->mutable_gpu_data();
1068 auto out_shape = tensor->get_shape();
1069 parameter_map_[param_name] = migraphx::argument(out_shape, out_ptr);
1070 }
1071 }
1072
1073 // Ensure input and output buffers are ready for inference
1074 migraphx::gpu::gpu_sync();
1075
1076 auto output = program_.eval(parameter_map_);
1077 CHECK_EQ(output.size(), outputs_.size());
1078}
std::shared_ptr< apollo::perception::base::Blob< float > > get_blob(const std::string &name) override
Definition mi_net.cc:1080

◆ Init()

bool apollo::perception::inference::MINet::Init ( const std::map< std::string, std::vector< int > > &  shapes)
overridevirtual

实现了 apollo::perception::inference::Inference.

在文件 mi_net.cc 第 937 行定义.

937 {
938 // TODO(B1tway): add cpu support
939 if (gpu_id_ < 0) {
940 AINFO << "must use gpu mode";
941 return false;
942 }
943
944 auto target = migraphx::target(migraphx::gpu::target{});
945 network_ = program_.get_main_module();
946
947 cudaDeviceProp prop;
948 cudaGetDeviceProperties(&prop, gpu_id_);
949 checkInt8(prop.name);
950
951 parse_with_api(shapes);
952
953 program_.compile(target);
954
955#if PRINT_DEBUG
956 {
957 const auto output_shapes = program_.get_output_shapes();
958 CHECK_EQ(outputs_.size(), output_shapes.size());
959
960 std::stringstream ss;
961 const auto shapes = program_.get_parameter_shapes();
962 ss << "Parameter shapes: ";
963 for (auto &p : shapes) {
964 ss << p.first << " " << p.second << ", ";
965 }
966 ss << "\nOutput shapes: ";
967 for (auto &o : output_shapes) {
968 ss << o << ", ";
969 }
970 DEBUG_LOG(ss.str());
971 }
972#endif
973
974 init_blob(&inputs_);
975 init_blob(&outputs_);
976 return true;
977}
bool checkInt8(const std::string &gpu_name)
Definition mi_net.cc:979
void init_blob(std::map< std::string, Tensor > *tensors)
Definition mi_net.cc:919
void parse_with_api(const std::map< std::string, std::vector< int > > &shapes)
Definition mi_net.cc:1012

◆ init_blob()

void apollo::perception::inference::MINet::init_blob ( std::map< std::string, Tensor > *  tensors)
protected

在文件 mi_net.cc 第 919 行定义.

919 {
920 for (const auto &p : *tensor_map) {
921 auto name = p.first;
922 auto shape = p.second->get_shape();
923
924 cudaMalloc(&buffers_[name], shape.bytes());
925
926 std::vector<size_t> dims_sizes = shape.lens();
927 std::vector<int> dims(dims_sizes.begin(), dims_sizes.end());
928
929 std::shared_ptr<apollo::perception::base::Blob<float>> blob;
930
931 blob.reset(new apollo::perception::base::Blob<float>(dims));
932 blob->set_gpu_data(reinterpret_cast<float *>(buffers_[name]));
933 blobs_.insert(std::make_pair(name, blob));
934 }
935}
A wrapper around SyncedMemory holders serving as the basic computational unit for images,...
Definition blob.h:88

◆ loadLayerWeights() [1/2]

Weights apollo::perception::inference::MINet::loadLayerWeights ( const float *  data,
size_t  size 
)
protected

在文件 mi_net.cc 第 876 行定义.

876 {
877 std::shared_ptr<float> val;
878 val.reset(new float[size]);
879
880 for (size_t k = 0; k < size; ++k) {
881 val.get()[k] = data[k];
882 }
883
884 Weights wt{size, val};
885 return wt;
886}

◆ loadLayerWeights() [2/2]

Weights apollo::perception::inference::MINet::loadLayerWeights ( float  data,
size_t  size 
)
protected

在文件 mi_net.cc 第 888 行定义.

888 {
889 std::shared_ptr<float> val;
890 val.reset(new float[size]);
891
892 for (size_t k = 0; k < size; ++k) {
893 val.get()[k] = data;
894 }
895
896 Weights wt{size, val};
897 return wt;
898}

◆ loadWeights()

bool apollo::perception::inference::MINet::loadWeights ( const std::string &  model_file,
WeightMap *  weight_map 
)
protected

在文件 mi_net.cc 第 822 行定义.

822 {
823 NetParameter net;
824 if (!ReadProtoFromBinaryFile(model_file.c_str(), &net)) {
825 AFATAL << "open file " << model_file << " failed";
826 return false;
827 }
828 for (int i = 0; i < net.layer_size(); ++i) {
829 std::vector<Weights> lw;
830 for (int j = 0; j < net.layer(i).blobs_size(); ++j) {
831 // val memory will be released when deconstructor is called
832 auto blob = &(net.layer(i).blobs(j));
833 CHECK_EQ(blob->double_data_size(), 0);
834 CHECK_EQ(blob->double_diff_size(), 0);
835 CHECK_EQ(blob->diff_size(), 0);
836 CHECK_NE(blob->data_size(), 0);
837 if (net.layer(i).type() == "BatchNorm") {
838 mergeBN(j, net.mutable_layer(i));
839 }
840
841 auto wt = loadLayerWeights(blob->data().data(), blob->data_size());
842 lw.push_back(wt);
843 }
844 (*weight_map)[net.layer(i).name().c_str()] = lw;
845 }
846 return true;
847}
void mergeBN(int index, LayerParameter *layer_param)
Definition mi_net.cc:849
#define AFATAL
Definition log.h:45
bool ReadProtoFromBinaryFile(const std::string &filename, google::protobuf::Message *proto)
Definition mi_utils.cc:44

◆ mergeBN()

void apollo::perception::inference::MINet::mergeBN ( int  index,
LayerParameter *  layer_param 
)
protected

在文件 mi_net.cc 第 849 行定义.

849 {
850 auto blob = (layer_param->mutable_blobs(index));
851 CHECK_EQ(blob->double_data_size(), 0);
852 CHECK_EQ(blob->double_diff_size(), 0);
853 CHECK_EQ(blob->diff_size(), 0);
854 CHECK_NE(blob->data_size(), 0);
855 int size = blob->data_size();
856
857 auto scale = (layer_param->blobs(2));
858 const float scale_factor = scale.data(0) == 0 ? 0 : 1 / scale.data(0);
859 auto epsilon = layer_param->batch_norm_param().eps();
860 if (index == 0) {
861 const BlobProto *var = (layer_param->mutable_blobs(index + 1));
862 for (int k = 0; k < size; ++k) {
863 auto data = blob->data(k);
864 blob->set_data(
865 k, static_cast<float>(-data * scale_factor /
866 sqrt(var->data(k) * scale_factor + epsilon)));
867 }
868 } else if (index == 1) {
869 for (int k = 0; k < size; ++k) {
870 blob->set_data(k, 1.0f / static_cast<float>(sqrt(
871 blob->data(k) * scale_factor + epsilon)));
872 }
873 }
874}

◆ parse_with_api()

void apollo::perception::inference::MINet::parse_with_api ( const std::map< std::string, std::vector< int > > &  shapes)
protected

在文件 mi_net.cc 第 1012 行定义.

1013 {
1014 CHECK_GT(net_param_->layer_size(), 0);
1015 std::vector<LayerParameter> order;
1016 TensorMap tensor_map;
1017 TensorDimsMap tensor_dims_map;
1018 ParseNetParam(*net_param_, &tensor_dims_map, &tensor_modify_map_, &order);
1019 addInput(&tensor_dims_map, shapes, &tensor_map);
1020
1021 for (auto layer_param : order) {
1022 std::vector<Tensor> inputs;
1023 for (int j = 0; j < layer_param.bottom_size(); ++j) {
1024 inputs.push_back(tensor_map[tensor_modify_map_[layer_param.bottom(j)]]);
1025 }
1026 addLayer(layer_param, inputs.data(), layer_param.bottom_size(),
1027 &weight_map_, network_, &tensor_map, &tensor_modify_map_);
1028 }
1029
1030 std::vector<Tensor> outputs;
1031 std::transform(outputs_.begin(), outputs_.end(), std::back_inserter(outputs),
1032 [](auto &p) { return p.second; });
1033
1034 network_->add_return(outputs);
1035}
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
std::map< std::string, Tensor > TensorMap
Definition mi_net.h:64
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, TensorDims > TensorDimsMap
Definition mi_common.h:33

该类的文档由以下文件生成: