Update 3d detection

This commit updates the CenternetDetection3d class and fixes
some bugs.

It also removes the resnet101 network for CenterNet 3D.
This network doesn't exist.

Signed-off-by: Davide Sapienza <sapienza.dav@gmail.com>
This commit is contained in:
Davide Sapienza
2021-07-21 15:51:13 +02:00
parent f78f7bfddc
commit be2d361ac6
4 changed files with 55 additions and 486 deletions
-3
View File
@@ -114,9 +114,6 @@ target_link_libraries(test_resnet101_cnet tkDNN)
add_executable(test_dla34_cnet tests/centernet/dla34_cnet/dla34_cnet.cpp)
target_link_libraries(test_dla34_cnet tkDNN)
add_executable(test_resnet101_cnet3d tests/centernet/resnet101_cnet3d/resnet101_cnet3d.cpp)
target_link_libraries(test_resnet101_cnet3d tkDNN)
add_executable(test_dla34_cnet3d tests/centernet/dla34_cnet3d/dla34_cnet3d.cpp)
target_link_libraries(test_dla34_cnet3d tkDNN)
+2
View File
@@ -61,6 +61,8 @@ private:
#endif
cv::Mat r;
float *d_ptrs;
cv::Size sz_old;
cv::Mat src;
cv::Mat dst;
+53 -40
View File
@@ -106,17 +106,22 @@ bool CenternetDetection3D::init(const std::string& tensor_path, const int n_clas
calibs_.at<float>(0,2) = 604.0814;
calibs_.at<float>(1,1) = 707.0493;
calibs_.at<float>(1,2) = 180.5066;
calibs_.at<float>(0,3) = 45.75831;
calibs_.at<float>(1,3) = -0.3454157;
calibs_.at<float>(2,2) = 1.0;
calibs_.at<float>(2,3) = 0.004981016;
}
else {
calibs_.at<float>(0,0) = inputCalibs[bi].at<float>(0,0) * dim.w / 1440;
calibs_.at<float>(0,2) = inputCalibs[bi].at<float>(0,2) * dim.w / 1440;
calibs_.at<float>(1,1) = inputCalibs[bi].at<float>(1,1) * dim.h / 1080;
calibs_.at<float>(1,2) = inputCalibs[bi].at<float>(1,2) * dim.h / 1080;
calibs_.at<float>(0,0) = inputCalibs[bi].at<float>(0,0);// * (1440.0/dim.w);// / 1440;
calibs_.at<float>(0,2) = inputCalibs[bi].at<float>(0,2);// * (1440.0/dim.w);// / 1440;
calibs_.at<float>(1,1) = inputCalibs[bi].at<float>(1,1);// * (1080.0/dim.h);//dim.h / 1080;
calibs_.at<float>(1,2) = inputCalibs[bi].at<float>(1,2);// * (1080.0/dim.h);//dim.h / 1080;
calibs_.at<float>(2,2) = 1.0;
}
calibs_.at<float>(0,3) = 45.75831;
calibs_.at<float>(1,3) = -0.3454157;
calibs_.at<float>(2,2) = 1.0;
calibs_.at<float>(2,3) = 0.004981016;
// calibs_.at<float>(0,3) = 45.75831;
// calibs_.at<float>(1,3) = -0.3454157;
// calibs_.at<float>(2,2) = 1.0;
// calibs_.at<float>(2,3) = 0.004981016;
calibs.push_back(calibs_);
}
@@ -165,16 +170,21 @@ bool CenternetDetection3D::init(const std::string& tensor_path, const int n_clas
}
void CenternetDetection3D::preprocess(cv::Mat &frame, const int bi){
// auto start_t = std::chrono::steady_clock::now();
// auto step_t = std::chrono::steady_clock::now();
// auto end_t = std::chrono::steady_clock::now();
cv::Size sz = originalSize[bi];
// std::cout<<"image: "<<sz.width<<", "<<sz.height<<std::endl;
cv::Size sz_old;
float scale = 1.0;
float new_height = sz.height * scale;
float new_width = sz.width * scale;
float new_height = dim.h;//sz.height * scale;
float new_width = dim.w;//sz.width * scale;
if(sz.height != sz_old.height && sz.width != sz_old.width){
if(inputCalibs.size() == 0 || inputCalibs[bi].empty()) {
calibs[bi].at<float>(0,2) = new_width / 2.0f;
calibs[bi].at<float>(1,2) = new_height /2.0f;
}
else {
calibs[bi].at<float>(0,0) = inputCalibs[bi].at<float>(0,0) * 2.0 * dim.w / sz.width;
calibs[bi].at<float>(0,2) = inputCalibs[bi].at<float>(0,2) * dim.w / sz.width ;
calibs[bi].at<float>(1,1) = inputCalibs[bi].at<float>(1,1) * 2.0 * dim.h / sz.height;
calibs[bi].at<float>(1,2) = inputCalibs[bi].at<float>(1,2) * dim.h / sz.height;
}
float c[] = {new_width / 2.0f, new_height /2.0f};
float s[] = {new_width, new_height};
// ----------- get_affine_transform
@@ -206,13 +216,13 @@ void CenternetDetection3D::preprocess(cv::Mat &frame, const int bi){
}
sz_old = sz;
#ifdef OPENCV_CUDACONTRIB
std::cout<<"OPENCV CPMTROB\n";
// std::cout<<"OPENCV CPMTROB\n";
cv::cuda::GpuMat im_Orig;
cv::cuda::GpuMat imageF1_d, imageF2_d;
im_Orig = cv::cuda::GpuMat(frame);
// cv::cuda::resize (im_Orig, imageF1_d, cv::Size(new_width, new_height));
imageF1_d = im_Orig;
cv::cuda::resize (im_Orig, imageF1_d, cv::Size(dim.w, dim.h));//cv::Size(new_width, new_height));
// imageF1_d = im_Orig;
checkCuda( cudaDeviceSynchronize() );
sz = imageF1_d.size();
@@ -252,10 +262,10 @@ void CenternetDetection3D::preprocess(cv::Mat &frame, const int bi){
// std::cout << " TIME Memcpy to input_d: " << std::chrono::duration_cast<std::chrono:: microseconds>(end_t - step_t).count() << " us" << std::endl;
// step_t = end_t;
#else
std::cout<<"NO OPENCV CPMTROB\n";
// std::cout<<"NO OPENCV CPMTROB\n";
cv::Mat imageF;
// resize(frame, imageF, cv::Size(new_width, new_height));
imageF = frame;
resize(frame, imageF, cv::Size(dim.w, dim.h));//cv::Size(new_width, new_height));
// imageF = frame;
sz = imageF.size();
// std::cout<<"size: "<<sz.height<<" "<<sz.width<<" - "<<std::endl;
// end_t = std::chrono::steady_clock::now();
@@ -485,37 +495,40 @@ void CenternetDetection3D::draw(std::vector<cv::Mat>& frames) {
int thickness = 2;
for(int bi=0; bi<frames.size(); ++bi){
float scale_x = float(originalSize[bi].width)/dim.w;
float scale_y = float(originalSize[bi].height)/dim.h;
resize(frames[bi], frames[bi], originalSize[bi]);
// draw dets
for(int i=0; i<batchDetected[bi].size(); i++) {
b = batchDetected[bi][i];
for(int ind_f = 3; ind_f>=0; ind_f--) {
for(int j=0; j<4; j++) {
cv::line(frames[bi], cv::Point(b.corners.at(faceId.at(ind_f).at(j) * 2),
b.corners.at(faceId.at(ind_f).at(j) * 2 + 1)),
cv::Point(b.corners.at(faceId.at(ind_f).at((j+1)%4) * 2),
b.corners.at(faceId.at(ind_f).at((j+1)%4) * 2 + 1)),
cv::line(frames[bi], cv::Point(b.corners.at(faceId.at(ind_f).at(j) * 2) * scale_x,
b.corners.at(faceId.at(ind_f).at(j) * 2 + 1) * scale_y),
cv::Point(b.corners.at(faceId.at(ind_f).at((j+1)%4) * 2) * scale_x,
b.corners.at(faceId.at(ind_f).at((j+1)%4) * 2 + 1) * scale_y),
colors[b.cl], 2);
if(ind_f == 0) {
cv::line(frames[bi], cv::Point(b.corners.at(faceId.at(ind_f).at(0) * 2),
b.corners.at(faceId.at(ind_f).at(0) * 2 + 1)),
cv::Point(b.corners.at(faceId.at(ind_f).at(2) * 2),
b.corners.at(faceId.at(ind_f).at(2) * 2 + 1)), colors[b.cl], 2);
cv::line(frames[bi], cv::Point(b.corners.at(faceId.at(ind_f).at(1) * 2),
b.corners.at(faceId.at(ind_f).at(1) * 2 + 1)),
cv::Point(b.corners.at(faceId.at(ind_f).at(3) * 2),
b.corners.at(faceId.at(ind_f).at(3) * 2 + 1)), colors[b.cl], 2);
cv::line(frames[bi], cv::Point(b.corners.at(faceId.at(ind_f).at(0) * 2) * scale_x,
b.corners.at(faceId.at(ind_f).at(0) * 2 + 1)* scale_y),
cv::Point(b.corners.at(faceId.at(ind_f).at(2) * 2) * scale_x,
b.corners.at(faceId.at(ind_f).at(2) * 2 + 1) * scale_y), colors[b.cl], 2);
cv::line(frames[bi], cv::Point(b.corners.at(faceId.at(ind_f).at(1) * 2)* scale_x,
b.corners.at(faceId.at(ind_f).at(1) * 2 + 1)* scale_y),
cv::Point(b.corners.at(faceId.at(ind_f).at(3) * 2)* scale_x,
b.corners.at(faceId.at(ind_f).at(3) * 2 + 1)* scale_y), colors[b.cl], 2);
}
}
}
// draw label
cv::Size text_size = getTextSize(classesNames[b.cl], cv::FONT_HERSHEY_SIMPLEX, font_scale, thickness, &baseline);
cv::rectangle(frames[bi], cv::Point(b.corners.at(faceId.at(0).at(0) * 2),
b.corners.at(faceId.at(0).at(0) * 2 + 1)),
cv::Point((b.corners.at(faceId.at(0).at(0) * 2) + text_size.width - 2),
(b.corners.at(faceId.at(0).at(0) * 2 + 1)) - text_size.height - 2), colors[b.cl], -1);
cv::putText(frames[bi], classesNames[b.cl], cv::Point(b.corners.at(faceId.at(0).at(0) * 2),
b.corners.at(faceId.at(0).at(0) * 2 + 1) - (baseline / 2)),
cv::rectangle(frames[bi], cv::Point(b.corners.at(faceId.at(0).at(0) * 2)* scale_x,
b.corners.at(faceId.at(0).at(0) * 2 + 1)* scale_y),
cv::Point((b.corners.at(faceId.at(0).at(0) * 2)* scale_x + text_size.width - 2),
(b.corners.at(faceId.at(0).at(0) * 2 + 1)* scale_y - text_size.height - 2)), colors[b.cl], -1);
cv::putText(frames[bi], classesNames[b.cl], cv::Point(b.corners.at(faceId.at(0).at(0) * 2)* scale_x,
(b.corners.at(faceId.at(0).at(0) * 2 + 1)* scale_y - (baseline / 2))),
cv::FONT_HERSHEY_SIMPLEX, font_scale, cv::Scalar(255, 255, 255), thickness);
}
}
@@ -1,443 +0,0 @@
#include <iostream>
#include "kernels.h"
#include "Yolo3Detection.h"
#include "tkdnn.h"
#include <vector>
#include <numeric> // std::iota
#include <algorithm> // 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/xH5oH9t5wdnktYf/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();
TKDNN_TSTART
net.infer(dim1, data);
TKDNN_TSTOP
dim1.print();
}
// printDeviceVector(64, cudnn_out, true);
tk::dnn::dataDim_t dim2 = dim;
printCenteredTitle(" TENSORRT inference ", '=', 30);
{
dim2.print();
TKDNN_TSTART
netRT.infer(dim2, data);
TKDNN_TSTOP
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;
}