From 7a677d5c10ed913593fefa38e6d4f3fc4065008e Mon Sep 17 00:00:00 2001 From: Davide Sapienza Date: Fri, 29 May 2020 14:54:36 +0200 Subject: [PATCH] Add CenterNet based on Resnet101 for 3D, CUDNN and TensorRT work Signed-off-by: Davide Sapienza --- CMakeLists.txt | 3 + tests/resnet101_cnet3d/resnet101_cnet3d.cpp | 443 ++++++++++++++++++++ 2 files changed, 446 insertions(+) create mode 100644 tests/resnet101_cnet3d/resnet101_cnet3d.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 0e75e3b..e5a2b26 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -136,6 +136,9 @@ target_link_libraries(test_bdd-csresnext50-panet-spp tkDNN) add_executable(test_resnet101_cnet tests/resnet101_cnet/resnet101_cnet.cpp) target_link_libraries(test_resnet101_cnet tkDNN) +add_executable(test_resnet101_cnet3d tests/resnet101_cnet3d/resnet101_cnet3d.cpp) +target_link_libraries(test_resnet101_cnet3d tkDNN) + add_executable(test_dla34 tests/dla34/dla34.cpp) target_link_libraries(test_dla34 tkDNN) diff --git a/tests/resnet101_cnet3d/resnet101_cnet3d.cpp b/tests/resnet101_cnet3d/resnet101_cnet3d.cpp new file mode 100644 index 0000000..0089a19 --- /dev/null +++ b/tests/resnet101_cnet3d/resnet101_cnet3d.cpp @@ -0,0 +1,443 @@ +#include + +#include "kernels.h" +#include "Yolo3Detection.h" +#include "tkdnn.h" +#include +#include // std::iota +#include // std::sort +// #include "utils.h" + +const char *input_bin = "resnet101_cnet3d/debug/input.bin"; +const char *conv1_bin = "resnet101_cnet3d/layers/conv1.bin"; + +//layer1 +const char *layer1_bin[]={ +"resnet101_cnet3d/layers/layer1-0-conv1.bin", +"resnet101_cnet3d/layers/layer1-0-conv2.bin", +"resnet101_cnet3d/layers/layer1-0-conv3.bin", +"resnet101_cnet3d/layers/layer1-0-downsample-0.bin", + +"resnet101_cnet3d/layers/layer1-1-conv1.bin", +"resnet101_cnet3d/layers/layer1-1-conv2.bin", +"resnet101_cnet3d/layers/layer1-1-conv3.bin", + +"resnet101_cnet3d/layers/layer1-2-conv1.bin", +"resnet101_cnet3d/layers/layer1-2-conv2.bin", +"resnet101_cnet3d/layers/layer1-2-conv3.bin"}; + + +//layer2 +const char *layer2_bin[]={ +"resnet101_cnet3d/layers/layer2-0-conv1.bin", +"resnet101_cnet3d/layers/layer2-0-conv2.bin", +"resnet101_cnet3d/layers/layer2-0-conv3.bin", +"resnet101_cnet3d/layers/layer2-0-downsample-0.bin", + +"resnet101_cnet3d/layers/layer2-1-conv1.bin", +"resnet101_cnet3d/layers/layer2-1-conv2.bin", +"resnet101_cnet3d/layers/layer2-1-conv3.bin", + +"resnet101_cnet3d/layers/layer2-2-conv1.bin", +"resnet101_cnet3d/layers/layer2-2-conv2.bin", +"resnet101_cnet3d/layers/layer2-2-conv3.bin", + +"resnet101_cnet3d/layers/layer2-3-conv1.bin", +"resnet101_cnet3d/layers/layer2-3-conv2.bin", +"resnet101_cnet3d/layers/layer2-3-conv3.bin" +}; +//layer3 +const char *layer3_bin[]={ +"resnet101_cnet3d/layers/layer3-0-conv1.bin", +"resnet101_cnet3d/layers/layer3-0-conv2.bin", +"resnet101_cnet3d/layers/layer3-0-conv3.bin", +"resnet101_cnet3d/layers/layer3-0-downsample-0.bin", + +"resnet101_cnet3d/layers/layer3-1-conv1.bin", +"resnet101_cnet3d/layers/layer3-1-conv2.bin", +"resnet101_cnet3d/layers/layer3-1-conv3.bin", + +"resnet101_cnet3d/layers/layer3-2-conv1.bin", +"resnet101_cnet3d/layers/layer3-2-conv2.bin", +"resnet101_cnet3d/layers/layer3-2-conv3.bin", + +"resnet101_cnet3d/layers/layer3-3-conv1.bin", +"resnet101_cnet3d/layers/layer3-3-conv2.bin", +"resnet101_cnet3d/layers/layer3-3-conv3.bin", + +"resnet101_cnet3d/layers/layer3-4-conv1.bin", +"resnet101_cnet3d/layers/layer3-4-conv2.bin", +"resnet101_cnet3d/layers/layer3-4-conv3.bin", + +"resnet101_cnet3d/layers/layer3-5-conv1.bin", +"resnet101_cnet3d/layers/layer3-5-conv2.bin", +"resnet101_cnet3d/layers/layer3-5-conv3.bin", + +"resnet101_cnet3d/layers/layer3-6-conv1.bin", +"resnet101_cnet3d/layers/layer3-6-conv2.bin", +"resnet101_cnet3d/layers/layer3-6-conv3.bin", + +"resnet101_cnet3d/layers/layer3-7-conv1.bin", +"resnet101_cnet3d/layers/layer3-7-conv2.bin", +"resnet101_cnet3d/layers/layer3-7-conv3.bin", + +"resnet101_cnet3d/layers/layer3-8-conv1.bin", +"resnet101_cnet3d/layers/layer3-8-conv2.bin", +"resnet101_cnet3d/layers/layer3-8-conv3.bin", + +"resnet101_cnet3d/layers/layer3-9-conv1.bin", +"resnet101_cnet3d/layers/layer3-9-conv2.bin", +"resnet101_cnet3d/layers/layer3-9-conv3.bin", + +"resnet101_cnet3d/layers/layer3-10-conv1.bin", +"resnet101_cnet3d/layers/layer3-10-conv2.bin", +"resnet101_cnet3d/layers/layer3-10-conv3.bin", + +"resnet101_cnet3d/layers/layer3-11-conv1.bin", +"resnet101_cnet3d/layers/layer3-11-conv2.bin", +"resnet101_cnet3d/layers/layer3-11-conv3.bin", + +"resnet101_cnet3d/layers/layer3-12-conv1.bin", +"resnet101_cnet3d/layers/layer3-12-conv2.bin", +"resnet101_cnet3d/layers/layer3-12-conv3.bin", + +"resnet101_cnet3d/layers/layer3-13-conv1.bin", +"resnet101_cnet3d/layers/layer3-13-conv2.bin", +"resnet101_cnet3d/layers/layer3-13-conv3.bin", + +"resnet101_cnet3d/layers/layer3-14-conv1.bin", +"resnet101_cnet3d/layers/layer3-14-conv2.bin", +"resnet101_cnet3d/layers/layer3-14-conv3.bin", + +"resnet101_cnet3d/layers/layer3-15-conv1.bin", +"resnet101_cnet3d/layers/layer3-15-conv2.bin", +"resnet101_cnet3d/layers/layer3-15-conv3.bin", + +"resnet101_cnet3d/layers/layer3-16-conv1.bin", +"resnet101_cnet3d/layers/layer3-16-conv2.bin", +"resnet101_cnet3d/layers/layer3-16-conv3.bin", + +"resnet101_cnet3d/layers/layer3-17-conv1.bin", +"resnet101_cnet3d/layers/layer3-17-conv2.bin", +"resnet101_cnet3d/layers/layer3-17-conv3.bin", + +"resnet101_cnet3d/layers/layer3-18-conv1.bin", +"resnet101_cnet3d/layers/layer3-18-conv2.bin", +"resnet101_cnet3d/layers/layer3-18-conv3.bin", + +"resnet101_cnet3d/layers/layer3-19-conv1.bin", +"resnet101_cnet3d/layers/layer3-19-conv2.bin", +"resnet101_cnet3d/layers/layer3-19-conv3.bin", + +"resnet101_cnet3d/layers/layer3-20-conv1.bin", +"resnet101_cnet3d/layers/layer3-20-conv2.bin", +"resnet101_cnet3d/layers/layer3-20-conv3.bin", + +"resnet101_cnet3d/layers/layer3-21-conv1.bin", +"resnet101_cnet3d/layers/layer3-21-conv2.bin", +"resnet101_cnet3d/layers/layer3-21-conv3.bin", + +"resnet101_cnet3d/layers/layer3-22-conv1.bin", +"resnet101_cnet3d/layers/layer3-22-conv2.bin", +"resnet101_cnet3d/layers/layer3-22-conv3.bin"}; + + +//layer4 +const char *layer4_bin[]={ +"resnet101_cnet3d/layers/layer4-0-conv1.bin", +"resnet101_cnet3d/layers/layer4-0-conv2.bin", +"resnet101_cnet3d/layers/layer4-0-conv3.bin", +"resnet101_cnet3d/layers/layer4-0-downsample-0.bin", + +"resnet101_cnet3d/layers/layer4-1-conv1.bin", +"resnet101_cnet3d/layers/layer4-1-conv2.bin", +"resnet101_cnet3d/layers/layer4-1-conv3.bin", + +"resnet101_cnet3d/layers/layer4-2-conv1.bin", +"resnet101_cnet3d/layers/layer4-2-conv2.bin", +"resnet101_cnet3d/layers/layer4-2-conv3.bin"}; + +const char *d_conv1_bin = "resnet101_cnet3d/layers/deconv_layers-0-conv_offset_mask.bin"; +const char *deform1_bin = "resnet101_cnet3d/layers/deconv_layers-0.bin"; +const char *deconv1_bin = "resnet101_cnet3d/layers/deconv_layers-3.bin"; + +const char *d_conv2_bin = "resnet101_cnet3d/layers/deconv_layers-6-conv_offset_mask.bin"; +const char *deform2_bin = "resnet101_cnet3d/layers/deconv_layers-6.bin"; +const char *deconv2_bin = "resnet101_cnet3d/layers/deconv_layers-9.bin"; + +const char *d_conv3_bin = "resnet101_cnet3d/layers/deconv_layers-12-conv_offset_mask.bin"; +const char *deform3_bin = "resnet101_cnet3d/layers/deconv_layers-12.bin"; +const char *deconv3_bin = "resnet101_cnet3d/layers/deconv_layers-15.bin"; + +const char *hm_conv1_bin = "resnet101_cnet3d/layers/hm-0.bin"; +const char *hm_conv2_bin = "resnet101_cnet3d/layers/hm-2.bin"; +const char *wh_conv1_bin = "resnet101_cnet3d/layers/wh-0.bin"; +const char *wh_conv2_bin = "resnet101_cnet3d/layers/wh-2.bin"; +const char *reg_conv1_bin = "resnet101_cnet3d/layers/reg-0.bin"; +const char *reg_conv2_bin = "resnet101_cnet3d/layers/reg-2.bin"; +const char *dep_conv1_bin = "resnet101_cnet3d/layers/dep-0.bin"; +const char *dep_conv2_bin = "resnet101_cnet3d/layers/dep-2.bin"; +const char *rot_conv1_bin = "resnet101_cnet3d/layers/rot-0.bin"; +const char *rot_conv2_bin = "resnet101_cnet3d/layers/rot-2.bin"; +const char *dim_conv1_bin = "resnet101_cnet3d/layers/dim-0.bin"; +const char *dim_conv2_bin = "resnet101_cnet3d/layers/dim-2.bin"; +//final +const char *fc_bin = "resnet101_cnet3d/layers/fc.bin"; + +const char *output_bin[]={ +"resnet101_cnet3d/debug/hm.bin", +"resnet101_cnet3d/debug/wh.bin", +"resnet101_cnet3d/debug/reg.bin", +"resnet101_cnet3d/debug/dep.bin", +"resnet101_cnet3d/debug/rot.bin", +"resnet101_cnet3d/debug/dim.bin"}; + +int main() +{ + // downloadWeightsifDoNotExist(input_bin, "resnet101_cnet3d", "https://cloud.hipert.unimore.it/s/5BTjHMWBcJk8g3i/download"); + + // Network layout + tk::dnn::dataDim_t dim(1, 3, 512, 512, 1); + tk::dnn::Network net(dim); + + tk::dnn::Conv2d conv1(&net, 64, 7, 7, 2, 2, 3, 3, conv1_bin, true); + tk::dnn::Activation relu3(&net, CUDNN_ACTIVATION_RELU); + + tk::dnn::Pooling maxpool4(&net, 3, 3, 2, 2, 1, 1, tk::dnn::POOLING_MAX); + + + //layer 1 + int id_layer1_bin = 0; + tk::dnn::Layer *last = &maxpool4; + for(int i=0; i<3;i++) + { + tk::dnn::Conv2d *layer1_0_conv1 = new tk::dnn::Conv2d(&net, 64, 1, 1, 1, 1, 0, 0, layer1_bin[id_layer1_bin++], true); + tk::dnn::Activation *relu1_0_1 = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + tk::dnn::Conv2d *layer1_0_conv2 = new tk::dnn::Conv2d(&net, 64, 3, 3, 1, 1, 1, 1, layer1_bin[id_layer1_bin++], true); + tk::dnn::Activation *relu1_0_2 = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + tk::dnn::Conv2d *layer1_0_conv3 = new tk::dnn::Conv2d(&net, 256, 1, 1, 1, 1, 0, 0, layer1_bin[id_layer1_bin++], true); + if(i==0) { + tk::dnn::Layer *route_1_0_layers[1] = { last }; + tk::dnn::Route *route_1_0 = new tk::dnn::Route(&net, route_1_0_layers, 1); + tk::dnn::Conv2d *layer1_0_downsample_0 = new tk::dnn::Conv2d(&net, 256, 1, 1, 1, 1, 0, 0, layer1_bin[id_layer1_bin++], true); + tk::dnn::Shortcut *s1_0 = new tk::dnn::Shortcut(&net, layer1_0_conv3); + } else { + tk::dnn::Shortcut *s1_0 = new tk::dnn::Shortcut(&net, last); + } + tk::dnn::Activation *layer1_0_relu = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + last = layer1_0_relu; + } + + // layer 2 + int id_layer2_bin = 0; + for(int i=0; i<4;i++) + { + tk::dnn::Conv2d *layer1_0_conv1 = new tk::dnn::Conv2d(&net, 128, 1, 1, 1, 1, 0, 0, layer2_bin[id_layer2_bin++], true); + tk::dnn::Activation *relu1_0_1 = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + tk::dnn::Conv2d *layer1_0_conv2; + if(i==0) + layer1_0_conv2 = new tk::dnn::Conv2d(&net, 128, 3, 3, 2, 2, 1, 1, layer2_bin[id_layer2_bin++], true); + else + layer1_0_conv2 = new tk::dnn::Conv2d(&net, 128, 3, 3, 1, 1, 1, 1, layer2_bin[id_layer2_bin++], true); + + tk::dnn::Activation *relu1_0_2 = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + tk::dnn::Conv2d *layer1_0_conv3 = new tk::dnn::Conv2d(&net, 512, 1, 1, 1, 1, 0, 0, layer2_bin[id_layer2_bin++], true); + if(i==0) + { + tk::dnn::Layer *route_1_0_layers[1] = { last }; + tk::dnn::Route *route_1_0 = new tk::dnn::Route(&net, route_1_0_layers, 1); + tk::dnn::Conv2d *layer1_0_downsample_0 = new tk::dnn::Conv2d(&net, 512, 1, 1, 2, 2, 0, 0, layer2_bin[id_layer2_bin++], true); + tk::dnn::Shortcut *s1_0 = new tk::dnn::Shortcut(&net, layer1_0_conv3); + } + else + { + tk::dnn::Shortcut *s1_0 = new tk::dnn::Shortcut(&net, last); + } + tk::dnn::Activation *layer1_0_relu = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + last = layer1_0_relu; + } + + // layer 3 + int id_layer3_bin = 0; + for(int i=0; i<23;i++) + { + tk::dnn::Conv2d *layer1_0_conv1 = new tk::dnn::Conv2d(&net, 256, 1, 1, 1, 1, 0, 0, layer3_bin[id_layer3_bin++], true); + tk::dnn::Activation *relu1_0_1 = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + tk::dnn::Conv2d *layer1_0_conv2; + if(i==0) + layer1_0_conv2 = new tk::dnn::Conv2d(&net, 256, 3, 3, 2, 2, 1, 1, layer3_bin[id_layer3_bin++], true); + else + layer1_0_conv2 = new tk::dnn::Conv2d(&net, 256, 3, 3, 1, 1, 1, 1, layer3_bin[id_layer3_bin++], true); + + tk::dnn::Activation *relu1_0_2 = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + tk::dnn::Conv2d *layer1_0_conv3 = new tk::dnn::Conv2d(&net, 1024, 1, 1, 1, 1, 0, 0, layer3_bin[id_layer3_bin++], true); + if(i==0) + { + tk::dnn::Layer *route_1_0_layers[1] = { last }; + tk::dnn::Route *route_1_0 = new tk::dnn::Route(&net, route_1_0_layers, 1); + tk::dnn::Conv2d *layer1_0_downsample_0 = new tk::dnn::Conv2d(&net, 1024, 1, 1, 2, 2, 0, 0, layer3_bin[id_layer3_bin++], true); + tk::dnn::Shortcut *s1_0 = new tk::dnn::Shortcut(&net, layer1_0_conv3); + } + else + { + tk::dnn::Shortcut *s1_0 = new tk::dnn::Shortcut(&net, last); + } + tk::dnn::Activation *layer1_0_relu = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + last = layer1_0_relu; + } + + // layer 4 + int id_layer4_bin = 0; + for(int i=0; i<3;i++) + { + tk::dnn::Conv2d *layer1_0_conv1 = new tk::dnn::Conv2d(&net, 512, 1, 1, 1, 1, 0, 0, layer4_bin[id_layer4_bin++], true); + tk::dnn::Activation *relu1_0_1 = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + tk::dnn::Conv2d *layer1_0_conv2; + if(i==0) + layer1_0_conv2 = new tk::dnn::Conv2d(&net, 512, 3, 3, 2, 2, 1, 1, layer4_bin[id_layer4_bin++], true); + else + layer1_0_conv2 = new tk::dnn::Conv2d(&net, 512, 3, 3, 1, 1, 1, 1, layer4_bin[id_layer4_bin++], true); + + tk::dnn::Activation *relu1_0_2 = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + tk::dnn::Conv2d *layer1_0_conv3 = new tk::dnn::Conv2d(&net, 2048, 1, 1, 1, 1, 0, 0, layer4_bin[id_layer4_bin++], true); + if(i==0) + { + tk::dnn::Layer *route_1_0_layers[1] = { last }; + tk::dnn::Route *route_1_0 = new tk::dnn::Route(&net, route_1_0_layers, 1); + tk::dnn::Conv2d *layer1_0_downsample_0 = new tk::dnn::Conv2d(&net, 2048, 1, 1, 2, 2, 0, 0, layer4_bin[id_layer4_bin++], true); + tk::dnn::Shortcut *s1_0 = new tk::dnn::Shortcut(&net, layer1_0_conv3); + } + else + { + tk::dnn::Shortcut *s1_0 = new tk::dnn::Shortcut(&net, last); + } + tk::dnn::Activation *layer1_0_relu = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + last = layer1_0_relu; + } + + tk::dnn::DeformConv2d *layer0_deform1 = new tk::dnn::DeformConv2d(&net, 256, 1, 3, 3, 1, 1, 1, 1, deform1_bin, d_conv1_bin, true); + tk::dnn::Activation *layer0_deform1_relu = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + tk::dnn::DeConv2d *layer0_deconv1 = new tk::dnn::DeConv2d(&net, 256, 4, 4, 2, 2, 1, 1, deconv1_bin, true); + tk::dnn::Activation *layer0_deconv1_relu = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + + tk::dnn::DeformConv2d *layer1_deform1 = new tk::dnn::DeformConv2d(&net, 128, 1, 3, 3, 1, 1, 1, 1, deform2_bin, d_conv2_bin, true); + tk::dnn::Activation *layer1_deform1_relu = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + tk::dnn::DeConv2d *layer1_deconv1 = new tk::dnn::DeConv2d(&net, 128, 4, 4, 2, 2, 1, 1, deconv2_bin, true); + tk::dnn::Activation *layer1_deconv1_relu = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + + tk::dnn::DeformConv2d *layer2_deform1 = new tk::dnn::DeformConv2d(&net, 64, 1, 3, 3, 1, 1, 1, 1, deform3_bin, d_conv3_bin, true); + tk::dnn::Activation *layer2_deform1_relu = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + tk::dnn::DeConv2d *layer2_deconv1 = new tk::dnn::DeConv2d(&net, 64, 4, 4, 2, 2, 1, 1, deconv3_bin, true); + tk::dnn::Activation *layer2_deconv1_relu = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + + tk::dnn::Layer *route_1_0_layers[1] = { layer2_deconv1_relu }; + tk::dnn::Conv2d *hm_conv1 = new tk::dnn::Conv2d(&net, 64, 3, 3, 1, 1, 1, 1, hm_conv1_bin, false); + tk::dnn::Activation *hm_relu1 = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + tk::dnn::Conv2d *hm = new tk::dnn::Conv2d(&net, 3, 1, 1, 1, 1, 0, 0, hm_conv2_bin, false); + hm->setFinal(); + int kernel = 3; + int pad = (kernel - 1)/2; + tk::dnn::Activation *hm_sig = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_SIGMOID); + tk::dnn::Pooling *hmax = new tk::dnn::Pooling(&net, kernel, kernel, 1, 1, pad, pad, tk::dnn::POOLING_MAX); + hmax->setFinal(); + + tk::dnn::Route *route_1_0 = new tk::dnn::Route(&net, route_1_0_layers, 1); + tk::dnn::Conv2d *wh_conv1 = new tk::dnn::Conv2d(&net, 64, 3, 3, 1, 1, 1, 1, wh_conv1_bin, false); + tk::dnn::Activation *wh_relu1 = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + tk::dnn::Conv2d *wh = new tk::dnn::Conv2d(&net, 2, 1, 1, 1, 1, 0, 0, wh_conv2_bin, false); + wh->setFinal(); + + tk::dnn::Route *route_2_0 = new tk::dnn::Route(&net, route_1_0_layers, 1); + tk::dnn::Conv2d *reg_conv1 = new tk::dnn::Conv2d(&net, 64, 3, 3, 1, 1, 1, 1, reg_conv1_bin, false); + tk::dnn::Activation *reg_relu1 = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + tk::dnn::Conv2d *reg = new tk::dnn::Conv2d(&net, 2, 1, 1, 1, 1, 0, 0, reg_conv2_bin, false); + reg->setFinal(); + + // dep + tk::dnn::Route *route_3_0 = new tk::dnn::Route(&net, route_1_0_layers, 1); + tk::dnn::Conv2d *dep_conv1 = new tk::dnn::Conv2d(&net, 64, 3, 3, 1, 1, 1, 1, dep_conv1_bin, false); + tk::dnn::Activation *dep_relu1 = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + tk::dnn::Conv2d *dep = new tk::dnn::Conv2d(&net, 1, 1, 1, 1, 1, 0, 0, dep_conv2_bin, false); + dep->setFinal(); + + // rot + tk::dnn::Route *route_4_0 = new tk::dnn::Route(&net, route_1_0_layers, 1); + tk::dnn::Conv2d *rot_conv1 = new tk::dnn::Conv2d(&net, 64, 3, 3, 1, 1, 1, 1, rot_conv1_bin, false); + tk::dnn::Activation *rot_relu1 = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + tk::dnn::Conv2d *rot = new tk::dnn::Conv2d(&net, 8, 1, 1, 1, 1, 0, 0, rot_conv2_bin, false); + rot->setFinal(); + + // dim + tk::dnn::Route *route_5_0 = new tk::dnn::Route(&net, route_1_0_layers, 1); + tk::dnn::Conv2d *dim_conv1 = new tk::dnn::Conv2d(&net, 64, 3, 3, 1, 1, 1, 1, dim_conv1_bin, false); + tk::dnn::Activation *dim_relu1 = new tk::dnn::Activation(&net, CUDNN_ACTIVATION_RELU); + tk::dnn::Conv2d *dim_ = new tk::dnn::Conv2d(&net, 3, 1, 1, 1, 1, 0, 0, dim_conv2_bin, false); + dim_->setFinal(); + + // Load input + dnnType *data; + dnnType *input_h; + readBinaryFile(input_bin, dim.tot(), &input_h, &data); + // printDeviceVector(64, data, true); + + //print network model + net.print(); + + //convert network to tensorRT + tk::dnn::NetworkRT netRT(&net, net.getNetworkRTName("resnet101_cnet3d")); + + + tk::dnn::dataDim_t dim1 = dim; //input dim + printCenteredTitle(" CUDNN inference ", '=', 30); + { + dim1.print(); + TIMER_START + net.infer(dim1, data); + TIMER_STOP + dim1.print(); + } + + // printDeviceVector(64, cudnn_out, true); + + tk::dnn::dataDim_t dim2 = dim; + printCenteredTitle(" TENSORRT inference ", '=', 30); + { + dim2.print(); + TIMER_START + netRT.infer(dim2, data); + TIMER_STOP + dim2.print(); + } + + tk::dnn::Layer *outs[6] = { hm, wh, reg, dep, rot, dim_ }; + int out_count = 1; + int ret_cudnn = 0, ret_tensorrt = 0, ret_cudnn_tensorrt = 0; + for(int i=0; i<6; i++) { + printCenteredTitle((std::string(" RESNET CHECK RESULTS ") + std::to_string(i) + " ").c_str(), '=', 30); + + outs[i]->output_dim.print(); + + dnnType *out, *out_h; + int odim = outs[i]->output_dim.tot(); + readBinaryFile(output_bin[i], odim, &out_h, &out); + // std::cout<<"OUTPUT BIN:\n"; + // printDeviceVector(odim, cudnn_out, true); + // std::cout<<"FILE BIN:\n"; + // printDeviceVector(odim, out, true); + + dnnType *cudnn_out, *rt_out; + cudnn_out = outs[i]->dstData; + rt_out = (dnnType *)netRT.buffersRT[i+out_count]; + // there is the maxpool. It isn't an output but it is necessary for the process section + if(i==0) + out_count ++; + + std::cout<<"CUDNN vs correct"; + ret_cudnn |= checkResult(odim, cudnn_out, out) == 0 ? 0: ERROR_CUDNN; + std::cout<<"TRT vs correct"; + ret_tensorrt |= checkResult(odim, rt_out, out) == 0 ? 0 : ERROR_TENSORRT; + std::cout<<"CUDNN vs TRT "; + ret_cudnn_tensorrt |= checkResult(odim, cudnn_out, rt_out) == 0 ? 0 : ERROR_CUDNNvsTENSORRT; + } + return ret_cudnn | ret_tensorrt | ret_cudnn_tensorrt; +}