Skip to content

Commit 18794d5

Browse files
committed
darknet parser tested
1 parent d2e2669 commit 18794d5

21 files changed

+112
-30
lines changed

include/tkDNN/DarknetParser.h

+34-13
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ namespace tk { namespace dnn {
2222
int classes = 20;
2323
int num = 1;
2424
int pad = 0;
25+
int coords = 4;
2526
float scale_xy = 1;
2627
std::vector<int> layers;
2728
std::string activation = "linear";
@@ -102,9 +103,11 @@ namespace tk { namespace dnn {
102103
fields.classes = std::stoi(value);
103104
else if(name.find("num") != std::string::npos)
104105
fields.num = std::stoi(value);
106+
else if(name.find("coords") != std::string::npos)
107+
fields.coords = std::stoi(value);
105108
else if(name.find("groups") != std::string::npos)
106109
fields.groups = std::stoi(value);
107-
else if(name.find("scale_xy") != std::string::npos)
110+
else if(name.find("scale_x_y") != std::string::npos)
108111
fields.scale_xy = std::stof(value);
109112
else if(name.find("from") != std::string::npos)
110113
fields.layers.push_back(std::stof(value));
@@ -135,23 +138,25 @@ namespace tk { namespace dnn {
135138
if(f.pad == 1) {
136139
f.padding_x = f.padding_y = f.size_x /2;
137140
}
138-
139141
std::cout<<"Add layer: "<<f.type<<"\n";
140142
if(f.type == "convolutional") {
141143
std::string wgs = wgs_path + "/c" + std::to_string(netLayers.size()) + ".bin";
142144
printf("%d (%d,%d) (%d,%d) (%d,%d) %s %d %d\n", f.filters, f.size_x, f.size_y, f.stride_x, f.stride_y, f.padding_x, f.padding_y, wgs.c_str(), f.batch_normalize, f.groups);
143145
tk::dnn::Conv2d *l= new tk::dnn::Conv2d(net, f.filters, f.size_x, f.size_y, f.stride_x,
144146
f.stride_y, f.padding_x, f.padding_y, wgs, f.batch_normalize, false, f.groups);
145-
if(f.activation != "linear") {
146-
tkdnnActivationMode_t act;
147-
if(f.activation == "relu") act = tkdnnActivationMode_t(CUDNN_ACTIVATION_RELU);
148-
else if(f.activation == "leaky") act = tk::dnn::ACTIVATION_LEAKY;
149-
else if(f.activation == "mish") act = tk::dnn::ACTIVATION_MISH;
150-
else { FatalError("activation not supported: " + f.activation); }
151-
netLayers.push_back(new tk::dnn::Activation(net, act));
152-
} else {
153-
netLayers.push_back(l);
154-
}
147+
netLayers.push_back(l);
148+
} else if(f.type == "maxpool") {
149+
if(f.stride_x == 1 && f.stride_y == 1)
150+
netLayers.push_back(new tk::dnn::Pooling(net, f.size_x, f.size_y, f.stride_x, f.stride_y,
151+
f.padding_x, f.padding_y, tk::dnn::POOLING_MAX_FIXEDSIZE));
152+
else
153+
netLayers.push_back(new tk::dnn::Pooling(net, f.size_x, f.size_y, f.stride_x, f.stride_y,
154+
f.padding_x, f.padding_y, tk::dnn::POOLING_MAX));
155+
156+
} else if(f.type == "avgpool") {
157+
netLayers.push_back(new tk::dnn::Pooling(net, f.size_x, f.size_y, f.stride_x, f.stride_y,
158+
f.padding_x, f.padding_y, tk::dnn::POOLING_AVERAGE));
159+
155160
} else if(f.type == "shortcut") {
156161
if(f.layers.size() != 1) FatalError("no layers to shortcut\n");
157162
int layerIdx = f.layers[0];
@@ -177,6 +182,12 @@ namespace tk { namespace dnn {
177182
}
178183
netLayers.push_back(new tk::dnn::Route(net, layers.data(), layers.size()));
179184

185+
} else if(f.type == "reorg") {
186+
netLayers.push_back(new tk::dnn::Reorg(net, f.stride_x));
187+
188+
} else if(f.type == "region") {
189+
netLayers.push_back(new tk::dnn::Region(net, f.classes, f.coords, f.num));
190+
180191
} else if(f.type == "yolo") {
181192
std::string wgs = wgs_path + "/g" + std::to_string(netLayers.size()) + ".bin";
182193
printf("%d %d %s %d %f\n", f.classes, f.num/f.n_mask, wgs.c_str(), f.n_mask, f.scale_xy);
@@ -189,6 +200,16 @@ namespace tk { namespace dnn {
189200
} else{
190201
FatalError("layer not supported: " + f.type);
191202
}
203+
204+
// add activation
205+
if(netLayers.size() > 0 && f.activation != "linear") {
206+
tkdnnActivationMode_t act;
207+
if(f.activation == "relu") act = tkdnnActivationMode_t(CUDNN_ACTIVATION_RELU);
208+
else if(f.activation == "leaky") act = tk::dnn::ACTIVATION_LEAKY;
209+
else if(f.activation == "mish") act = tk::dnn::ACTIVATION_MISH;
210+
else { FatalError("activation not supported: " + f.activation); }
211+
netLayers[netLayers.size()-1] = new tk::dnn::Activation(net, act);
212+
};
192213
}
193214

194215
std::vector<std::string> darknetReadNames(const std::string& names_file){
@@ -244,7 +265,7 @@ namespace tk { namespace dnn {
244265

245266
// new type
246267
//std::cout<<"type: "<<type<<"\n";
247-
fields = darknetFields_t();
268+
fields = darknetFields_t(); // reset to default
248269
fields.type = type;
249270
continue;
250271
}

include/tkDNN/Network.h

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class Network {
4040
public:
4141
Network(dataDim_t input_dim);
4242
virtual ~Network();
43+
void releaseLayers();
4344

4445
/**
4546
Do inferece for every added layer

include/tkDNN/test.h

+5
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ int testInference(std::vector<std::string> input_bins, std::vector<std::string>
88
if(net->layers[i]->final)
99
outputs.push_back(net->layers[i]);
1010
}
11+
// no final layers, set last as output
12+
if(outputs.size() == 0) {
13+
outputs.push_back(net->layers[net->num_layers-1]);
14+
}
15+
1116

1217
// check input
1318
if(input_bins.size() != 1) {

scripts/test_all_tests.sh

+2-1
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,10 @@ do
7878
test_net yolo3_512
7979
test_net yolo3tiny
8080
test_net csresnext50-panet-spp
81+
#test_net csresnext50-panet-spp_berkeley
8182
test_net mobilenetv2ssd
8283
test_net yolo3tiny_512
83-
test_net yolo2tiny
84+
#test_net yolo2tiny
8485
test_net mobilenetv2ssd512
8586
test_net mnist
8687
test_net yolo2

src/Network.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,16 @@ Network::Network(dataDim_t input_dim) {
5959
}
6060

6161
Network::~Network() {
62-
for(int i=0; i<num_layers; i++)
63-
delete layers[i];
6462
checkCUDNN( cudnnDestroy(cudnnHandle) );
6563
checkERROR( cublasDestroy(cublasHandle) );
6664
}
6765

66+
void Network::releaseLayers() {
67+
for(int i=0; i<num_layers; i++)
68+
delete layers[i];
69+
num_layers = 0;
70+
}
71+
6872
dnnType* Network::infer(dataDim_t &dim, dnnType* data) {
6973

7074
//do infer for every layer

src/Region.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@
1212
namespace tk { namespace dnn {
1313

1414
Region::Region(Network *net, int classes, int coords, int num) :
15-
Layer(net) {
16-
15+
Layer(net) {
1716
this->classes = classes;
1817
this->coords = coords;
1918
this->num = num;

tests/darknet/cfg/yolo2tiny.cfg

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[net]
2-
Training
2+
# Training
33
batch=64
44
subdivisions=8
55
# Testing
@@ -90,9 +90,9 @@ stride=1
9090
pad=1
9191
activation=leaky
9292

93-
#[maxpool]
94-
#size=2
95-
#stride=1
93+
[maxpool]
94+
size=2
95+
stride=1
9696

9797
[convolutional]
9898
batch_normalize=1

tests/darknet/csresnext50-panet-spp.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ int main() {
2727
tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str()));
2828

2929
int ret = testInference(input_bins, output_bins, net, netRT);
30+
net->releaseLayers();
3031
delete net;
3132
delete netRT;
3233
return ret;

tests/darknet/csresnext50-panet-spp_berkeley.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#include "DarknetParser.h"
66

77
int main() {
8-
std::string bin_path = "bdd-csresnext50-panet-spp";
8+
std::string bin_path = "csresnext50-panet-spp_berkeley";
99
std::vector<std::string> input_bins = {
1010
bin_path + "/layers/input.bin"
1111
};
@@ -17,6 +17,7 @@ int main() {
1717
std::string wgs_path = bin_path + "/layers";
1818
std::string cfg_path = "../tests/darknet/cfg/csresnext50-panet-spp_berkeley.cfg";
1919
std::string name_path = "../tests/darknet/names/berkeley.names";
20+
// FIXME: wrong weights
2021
// downloadWeightsifDoNotExist(input_bins[0], bin_path, "https://cloud.hipert.unimore.it/s//download");
2122

2223
// parse darknet network
@@ -27,6 +28,7 @@ int main() {
2728
tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str()));
2829

2930
int ret = testInference(input_bins, output_bins, net, netRT);
31+
net->releaseLayers();
3032
delete net;
3133
delete netRT;
3234
return ret;

tests/darknet/yolo2.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ int main() {
1010
bin_path + "/layers/input.bin"
1111
};
1212
std::vector<std::string> output_bins = {
13-
bin_path + "layers/output.bin"
13+
bin_path + "/layers/output.bin"
1414
};
1515
std::string wgs_path = bin_path + "/layers";
1616
std::string cfg_path = "../tests/darknet/cfg/yolo2.cfg";
@@ -25,6 +25,7 @@ int main() {
2525
tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str()));
2626

2727
int ret = testInference(input_bins, output_bins, net, netRT);
28+
net->releaseLayers();
2829
delete net;
2930
delete netRT;
3031
return ret;

tests/darknet/yolo2_voc.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ int main() {
2525
tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str()));
2626

2727
int ret = testInference(input_bins, output_bins, net, netRT);
28+
net->releaseLayers();
2829
delete net;
2930
delete netRT;
3031
return ret;

tests/darknet/yolo2tiny.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@ int main() {
1010
bin_path + "/layers/input.bin"
1111
};
1212
std::vector<std::string> output_bins = {
13-
bin_path + "layers/output.bin"
13+
bin_path + "/layers/output.bin"
1414
};
1515
std::string wgs_path = bin_path + "/layers";
1616
std::string cfg_path = "../tests/darknet/cfg/yolo2tiny.cfg";
1717
std::string name_path = "../tests/darknet/names/coco.names";
18-
downloadWeightsifDoNotExist(input_bins[0], bin_path, "https://cloud.hipert.unimore.it/s/nf4PJ3k8bxBETwL/download");
18+
// FIXME: wrong weights
19+
//downloadWeightsifDoNotExist(input_bins[0], bin_path, "https://cloud.hipert.unimore.it/s//download");
1920

2021
// parse darknet network
2122
tk::dnn::Network *net = tk::dnn::darknetParser(cfg_path, wgs_path, name_path);
@@ -25,6 +26,7 @@ int main() {
2526
tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str()));
2627

2728
int ret = testInference(input_bins, output_bins, net, netRT);
29+
net->releaseLayers();
2830
delete net;
2931
delete netRT;
3032
return ret;

tests/darknet/yolo3.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ int main() {
2626
//convert network to tensorRT
2727
tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str()));
2828

29-
int ret = testInference(input_bins, output_bins, net, netRT);
29+
int ret = testInference(input_bins, output_bins, net, netRT);
30+
net->releaseLayers();
3031
delete net;
3132
delete netRT;
3233
return ret;

tests/darknet/yolo3_512.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ int main() {
2727
tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str()));
2828

2929
int ret = testInference(input_bins, output_bins, net, netRT);
30+
net->releaseLayers();
3031
delete net;
3132
delete netRT;
3233
return ret;

tests/darknet/yolo3_berkeley.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ int main() {
1616
};
1717
std::string wgs_path = bin_path + "/layers";
1818
std::string cfg_path = "../tests/darknet/cfg/yolo3_berkeley.cfg";
19-
std::string name_path = "../tests/darknet/names/barkeley.names";
19+
std::string name_path = "../tests/darknet/names/berkeley.names";
2020
downloadWeightsifDoNotExist(input_bins[0], bin_path, "https://cloud.hipert.unimore.it/s/o5cHa4AjTKS64oD/download");
2121

2222
// parse darknet network
@@ -27,6 +27,7 @@ int main() {
2727
tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str()));
2828

2929
int ret = testInference(input_bins, output_bins, net, netRT);
30+
net->releaseLayers();
3031
delete net;
3132
delete netRT;
3233
return ret;

tests/darknet/yolo3_coco4.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ int main() {
2727
tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str()));
2828

2929
int ret = testInference(input_bins, output_bins, net, netRT);
30+
net->releaseLayers();
3031
delete net;
3132
delete netRT;
3233
return ret;

tests/darknet/yolo3_flir.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ int main() {
2727
tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str()));
2828

2929
int ret = testInference(input_bins, output_bins, net, netRT);
30+
net->releaseLayers();
3031
delete net;
3132
delete netRT;
3233
return ret;

tests/darknet/yolo3tiny.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ int main() {
1010
bin_path + "/layers/input.bin"
1111
};
1212
std::vector<std::string> output_bins = {
13-
bin_path + "debug/layer23_out.bin",
13+
bin_path + "/debug/layer16_out.bin",
14+
bin_path + "/debug/layer23_out.bin",
1415
};
1516
std::string wgs_path = bin_path + "/layers";
1617
std::string cfg_path = "../tests/darknet/cfg/yolo3tiny.cfg";
@@ -25,6 +26,7 @@ int main() {
2526
tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str()));
2627

2728
int ret = testInference(input_bins, output_bins, net, netRT);
29+
net->releaseLayers();
2830
delete net;
2931
delete netRT;
3032
return ret;

tests/darknet/yolo3tiny512.cpp renamed to tests/darknet/yolo3tiny_512.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ int main() {
1010
bin_path + "/layers/input.bin"
1111
};
1212
std::vector<std::string> output_bins = {
13-
bin_path + "debug/layer23_out.bin",
13+
bin_path + "/debug/layer16_out.bin",
14+
bin_path + "/debug/layer23_out.bin",
1415
};
1516
std::string wgs_path = bin_path + "/layers";
1617
std::string cfg_path = "../tests/darknet/cfg/yolo3tiny_512.cfg";
@@ -25,6 +26,7 @@ int main() {
2526
tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str()));
2627

2728
int ret = testInference(input_bins, output_bins, net, netRT);
29+
net->releaseLayers();
2830
delete net;
2931
delete netRT;
3032
return ret;

tests/darknet/yolo4.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ int main() {
2727
tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str()));
2828

2929
int ret = testInference(input_bins, output_bins, net, netRT);
30+
net->releaseLayers();
3031
delete net;
3132
delete netRT;
3233
return ret;

tests/darknet/yolo4_berkeley.cpp

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include<iostream>
2+
#include<vector>
3+
#include "tkdnn.h"
4+
#include "test.h"
5+
#include "DarknetParser.h"
6+
7+
int main() {
8+
std::string bin_path = "yolo4_berkeley";
9+
std::vector<std::string> input_bins = {
10+
bin_path + "/layers/input.bin"
11+
};
12+
std::vector<std::string> output_bins = {
13+
bin_path + "/debug/layer139_out.bin",
14+
bin_path + "/debug/layer150_out.bin",
15+
bin_path + "/debug/layer161_out.bin"
16+
};
17+
std::string wgs_path = bin_path + "/layers";
18+
std::string cfg_path = "../tests/darknet/cfg/yolo4_berkeley.cfg";
19+
std::string name_path = "../tests/darknet/names/berkeley.names";
20+
downloadWeightsifDoNotExist(input_bins[0], bin_path, "https://cloud.hipert.unimore.it/s//download");
21+
22+
// parse darknet network
23+
tk::dnn::Network *net = tk::dnn::darknetParser(cfg_path, wgs_path, name_path);
24+
net->print();
25+
26+
//convert network to tensorRT
27+
tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str()));
28+
29+
int ret = testInference(input_bins, output_bins, net, netRT);
30+
net->releaseLayers();
31+
delete net;
32+
delete netRT;
33+
return ret;
34+
}

0 commit comments

Comments
 (0)