29 #include "utils/Utils.h"
36 class GraphYOLOv3Example :
public Example
39 GraphYOLOv3Example() : cmd_parser(), common_opts(cmd_parser), common_params(), graph(0,
"YOLOv3")
43 bool do_setup(
int argc,
char **argv)
override
46 cmd_parser.parse(argc, argv);
47 cmd_parser.validate();
53 if (common_params.help)
55 cmd_parser.print_help(argv[0]);
61 "QASYMM8 not supported for this graph");
64 std::cout << common_params << std::endl;
67 std::string data_path = common_params.data_path;
70 std::unique_ptr<IPreprocessor> preprocessor = std::make_unique<TFPreproccessor>(0.f);
73 const TensorShape tensor_shape =
81 graph << common_params.target << common_params.fast_math_hint
83 std::pair<SubStream, SubStream> intermediate_layers = darknet53(data_path, weights_layout);
88 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
94 get_weights_accessor(data_path,
"/cnn_data/yolov3_model/batch_normalization_53_beta.npy"), 0.000001f)
96 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
101 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 1, 1))
107 get_weights_accessor(data_path,
"/cnn_data/yolov3_model/batch_normalization_54_beta.npy"), 0.000001f)
109 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
114 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
120 get_weights_accessor(data_path,
"/cnn_data/yolov3_model/batch_normalization_55_beta.npy"), 0.000001f)
122 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
127 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 1, 1))
133 get_weights_accessor(data_path,
"/cnn_data/yolov3_model/batch_normalization_56_beta.npy"), 0.000001f)
135 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
140 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
146 get_weights_accessor(data_path,
"/cnn_data/yolov3_model/batch_normalization_57_beta.npy"), 0.000001f)
148 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
155 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 1, 1))
161 get_weights_accessor(data_path,
"/cnn_data/yolov3_model/batch_normalization_58_beta.npy"), 0.000001f)
163 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
169 PadStrideInfo(1, 1, 0, 0))
171 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LINEAR, 1.f))
173 <<
YOLOLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LOGISTIC, 0.1f)).
set_name(
"Yolo1")
178 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
187 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
192 <<
ConcatLayer(std::move(route_1), std::move(intermediate_layers.second)).
set_name(
"Route1")
196 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
202 get_weights_accessor(data_path,
"/cnn_data/yolov3_model/batch_normalization_60_beta.npy"), 0.000001f)
204 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
209 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 1, 1))
215 get_weights_accessor(data_path,
"/cnn_data/yolov3_model/batch_normalization_61_beta.npy"), 0.000001f)
217 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
222 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
228 get_weights_accessor(data_path,
"/cnn_data/yolov3_model/batch_normalization_62_beta.npy"), 0.000001f)
230 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
235 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 1, 1))
241 get_weights_accessor(data_path,
"/cnn_data/yolov3_model/batch_normalization_63_beta.npy"), 0.000001f)
243 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
248 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
254 get_weights_accessor(data_path,
"/cnn_data/yolov3_model/batch_normalization_64_beta.npy"), 0.000001f)
256 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
263 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 1, 1))
269 get_weights_accessor(data_path,
"/cnn_data/yolov3_model/batch_normalization_65_beta.npy"), 0.000001f)
271 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
277 PadStrideInfo(1, 1, 0, 0))
279 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LINEAR, 1.f))
281 <<
YOLOLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LOGISTIC, 0.1f)).
set_name(
"Yolo2")
286 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
295 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
300 <<
ConcatLayer(std::move(route_2), std::move(intermediate_layers.first)).
set_name(
"Route2")
304 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
310 get_weights_accessor(data_path,
"/cnn_data/yolov3_model/batch_normalization_67_beta.npy"), 0.000001f)
312 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
317 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 1, 1))
323 get_weights_accessor(data_path,
"/cnn_data/yolov3_model/batch_normalization_68_beta.npy"), 0.000001f)
325 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
330 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
336 get_weights_accessor(data_path,
"/cnn_data/yolov3_model/batch_normalization_69_beta.npy"), 0.000001f)
338 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
343 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 1, 1))
349 get_weights_accessor(data_path,
"/cnn_data/yolov3_model/batch_normalization_70_beta.npy"), 0.000001f)
351 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
356 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
362 get_weights_accessor(data_path,
"/cnn_data/yolov3_model/batch_normalization_71_beta.npy"), 0.000001f)
364 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
369 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 1, 1))
375 get_weights_accessor(data_path,
"/cnn_data/yolov3_model/batch_normalization_72_beta.npy"), 0.000001f)
377 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
383 PadStrideInfo(1, 1, 0, 0))
385 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LINEAR, 1.f))
387 <<
YOLOLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LOGISTIC, 0.1f)).
set_name(
"Yolo3")
393 config.
use_tuner = common_params.enable_tuner;
396 config.
mlgo_file = common_params.mlgo_file;
398 graph.finalize(common_params.target, config);
402 void do_run()
override
414 std::pair<SubStream, SubStream> darknet53(
const std::string &data_path,
DataLayout weights_layout)
419 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 1, 1))
428 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
433 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(2, 2, 1, 1))
442 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
444 darknet53_block(data_path,
"3", weights_layout, 32U);
448 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(2, 2, 1, 1))
457 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
459 darknet53_block(data_path,
"6", weights_layout, 64U);
460 darknet53_block(data_path,
"8", weights_layout, 64U);
464 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(2, 2, 1, 1))
473 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
475 darknet53_block(data_path,
"11", weights_layout, 128U);
476 darknet53_block(data_path,
"13", weights_layout, 128U);
477 darknet53_block(data_path,
"15", weights_layout, 128U);
478 darknet53_block(data_path,
"17", weights_layout, 128U);
479 darknet53_block(data_path,
"19", weights_layout, 128U);
480 darknet53_block(data_path,
"21", weights_layout, 128U);
481 darknet53_block(data_path,
"23", weights_layout, 128U);
482 darknet53_block(data_path,
"25", weights_layout, 128U);
487 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(2, 2, 1, 1))
496 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
498 darknet53_block(data_path,
"28", weights_layout, 256U);
499 darknet53_block(data_path,
"30", weights_layout, 256U);
500 darknet53_block(data_path,
"32", weights_layout, 256U);
501 darknet53_block(data_path,
"34", weights_layout, 256U);
502 darknet53_block(data_path,
"36", weights_layout, 256U);
503 darknet53_block(data_path,
"38", weights_layout, 256U);
504 darknet53_block(data_path,
"40", weights_layout, 256U);
505 darknet53_block(data_path,
"42", weights_layout, 256U);
510 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(2, 2, 1, 1))
519 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
521 darknet53_block(data_path,
"45", weights_layout, 512U);
522 darknet53_block(data_path,
"47", weights_layout, 512U);
523 darknet53_block(data_path,
"49", weights_layout, 512U);
524 darknet53_block(data_path,
"51", weights_layout, 512U);
526 return std::pair<SubStream, SubStream>(layer_36, layer_61);
529 void darknet53_block(
const std::string &data_path,
530 std::string &¶m_path,
532 unsigned int filter_size)
534 std::string total_path =
"/cnn_data/yolov3_model/";
535 std::string param_path2 =
541 get_weights_accessor(data_path, total_path +
"conv2d_" + param_path +
"_w.npy", weights_layout),
542 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
543 .
set_name(
"conv2d_" + param_path +
"/Conv2D")
545 get_weights_accessor(data_path, total_path +
"batch_normalization_" + param_path +
"_mean.npy"),
547 get_weights_accessor(data_path, total_path +
"batch_normalization_" + param_path +
"_gamma.npy"),
548 get_weights_accessor(data_path, total_path +
"batch_normalization_" + param_path +
"_beta.npy"),
550 .
set_name(
"conv2d_" + param_path +
"/BatchNorm")
551 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
552 .
set_name(
"conv2d_" + param_path +
"/LeakyRelu")
554 3U, 3U, filter_size * 2,
555 get_weights_accessor(data_path, total_path +
"conv2d_" + param_path2 +
"_w.npy", weights_layout),
556 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 1, 1))
557 .
set_name(
"conv2d_" + param_path2 +
"/Conv2D")
559 get_weights_accessor(data_path, total_path +
"batch_normalization_" + param_path2 +
"_mean.npy"),
560 get_weights_accessor(data_path, total_path +
"batch_normalization_" + param_path2 +
"_var.npy"),
561 get_weights_accessor(data_path, total_path +
"batch_normalization_" + param_path2 +
"_gamma.npy"),
562 get_weights_accessor(data_path, total_path +
"batch_normalization_" + param_path2 +
"_beta.npy"),
564 .
set_name(
"conv2d_" + param_path2 +
"/BatchNorm")
565 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU, 0.1f))
566 .
set_name(
"conv2d_" + param_path2 +
"/LeakyRelu");
568 graph <<
EltwiseLayer(std::move(i_a), std::move(i_b), EltwiseOperation::Add)
570 .
set_name(
"add_" + param_path +
"_" + param_path2);
588 int main(
int argc,
char **argv)
590 return arm_compute::utils::run_example<GraphYOLOv3Example>(argc, argv);