|
| 1 | +cmake_minimum_required(VERSION 3.5) |
| 2 | +project(traffic_light_classifier) |
| 3 | + |
| 4 | +if(NOT CMAKE_CXX_STANDARD) |
| 5 | + set(CMAKE_CXX_STANDARD 14) |
| 6 | +endif() |
| 7 | +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") |
| 8 | + add_compile_options(-Wall -Wextra -Wpedantic -Wno-deprecated-declarations -Werror) |
| 9 | +endif() |
| 10 | + |
| 11 | +option(CUDA_VERBOSE "Verbose output of CUDA modules" OFF) |
| 12 | +# set flags for CUDA availability |
| 13 | +option(CUDA_AVAIL "CUDA available" OFF) |
| 14 | +find_package(CUDA) |
| 15 | +if (CUDA_FOUND) |
| 16 | + find_library(CUBLAS_LIBRARIES cublas HINTS |
| 17 | + ${CUDA_TOOLKIT_ROOT_DIR}/lib64 |
| 18 | + ${CUDA_TOOLKIT_ROOT_DIR}/lib |
| 19 | + ) |
| 20 | + if (CUDA_VERBOSE) |
| 21 | + message(STATUS "CUDA is available!") |
| 22 | + message(STATUS "CUDA Libs: ${CUDA_LIBRARIES}") |
| 23 | + message(STATUS "CUDA Headers: ${CUDA_INCLUDE_DIRS}") |
| 24 | + endif () |
| 25 | + set(CUDA_AVAIL ON) |
| 26 | +else() |
| 27 | + message(STATUS "CUDA NOT FOUND") |
| 28 | + set(CUDA_AVAIL OFF) |
| 29 | +endif (CUDA_FOUND) |
| 30 | + |
| 31 | +# set flags for TensorRT availability |
| 32 | +option(TRT_AVAIL "TensorRT available" OFF) |
| 33 | +# try to find the tensorRT modules |
| 34 | +find_library(NVINFER NAMES nvinfer) |
| 35 | +find_library(NVONNXPARSER nvonnxparser) |
| 36 | +find_library(NVINFER_PLUGIN NAMES nvinfer_plugin) |
| 37 | +if(NVINFER AND NVONNXPARSER AND NVINFER_PLUGIN) |
| 38 | + if (CUDA_VERBOSE) |
| 39 | + message(STATUS "TensorRT is available!") |
| 40 | + message(STATUS "NVINFER: ${NVINFER}") |
| 41 | + message(STATUS "NVPARSERS: ${NVPARSERS}") |
| 42 | + message(STATUS "NVINFER_PLUGIN: ${NVINFER_PLUGIN}") |
| 43 | + message(STATUS "NVONNXPARSER: ${NVONNXPARSER}") |
| 44 | + endif () |
| 45 | + set(TRT_AVAIL ON) |
| 46 | +else() |
| 47 | + message(STATUS "TensorRT is NOT Available") |
| 48 | + set(TRT_AVAIL OFF) |
| 49 | +endif() |
| 50 | + |
| 51 | +# set flags for CUDNN availability |
| 52 | +option(CUDNN_AVAIL "CUDNN available" OFF) |
| 53 | +# try to find the CUDNN module |
| 54 | +find_library(CUDNN_LIBRARY |
| 55 | + NAMES libcudnn.so${__cudnn_ver_suffix} libcudnn${__cudnn_ver_suffix}.dylib ${__cudnn_lib_win_name} |
| 56 | + PATHS $ENV{LD_LIBRARY_PATH} ${__libpath_cudart} ${CUDNN_ROOT_DIR} ${PC_CUDNN_LIBRARY_DIRS} ${CMAKE_INSTALL_PREFIX} |
| 57 | + PATH_SUFFIXES lib lib64 bin |
| 58 | + DOC "CUDNN library." ) |
| 59 | +if(CUDNN_LIBRARY) |
| 60 | + if (CUDA_VERBOSE) |
| 61 | + message(STATUS "CUDNN is available!") |
| 62 | + message(STATUS "CUDNN_LIBRARY: ${CUDNN_LIBRARY}") |
| 63 | + endif () |
| 64 | + set(CUDNN_AVAIL ON) |
| 65 | + |
| 66 | +else() |
| 67 | + message(STATUS "CUDNN is NOT Available") |
| 68 | + set(CUDNN_AVAIL OFF) |
| 69 | +endif() |
| 70 | + |
| 71 | +# Download caffemodel and prototxt |
| 72 | +set(PRETRAINED_MODEL_LINK "https://drive.google.com/uc?id=15CQceCn9TZDU6huKJacQvUnDiLHionb3") |
| 73 | +set(PRETRAINED_MODEL_HASH 7dc31c696b0400ddfc2cc5521586fa51) |
| 74 | +set(LAMP_LABEL_LINK "https://drive.google.com/uc?id=1D7n3oGSWLkWgxET6PcWqEzOhmmPcqM52") |
| 75 | +set(LAMP_LABEL_HASH 20167c8e9a1f9d2ec7b0b0088c4100f0) |
| 76 | + |
| 77 | +find_program(GDOWN_AVAIL "gdown") |
| 78 | +if (NOT GDOWN_AVAIL) |
| 79 | + message(STATUS "gdown: command not found. External files could not be downloaded.") |
| 80 | +endif() |
| 81 | +set(PATH "${CMAKE_CURRENT_SOURCE_DIR}/data") |
| 82 | +if (NOT EXISTS "${PATH}") |
| 83 | + execute_process(COMMAND mkdir -p ${PATH}) |
| 84 | +endif() |
| 85 | +set(FILE "${PATH}/traffic_light_classifier_mobilenetv2.onnx") |
| 86 | +message(STATUS "Checking and downloading traffic_light_classifier_mobilenetv2.onnx") |
| 87 | +if (EXISTS "${FILE}") |
| 88 | + file(MD5 "${FILE}" EXISTING_FILE_HASH) |
| 89 | + if (NOT "${PRETRAINED_MODEL_HASH}" EQUAL "${EXISTING_FILE_HASH}") |
| 90 | + message(STATUS "... file hash changed. Downloading now ...") |
| 91 | + execute_process(COMMAND gdown --quiet "${PRETRAINED_MODEL_LINK}" -O ${PATH}/traffic_light_classifier_mobilenetv2.onnx) |
| 92 | + endif() |
| 93 | +else() |
| 94 | + message(STATUS "... file does not exist. Downloading now ...") |
| 95 | + execute_process(COMMAND gdown --quiet "${PRETRAINED_MODEL_LINK}" -O ${PATH}/traffic_light_classifier_mobilenetv2.onnx) |
| 96 | +endif() |
| 97 | + |
| 98 | +set(FILE "${PATH}/lamp_labels.txt") |
| 99 | +message(STATUS "Checking and downloading lamp_labels.txt") |
| 100 | +if (EXISTS "${FILE}") |
| 101 | + file(MD5 "${FILE}" EXISTING_FILE_HASH) |
| 102 | + if (NOT "${LAMP_LABEL_HASH}" EQUAL "${EXISTING_FILE_HASH}") |
| 103 | + message(STATUS "... file does not exist. Downloading now ...") |
| 104 | + execute_process(COMMAND gdown --quiet "${LAMP_LABEL_LINK}" -O ${PATH}/lamp_labels.txt) |
| 105 | + endif() |
| 106 | +else() |
| 107 | + message(STATUS "... file does not exist. Downloading now ...") |
| 108 | + execute_process(COMMAND gdown --quiet "${LAMP_LABEL_LINK}" -O ${PATH}/lamp_labels.txt) |
| 109 | +endif() |
| 110 | + |
| 111 | +find_package(ament_cmake_auto REQUIRED) |
| 112 | +ament_auto_find_build_dependencies() |
| 113 | +find_package(OpenCV REQUIRED) |
| 114 | +find_package(Boost REQUIRED COMPONENTS filesystem) |
| 115 | + |
| 116 | +if(TRT_AVAIL AND CUDA_AVAIL AND CUDNN_AVAIL) |
| 117 | + add_definitions(-DENABLE_GPU) |
| 118 | + |
| 119 | + include_directories( |
| 120 | + utils |
| 121 | + ${OpenCV_INCLUDE_DIRS} |
| 122 | + ${CUDA_INCLUDE_DIRS} |
| 123 | + ) |
| 124 | + |
| 125 | + ament_auto_add_library(libutils SHARED |
| 126 | + utils/trt_common.cpp |
| 127 | + ) |
| 128 | + target_link_libraries(libutils |
| 129 | + ${OpenCV_LIBRARIES} |
| 130 | + ${NVINFER} |
| 131 | + ${NVONNXPARSER} |
| 132 | + ${NVINFER_PLUGIN} |
| 133 | + ${CUDA_LIBRARIES} |
| 134 | + ${CUBLAS_LIBRARIES} |
| 135 | + ${CUDA_curand_LIBRARY} |
| 136 | + ${CUDNN_LIBRARY} |
| 137 | + ${Boost_LIBRARIES} |
| 138 | + ) |
| 139 | + |
| 140 | + ament_auto_add_library(traffic_light_classifier_nodelet SHARED |
| 141 | + src/color_classifier.cpp |
| 142 | + src/cnn_classifier.cpp |
| 143 | + src/nodelet.cpp |
| 144 | + ) |
| 145 | + target_link_libraries(traffic_light_classifier_nodelet |
| 146 | + libutils |
| 147 | + ${OpenCV_LIBRARIES} |
| 148 | + ) |
| 149 | + rclcpp_components_register_node(traffic_light_classifier_nodelet |
| 150 | + PLUGIN "traffic_light::TrafficLightClassifierNodelet" |
| 151 | + EXECUTABLE traffic_light_classifier_node |
| 152 | + ) |
| 153 | + |
| 154 | + ament_auto_package(INSTALL_TO_SHARE |
| 155 | + data |
| 156 | + launch |
| 157 | + ) |
| 158 | + |
| 159 | +else() |
| 160 | + message(STATUS "CUDA and/or TensorRT were not found. build only color classifier") |
| 161 | + |
| 162 | + include_directories( |
| 163 | + ${OpenCV_INCLUDE_DIRS} |
| 164 | + ) |
| 165 | + |
| 166 | + ament_auto_add_library(traffic_light_classifier_nodelet SHARED |
| 167 | + src/color_classifier.cpp |
| 168 | + src/nodelet.cpp |
| 169 | + ) |
| 170 | + target_link_libraries(traffic_light_classifier_nodelet |
| 171 | + ${OpenCV_LIBRARIES} |
| 172 | + ) |
| 173 | + |
| 174 | + rclcpp_components_register_node(traffic_light_classifier_nodelet |
| 175 | + PLUGIN "traffic_light::TrafficLightClassifierNodelet" |
| 176 | + EXECUTABLE traffic_light_classifier_node |
| 177 | + ) |
| 178 | + |
| 179 | + ament_auto_package(INSTALL_TO_SHARE |
| 180 | + data |
| 181 | + launch |
| 182 | + ) |
| 183 | + |
| 184 | +endif() |
0 commit comments