Merge branch 'master' into tensorrt8

This commit is contained in:
Francesco Gatti
2022-03-30 16:41:45 +02:00
16 changed files with 1719 additions and 98 deletions
+9
View File
@@ -5,6 +5,10 @@ set(CMAKE_CXX_STANDARD 14)
option(ENABLE_OPENCV_CUDA_CONTRIB "Enable OpenCV CUDA Contrib" OFF ) option(ENABLE_OPENCV_CUDA_CONTRIB "Enable OpenCV CUDA Contrib" OFF )
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "default build" FORCE)
endif(NOT CMAKE_BUILD_TYPE)
find_package(CUDA 9.0 REQUIRED) find_package(CUDA 9.0 REQUIRED)
if (CUDA_FOUND) if (CUDA_FOUND)
set(OUTPUTFILE ${CMAKE_CURRENT_SOURCE_DIR}/cmake/cuda_script) # No suffix required set(OUTPUTFILE ${CMAKE_CURRENT_SOURCE_DIR}/cmake/cuda_script) # No suffix required
@@ -202,12 +206,17 @@ target_link_libraries(test_shelfnet_berkeley tkDNN)
add_executable(test_shelfnet_mapillary tests/shelfnet/shelfnet_mapillary.cpp) add_executable(test_shelfnet_mapillary tests/shelfnet/shelfnet_mapillary.cpp)
target_link_libraries(test_shelfnet_mapillary tkDNN) target_link_libraries(test_shelfnet_mapillary tkDNN)
add_executable(test_shelfnet_coco tests/shelfnet/shelfnet_coco.cpp)
target_link_libraries(test_shelfnet_coco tkDNN)
# MONODEPTH2 # MONODEPTH2
add_executable(test_monodepth2_640 tests/monodepth2/monodepth2_640.cpp) add_executable(test_monodepth2_640 tests/monodepth2/monodepth2_640.cpp)
target_link_libraries(test_monodepth2_640 tkDNN) target_link_libraries(test_monodepth2_640 tkDNN)
add_executable(test_monodepth2_1024 tests/monodepth2/monodepth2_1024.cpp) add_executable(test_monodepth2_1024 tests/monodepth2/monodepth2_1024.cpp)
target_link_libraries(test_monodepth2_1024 tkDNN) target_link_libraries(test_monodepth2_1024 tkDNN)
# DEMOS # DEMOS
add_executable(test_rtinference tests/test_rtinference/rtinference.cpp) add_executable(test_rtinference tests/test_rtinference/rtinference.cpp)
target_link_libraries(test_rtinference tkDNN) target_link_libraries(test_rtinference tkDNN)
+7 -9
View File
@@ -23,12 +23,11 @@ If you use tkDNN in your research, please cite the [following paper](https://iee
- [x] Support 2D/3D Object Detection and Tracking [README](docs/README_2d3dtracking.md) - [x] Support 2D/3D Object Detection and Tracking [README](docs/README_2d3dtracking.md)
#### 24 November 2021 #### 24 November 2021
- [x] Support to sematic segmentation on cuda 11 - [x] Support to sematic segmentation on cuda 11
- [x] Support to TensorRT8 (tensort8 branch). - [x] Support to TensorRT8. (thanks to [Harshvardhan Chandirasekar](https://github.com/perseusdg))
#### 30 March 2022 #### 30 March 2022
- [x] Support to monocular depth esitmation (tensort8 branch) [README](docs/README_depth.md) - [x] Support to monocular depth esitmation [README](docs/README_depth.md) (thanks to [Harshvardhan Chandirasekar](https://github.com/perseusdg))
TensorRT8 (and therefore Jetpack 4.6) is currently supported only on the branch tensort8 due to [performance issue with TensorRT8](https://docs.nvidia.com/deeplearning/tensorrt/release-notes/tensorrt-8.html)). We will merge it to the master as soon as those issues are fixed (probably in future minor releases).
## FPS Results ## FPS Results
Inference FPS of yolov4 with tkDNN, average of 1200 images with the same dimension as the input size, on Inference FPS of yolov4 with tkDNN, average of 1200 images with the same dimension as the input size, on
@@ -120,8 +119,8 @@ git clone https://github.com/ceccocats/tkDNN
cd tkDNN cd tkDNN
mkdir build mkdir build
cd build cd build
cmake -DCMAKE_BUILD_TYPE=Release -G"Ninja" .. cmake -DCMAKE_BUILD_TYPE=Release ..
ninja make
``` ```
## Workflow ## Workflow
@@ -179,11 +178,10 @@ For specific details on how to run tkDNN on Windows 10/11 see [HERE](./docs/wind
| yolo4_320 | Yolov4 <sup>8</sup> | [COCO 2017](http://cocodataset.org/) | 80 | 320x320 | [weights](https://cloud.hipert.unimore.it/s/d97CFzYqCPCp5Hg/download) | | yolo4_320 | Yolov4 <sup>8</sup> | [COCO 2017](http://cocodataset.org/) | 80 | 320x320 | [weights](https://cloud.hipert.unimore.it/s/d97CFzYqCPCp5Hg/download) |
| yolo4_512 | Yolov4 <sup>8</sup> | [COCO 2017](http://cocodataset.org/) | 80 | 512x512 | [weights](https://cloud.hipert.unimore.it/s/d97CFzYqCPCp5Hg/download) | | yolo4_512 | Yolov4 <sup>8</sup> | [COCO 2017](http://cocodataset.org/) | 80 | 512x512 | [weights](https://cloud.hipert.unimore.it/s/d97CFzYqCPCp5Hg/download) |
| yolo4_608 | Yolov4 <sup>8</sup> | [COCO 2017](http://cocodataset.org/) | 80 | 608x608 | [weights](https://cloud.hipert.unimore.it/s/d97CFzYqCPCp5Hg/download) | | yolo4_608 | Yolov4 <sup>8</sup> | [COCO 2017](http://cocodataset.org/) | 80 | 608x608 | [weights](https://cloud.hipert.unimore.it/s/d97CFzYqCPCp5Hg/download) |
| yolo4_berkeley | Yolov4 <sup>8</sup> | [BDD100K ](https://bair.berkeley.edu/blog/2018/05/30/bdd/) | 10 | 540x320 | [weights](https://cloud.hipert.unimore.it/s/nkWFa5fgb4NTdnB/download) | | yolo4_berkeley | Yolov4 <sup>8</sup> | [BDD100K ](https://bair.berkeley.edu/blog/2018/05/30/bdd/) | 10 | 544x320 | [weights](https://cloud.hipert.unimore.it/s/nkWFa5fgb4NTdnB/download) |
| yolo4tiny | Yolov4 tiny <sup>9</sup> | [COCO 2017](http://cocodataset.org/) | 80 | 416x416 | [weights](https://cloud.hipert.unimore.it/s/iRnc4pSqmx78gJs/download) | | yolo4tiny | Yolov4 tiny <sup>9</sup> | [COCO 2017](http://cocodataset.org/) | 80 | 416x416 | [weights](https://cloud.hipert.unimore.it/s/iRnc4pSqmx78gJs/download) |
| yolo4x | Yolov4x-mish <sup>9</sup> | [COCO 2017](http://cocodataset.org/) | | yolo4x | Yolov4x-mish <sup>9</sup> | [COCO 2017](http://cocodataset.org/) | 80 | 640x640 | [weights](https://cloud.hipert.unimore.it/s/5MFjtNtgbDGdJEo/download) |
| yolo4tiny_512 | Yolov4 tiny <sup>9</sup> | [COCO 2017](http://cocodataset.org/) | 80 | 512x512 | [weights](https://cloud.hipert.unimore.it/s/iRnc4pSqmx78gJs/download) | | yolo4tiny_512 | Yolov4 tiny <sup>9</sup> | [COCO 2017](http://cocodataset.org/) | 80 | 512x512 | [weights](https://cloud.hipert.unimore.it/s/iRnc4pSqmx78gJs/download) |
80 | 640x640 | [weights](https://cloud.hipert.unimore.it/s/5MFjtNtgbDGdJEo/download) |
| yolo4x-cps | Scaled Yolov4 <sup>10</sup> | [COCO 2017](http://cocodataset.org/) | 80 | 512x512 | [weights](https://cloud.hipert.unimore.it/s/AfzHE4BfTeEm2gH/download) | | yolo4x-cps | Scaled Yolov4 <sup>10</sup> | [COCO 2017](http://cocodataset.org/) | 80 | 512x512 | [weights](https://cloud.hipert.unimore.it/s/AfzHE4BfTeEm2gH/download) |
| shelfnet | ShelfNet18_realtime<sup>11</sup> | [Cityscapes](https://www.cityscapes-dataset.com/) | 19 | 1024x1024 | [weights](https://cloud.hipert.unimore.it/s/mEDZMRJaGCFWSJF/download) | | shelfnet | ShelfNet18_realtime<sup>11</sup> | [Cityscapes](https://www.cityscapes-dataset.com/) | 19 | 1024x1024 | [weights](https://cloud.hipert.unimore.it/s/mEDZMRJaGCFWSJF/download) |
| shelfnet_berkeley | ShelfNet18_realtime<sup>11</sup> | [DeepDrive](https://bdd-data.berkeley.edu/) | 20 | 1024x1024 | [weights](https://cloud.hipert.unimore.it/s/m92e7QdD9gYMF7f/download) | | shelfnet_berkeley | ShelfNet18_realtime<sup>11</sup> | [DeepDrive](https://bdd-data.berkeley.edu/) | 20 | 1024x1024 | [weights](https://cloud.hipert.unimore.it/s/m92e7QdD9gYMF7f/download) |
+36 -39
View File
@@ -9,7 +9,6 @@
#include "Yolo3Detection.h" #include "Yolo3Detection.h"
bool gRun; bool gRun;
bool SAVE_RESULT = false;
void sig_handler(int signo) { void sig_handler(int signo) {
std::cout<<"request gateway stop\n"; std::cout<<"request gateway stop\n";
@@ -20,44 +19,41 @@ int main(int argc, char *argv[]) {
signal(SIGINT, sig_handler); signal(SIGINT, sig_handler);
#ifdef __linux__ // get config file path and read it
std::string config_file = "../demo/demoConfig.yaml"; #ifdef __linux__
#elif _WIN32 std::string config_file = "../demo/demoConfig.yaml";
std::string config_file = "..\\..\\..\\demo\\demoConfig.yaml"; #elif _WIN32
#endif std::string config_file = "..\\..\\..\\demo\\demoConfig.yaml";
#endif
if(argc > 1){ if(argc > 1)
config_file = argv[1]; config_file = argv[1];
}
YAML::Node conf = YAMLloadConf(config_file);
YAML::Node conf = YAMLloadConf(config_file); if(!conf)
if(!conf){
FatalError("Problem with config file"); FatalError("Problem with config file");
}
// read settings from config file
std::string net = YAMLgetConf<std::string>(conf,"net","yolo4tiny_fp32.rt"); std::string net = YAMLgetConf<std::string>(conf, "net", "yolo4tiny_fp32.rt");
if(!fileExist(net.c_str())) { if(!fileExist(net.c_str()))
FatalError("The given network does not exist. Create the rt first."); FatalError("The given network does not exist. Create the rt first.");
}
#ifdef __linux__ #ifdef __linux__
std::string input = YAMLgetConf<std::string>(conf, "input", "../demo/yolo_test.mp4"); std::string input = YAMLgetConf<std::string>(conf, "input", "../demo/yolo_test.mp4");
std::string cfgPath = YAMLgetConf<std::string>(conf,"cfg_input", "../tests/darknet/cfg/yolo4tiny.cfg"); std::string cfgPath = YAMLgetConf<std::string>(conf,"cfg_input", "../tests/darknet/cfg/yolo4tiny.cfg");
std::string namePath = YAMLgetConf<std::string>(conf,"name_input","../tests/darknet/names/coco.names"); std::string namePath = YAMLgetConf<std::string>(conf,"name_input","../tests/darknet/names/coco.names");
#elif _WIN32 #elif _WIN32
std::string input = YAMLgetConf<std::string>(conf, "win_input", "..\\..\\..\\demo\\yolo_test.mp4"); std::string input = YAMLgetConf<std::string>(conf, "win_input", "..\\..\\..\\demo\\yolo_test.mp4");
std::string cfgPath = YAMLgetConf<std::string>(conf,"cfg_win_input","..\\..\\..\\tests\\darknet\\cfg\\yolo4tiny.cfg"); std::string cfgPath = YAMLgetConf<std::string>(conf,"cfg_win_input","..\\..\\..\\tests\\darknet\\cfg\\yolo4tiny.cfg");
std::string namePath = YAMLgetConf<std::string>(conf,"name_win_input","..\\..\\..\\tests\\darknet\\names\\coco.names"); std::string namePath = YAMLgetConf<std::string>(conf,"name_win_input","..\\..\\..\\tests\\darknet\\names\\coco.names");
#endif #endif
if(!fileExist(input.c_str())) if(!fileExist(input.c_str()))
FatalError("The given input video does not exist."); FatalError("The given input video does not exist.");
char ntype = YAMLgetConf<char>(conf, "ntype", 'y'); char ntype = YAMLgetConf<char>(conf, "ntype", 'y');
int n_classes = YAMLgetConf<int>(conf, "n_classes", 80); int n_classes = YAMLgetConf<int>(conf, "n_classes", 80);
int n_batch = YAMLgetConf<int>(conf, "n_batch", 1); int n_batch = YAMLgetConf<int>(conf, "n_batch", 1);
if(n_batch < 1 || n_batch > 64) if(n_batch < 1 || n_batch > 64)
FatalError("Batch dim not supported"); FatalError("Batch dim not supported");
float conf_thresh = YAMLgetConf<float>(conf, "conf_thresh", 0.3); float conf_thresh = YAMLgetConf<float>(conf, "conf_thresh", 0.3);
bool show = YAMLgetConf<bool>(conf, "show", true); bool show = YAMLgetConf<bool>(conf, "show", true);
bool save = YAMLgetConf<bool>(conf, "save", false); bool save = YAMLgetConf<bool>(conf, "save", false);
@@ -70,7 +66,8 @@ int main(int argc, char *argv[]) {
std::cout <<"Demo settings - input: "<< input std::cout <<"Demo settings - input: "<< input
<<", show: "<< show <<", show: "<< show
<<", save: "<< save<<"\n\n"; <<", save: "<< save<<"\n\n";
// create detection network
tk::dnn::Yolo3Detection yolo; tk::dnn::Yolo3Detection yolo;
tk::dnn::CenternetDetection cnet; tk::dnn::CenternetDetection cnet;
tk::dnn::MobilenetDetection mbnet; tk::dnn::MobilenetDetection mbnet;
@@ -100,8 +97,7 @@ int main(int argc, char *argv[]) {
detNN->init(net,cfgPath,namePath,n_classes,n_batch,conf_thresh); detNN->init(net,cfgPath,namePath,n_classes,n_batch,conf_thresh);
gRun = true; // open video stream
cv::VideoCapture cap(input); cv::VideoCapture cap(input);
if(!cap.isOpened()) if(!cap.isOpened())
gRun = false; gRun = false;
@@ -115,13 +111,15 @@ int main(int argc, char *argv[]) {
resultVideo.open("result.mp4", cv::VideoWriter::fourcc('M','P','4','V'), 30, cv::Size(w, h)); resultVideo.open("result.mp4", cv::VideoWriter::fourcc('M','P','4','V'), 30, cv::Size(w, h));
} }
cv::Mat frame;
if(show) if(show)
cv::namedWindow("detection", cv::WINDOW_NORMAL); cv::namedWindow("detection", cv::WINDOW_NORMAL);
cv::Mat frame;
std::vector<cv::Mat> batch_frame; std::vector<cv::Mat> batch_frame;
std::vector<cv::Mat> batch_dnn_input; std::vector<cv::Mat> batch_dnn_input;
// start detection loop
gRun = true;
while(gRun) { while(gRun) {
batch_dnn_input.clear(); batch_dnn_input.clear();
batch_frame.clear(); batch_frame.clear();
@@ -154,14 +152,13 @@ int main(int argc, char *argv[]) {
} }
std::cout<<"detection end\n"; std::cout<<"detection end\n";
double mean = 0; double mean = 0;
std::cout<<COL_GREENB<<"\n\nTime stats:\n"; std::cout<<COL_GREENB<<"\n\nTime stats:\n";
std::cout<<"Min: "<<*std::min_element(detNN->stats.begin(), detNN->stats.end())/n_batch<<" ms\n"; std::cout<<"Min: "<<*std::min_element(detNN->stats.begin(), detNN->stats.end())<<" ms\n";
std::cout<<"Max: "<<*std::max_element(detNN->stats.begin(), detNN->stats.end())/n_batch<<" ms\n"; std::cout<<"Max: "<<*std::max_element(detNN->stats.begin(), detNN->stats.end())<<" ms\n";
for(int i=0; i<detNN->stats.size(); i++) mean += detNN->stats[i]; mean /= detNN->stats.size(); for(int i=0; i<detNN->stats.size(); i++) mean += detNN->stats[i]; mean /= detNN->stats.size();
std::cout<<"Avg: "<<mean/n_batch<<" ms\t"<<1000/(mean/n_batch)<<" FPS\n"<<COL_END; std::cout<<"Avg: "<<mean<<" ms\t"<<1000/(mean)<<" FPS\n"<<COL_END;
return 0; return 0;
} }
+1 -1
View File
@@ -19,4 +19,4 @@ conf_thresh : 0.3
# demo config # demo config
show : true show : true
save : false save : false
+1
View File
@@ -185,6 +185,7 @@ class SegmentationNN {
checkCuda(cudaMemcpyAsync(stddev_d, stddev.data(), stddev.size() * sizeof(float), cudaMemcpyHostToDevice, netRT->stream)); checkCuda(cudaMemcpyAsync(stddev_d, stddev.data(), stddev.size() * sizeof(float), cudaMemcpyHostToDevice, netRT->stream));
return true; return true;
return true;
} }
/** /**
+1 -1
View File
@@ -23,6 +23,7 @@
#include <ios> #include <ios>
#include <chrono> #include <chrono>
#include <yaml-cpp/yaml.h>
@@ -176,5 +177,4 @@ inline T YAMLgetConf(YAML::Node conf, std::string key, T defaultVal) {
return val; return val;
} }
#endif //UTILS_H #endif //UTILS_H
+43 -39
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
cd build #cd build
RED='\033[1;31m' RED='\033[1;31m'
GREEN='\033[1;32m' GREEN='\033[1;32m'
@@ -29,24 +29,28 @@ function print_output {
} }
out_dir=results
out_file=results.log out_file=results.log
rm $out_file rm -rf $out_dir/
mkdir -p $out_dir
function test_net { function test_net {
./test_$1 &>> $out_file ./test_$1 &> $out_dir/$1_${TKDNN_MODE}_build_$out_file
print_output $? $1 print_output $? $1
./test_rtinference $1*.rt $TKDNN_BATCHSIZE &>> $out_file ./test_rtinference $1*.rt 1 &> $out_dir/$1_${TKDNN_MODE}_inference_batch1_$out_file
print_output $? "infer $1"
./test_rtinference $1*.rt $TKDNN_BATCHSIZE &> $out_dir/$1_${TKDNN_MODE}_inference_batch${TKDNN_BATCHSIZE}_$out_file
print_output $? "batched $1" print_output $? "batched $1"
} }
modes=( 1 ) # only FP32 # modes=( 1 ) # only FP32
# modes=( 1 2 ) # FP32 and FP16 modes=( 1 2 ) # FP32 and FP16
# modes=( 1 2 3 ) # FP32, FP16 and INT8 # modes=( 1 2 3 ) # FP32, FP16 and INT8
for i in "${modes[@]}" for i in "${modes[@]}"
do do
rm *rt rm -f *rt
if [ $i -eq 1 ] if [ $i -eq 1 ]
then then
export TKDNN_MODE=FP32 export TKDNN_MODE=FP32
@@ -73,37 +77,37 @@ do
# print_output $? imuodom # print_output $? imuodom
test_net yolo4 test_net yolo4
test_net yolo4_320 # test_net yolo4_320
test_net yolo4_320_coco2 # test_net yolo4_320_coco2
test_net yolo4_512 # test_net yolo4_512
test_net yolo4_608 # test_net yolo4_608
test_net yolo4-csp # test_net yolo4-csp
test_net yolo4x # test_net yolo4x
test_net yolo4_berkeley # test_net yolo4_berkeley
test_net yolo4_berkeley_f1 # test_net yolo4_berkeley_f1
test_net yolo4tiny # test_net yolo4tiny
test_net yolo4tiny_512 # test_net yolo4tiny_512
test_net yolo3 # test_net yolo3
test_net yolo3_berkeley # test_net yolo3_berkeley
test_net yolo3_coco4 # test_net yolo3_coco4
test_net yolo3_flir # test_net yolo3_flir
test_net yolo3_512 # test_net yolo3_512
test_net yolo3tiny # test_net yolo3tiny
test_net yolo3tiny_512 # test_net yolo3tiny_512
test_net yolo2 # test_net yolo2
test_net yolo2_voc # test_net yolo2_voc
#test_net yolo2tiny # test_net yolo2tiny
test_net csresnext50-panet-spp # test_net csresnext50-panet-spp
#test_net csresnext50-panet-spp_berkeley # test_net csresnext50-panet-spp_berkeley
test_net resnet101_cnet # test_net resnet101_cnet
test_net dla34_cnet # test_net dla34_cnet
test_net dla34_cnet3d # test_net dla34_cnet3d
test_net mobilenetv2ssd # test_net mobilenetv2ssd
test_net mobilenetv2ssd512 # test_net mobilenetv2ssd512
test_net bdd-mobilenetv2ssd # test_net bdd-mobilenetv2ssd
test_net dla34_ctrack # test_net dla34_ctrack
test_net shelfnet # test_net shelfnet
test_net shelfnet_berkeley # test_net shelfnet_berkeley
done done
echo "If errors occured, check logfile $out_file" echo "If errors occured, check logfiles in directory: $out_dir"
+1
View File
@@ -120,6 +120,7 @@ bool CenternetDetection::init(const std::string& tensor_path, const std::string&
dst2.at<float>(2,1)=dst2.at<float>(1,1) + (dst2.at<float>(0,0)-dst2.at<float>(1,0) ); dst2.at<float>(2,1)=dst2.at<float>(1,1) + (dst2.at<float>(0,0)-dst2.at<float>(1,0) );
return true; return true;
return true;
} }
+2 -2
View File
@@ -198,7 +198,7 @@ bool MobilenetDetection::init(const std::string& tensor_path, const std::string&
"bottle" , "wine glass" , "cup" , "fork" , "knife" , "spoon" , "bowl" , "banana" , "bottle" , "wine glass" , "cup" , "fork" , "knife" , "spoon" , "bowl" , "banana" ,
"apple" , "sandwich" , "orange" , "broccoli" , "carrot" , "hot dog" , "pizza" , "apple" , "sandwich" , "orange" , "broccoli" , "carrot" , "hot dog" , "pizza" ,
"donut" , "cake" , "chair" , "sofa" , "pottedplant" , "bed" , "diningtable" , "donut" , "cake" , "chair" , "sofa" , "pottedplant" , "bed" , "diningtable" ,
"toilet" , "tvmonitor" , "laptop" , "mouse" , "remote" , "keyboard" , "toilet" , "tvmonitor" , "laptop" , "mouse" , "remote" , "keyboard" ,
"cell phone" , "microwave" , "oven" , "toaster" , "sink" , "refrigerator" , "cell phone" , "microwave" , "oven" , "toaster" , "sink" , "refrigerator" ,
"book" , "clock" , "vase" , "scissors" , "teddy bear" , "hair drier" , "toothbrush"}; "book" , "clock" , "vase" , "scissors" , "teddy bear" , "hair drier" , "toothbrush"};
classesNames = std::vector<std::string>(classes_names_, std::end(classes_names_)); classesNames = std::vector<std::string>(classes_names_, std::end(classes_names_));
@@ -207,7 +207,7 @@ bool MobilenetDetection::init(const std::string& tensor_path, const std::string&
else{ else{
FatalError("Number of classes not supported for mobilenet"); FatalError("Number of classes not supported for mobilenet");
} }
return 1; return true;
} }
void MobilenetDetection::preprocess(cv::Mat &frame, const int bi){ void MobilenetDetection::preprocess(cv::Mat &frame, const int bi){
+3 -2
View File
@@ -278,6 +278,7 @@ void Yolo::mergeDetections(Yolo::detection *dets, int ndets, int classes, double
} }
total = k+1; total = k+1;
float thresh = 0.45f;
for(k = 0; k < classes; ++k){ for(k = 0; k < classes; ++k){
for(i = 0; i < total; ++i){ for(i = 0; i < total; ++i){
dets[i].sort_class = k; dets[i].sort_class = k;
@@ -288,9 +289,9 @@ void Yolo::mergeDetections(Yolo::detection *dets, int ndets, int classes, double
box a = dets[i].bbox; box a = dets[i].bbox;
for(j = i+1; j < total; ++j){ for(j = i+1; j < total; ++j){
box b = dets[j].bbox; box b = dets[j].bbox;
if (nsm_kind == GREEDY_NMS && yolo_box_iou(a, b) > nms_thresh) if (nsm_kind == GREEDY_NMS && yolo_box_iou(a, b) > thresh)
dets[j].prob[k] = 0; dets[j].prob[k] = 0;
else if (nsm_kind == DIOU_NMS && yolo_box_diou(a, b, nms_thresh) > nms_thresh) else if (nsm_kind == DIOU_NMS && yolo_box_diou(a, b, nms_thresh) > thresh)
dets[j].prob[k] = 0; dets[j].prob[k] = 0;
} }
} }
File diff suppressed because it is too large Load Diff
+2
View File
@@ -0,0 +1,2 @@
person
head
+34
View File
@@ -0,0 +1,34 @@
#include<iostream>
#include<vector>
#include "tkdnn.h"
#include "test.h"
#include "DarknetParser.h"
int main() {
std::string bin_path = "yolo4-csp_crowd";
std::vector<std::string> input_bins = {
bin_path + "/layers/input.bin"
};
std::vector<std::string> output_bins = {
bin_path + "/debug/layer144_out.bin",
bin_path + "/debug/layer159_out.bin",
bin_path + "/debug/layer174_out.bin"
};
std::string wgs_path = bin_path + "/layers";
std::string cfg_path = std::string(TKDNN_PATH) + "/tests/darknet/cfg/yolo4-csp_crowd.cfg";
std::string name_path = std::string(TKDNN_PATH) + "/tests/darknet/names/crowdhuman.names";
downloadWeightsifDoNotExist(input_bins[0], bin_path, "https://cloud.hipert.unimore.it/s/RKWfWNmWXfJigsK/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;
}
+1 -1
View File
@@ -17,7 +17,7 @@ int main() {
std::string wgs_path = bin_path + "/layers"; std::string wgs_path = bin_path + "/layers";
std::string cfg_path = std::string(TKDNN_PATH) + "/tests/darknet/cfg/yolo4_berkeley.cfg"; std::string cfg_path = std::string(TKDNN_PATH) + "/tests/darknet/cfg/yolo4_berkeley.cfg";
std::string name_path = std::string(TKDNN_PATH) + "/tests/darknet/names/berkeley.names"; std::string name_path = std::string(TKDNN_PATH) + "/tests/darknet/names/berkeley.names";
downloadWeightsifDoNotExist(input_bins[0], bin_path, "https://cloud.hipert.unimore.it/s/M7WJdGoGDaDACnN/download"); downloadWeightsifDoNotExist(input_bins[0], bin_path, "https://cloud.hipert.unimore.it/s/q9dwoqQ5YQqEi7s/download");
// parse darknet network // parse darknet network
tk::dnn::Network *net = tk::dnn::darknetParser(cfg_path, wgs_path, name_path); tk::dnn::Network *net = tk::dnn::darknetParser(cfg_path, wgs_path, name_path);
+295
View File
@@ -0,0 +1,295 @@
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "tkdnn.h"
#include "NetworkViz.h"
const char *input_bin = "shelfnet_coco/debug/input.bin";
const char *backbone[] = {
"shelfnet_coco/layers/backbone-conv1.bin",
"shelfnet_coco/layers/backbone-layer1-0-conv1.bin",
"shelfnet_coco/layers/backbone-layer1-0-conv2.bin",
"shelfnet_coco/layers/backbone-layer1-1-conv1.bin",
"shelfnet_coco/layers/backbone-layer1-1-conv2.bin",
"shelfnet_coco/layers/backbone-layer2-0-conv1.bin",
"shelfnet_coco/layers/backbone-layer2-0-conv2.bin",
"shelfnet_coco/layers/backbone-layer2-0-downsample-0.bin",
"shelfnet_coco/layers/backbone-layer2-1-conv1.bin",
"shelfnet_coco/layers/backbone-layer2-1-conv2.bin",
"shelfnet_coco/layers/backbone-layer3-0-conv1.bin",
"shelfnet_coco/layers/backbone-layer3-0-conv2.bin",
"shelfnet_coco/layers/backbone-layer3-0-downsample-0.bin",
"shelfnet_coco/layers/backbone-layer3-1-conv1.bin",
"shelfnet_coco/layers/backbone-layer3-1-conv2.bin",
"shelfnet_coco/layers/backbone-layer4-0-conv1.bin",
"shelfnet_coco/layers/backbone-layer4-0-conv2.bin",
"shelfnet_coco/layers/backbone-layer4-0-downsample-0.bin",
"shelfnet_coco/layers/backbone-layer4-1-conv1.bin",
"shelfnet_coco/layers/backbone-layer4-1-conv2.bin"};
const char *conv_out[] = {
"shelfnet_coco/layers/conv_out-conv-conv.bin",
"shelfnet_coco/layers/conv_out-conv_out.bin",
"shelfnet_coco/layers/conv_out16-conv-conv.bin",
"shelfnet_coco/layers/conv_out16-conv_out.bin",
"shelfnet_coco/layers/conv_out32-conv-conv.bin",
"shelfnet_coco/layers/conv_out32-conv_out.bin"
};
const char *decoder[] = {
"shelfnet_coco/layers/decoder-bottom-conv1.bin",
"shelfnet_coco/layers/decoder-bottom-conv12.bin",
"shelfnet_coco/layers/decoder-up_conv_list-0-conv-conv.bin",
"shelfnet_coco/layers/decoder-up_conv_list-0-conv_atten.bin",
"shelfnet_coco/layers/decoder-up_dense_list-0-conv.bin",
"shelfnet_coco/layers/decoder-up_conv_list-1-conv-conv.bin",
"shelfnet_coco/layers/decoder-up_conv_list-1-conv_atten.bin",
"shelfnet_coco/layers/decoder-up_dense_list-1-conv.bin"
};
const char *ladder[] = {
"shelfnet_coco/layers/ladder-inconv-conv1.bin",
"shelfnet_coco/layers/ladder-inconv-conv12.bin",
"shelfnet_coco/layers/ladder-down_module_list-0-conv1.bin",
"shelfnet_coco/layers/ladder-down_module_list-0-conv12.bin",
"shelfnet_coco/layers/ladder-down_conv_list-0.bin",
"shelfnet_coco/layers/ladder-down_module_list-1-conv1.bin",
"shelfnet_coco/layers/ladder-down_module_list-1-conv12.bin",
"shelfnet_coco/layers/ladder-down_conv_list-1.bin",
"shelfnet_coco/layers/ladder-bottom-conv1.bin",
"shelfnet_coco/layers/ladder-bottom-conv12.bin",
"shelfnet_coco/layers/ladder-up_conv_list-0-conv-conv.bin",
"shelfnet_coco/layers/ladder-up_conv_list-0-conv_atten.bin",
"shelfnet_coco/layers/ladder-up_dense_list-0-conv.bin",
"shelfnet_coco/layers/ladder-up_conv_list-1-conv-conv.bin",
"shelfnet_coco/layers/ladder-up_conv_list-1-conv_atten.bin",
"shelfnet_coco/layers/ladder-up_dense_list-1-conv.bin"};
const char *trans[] = {
"shelfnet_coco/layers/trans1-conv.bin",
"shelfnet_coco/layers/trans2-conv.bin",
"shelfnet_coco/layers/trans3-conv.bin"};
int main()
{
downloadWeightsifDoNotExist(input_bin, "shelfnet_coco", "https://cloud.hipert.unimore.it/s/KfQ9fGJQsgzNbiW/download");
int classes = 183;
// Network layout
tk::dnn::dataDim_t dim(1, 3, 1024, 1024, 1);
tk::dnn::Network net(dim);
int bi = 0, di = 0, li = 0, ci = 0;
new tk::dnn::Conv2d(&net, 64, 7, 7, 2, 2, 3, 3, backbone[bi++], true);
new tk::dnn::Activation (&net, tk::dnn::ACTIVATION_LEAKY, 0.0f, 0.01);
tk::dnn::Layer* last = new tk::dnn::Pooling (&net, 3, 3, 2, 2, 1, 1, tk::dnn::POOLING_MAX);
for(int i=0; i<2; ++i){
new tk::dnn::Conv2d (&net, 64, 3, 3, 1, 1, 1, 1, backbone[bi++], true);
new tk::dnn::Activation (&net, tk::dnn::ACTIVATION_LEAKY, 0.0f, 0.01);
new tk::dnn::Conv2d (&net, 64, 3, 3, 1, 1, 1, 1, backbone[bi++], true);
new tk::dnn::Shortcut(&net, last);
last = new tk::dnn::Activation (&net, CUDNN_ACTIVATION_RELU);
}
std::vector<tk::dnn::Layer*> features;
for(int i=0;i<3;++i){
int out_channel = pow(2,7+i);
std::cout<<out_channel<<std::endl;
new tk::dnn::Conv2d (&net, out_channel, 3, 3, 2, 2, 1, 1, backbone[bi++], true);
new tk::dnn::Activation (&net, tk::dnn::ACTIVATION_LEAKY, 0.0f, 0.01);
tk::dnn::Layer* bn2 = new tk::dnn::Conv2d (&net, out_channel, 3, 3, 1, 1, 1, 1, backbone[bi++], true);
new tk::dnn::Route(&net, &last, 1);
new tk::dnn::Conv2d (&net, out_channel, 1, 1, 2, 2, 0, 0, backbone[bi++], true);
new tk::dnn::Shortcut(&net, bn2);
last = new tk::dnn::Activation (&net, CUDNN_ACTIVATION_RELU);
new tk::dnn::Conv2d (&net, out_channel, 3, 3, 1, 1, 1, 1, backbone[bi++], true);
new tk::dnn::Activation (&net, tk::dnn::ACTIVATION_LEAKY, 0.0f, 0.01);
new tk::dnn::Conv2d (&net, out_channel, 3, 3, 1, 1, 1, 1, backbone[bi++], true);
new tk::dnn::Shortcut(&net, last);
last = new tk::dnn::Activation (&net, CUDNN_ACTIVATION_RELU);
features.push_back(last);
}
for(int i=0; i<features.size(); ++i){
new tk::dnn::Route(&net, &features[i], 1);
int out_channel = pow(2,6+i);
new tk::dnn::Conv2d (&net, out_channel, 1, 1, 1, 1, 0, 0, trans[i], true);
features[i] = new tk::dnn::Activation (&net, tk::dnn::ACTIVATION_LEAKY, 0.0f, 0.01);
}
//DECODER
last = features[2];
std::vector<tk::dnn::Layer*> up_out;
//bottom
new tk::dnn::Conv2d (&net, 256, 3, 3, 1, 1, 1, 1, decoder[di++], true, false, 1, true);
new tk::dnn::Activation (&net, tk::dnn::ACTIVATION_LEAKY, 0.0f, 0.01);
new tk::dnn::Conv2d (&net, 256, 3, 3, 1, 1, 1, 1, decoder[di++], true, false, 1, true);
new tk::dnn::Shortcut(&net, last);
last = new tk::dnn::Activation (&net, CUDNN_ACTIVATION_RELU);
up_out.push_back(last);
for(int i=0; i<2; ++i){
int out_channel = pow(2,7-i);
//up-conv
std::cout<<out_channel<<std::endl;
new tk::dnn::Conv2d (&net, out_channel, 3, 3, 1, 1, 1, 1, decoder[di++], true);
last = new tk::dnn::Activation (&net, tk::dnn::ACTIVATION_LEAKY, 0.0f, 0.01);
new tk::dnn::Pooling(&net, last->output_dim.w, last->output_dim.h, last->output_dim.w, last->output_dim.h, 0, 0, tk::dnn::POOLING_AVERAGE);
new tk::dnn::Conv2d (&net, out_channel, 1, 1, 1, 1, 0, 0, decoder[di++], true);
tk::dnn::Layer* act = new tk::dnn::Activation (&net, CUDNN_ACTIVATION_SIGMOID);
new tk::dnn::Route(&net, &last, 1);
new tk::dnn::Shortcut(&net, act, true);
//interpolate
new tk::dnn::Resize(&net, 1,2,2);
new tk::dnn::Shortcut(&net, features[1-i]);
//up-dense
new tk::dnn::Conv2d (&net, out_channel, 3, 3, 1, 1, 1, 1, decoder[di++], true);
last = new tk::dnn::Activation (&net, tk::dnn::ACTIVATION_LEAKY, 0.0f, 0.01);
up_out.push_back(last);
}
//LADDER
std::vector<tk::dnn::Layer*> down_out;
new tk::dnn::Conv2d (&net, 64, 3, 3, 1, 1, 1, 1, ladder[li++], true, false, 1, true);
new tk::dnn::Activation (&net, tk::dnn::ACTIVATION_LEAKY, 0.0f, 0.01);
new tk::dnn::Conv2d (&net, 64, 3, 3, 1, 1, 1, 1, ladder[li++], true, false, 1, true);
new tk::dnn::Shortcut(&net, last);
new tk::dnn::Activation (&net, CUDNN_ACTIVATION_RELU);
for(int i=0; i<2;++i){
int out_channel = pow(2,6+i);
tk::dnn::Layer* l_last = new tk::dnn::Shortcut(&net, up_out[2-i]);
new tk::dnn::Conv2d (&net, out_channel, 3, 3, 1, 1, 1, 1, ladder[li++], true, false, 1, true);
new tk::dnn::Activation (&net, tk::dnn::ACTIVATION_LEAKY, 0.0f, 0.01);
new tk::dnn::Conv2d (&net, out_channel, 3, 3, 1, 1, 1, 1, ladder[li++], true, false, 1, true);
new tk::dnn::Shortcut(&net, l_last);
l_last = new tk::dnn::Activation (&net, CUDNN_ACTIVATION_RELU);
down_out.push_back(l_last);
new tk::dnn::Conv2d (&net, out_channel*2, 3, 3, 2, 2, 1, 1, ladder[li++], false);
last = new tk::dnn::Activation (&net, tk::dnn::ACTIVATION_LEAKY, 0.0f, 0.0f); //should be ReLU
}
new tk::dnn::Conv2d (&net, 256, 3, 3, 1, 1, 1, 1, ladder[li++], true, false, 1, true);
new tk::dnn::Activation (&net, tk::dnn::ACTIVATION_LEAKY, 0.0f, 0.01);
new tk::dnn::Conv2d (&net, 256, 3, 3, 1, 1, 1, 1, ladder[li++], true, false, 1, true);
new tk::dnn::Shortcut(&net, last);
last = new tk::dnn::Activation (&net, CUDNN_ACTIVATION_RELU);
up_out.clear();
up_out.push_back(last);
for(int i=0; i<2; ++i){
int out_channel = pow(2,7-i);
//up-conv
new tk::dnn::Conv2d (&net, out_channel, 3, 3, 1, 1, 1, 1, ladder[li++], true);
last = new tk::dnn::Activation (&net, tk::dnn::ACTIVATION_LEAKY, 0.0f, 0.01);
new tk::dnn::Pooling(&net, last->output_dim.w, last->output_dim.h, last->output_dim.w, last->output_dim.h, 0, 0, tk::dnn::POOLING_AVERAGE);
new tk::dnn::Conv2d (&net, out_channel, 1, 1, 1, 1, 0, 0, ladder[li++], true);
tk::dnn::Layer* act = new tk::dnn::Activation (&net, CUDNN_ACTIVATION_SIGMOID);
new tk::dnn::Route(&net, &last, 1);
new tk::dnn::Shortcut(&net, act, true);
//interpolate
new tk::dnn::Resize(&net, 1,2,2);
new tk::dnn::Shortcut(&net, down_out[1-i]);
// //up-dense
new tk::dnn::Conv2d (&net, out_channel, 3, 3, 1, 1, 1, 1, ladder[li++], true);
last = new tk::dnn::Activation (&net, tk::dnn::ACTIVATION_LEAKY, 0.0f, 0.01);
up_out.push_back(last);
}
// for(int i=2;i>=0;--i){
// new tk::dnn::Route(&net, &up_out[i], 1);
new tk::dnn::Conv2d (&net, 64, 3, 3, 1, 1, 1, 1, conv_out[ci++], true);
new tk::dnn::Activation (&net, tk::dnn::ACTIVATION_LEAKY, 0.0f, 0.01);
new tk::dnn::Conv2d (&net, classes, 3, 3, 1, 1, 1, 1, conv_out[ci++], false);
/*up_out[i] =*/ new tk::dnn::Resize(&net, classes, net.input_dim.h, net.input_dim.w, true, tk::dnn::ResizeMode_t::LINEAR);
// // }
new tk::dnn::Softmax(&net);
const char *output_bin = "shelfnet_coco/debug/softmax.bin";
// Load input
dnnType *data;
dnnType *input_h;
readBinaryFile(input_bin, dim.tot(), &input_h, &data);
std::cout<<"Input:"<<std::endl;
//print network model
net.print();
// // convert network to tensorRT
tk::dnn::NetworkRT netRT(&net, net.getNetworkRTName("shelfnet_coco"));
tk::dnn::dataDim_t dim1 = dim; //input dim
dnnType *cudnn_out = nullptr;
printCenteredTitle(" CUDNN inference ", '=', 30);
{
dim1.print();
TKDNN_TSTART
cudnn_out = net.infer(dim1, data);
TKDNN_TSTOP
dim1.print();
}
tk::dnn::dataDim_t dim2 = dim;
printCenteredTitle(" TENSORRT inference ", '=', 30);
{
dim2.print();
TKDNN_TSTART
netRT.infer(dim2, data);
TKDNN_TSTOP
dim2.print();
}
dnnType *rt_out1 = (dnnType *)netRT.buffersRT[1];
printCenteredTitle(std::string(" CHECK RESULTS ").c_str(), '=', 30);
dnnType *out1, *out1_h;
int odim1 = dim1.tot();
readBinaryFile(output_bin, odim1, &out1_h, &out1);
int ret_cudnn = 0, ret_tensorrt = 0, ret_cudnn_tensorrt = 0;
// std::cout << "CUDNN vs correct" << std::endl;
// ret_cudnn |= checkResult(odim1, cudnn_out, out1, true, 20) == 0 ? 0 : ERROR_CUDNN;
std::cout << "TRT vs correct" << std::endl;
ret_tensorrt |=checkResult(odim1, rt_out1, out1) == 0 ? 0 : ERROR_TENSORRT;
std::cout << "CUDNN vs TRT " << std::endl;
ret_cudnn_tensorrt |= checkResult(odim1, cudnn_out, rt_out1) == 0 ? 0 : ERROR_CUDNNvsTENSORRT;
cv::Mat viz = vizLayer2Mat(&net, net.num_layers-1);
cv::imwrite("test.png", viz);
return ret_cudnn | ret_tensorrt | ret_cudnn_tensorrt;
}
+4 -4
View File
@@ -1,6 +1,6 @@
#include<iostream> #include<iostream>
#include<algorithm> #include<algorithm>
#include "tkdnn.h" #include "tkDNN/tkdnn.h"
#include <stdlib.h> /* srand, rand */ #include <stdlib.h> /* srand, rand */
@@ -66,11 +66,11 @@ int main(int argc, char *argv[]) {
} }
} }
double min = *std::min_element(stats.begin(), stats.end())/BATCH_SIZE; double min = *std::min_element(stats.begin(), stats.end()); ///BATCH_SIZE;
double max = *std::max_element(stats.begin(), stats.end())/BATCH_SIZE; double max = *std::max_element(stats.begin(), stats.end()); ///BATCH_SIZE;
double mean =0; double mean =0;
for(int i=0; i<stats.size(); i++) mean += stats[i]; mean /= stats.size(); for(int i=0; i<stats.size(); i++) mean += stats[i]; mean /= stats.size();
mean /=BATCH_SIZE; //mean /=BATCH_SIZE;
std::cout<<"Min: "<<min<<" ms\n"; std::cout<<"Min: "<<min<<" ms\n";
std::cout<<"Max: "<<max<<" ms\n"; std::cout<<"Max: "<<max<<" ms\n";