Skip to content

Commit 619462b

Browse files
committed
Merge pull request opencv#17564 from l-bat:fix_yolov4
2 parents 9755ab1 + d93b6be commit 619462b

File tree

1 file changed

+16
-32
lines changed

1 file changed

+16
-32
lines changed

modules/dnn/src/layers/region_layer.cpp

Lines changed: 16 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -412,12 +412,12 @@ class RegionLayerImpl CV_FINAL : public RegionLayer
412412
auto scale_x_y_node = std::make_shared<ngraph::op::Constant>(ngraph::element::f32, ngraph::Shape{1}, &scale_x_y);
413413
auto shift_node = std::make_shared<ngraph::op::Constant>(ngraph::element::f32, ngraph::Shape{1}, std::vector<float>{0.5});
414414

415+
auto axis = ngraph::op::Constant::create<int64_t>(ngraph::element::i64, ngraph::Shape{}, {0});
416+
auto splits = ngraph::op::Constant::create<int64_t>(ngraph::element::i64, ngraph::Shape{5}, {1, 1, 1, 1, rows - 4});
417+
auto split = std::make_shared<ngraph::op::v1::VariadicSplit>(input2d, axis, splits);
415418
std::shared_ptr<ngraph::Node> box_x;
416419
{
417-
auto lower_bounds = std::make_shared<ngraph::op::Constant>(ngraph::element::i64, ngraph::Shape{2}, std::vector<int64_t>{0, 0});
418-
auto upper_bounds = std::make_shared<ngraph::op::Constant>(ngraph::element::i64, ngraph::Shape{2}, std::vector<int64_t>{1, cols});
419-
box_x = std::make_shared<ngraph::op::v1::StridedSlice>(input2d, lower_bounds, upper_bounds, strides, std::vector<int64_t>{}, std::vector<int64_t>{});
420-
box_x = std::make_shared<ngraph::op::Sigmoid>(box_x);
420+
box_x = std::make_shared<ngraph::op::Sigmoid>(split->output(0));
421421
box_x = std::make_shared<ngraph::op::v1::Subtract>(box_x, shift_node, ngraph::op::AutoBroadcastType::NUMPY);
422422
box_x = std::make_shared<ngraph::op::v1::Multiply>(box_x, scale_x_y_node, ngraph::op::AutoBroadcastType::NUMPY);
423423
box_x = std::make_shared<ngraph::op::v1::Add>(box_x, shift_node, ngraph::op::AutoBroadcastType::NUMPY);
@@ -443,10 +443,7 @@ class RegionLayerImpl CV_FINAL : public RegionLayer
443443

444444
std::shared_ptr<ngraph::Node> box_y;
445445
{
446-
auto lower_bounds = std::make_shared<ngraph::op::Constant>(ngraph::element::i64, ngraph::Shape{2}, std::vector<int64_t>{1, 0});
447-
auto upper_bounds = std::make_shared<ngraph::op::Constant>(ngraph::element::i64, ngraph::Shape{2}, std::vector<int64_t>{2, cols});
448-
box_y = std::make_shared<ngraph::op::v1::StridedSlice>(input2d, lower_bounds, upper_bounds, strides, std::vector<int64_t>{}, std::vector<int64_t>{});
449-
box_y = std::make_shared<ngraph::op::Sigmoid>(box_y);
446+
box_y = std::make_shared<ngraph::op::Sigmoid>(split->output(1));
450447
box_y = std::make_shared<ngraph::op::v1::Subtract>(box_y, shift_node, ngraph::op::AutoBroadcastType::NUMPY);
451448
box_y = std::make_shared<ngraph::op::v1::Multiply>(box_y, scale_x_y_node, ngraph::op::AutoBroadcastType::NUMPY);
452449
box_y = std::make_shared<ngraph::op::v1::Add>(box_y, shift_node, ngraph::op::AutoBroadcastType::NUMPY);
@@ -499,45 +496,32 @@ class RegionLayerImpl CV_FINAL : public RegionLayer
499496
std::copy(bias_h.begin(), bias_h.begin() + h * anchors, bias_h.begin() + i * h * anchors);
500497
}
501498

502-
auto lower_bounds = std::make_shared<ngraph::op::Constant>(ngraph::element::i64, ngraph::Shape{2}, std::vector<int64_t>{2, 0});
503-
auto upper_bounds = std::make_shared<ngraph::op::Constant>(ngraph::element::i64, ngraph::Shape{2}, std::vector<int64_t>{3, cols});
504-
box_w = std::make_shared<ngraph::op::v1::StridedSlice>(input2d, lower_bounds, upper_bounds, strides, std::vector<int64_t>{}, std::vector<int64_t>{});
505-
box_w = std::make_shared<ngraph::op::v0::Exp>(box_w);
499+
box_w = std::make_shared<ngraph::op::v0::Exp>(split->output(2));
506500
box_w = std::make_shared<ngraph::op::v1::Reshape>(box_w, shape_3d, true);
507501
auto anchor_w_node = std::make_shared<ngraph::op::Constant>(ngraph::element::f32, box_broad_shape, bias_w.data());
508502
box_w = std::make_shared<ngraph::op::v1::Multiply>(box_w, anchor_w_node, ngraph::op::AutoBroadcastType::NUMPY);
509503

510-
lower_bounds = std::make_shared<ngraph::op::Constant>(ngraph::element::i64, ngraph::Shape{2}, std::vector<int64_t>{3, 0});
511-
upper_bounds = std::make_shared<ngraph::op::Constant>(ngraph::element::i64, ngraph::Shape{2}, std::vector<int64_t>{4, cols});
512-
box_h = std::make_shared<ngraph::op::v1::StridedSlice>(input2d, lower_bounds, upper_bounds, strides, std::vector<int64_t>{}, std::vector<int64_t>{});
513-
box_h = std::make_shared<ngraph::op::v0::Exp>(box_h);
504+
box_h = std::make_shared<ngraph::op::v0::Exp>(split->output(3));
514505
box_h = std::make_shared<ngraph::op::v1::Reshape>(box_h, shape_3d, true);
515506
auto anchor_h_node = std::make_shared<ngraph::op::Constant>(ngraph::element::f32, box_broad_shape, bias_h.data());
516507
box_h = std::make_shared<ngraph::op::v1::Multiply>(box_h, anchor_h_node, ngraph::op::AutoBroadcastType::NUMPY);
517508
}
518509

510+
auto region_splits = ngraph::op::Constant::create<int64_t>(ngraph::element::i64, ngraph::Shape{3}, {4, 1, rows - 5});
511+
auto region_split = std::make_shared<ngraph::op::v1::VariadicSplit>(region, axis, region_splits);
512+
519513
std::shared_ptr<ngraph::Node> scale;
520514
{
521-
auto lower_bounds = std::make_shared<ngraph::op::Constant>(ngraph::element::i64, ngraph::Shape{2}, std::vector<int64_t>{4, 0});
522-
auto upper_bounds = std::make_shared<ngraph::op::Constant>(ngraph::element::i64, ngraph::Shape{2}, std::vector<int64_t>{5, cols});
523-
scale = std::make_shared<ngraph::op::v1::StridedSlice>(region, lower_bounds, upper_bounds, strides, std::vector<int64_t>{}, std::vector<int64_t>{});
524-
525-
if (classfix == -1)
526-
{
527-
auto thresh_node = std::make_shared<ngraph::op::Constant>(ngraph::element::f32, ngraph::Shape{1}, std::vector<float>{0.5});
528-
auto mask = std::make_shared<ngraph::op::v1::Less>(scale, thresh_node);
529-
auto zero_node = std::make_shared<ngraph::op::Constant>(ngraph::element::f32, mask->get_shape(), std::vector<float>(b * cols, 0));
530-
scale = std::make_shared<ngraph::op::v1::Select>(mask, scale, zero_node);
531-
}
515+
float thr = classfix == -1 ? 0.5 : 0;
516+
auto thresh_node = std::make_shared<ngraph::op::Constant>(ngraph::element::f32, ngraph::Shape{1}, std::vector<float>{thr});
517+
auto mask = std::make_shared<ngraph::op::v1::Less>(region_split->output(1), thresh_node);
518+
auto zero_node = std::make_shared<ngraph::op::Constant>(ngraph::element::f32, mask->get_shape(), std::vector<float>(cols, 0));
519+
scale = std::make_shared<ngraph::op::v1::Select>(mask, zero_node, region_split->output(1));
532520
}
533521

534522
std::shared_ptr<ngraph::Node> probs;
535523
{
536-
auto lower_bounds = std::make_shared<ngraph::op::Constant>(ngraph::element::i64, ngraph::Shape{2}, std::vector<int64_t>{5, 0});
537-
auto upper_bounds = std::make_shared<ngraph::op::Constant>(ngraph::element::i64, ngraph::Shape{2}, std::vector<int64_t>{rows, cols});
538-
auto classes = std::make_shared<ngraph::op::v1::StridedSlice>(region, lower_bounds, upper_bounds, strides, std::vector<int64_t>{}, std::vector<int64_t>{});
539-
probs = std::make_shared<ngraph::op::v1::Multiply>(classes, scale, ngraph::op::AutoBroadcastType::NUMPY);
540-
524+
probs = std::make_shared<ngraph::op::v1::Multiply>(region_split->output(2), scale, ngraph::op::AutoBroadcastType::NUMPY);
541525
auto thresh_node = std::make_shared<ngraph::op::Constant>(ngraph::element::f32, ngraph::Shape{1}, &thresh);
542526
auto mask = std::make_shared<ngraph::op::v1::Greater>(probs, thresh_node);
543527
auto zero_node = std::make_shared<ngraph::op::Constant>(ngraph::element::f32, mask->get_shape(), std::vector<float>((rows - 5) * cols, 0));

0 commit comments

Comments
 (0)