diff --git a/CMakeLists.txt b/CMakeLists.txt index 8043e4e..8943dd5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,17 +18,11 @@ find_package(CUDA 9.0 REQUIRED) SET(CUDA_SEPARABLE_COMPILATION ON) #set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -arch=sm_30 --compiler-options '-fPIC'") -# compile Discovery only if TensorRT is installed -find_library(NVINFER NAMES nvinfer) -if(NVINFER STREQUAL "NVINFER-NOTFOUND") - set(NVINFER_INCLUDES "/usr/local/nvidia/tensorrt/include/") - link_directories(/usr/local/nvidia/tensorrt/targets/x86_64-linux-gnu/lib/ - /usr/local/cuda/targets/x86_64-linux/lib/) -endif() +find_package(CUDNN REQUIRED) # compile file(GLOB tkdnn_CUSRC "src/kernels/*.cu") -cuda_include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include ${CUDA_INCLUDE_DIRS} ${NVINFER_INCLUDES}) +cuda_include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include ${CUDA_INCLUDE_DIRS} ${CUDNN_INCLUDE_DIRS}) cuda_add_library(kernels SHARED ${tkdnn_CUSRC}) @@ -43,7 +37,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DOPENCV") # Build Libraries #------------------------------------------------------------------------------- file(GLOB tkdnn_SRC "src/*.cpp") -set(tkdnn_LIBS kernels ${CUDA_LIBRARIES} ${CUDA_CUBLAS_LIBRARIES} -lcudnn -lnvinfer ${OpenCV_LIBS}) +set(tkdnn_LIBS kernels ${CUDA_LIBRARIES} ${CUDA_CUBLAS_LIBRARIES} ${CUDNN_LIBRARIES} ${OpenCV_LIBS}) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11") include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include ${CUDA_INCLUDE_DIRS} ${OPENCV_INCLUDE_DIRS} ${NVINFER_INCLUDES}) diff --git a/README.md b/README.md index b166f63..3b16ec3 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,10 @@ tkDNN is a Deep Neural Network library built with cuDNN primitives specifically The main scope is to do high performance inference on already trained models. this branch actually work on every NVIDIA GPU that support the dependencies: -* CUDA 9 -* CUDNN 7.105 -* TENSORRT 4.02 +* CUDA 10.0 +* CUDNN 7.603 +* TENSORRT 6.01 +* OPENCV 4.1 ## Workflow The recommended workflow follow these step: @@ -48,5 +49,3 @@ this will genereate a yolo3_berkeley.rt file that can be used for live detection ./yolo3_demo # launch detection on a demo video ./yolo3_demo yolo3_berkeley.rt /dev/video0 # launch detection on device 0 ``` - - diff --git a/cmake/FindCUDNN.cmake b/cmake/FindCUDNN.cmake new file mode 100644 index 0000000..f240fcb --- /dev/null +++ b/cmake/FindCUDNN.cmake @@ -0,0 +1,33 @@ +# Find the header files + +find_path(CUDNN_INCLUDE_DIR + ${CMAKE_SYSROOT}/usr/local/include + ${CMAKE_SYSROOT}/usr/include + /usr/local/nvidia/tensorrt/include/ + NO_DEFAULT_PATH +) + +set(OLD_ROOT ${CMAKE_FIND_ROOT_PATH}) +list(APPEND CMAKE_FIND_ROOT_PATH /) +list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES .so.7) +list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES .so.5) +find_library(CUDNN_LIB + NAMES cudnn + PATHS + /usr/local/driveworks/targets/${CMAKE_SYSTEM_PROCESSOR}-Linux/lib + /usr/lib/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu/ + NO_DEFAULT_PATH +) +find_library(CUDNN_NVLIB + NAMES "nvinfer" + PATHS + /usr/local/driveworks/targets/${CMAKE_SYSTEM_PROCESSOR}-Linux/lib + /usr/lib/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu/ + NO_DEFAULT_PATH +) +set(CMAKE_FIND_ROOT_PATH ${OLD_ROOT}) + +set(CUDNN_LIBRARIES ${CUDNN_LIB} ${CUDNN_NVLIB}) +message("-- Found CUDNN: " ${CUDNN_LIB}) +message("-- Found NVINFER: " ${CUDNN_NVLIB}) +set(CUDNN_FOUND true) diff --git a/cmake/tkDNNConfig.cmake b/cmake/tkDNNConfig.cmake index fd06286..4dbaf21 100644 --- a/cmake/tkDNNConfig.cmake +++ b/cmake/tkDNNConfig.cmake @@ -4,27 +4,21 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++11 -fPIC") find_package(CUDA REQUIRED) find_package(OpenCV REQUIRED) -find_library(NVINFER NAMES nvinfer) -if(NVINFER STREQUAL "NVINFER-NOTFOUND") - set(NVINFER_INCLUDES "/usr/local/nvidia/tensorrt/include/") - link_directories(/usr/local/nvidia/tensorrt/targets/x86_64-linux-gnu/lib/ - /usr/local/cuda/targets/x86_64-linux/lib/) -endif() +find_package(CUDNN REQUIRED) set(tkDNN_INCLUDE_DIRS ${CUDA_INCLUDE_DIRS} ${OPENCV_INCLUDE_DIRS} - ${NVINFER_INCLUDES} + ${CUDNN_INCLUDE_DIRS} ) set(tkDNN_LIBRARIES tkDNN kernels ${CUDA_LIBRARIES} - ${CUDA_CUBLAS_LIBRARIES} - -lcudnn - -lnvinfer - ${OpenCV_LIBS} + ${CUDA_CUBLAS_LIBRARIES} + ${CUDNN_LIBRARIES} + ${OpenCV_LIBS} ) set(tkDNN_FOUND true) diff --git a/demo/demo/demo.cpp b/demo/demo/demo.cpp index 295b2af..0d5cc28 100644 --- a/demo/demo/demo.cpp +++ b/demo/demo/demo.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include "Yolo3Detection.h" @@ -46,9 +47,9 @@ int main(int argc, char *argv[]) { cv::VideoWriter resultVideo; if(SAVE_RESULT) { - int w = cap.get(CV_CAP_PROP_FRAME_WIDTH); - int h = cap.get(CV_CAP_PROP_FRAME_HEIGHT); - resultVideo.open("result.mp4", CV_FOURCC('M','P','4','V'), 30, cv::Size(w, h)); + int w = cap.get(cv::CAP_PROP_FRAME_WIDTH); + int h = cap.get(cv::CAP_PROP_FRAME_HEIGHT); + resultVideo.open("result.mp4", cv::VideoWriter::fourcc('M','P','4','V'), 30, cv::Size(w, h)); } cv::Mat frame; diff --git a/include/tkDNN/Layer.h b/include/tkDNN/Layer.h index f5ac6a7..d8f8ddf 100644 --- a/include/tkDNN/Layer.h +++ b/include/tkDNN/Layer.h @@ -26,6 +26,8 @@ enum layerType_t { LAYER_YOLO }; +#define TKDNN_BN_MIN_EPSILON 1e-5 + /** Simple layer Father class */ diff --git a/src/Conv2d.cpp b/src/Conv2d.cpp index ef73e40..f984f67 100644 --- a/src/Conv2d.cpp +++ b/src/Conv2d.cpp @@ -113,7 +113,7 @@ void Conv2d::inferCUDNN(dnnType* srcData, bool back) { dstTensorDesc, dstData, dstTensorDesc, dstData, biasTensorDesc, //same tensor descriptor as bias scales_d, bias_d, mean_d, variance_d, - CUDNN_BN_MIN_EPSILON) ); + TKDNN_BN_MIN_EPSILON) ); } } diff --git a/src/DeformConv2d.cpp b/src/DeformConv2d.cpp index 3d1fad2..8997593 100644 --- a/src/DeformConv2d.cpp +++ b/src/DeformConv2d.cpp @@ -124,7 +124,7 @@ dnnType* DeformConv2d::infer(dataDim_t &dim, dnnType* srcData) { dstTensorDesc, dstData, dstTensorDesc, dstData, biasTensorDesc, //same tensor descriptor as bias scales_d, bias_d, mean_d, variance_d, - CUDNN_BN_MIN_EPSILON) ); + TKDNN_BN_MIN_EPSILON) ); } //update data dimensions diff --git a/src/LayerWgs.cpp b/src/LayerWgs.cpp index 2f7c7fc..a18fd53 100644 --- a/src/LayerWgs.cpp +++ b/src/LayerWgs.cpp @@ -35,7 +35,7 @@ LayerWgs::LayerWgs(Network *net, int inputs, int outputs, seek += outputs; readBinaryFile(weights_path.c_str(), outputs, &variance_h, &variance_d, seek, net->dontLoadWeights); - float eps = CUDNN_BN_MIN_EPSILON; + float eps = TKDNN_BN_MIN_EPSILON; power_h = new dnnType[outputs]; for(int i=0; i