Skip to content

Commit 65dbbf7

Browse files
authored
Merge pull request opencv#17733 from l-bat:tiny_yolov4
* Supported yolov4-tiny * Added comments
1 parent 49497d8 commit 65dbbf7

File tree

2 files changed

+53
-3
lines changed

2 files changed

+53
-3
lines changed

modules/dnn/src/darknet/darknet_io.cpp

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,28 @@ namespace cv {
363363
fused_layer_names.push_back(last_layer);
364364
}
365365

366+
void setSlice(int input_index, int split_size, int group_id)
367+
{
368+
int begin[] = {0, split_size * group_id, 0, 0};
369+
cv::dnn::DictValue paramBegin = cv::dnn::DictValue::arrayInt(begin, 4);
370+
371+
int end[] = {-1, begin[1] + split_size, -1, -1};
372+
cv::dnn::DictValue paramEnd = cv::dnn::DictValue::arrayInt(end, 4);
373+
374+
darknet::LayerParameter lp;
375+
lp.layer_name = cv::format("slice_%d", layer_id);
376+
lp.layer_type = "Slice";
377+
lp.layerParams.set("begin", paramBegin);
378+
lp.layerParams.set("end", paramEnd);
379+
380+
lp.bottom_indexes.push_back(fused_layer_names.at(input_index));
381+
net->layers.push_back(lp);
382+
383+
layer_id++;
384+
last_layer = lp.layer_name;
385+
fused_layer_names.push_back(last_layer);
386+
}
387+
366388
void setReorg(int stride)
367389
{
368390
cv::dnn::LayerParams reorg_params;
@@ -717,6 +739,7 @@ namespace cv {
717739
{
718740
std::string bottom_layers = getParam<std::string>(layer_params, "layers", "");
719741
CV_Assert(!bottom_layers.empty());
742+
int groups = getParam<int>(layer_params, "groups", 1);
720743
std::vector<int> layers_vec = getNumbers<int>(bottom_layers);
721744

722745
tensor_shape[0] = 0;
@@ -725,10 +748,31 @@ namespace cv {
725748
tensor_shape[0] += net->out_channels_vec[layers_vec[k]];
726749
}
727750

728-
if (layers_vec.size() == 1)
729-
setParams.setIdentity(layers_vec.at(0));
751+
if (groups > 1)
752+
{
753+
int group_id = getParam<int>(layer_params, "group_id", 0);
754+
tensor_shape[0] /= groups;
755+
int split_size = tensor_shape[0] / layers_vec.size();
756+
for (size_t k = 0; k < layers_vec.size(); ++k)
757+
setParams.setSlice(layers_vec[k], split_size, group_id);
758+
759+
if (layers_vec.size() > 1)
760+
{
761+
// layer ids in layers_vec - inputs of Slice layers
762+
// after adding offset to layers_vec: layer ids - ouputs of Slice layers
763+
for (size_t k = 0; k < layers_vec.size(); ++k)
764+
layers_vec[k] += layers_vec.size();
765+
766+
setParams.setConcat(layers_vec.size(), layers_vec.data());
767+
}
768+
}
730769
else
731-
setParams.setConcat(layers_vec.size(), layers_vec.data());
770+
{
771+
if (layers_vec.size() == 1)
772+
setParams.setIdentity(layers_vec.at(0));
773+
else
774+
setParams.setConcat(layers_vec.size(), layers_vec.data());
775+
}
732776
}
733777
else if (layer_type == "dropout" || layer_type == "cost")
734778
{

modules/dnn/test/test_darknet_importer.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,12 @@ TEST_P(Test_Darknet_layers, reorg)
627627
testDarknetLayer("reorg");
628628
}
629629

630+
TEST_P(Test_Darknet_layers, route)
631+
{
632+
testDarknetLayer("route");
633+
testDarknetLayer("route_multi");
634+
}
635+
630636
TEST_P(Test_Darknet_layers, maxpool)
631637
{
632638
#if defined(INF_ENGINE_RELEASE) && INF_ENGINE_VER_MAJOR_GE(2020020000)

0 commit comments

Comments
 (0)