@@ -363,6 +363,28 @@ namespace cv {
363
363
fused_layer_names.push_back (last_layer);
364
364
}
365
365
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
+
366
388
void setReorg (int stride)
367
389
{
368
390
cv::dnn::LayerParams reorg_params;
@@ -717,6 +739,7 @@ namespace cv {
717
739
{
718
740
std::string bottom_layers = getParam<std::string>(layer_params, " layers" , " " );
719
741
CV_Assert (!bottom_layers.empty ());
742
+ int groups = getParam<int >(layer_params, " groups" , 1 );
720
743
std::vector<int > layers_vec = getNumbers<int >(bottom_layers);
721
744
722
745
tensor_shape[0 ] = 0 ;
@@ -725,10 +748,31 @@ namespace cv {
725
748
tensor_shape[0 ] += net->out_channels_vec [layers_vec[k]];
726
749
}
727
750
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
+ }
730
769
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
+ }
732
776
}
733
777
else if (layer_type == " dropout" || layer_type == " cost" )
734
778
{
0 commit comments