From 7298dcfb2f4db8c98dbc47a0282d6b99256d8f49 Mon Sep 17 00:00:00 2001 From: perseusdg Date: Thu, 6 Jan 2022 16:30:11 +0000 Subject: [PATCH] Added monodepth2.cpp --- CMakeLists.txt | 4 + tests/monodepth2/monodepth2.cpp | 275 ++++++++++++++++++++++++++++++++ 2 files changed, 279 insertions(+) create mode 100644 tests/monodepth2/monodepth2.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 7cc9e33..6a775ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -202,6 +202,10 @@ target_link_libraries(test_shelfnet_berkeley tkDNN) add_executable(test_shelfnet_mapillary tests/shelfnet/shelfnet_mapillary.cpp) target_link_libraries(test_shelfnet_mapillary tkDNN) +# MONODEPTH2 +add_executable(test_monodepth2 tests/monodepth2/monodepth2.cpp) +target_link_libraries(test_monodepth2 tkDNN) + # DEMOS add_executable(test_rtinference tests/test_rtinference/rtinference.cpp) target_link_libraries(test_rtinference tkDNN) diff --git a/tests/monodepth2/monodepth2.cpp b/tests/monodepth2/monodepth2.cpp new file mode 100644 index 0000000..0aa0f2a --- /dev/null +++ b/tests/monodepth2/monodepth2.cpp @@ -0,0 +1,275 @@ +#include +#include +#include +#include +#include + +const char* encoder_conv1_bin = "monodepth2/layers/encoder/encoder-conv1.bin"; +const char* encoder_layer1_bin[] = { + "monodepth2/layers/encoder/encoder-layer1-0-conv1.bin", + "monodepth2/layers/encoder/encoder-layer1-0-conv2.bin", + "monodepth2/layers/encoder/encoder-layer1-1-conv1.bin", + "monodepth2/layers/encoder/encoder-layer1-1-conv2.bin", +}; + +const char* encoder_layer2_bin[] = { + "monodepth2/layers/encoder/encoder-layer2-0-conv1.bin", + "monodepth2/layers/encoder/encoder-layer2-0-conv2.bin", + "monodepth2/layers/encoder/encoder-layer2-0-downsample-0.bin", + "monodepth2/layers/encoder/encoder-layer2-1-conv1.bin", + "monodepth2/layers/encoder/encoder-layer2-1-conv2.bin" +}; + +const char* encoder_layer3_bin[]={ + "monodepth2/layers/encoder/encoder-layer3-0-conv1.bin", + "monodepth2/layers/encoder/encoder-layer3-0-conv2.bin", + "monodepth2/layers/encoder/encoder-layer3-0-downsample-0.bin", + "monodepth2/layers/encoder/encoder-layer3-1-conv1.bin", + "monodepth2/layers/encoder/encoder-layer3-1-conv2.bin" +}; + +const char* encoder_layer4_bin[] = { + "monodepth2/layers/encoder/encoder-layer4-0-conv1.bin", + "monodepth2/layers/encoder/encoder-layer4-0-conv2.bin", + "monodepth2/layers/encoder/encoder-layer4-0-downsample-0.bin", + "monodepth2/layers/encoder/encoder-layer4-1-conv1.bin", + "monodepth2/layers/encoder/encoder-layer4-1-conv2.bin" +}; + +const char *encoder_fc_bin = "monodepth2/layers/encoder/encoder-fc.bin"; + +const char* decoder_layer_bin[] = { + "monodepth2/layers/depth_decoder/decoder-0-conv-conv.bin", + "monodepth2/layers/depth_decoder/decoder-1-conv-conv.bin", + "monodepth2/layers/depth_decoder/decoder-2-conv-conv.bin", + "monodepth2/layers/depth_decoder/decoder-3-conv-conv.bin", + "monodepth2/layers/depth_decoder/decoder-4-conv-conv.bin", + "monodepth2/layers/depth_decoder/decoder-5-conv-conv.bin", + "monodepth2/layers/depth_decoder/decoder-6-conv-conv.bin", + "monodepth2/layers/depth_decoder/decoder-7-conv-conv.bin", + "monodepth2/layers/depth_decoder/decoder-8-conv-conv.bin", + "monodepth2/layers/depth_decoder/decoder-9-conv-conv.bin" +}; + +const char* decoder_dispconv_layer_bin[] = { + "monodepth2/layers/depth_decoder/decoder-10-conv.bin", + "monodepth2/layers/depth_decoder/decoder-11-conv.bin", + "monodepth2/layers/depth_decoder/decoder-12-conv.bin", + "monodepth2/layers/depth_decoder/decoder-13-conv.bin" +}; + +const char* output_bin[] = { + "monodepth2/debug/outputs/output-disp-0.bin", + "monodepth2/debug/outputs/output-disp-1.bin", + "monodepth2/debug/outputs/output-disp-2.bin", + "monodepth2/debug/outputs/output-disp-3.bin" +}; + +const char* input_monodepth2_bin[] = {"monodepth2/debug/input.bin","monodepth2/debug/input2.bin"}; + + +int main(){ + + tk::dnn::dataDim_t dim(1,3,192,640,1); + tk::dnn::Network net(dim); + std::vector features; + new tk::dnn::Conv2d(&net,64,7,7,2,2,3,3,encoder_conv1_bin, true,false,1, true); + tk::dnn::Layer *encoder_relu_1 = new tk::dnn::Activation(&net,CUDNN_ACTIVATION_RELU); + features.push_back(encoder_relu_1); + tk::dnn::Layer *last = new tk::dnn::Pooling(&net,3,3,2,2,1,1,tk::dnn::POOLING_MAX); + + //layer 1 + for(int i=0;i<4;i=i+2){ + new tk::dnn::Conv2d(&net,64,3,3,1,1,1,1,encoder_layer1_bin[i], true,false,1, true); + new tk::dnn::Activation(&net,CUDNN_ACTIVATION_RELU); + new tk::dnn::Conv2d(&net,64,3,3,1,1,1,1,encoder_layer1_bin[i+1],true,false,1,true); + new tk::dnn::Shortcut(&net,last); + last = new tk::dnn::Activation(&net,CUDNN_ACTIVATION_RELU); + } + features.push_back(last); + + //layer2 + new tk::dnn::Conv2d(&net,128,3,3,2,2,1,1,encoder_layer2_bin[0],true,false,1,true); + new tk::dnn::Activation(&net,CUDNN_ACTIVATION_RELU); + tk::dnn::Layer *bn2 = new tk::dnn::Conv2d(&net,128,3,3,1,1,1,1,encoder_layer2_bin[1],true,false,1, true); + new tk::dnn::Route(&net,&last,1); + new tk::dnn::Conv2d(&net,128,1,1,2,2,0,0,encoder_layer2_bin[2], true,false,1, true); + new tk::dnn::Shortcut(&net,bn2); + last = new tk::dnn::Activation(&net,CUDNN_ACTIVATION_RELU); + new tk::dnn::Conv2d(&net,128,3,3,1,1,1,1,encoder_layer2_bin[3],true,false,1, true); + new tk::dnn::Activation(&net,CUDNN_ACTIVATION_RELU); + new tk::dnn::Conv2d(&net,128,3,3,1,1,1,1,encoder_layer2_bin[4],true,false,1, true); + new tk::dnn::Shortcut(&net,last); + last = new tk::dnn::Activation(&net,CUDNN_ACTIVATION_RELU); + features.push_back(last); + + + //layer3 + new tk::dnn::Conv2d(&net,256,3,3,2,2,1,1,encoder_layer3_bin[0],true,false,1, true); + new tk::dnn::Activation(&net,CUDNN_ACTIVATION_RELU); + bn2 = new tk::dnn::Conv2d(&net,256,3,3,1,1,1,1,encoder_layer3_bin[1],true,false,1, true); + new tk::dnn::Route(&net,&last,1); + new tk::dnn::Conv2d(&net,256,1,1,2,2,0,0,encoder_layer3_bin[2], true,false,1,true); + new tk::dnn::Shortcut(&net,bn2); + last = new tk::dnn::Activation(&net,CUDNN_ACTIVATION_RELU); + new tk::dnn::Conv2d(&net,256,3,3,1,1,1,1,encoder_layer3_bin[3],true,false,1, true); + new tk::dnn::Activation(&net,CUDNN_ACTIVATION_RELU); + new tk::dnn::Conv2d(&net,256,3,3,1,1,1,1,encoder_layer3_bin[4],true,false,1, true); + new tk::dnn::Shortcut(&net,last); + last = new tk::dnn::Activation(&net,CUDNN_ACTIVATION_RELU); + features.push_back(last); + + + //layer4 + new tk::dnn::Conv2d(&net,512,3,3,2,2,1,1,encoder_layer4_bin[0],true,false,1, true); + new tk::dnn::Activation(&net,CUDNN_ACTIVATION_RELU); + bn2 = new tk::dnn::Conv2d(&net,512,3,3,1,1,1,1,encoder_layer4_bin[1],true,false,1, true); + new tk::dnn::Route(&net,&last,1); + new tk::dnn::Conv2d(&net,512,1,1,2,2,0,0,encoder_layer4_bin[2], true,false,1, true); + new tk::dnn::Shortcut(&net,bn2); + last = new tk::dnn::Activation(&net,CUDNN_ACTIVATION_RELU); + new tk::dnn::Conv2d(&net,512,3,3,1,1,1,1,encoder_layer4_bin[3],true,false,1, true); + new tk::dnn::Activation(&net,CUDNN_ACTIVATION_RELU); + new tk::dnn::Conv2d(&net,512,3,3,1,1,1,1,encoder_layer4_bin[4],true,false,1, true); + new tk::dnn::Shortcut(&net,last); + last = new tk::dnn::Activation(&net,CUDNN_ACTIVATION_RELU); + features.push_back(last); + + std::vector depth_conv_features; + + //decoders + + new tk::dnn::Shortcut(&net,features[4]); + new tk::dnn::Padding(&net,1,1,tk::dnn::PADDING_MODE_REFLECTION); + new tk::dnn::Conv2d(&net,256,3,3,1,1,0,0,decoder_layer_bin[0], false,false,1, false); + new tk::dnn::Activation(&net,CUDNN_ACTIVATION_ELU); + tk::dnn::Layer *upsample_layer_1 = new tk::dnn::Upsample(&net, 2); + tk::dnn::Layer *layer_1[2] = {features[3],upsample_layer_1}; + new tk::dnn::Route(&net,layer_1,2); + new tk::dnn::Padding(&net,1,1,tk::dnn::PADDING_MODE_REFLECTION); + new tk::dnn::Conv2d(&net,256,3,3,1,1,0,0,decoder_layer_bin[1], false,false,1,false); + new tk::dnn::Activation(&net,CUDNN_ACTIVATION_ELU); + new tk::dnn::Padding(&net,1,1,tk::dnn::PADDING_MODE_REFLECTION); + new tk::dnn::Conv2d(&net,128,3,3,1,1,0,0,decoder_layer_bin[2], false,false,1,false); + new tk::dnn::Activation(&net,CUDNN_ACTIVATION_ELU); + tk::dnn::Layer *upsample_layer_2 = new tk::dnn::Upsample(&net,2); + tk::dnn::Layer *layer_2[2] = {features[2],upsample_layer_2}; + new tk::dnn::Route(&net,layer_2,2); + new tk::dnn::Padding(&net,1,1,tk::dnn::PADDING_MODE_REFLECTION); + new tk::dnn::Conv2d(&net,128,3,3,1,1,0,0,decoder_layer_bin[3], false,false,1,false); + last = new tk::dnn::Activation(&net,CUDNN_ACTIVATION_ELU); + depth_conv_features.push_back(last); + + new tk::dnn::Padding(&net,1,1,tk::dnn::PADDING_MODE_REFLECTION); + new tk::dnn::Conv2d(&net,64,3,3,1,1,0,0,decoder_layer_bin[4],false,false,1,false); + new tk::dnn::Activation(&net,CUDNN_ACTIVATION_ELU); + tk::dnn::Layer* upsample_layer_3 = new tk::dnn::Upsample(&net,2); + tk::dnn::Layer *layer_3[2] = {features[1],upsample_layer_3}; + new tk::dnn::Route(&net,layer_3,2); + new tk::dnn::Padding(&net,1,1,tk::dnn::PADDING_MODE_REFLECTION); + new tk::dnn::Conv2d(&net,64,3,3,1,1,0,0,decoder_layer_bin[5], false,false,1, false); + last = new tk::dnn::Activation(&net,CUDNN_ACTIVATION_ELU); + depth_conv_features.push_back(last); + + new tk::dnn::Padding(&net,1,1,tk::dnn::PADDING_MODE_REFLECTION); + new tk::dnn::Conv2d(&net,32,3,3,1,1,0,0,decoder_layer_bin[6], false,false,1, false); + new tk::dnn::Activation(&net,CUDNN_ACTIVATION_ELU); + tk::dnn::Layer* upsample_layer_4 = new tk::dnn::Upsample(&net,2); + tk::dnn::Layer *layer_4[2] = {features[0],upsample_layer_4}; + new tk::dnn::Route(&net,layer_4,2); + new tk::dnn::Padding(&net,1,1,tk::dnn::PADDING_MODE_REFLECTION); + new tk::dnn::Conv2d(&net,32,3,3,1,1,0,0,decoder_layer_bin[7], false,false,1,false); + last = new tk::dnn::Activation(&net,CUDNN_ACTIVATION_ELU); + depth_conv_features.push_back(last); + + new tk::dnn::Padding(&net,1,1,tk::dnn::PADDING_MODE_REFLECTION); + new tk::dnn::Conv2d(&net,16,3,3,1,1,0,0,decoder_layer_bin[8], false,false,1,false); + new tk::dnn::Activation(&net,CUDNN_ACTIVATION_ELU); + new tk::dnn::Upsample(&net,2); + new tk::dnn::Padding(&net,1,1,tk::dnn::PADDING_MODE_REFLECTION); + new tk::dnn::Conv2d(&net,16,3,3,1,1,0,0,decoder_layer_bin[9], false, false,1, false); + last = new tk::dnn::Activation(&net,CUDNN_ACTIVATION_ELU); + depth_conv_features.push_back(last); + + + new tk::dnn::Route(&net,&depth_conv_features[3],1); + new tk::dnn::Padding(&net,1,1,tk::dnn::PADDING_MODE_REFLECTION); + new tk::dnn::Conv2d(&net,1,3,3,1,1,0,0,decoder_dispconv_layer_bin[0], false, false,1, false); + tk::dnn::Layer *disp0 = new tk::dnn::Activation(&net,CUDNN_ACTIVATION_SIGMOID); + disp0->setFinal(); + + new tk::dnn::Route(&net,&depth_conv_features[2],1); + new tk::dnn::Padding(&net,1,1,tk::dnn::PADDING_MODE_REFLECTION); + new tk::dnn::Conv2d(&net,1,3,3,1,1,0,0,decoder_dispconv_layer_bin[1],false,false,1,false); + tk::dnn::Layer *disp1 = new tk::dnn::Activation(&net,CUDNN_ACTIVATION_SIGMOID); + disp1->setFinal(); + + + new tk::dnn::Route(&net,&depth_conv_features[1],1); + new tk::dnn::Padding(&net,1,1,tk::dnn::PADDING_MODE_REFLECTION); + new tk::dnn::Conv2d(&net,1,3,3,1,1,0,0,decoder_dispconv_layer_bin[2], false,false,1, false); + tk::dnn::Layer *disp2 = new tk::dnn::Activation(&net,CUDNN_ACTIVATION_SIGMOID); + disp2->setFinal(); + + new tk::dnn::Route(&net,&depth_conv_features[0],1); + new tk::dnn::Padding(&net,1,1,tk::dnn::PADDING_MODE_REFLECTION); + new tk::dnn::Conv2d(&net,1,3,3,1,1,0,0,decoder_dispconv_layer_bin[3], false,false,1, false); + tk::dnn::Layer *disp3 = new tk::dnn::Activation(&net,CUDNN_ACTIVATION_SIGMOID); + disp3->setFinal(); + + + + dnnType *data; + dnnType *input_H; + readBinaryFile(input_monodepth2_bin[1],dim.tot(),&input_H,&data); + std::cout<<"INPUT DIMENSIONS : "<output_dim.print(); + int ret_cudnn = 0, ret_tensorrt = 0, ret_cudnn_tensorrt = 0; + for(int i=0;i<4;i++){ + printCenteredTitle((std::string("MONODEPTH2 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); + + dnnType *cudnn_out, *rt_out; + cudnn_out = outs[i]->dstData; + rt_out = (dnnType *)netRT.buffersRT[i]; + 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; +} \ No newline at end of file