diff --git a/include/tkDNN/DarknetParser.h b/include/tkDNN/DarknetParser.h index 9008670..a918a5b 100644 --- a/include/tkDNN/DarknetParser.h +++ b/include/tkDNN/DarknetParser.h @@ -22,6 +22,7 @@ namespace tk { namespace dnn { int classes = 20; int num = 1; int pad = 0; + int coords = 4; float scale_xy = 1; std::vector layers; std::string activation = "linear"; @@ -102,9 +103,11 @@ namespace tk { namespace dnn { fields.classes = std::stoi(value); else if(name.find("num") != std::string::npos) fields.num = std::stoi(value); + else if(name.find("coords") != std::string::npos) + fields.coords = std::stoi(value); else if(name.find("groups") != std::string::npos) fields.groups = std::stoi(value); - else if(name.find("scale_xy") != std::string::npos) + else if(name.find("scale_x_y") != std::string::npos) fields.scale_xy = std::stof(value); else if(name.find("from") != std::string::npos) fields.layers.push_back(std::stof(value)); @@ -135,23 +138,25 @@ namespace tk { namespace dnn { if(f.pad == 1) { f.padding_x = f.padding_y = f.size_x /2; } - std::cout<<"Add layer: "< 0 && f.activation != "linear") { + tkdnnActivationMode_t act; + if(f.activation == "relu") act = tkdnnActivationMode_t(CUDNN_ACTIVATION_RELU); + else if(f.activation == "leaky") act = tk::dnn::ACTIVATION_LEAKY; + else if(f.activation == "mish") act = tk::dnn::ACTIVATION_MISH; + else { FatalError("activation not supported: " + f.activation); } + netLayers[netLayers.size()-1] = new tk::dnn::Activation(net, act); + }; } std::vector darknetReadNames(const std::string& names_file){ @@ -244,7 +265,7 @@ namespace tk { namespace dnn { // new type //std::cout<<"type: "< input_bins, std::vector if(net->layers[i]->final) outputs.push_back(net->layers[i]); } + // no final layers, set last as output + if(outputs.size() == 0) { + outputs.push_back(net->layers[net->num_layers-1]); + } + // check input if(input_bins.size() != 1) { diff --git a/scripts/test_all_tests.sh b/scripts/test_all_tests.sh index 1a621f7..b530606 100644 --- a/scripts/test_all_tests.sh +++ b/scripts/test_all_tests.sh @@ -78,9 +78,10 @@ do test_net yolo3_512 test_net yolo3tiny test_net csresnext50-panet-spp + #test_net csresnext50-panet-spp_berkeley test_net mobilenetv2ssd test_net yolo3tiny_512 - test_net yolo2tiny + #test_net yolo2tiny test_net mobilenetv2ssd512 test_net mnist test_net yolo2 diff --git a/src/Network.cpp b/src/Network.cpp index 6801ba3..9adcc48 100644 --- a/src/Network.cpp +++ b/src/Network.cpp @@ -59,12 +59,16 @@ Network::Network(dataDim_t input_dim) { } Network::~Network() { - for(int i=0; iclasses = classes; this->coords = coords; this->num = num; diff --git a/tests/darknet/cfg/yolo2tiny.cfg b/tests/darknet/cfg/yolo2tiny.cfg index 630a209..2884bb4 100644 --- a/tests/darknet/cfg/yolo2tiny.cfg +++ b/tests/darknet/cfg/yolo2tiny.cfg @@ -1,5 +1,5 @@ [net] - Training +# Training batch=64 subdivisions=8 # Testing @@ -90,9 +90,9 @@ stride=1 pad=1 activation=leaky -#[maxpool] -#size=2 -#stride=1 +[maxpool] +size=2 +stride=1 [convolutional] batch_normalize=1 diff --git a/tests/darknet/csresnext50-panet-spp.cpp b/tests/darknet/csresnext50-panet-spp.cpp index f2f66f6..1da95b2 100644 --- a/tests/darknet/csresnext50-panet-spp.cpp +++ b/tests/darknet/csresnext50-panet-spp.cpp @@ -27,6 +27,7 @@ int main() { tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str())); int ret = testInference(input_bins, output_bins, net, netRT); + net->releaseLayers(); delete net; delete netRT; return ret; diff --git a/tests/darknet/csresnext50-panet-spp_berkeley.cpp b/tests/darknet/csresnext50-panet-spp_berkeley.cpp index ca21399..47bbfd4 100644 --- a/tests/darknet/csresnext50-panet-spp_berkeley.cpp +++ b/tests/darknet/csresnext50-panet-spp_berkeley.cpp @@ -5,7 +5,7 @@ #include "DarknetParser.h" int main() { - std::string bin_path = "bdd-csresnext50-panet-spp"; + std::string bin_path = "csresnext50-panet-spp_berkeley"; std::vector input_bins = { bin_path + "/layers/input.bin" }; @@ -17,6 +17,7 @@ int main() { std::string wgs_path = bin_path + "/layers"; std::string cfg_path = "../tests/darknet/cfg/csresnext50-panet-spp_berkeley.cfg"; std::string name_path = "../tests/darknet/names/berkeley.names"; + // FIXME: wrong weights // downloadWeightsifDoNotExist(input_bins[0], bin_path, "https://cloud.hipert.unimore.it/s//download"); // parse darknet network @@ -27,6 +28,7 @@ int main() { tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str())); int ret = testInference(input_bins, output_bins, net, netRT); + net->releaseLayers(); delete net; delete netRT; return ret; diff --git a/tests/darknet/yolo2.cpp b/tests/darknet/yolo2.cpp index e6b40a5..7a46c31 100644 --- a/tests/darknet/yolo2.cpp +++ b/tests/darknet/yolo2.cpp @@ -10,7 +10,7 @@ int main() { bin_path + "/layers/input.bin" }; std::vector output_bins = { - bin_path + "layers/output.bin" + bin_path + "/layers/output.bin" }; std::string wgs_path = bin_path + "/layers"; std::string cfg_path = "../tests/darknet/cfg/yolo2.cfg"; @@ -25,6 +25,7 @@ int main() { tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str())); int ret = testInference(input_bins, output_bins, net, netRT); + net->releaseLayers(); delete net; delete netRT; return ret; diff --git a/tests/darknet/yolo2_voc.cpp b/tests/darknet/yolo2_voc.cpp index 2efcbcb..eab215b 100644 --- a/tests/darknet/yolo2_voc.cpp +++ b/tests/darknet/yolo2_voc.cpp @@ -25,6 +25,7 @@ int main() { tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str())); int ret = testInference(input_bins, output_bins, net, netRT); + net->releaseLayers(); delete net; delete netRT; return ret; diff --git a/tests/darknet/yolo2tiny.cpp b/tests/darknet/yolo2tiny.cpp index fefdaa5..64faa36 100644 --- a/tests/darknet/yolo2tiny.cpp +++ b/tests/darknet/yolo2tiny.cpp @@ -10,12 +10,13 @@ int main() { bin_path + "/layers/input.bin" }; std::vector output_bins = { - bin_path + "layers/output.bin" + bin_path + "/layers/output.bin" }; std::string wgs_path = bin_path + "/layers"; std::string cfg_path = "../tests/darknet/cfg/yolo2tiny.cfg"; std::string name_path = "../tests/darknet/names/coco.names"; - downloadWeightsifDoNotExist(input_bins[0], bin_path, "https://cloud.hipert.unimore.it/s/nf4PJ3k8bxBETwL/download"); + // FIXME: wrong weights + //downloadWeightsifDoNotExist(input_bins[0], bin_path, "https://cloud.hipert.unimore.it/s//download"); // parse darknet network tk::dnn::Network *net = tk::dnn::darknetParser(cfg_path, wgs_path, name_path); @@ -25,6 +26,7 @@ int main() { tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str())); int ret = testInference(input_bins, output_bins, net, netRT); + net->releaseLayers(); delete net; delete netRT; return ret; diff --git a/tests/darknet/yolo3.cpp b/tests/darknet/yolo3.cpp index b96d79a..ea53b84 100644 --- a/tests/darknet/yolo3.cpp +++ b/tests/darknet/yolo3.cpp @@ -26,7 +26,8 @@ int main() { //convert network to tensorRT tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str())); - int ret = testInference(input_bins, output_bins, net, netRT); + int ret = testInference(input_bins, output_bins, net, netRT); + net->releaseLayers(); delete net; delete netRT; return ret; diff --git a/tests/darknet/yolo3_512.cpp b/tests/darknet/yolo3_512.cpp index 11a7839..a67c3a7 100644 --- a/tests/darknet/yolo3_512.cpp +++ b/tests/darknet/yolo3_512.cpp @@ -27,6 +27,7 @@ int main() { tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str())); int ret = testInference(input_bins, output_bins, net, netRT); + net->releaseLayers(); delete net; delete netRT; return ret; diff --git a/tests/darknet/yolo3_berkeley.cpp b/tests/darknet/yolo3_berkeley.cpp index 6c3512c..a71fe83 100644 --- a/tests/darknet/yolo3_berkeley.cpp +++ b/tests/darknet/yolo3_berkeley.cpp @@ -16,7 +16,7 @@ int main() { }; std::string wgs_path = bin_path + "/layers"; std::string cfg_path = "../tests/darknet/cfg/yolo3_berkeley.cfg"; - std::string name_path = "../tests/darknet/names/barkeley.names"; + std::string name_path = "../tests/darknet/names/berkeley.names"; downloadWeightsifDoNotExist(input_bins[0], bin_path, "https://cloud.hipert.unimore.it/s/o5cHa4AjTKS64oD/download"); // parse darknet network @@ -27,6 +27,7 @@ int main() { tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str())); int ret = testInference(input_bins, output_bins, net, netRT); + net->releaseLayers(); delete net; delete netRT; return ret; diff --git a/tests/darknet/yolo3_coco4.cpp b/tests/darknet/yolo3_coco4.cpp index cf69a26..a651430 100644 --- a/tests/darknet/yolo3_coco4.cpp +++ b/tests/darknet/yolo3_coco4.cpp @@ -27,6 +27,7 @@ int main() { tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str())); int ret = testInference(input_bins, output_bins, net, netRT); + net->releaseLayers(); delete net; delete netRT; return ret; diff --git a/tests/darknet/yolo3_flir.cpp b/tests/darknet/yolo3_flir.cpp index fd5c1d5..678f10f 100644 --- a/tests/darknet/yolo3_flir.cpp +++ b/tests/darknet/yolo3_flir.cpp @@ -27,6 +27,7 @@ int main() { tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str())); int ret = testInference(input_bins, output_bins, net, netRT); + net->releaseLayers(); delete net; delete netRT; return ret; diff --git a/tests/darknet/yolo3tiny.cpp b/tests/darknet/yolo3tiny.cpp index 247b152..01fc6f9 100644 --- a/tests/darknet/yolo3tiny.cpp +++ b/tests/darknet/yolo3tiny.cpp @@ -10,7 +10,8 @@ int main() { bin_path + "/layers/input.bin" }; std::vector output_bins = { - bin_path + "debug/layer23_out.bin", + bin_path + "/debug/layer16_out.bin", + bin_path + "/debug/layer23_out.bin", }; std::string wgs_path = bin_path + "/layers"; std::string cfg_path = "../tests/darknet/cfg/yolo3tiny.cfg"; @@ -25,6 +26,7 @@ int main() { tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str())); int ret = testInference(input_bins, output_bins, net, netRT); + net->releaseLayers(); delete net; delete netRT; return ret; diff --git a/tests/darknet/yolo3tiny512.cpp b/tests/darknet/yolo3tiny_512.cpp similarity index 89% rename from tests/darknet/yolo3tiny512.cpp rename to tests/darknet/yolo3tiny_512.cpp index 495033a..8153b0d 100644 --- a/tests/darknet/yolo3tiny512.cpp +++ b/tests/darknet/yolo3tiny_512.cpp @@ -10,7 +10,8 @@ int main() { bin_path + "/layers/input.bin" }; std::vector output_bins = { - bin_path + "debug/layer23_out.bin", + bin_path + "/debug/layer16_out.bin", + bin_path + "/debug/layer23_out.bin", }; std::string wgs_path = bin_path + "/layers"; std::string cfg_path = "../tests/darknet/cfg/yolo3tiny_512.cfg"; @@ -25,6 +26,7 @@ int main() { tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str())); int ret = testInference(input_bins, output_bins, net, netRT); + net->releaseLayers(); delete net; delete netRT; return ret; diff --git a/tests/darknet/yolo4.cpp b/tests/darknet/yolo4.cpp index 70257d2..80b12ce 100644 --- a/tests/darknet/yolo4.cpp +++ b/tests/darknet/yolo4.cpp @@ -27,6 +27,7 @@ int main() { tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str())); int ret = testInference(input_bins, output_bins, net, netRT); + net->releaseLayers(); delete net; delete netRT; return ret; diff --git a/tests/darknet/yolo4_berkeley.cpp b/tests/darknet/yolo4_berkeley.cpp new file mode 100644 index 0000000..db534b7 --- /dev/null +++ b/tests/darknet/yolo4_berkeley.cpp @@ -0,0 +1,34 @@ +#include +#include +#include "tkdnn.h" +#include "test.h" +#include "DarknetParser.h" + +int main() { + std::string bin_path = "yolo4_berkeley"; + std::vector input_bins = { + bin_path + "/layers/input.bin" + }; + std::vector output_bins = { + bin_path + "/debug/layer139_out.bin", + bin_path + "/debug/layer150_out.bin", + bin_path + "/debug/layer161_out.bin" + }; + std::string wgs_path = bin_path + "/layers"; + std::string cfg_path = "../tests/darknet/cfg/yolo4_berkeley.cfg"; + std::string name_path = "../tests/darknet/names/berkeley.names"; + downloadWeightsifDoNotExist(input_bins[0], bin_path, "https://cloud.hipert.unimore.it/s//download"); + + // parse darknet network + tk::dnn::Network *net = tk::dnn::darknetParser(cfg_path, wgs_path, name_path); + net->print(); + + //convert network to tensorRT + tk::dnn::NetworkRT *netRT = new tk::dnn::NetworkRT(net, net->getNetworkRTName(bin_path.c_str())); + + int ret = testInference(input_bins, output_bins, net, netRT); + net->releaseLayers(); + delete net; + delete netRT; + return ret; +}