CMakeLists.txt 6.76 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
set(the_description "Modern Deep Learning module")

if(${CMAKE_VERSION} VERSION_LESS 3.2)
  message(STATUS "Module opencv_dnn_modern disabled because CMake version is less than 3.2")
  ocv_module_disable(dnn_modern)
  return()
endif()

# Using cmake scripts and modules
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

# ----------------------------------------------------------------------------
# MODULE REQUIREMENTS
# ----------------------------------------------------------------------------

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
set(TINY_DNN_CPP_PATH "${OpenCV_BINARY_DIR}/3rdparty/tinydnn")
set(TINY_DNN_CPP_ROOT "${TINY_DNN_CPP_PATH}/tiny-dnn-1.0.0a3")
ocv_download(FILENAME "v1.0.0a3.tar.gz"
               HASH "adb1c512e09ca2c7a6faef36f9c53e59"
               URL
                 "${OPENCV_TINY_DNN_URL}"
                 "$ENV{OPENCV_TINY_DNN_URL}"
                 "https://github.com/tiny-dnn/tiny-dnn/archive/"
               DESTINATION_DIR "${TINY_DNN_CPP_PATH}"
               STATUS TINY_DNN_DOWNLOAD_SUCCESS
               ID "tiny-dnn"
               UNPACK RELATIVE_URL)

if(NOT TINY_DNN_DOWNLOAD_SUCCESS)
  message(STATUS "Failed to download tiny-dnn sources")
endif()

33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
find_package(TinyDNN QUIET)

include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)

if(NOT TinyDNN_FOUND)
    message(STATUS "Module opencv_dnn_modern disabled because tiny-dnn was not found")
    ocv_module_disable(dnn_modern)
    return()
elseif(NOT COMPILER_SUPPORTS_CXX11)
    message(STATUS "Module opencv_dnn_modern disabled because your compiler does not support C++11")
    ocv_module_disable(dnn_modern)
    return()
elseif(APPLE_FRAMEWORK OR ANDROID)
    message(STATUS "Module opencv_dnn_modern disabled because you are not under Linux or Win")
    ocv_module_disable(dnn_modern)
    return()
endif()

# ----------------------------------------------------------------------------
# OPTIMIZATION OPTIONS
# ----------------------------------------------------------------------------

option(TINYDNN_USE_SSE    "Build tiny-dnn with SSE library support" ON)
option(TINYDNN_USE_AVX    "Build tiny-dnn with AVX library support" ON)
option(TINYDNN_USE_TBB    "Build tiny-dnn with TBB library support" OFF)
option(TINYDNN_USE_OMP    "Build tiny-dnn with OMP library support" OFF)
option(TINYDNN_USE_NNPACK "Build tiny-dnn with NNPACK library support" OFF)

if(TINYDNN_USE_TBB AND HAVE_TBB)
    add_definitions(-DCNN_USE_TBB)
elseif(NOT TINYDNN_USE_TBB AND
	   TINYDNN_USE_OMP AND HAVE_OPENMP)
    add_definitions(-DCNN_USE_OMP)
endif()

if(TINYDNN_USE_NNPACK)
   find_package(NNPACK REQUIRED)
   add_definitions(-DCNN_USE_NNPACK)
   include_directories(SYSTEM ${NNPACK_INCLUDE_DIR})
   include_directories(SYSTEM ${NNPACK_INCLUDE_DIR}/../third-party/pthreadpool/include)
   list(APPEND REQUIRED_LIBRARIES ${NNPACK_LIB})
endif()

77 78
# we need to disable seializer unless we import cereal and we gonna use caffe converter
add_definitions(-DCNN_NO_SERIALIZATION -DCNN_USE_CAFFE_CONVERTER)
79 80 81

# NOTE: In case that proto files already exist,
#       this is not needed anymore.
82 83
find_package(Protobuf QUIET)

84 85 86 87 88 89
if(NOT ${Protobuf_FOUND})
  message(STATUS "Module opencv_dnn_modern disabled because Protobuf is not found")
  ocv_module_disable(dnn_modern)
  return()
endif()

90 91 92 93 94 95 96 97 98
if(DEFINED PROTOBUF_PROTOC_EXECUTABLE AND EXISTS ${PROTOBUF_PROTOC_EXECUTABLE})
  execute_process(COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} caffe.proto --cpp_out=./
                  WORKING_DIRECTORY ${TINYDNN_INCLUDE_DIRS}/tiny_dnn/io/caffe)
else()
  message(STATUS "The protocol buffer compiler is not found (PROTOBUF_PROTOC_EXECUTABLE='${PROTOBUF_PROTOC_EXECUTABLE}')")
  ocv_module_disable(dnn_modern)
  return()
endif()

99
list(APPEND REQUIRED_LIBRARIES ${PROTOBUF_LIBRARIES})
100
include_directories(SYSTEM ${PROTOBUF_INCLUDE_DIRS})
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163

####
# Setup the compiler options

# set c++ standard to c++11.
# Note: not working on CMake 2.8. We assume that user has
#       a compiler with C++11 support.

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Unix
if(CMAKE_COMPILER_IS_GNUCXX OR MINGW OR
   CMAKE_CXX_COMPILER_ID MATCHES "Clang")
    include(CheckCXXCompilerFlag)
    check_cxx_compiler_flag("-msse3" COMPILER_HAS_SSE_FLAG)
    check_cxx_compiler_flag("-mavx"  COMPILER_HAS_AVX_FLAG)
    check_cxx_compiler_flag("-mavx2" COMPILER_HAS_AVX2_FLAG)
    check_cxx_compiler_flag("-mfma" COMPILER_HAS_AVX2_FLAG)

    # set Streaming SIMD Extension (SSE) instructions
    if(USE_SSE AND COMPILER_HAS_SSE_FLAG)
        add_definitions(-DCNN_USE_SSE)
        set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -msse3")
    endif(USE_SSE AND COMPILER_HAS_SSE_FLAG)
    # set Advanced Vector Extensions (AVX)
    if(USE_AVX AND COMPILER_HAS_AVX_FLAG)
        add_definitions(-DCNN_USE_AVX)
        set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -mavx")
    endif(USE_AVX AND COMPILER_HAS_AVX_FLAG)
    # set Advanced Vector Extensions 2 (AVX2)
    if(USE_AVX2 AND COMPILER_HAS_AVX2_FLAG)
        add_definitions(-DCNN_USE_AVX2)
        set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -mavx2 -mfma -march=core-avx2")
    endif(USE_AVX2 AND COMPILER_HAS_AVX2_FLAG)

    # include extra flags to the compiler
    # TODO: add info about those flags.
    set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wall -Wpedantic -Wno-narrowing")
    set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -O3")
    set(EXTRA_C_FLAGS_DEBUG   "${EXTRA_C_FLAGS_DEBUG} -g3 -pthread")
elseif(MSVC)
    if(USE_SSE)
        add_definitions(-DCNN_USE_SSE)
        set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} /arch:SSE2")
    endif(USE_SSE)
    if(USE_AVX)
        add_definitions(-DCNN_USE_AVX)
        set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} /arch:AVX")
    endif(USE_AVX)
    if(USE_AVX2)
        add_definitions(-DCNN_USE_AVX2)
        set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} /arch:AVX2")
    endif(USE_AVX2)
    # include specific flags for release and debug modes.
    set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE}
        /Ox /Oi /Ot /Oy /GL /fp:fast /GS-")
    set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG")
    set(EXTRA_C_FLAGS_DEBUG "${EXTRA_C_FLAGS_DEBUG}")
    set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} /W4 /bigobj")
    # this is fine
    add_definitions(-D _CRT_SECURE_NO_WARNINGS)
    add_definitions(-D _SCL_SECURE_NO_WARNINGS)
164
    add_definitions(-D NO_STRICT)
165 166 167 168 169 170 171 172
    # prolly powerless with header-only project
    set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} /MP")
endif()

# ----------------------------------------------------------------------------
# DNN-MODERN MODULE
# ----------------------------------------------------------------------------

173
ocv_define_module(dnn_modern opencv_core opencv_imgproc WRAP python)
174 175
ocv_target_link_libraries(${the_module} ${REQUIRED_LIBRARIES})
ocv_target_include_directories(${the_module} ${TINYDNN_INCLUDE_DIRS})
176 177 178
ocv_warnings_disable(CMAKE_CXX_FLAGS
  -Wnon-virtual-dtor -Wunused-parameter -Wshadow -Wundef
  /wd4265 /wd4100 /wd4458 /wd4244 /wd4456)