mirror of
https://gitcode.com/gh_mirrors/ope/OpenFace.git
synced 2025-12-30 04:52:29 +00:00
* - Use staged container builds to improve caching and reduce size
- Image size reduced from 8 GB to 1.6ish
- Switched from Make to Ninja for faster builds that do not hog processor
- Removed unneded dependencies
- Added to .dockerignore
- Readme for docker stuff
- Staged Builds
- Docker's overlay FS means that `rm`ing files does not reduce size
- Once build artifacts are build, the build dependencies are no longer needed
- Both of these can be solved by building in a temporary image and copying
only the needed libraries in
- Leverages DESTDIR to generate a directory structure that can be just
copied onto the `/` of the filesystem
- Similarly, the data files (like models) can be downloaded ahead of time
into their own image and copied in. This saves on network IO.
- Anything in a RUN directive that is non-deterministic (e.g. downloading
a file from a link, the content of that link changes) does not cause a cache
miss, so if you need to update something RUN uses, either modify the
dockerfile or build with `--no-cache` to force a rebuild
- Switch to Ninja
- cmake can generate many types of build systems
- Ninja builds faster than GNU Make
- `make -j` has a tendency to lock up my system when building locally
- Do not need to tell ninja how many jobs to run
- .dockerignore
- Paths in .dockerignore are basically invisible to dockerd, so when dockerd
zips up the build context, all of the cruft can be ignored
- it is beneficial to docker build speed to add any large, unnecssary files
and directories to .dockerignore.
- Just remember they cannot be seen by dockerd
* removing cruft and some format fixes
* updated dockerfile to opencv 4.1.0
248 lines
9.1 KiB
CMake
248 lines
9.1 KiB
CMake
cmake_minimum_required (VERSION 3.8)
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
|
|
project(OpenFace VERSION 2.0.2)
|
|
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/)
|
|
|
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/")
|
|
|
|
set(CMAKE_CONFIG_DIR etc/OpenFace)
|
|
set(CONFIG_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_CONFIG_DIR}")
|
|
add_definitions(-DCONFIG_DIR="${CONFIG_DIR}")
|
|
|
|
# make sure we'll use OpenBLAS only: there's a header file naming difference between different
|
|
# implementations; so OpenFace wants OpenBLAS;
|
|
find_package(OpenBLAS REQUIRED)
|
|
if ( ${OpenBLAS_FOUND} )
|
|
MESSAGE("OpenBLAS information:")
|
|
MESSAGE(" OpenBLAS_LIBRARIES: ${OpenBLAS_LIB}")
|
|
else()
|
|
MESSAGE(FATAL_ERROR "OpenBLAS not found in the system.")
|
|
endif()
|
|
|
|
if ( ${OpenBLAS_INCLUDE_FOUND} )
|
|
MESSAGE(" OpenBLAS_INCLUDE: ${OpenBLAS_INCLUDE_DIR}")
|
|
else()
|
|
MESSAGE(WARNING "OpenBLAS include not found in the system. Using the one vended with OpenFace.")
|
|
set(OpenBLAS_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/lib/3rdParty/OpenBLAS/include")
|
|
MESSAGE(" OpenBLAS_INCLUDE: ${OpenBLAS_INCLUDE_DIR}")
|
|
endif()
|
|
|
|
find_package( OpenCV 4.0 REQUIRED COMPONENTS core imgproc calib3d highgui objdetect)
|
|
if(${OpenCV_FOUND})
|
|
MESSAGE("OpenCV information:")
|
|
MESSAGE(" OpenCV_INCLUDE_DIRS: ${OpenCV_INCLUDE_DIRS}")
|
|
MESSAGE(" OpenCV_LIBRARIES: ${OpenCV_LIBRARIES}")
|
|
MESSAGE(" OpenCV_LIBRARY_DIRS: ${OpenCV_LINK_DIRECTORIES}")
|
|
else()
|
|
MESSAGE(FATAL_ERROR "OpenCV not found in the system.")
|
|
endif()
|
|
|
|
find_package( Boost 1.5.9 COMPONENTS filesystem system)
|
|
if(${Boost_FOUND})
|
|
MESSAGE("Boost information:")
|
|
MESSAGE(" Boost_VERSION: ${Boost_VERSION}")
|
|
MESSAGE(" Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}")
|
|
MESSAGE(" Boost_LIBRARIES: ${Boost_LIBRARIES}")
|
|
MESSAGE(" Boost_LIBRARY_DIRS: ${Boost_LIBRARY_DIRS}")
|
|
else()
|
|
MESSAGE("Boost not found in the system.")
|
|
endif()
|
|
|
|
|
|
# Move LandmarkDetector model
|
|
file(GLOB files "lib/local/LandmarkDetector/model/*.txt")
|
|
foreach(file ${files})
|
|
file(COPY ${file} DESTINATION ${CMAKE_BINARY_DIR}/bin/model)
|
|
install(FILES ${file} DESTINATION ${CMAKE_CONFIG_DIR}/model)
|
|
endforeach()
|
|
|
|
# Move the hierarchical LandmarkDetector models
|
|
file(GLOB files "lib/local/LandmarkDetector/model/model*")
|
|
foreach(file ${files})
|
|
file(COPY ${file} DESTINATION ${CMAKE_BINARY_DIR}/bin/model)
|
|
install(DIRECTORY ${file} DESTINATION ${CMAKE_CONFIG_DIR}/model)
|
|
endforeach()
|
|
|
|
# Move detection validation models
|
|
file(GLOB files "lib/local/LandmarkDetector/model/detection_validation/*.txt")
|
|
foreach(file ${files})
|
|
file(COPY ${file} DESTINATION ${CMAKE_BINARY_DIR}/bin/model/detection_validation)
|
|
install(FILES ${file} DESTINATION ${CMAKE_CONFIG_DIR}/model/detection_validation)
|
|
endforeach()
|
|
|
|
# Move patch experts
|
|
file(GLOB files "lib/local/LandmarkDetector/model/patch_experts/*.txt")
|
|
foreach(file ${files})
|
|
file(COPY ${file} DESTINATION ${CMAKE_BINARY_DIR}/bin/model/patch_experts)
|
|
install(FILES ${file} DESTINATION ${CMAKE_CONFIG_DIR}/model/patch_experts)
|
|
endforeach()
|
|
|
|
# Move CEN patch experts
|
|
file(GLOB files "lib/local/LandmarkDetector/model/patch_experts/*.dat")
|
|
foreach(file ${files})
|
|
file(COPY ${file} DESTINATION ${CMAKE_BINARY_DIR}/bin/model/patch_experts)
|
|
install(FILES ${file} DESTINATION ${CMAKE_CONFIG_DIR}/model/patch_experts)
|
|
endforeach()
|
|
|
|
# Move MTCNN face detector
|
|
file(GLOB files "lib/local/LandmarkDetector/model/mtcnn_detector/*.txt")
|
|
foreach(file ${files})
|
|
file(COPY ${file} DESTINATION ${CMAKE_BINARY_DIR}/bin/model/mtcnn_detector)
|
|
install(FILES ${file} DESTINATION ${CMAKE_CONFIG_DIR}/model/mtcnn_detector)
|
|
endforeach()
|
|
|
|
# Move MTCNN face detector
|
|
file(GLOB files "lib/local/LandmarkDetector/model/mtcnn_detector/*.dat")
|
|
foreach(file ${files})
|
|
file(COPY ${file} DESTINATION ${CMAKE_BINARY_DIR}/bin/model/mtcnn_detector)
|
|
install(FILES ${file} DESTINATION ${CMAKE_CONFIG_DIR}/model/mtcnn_detector)
|
|
endforeach()
|
|
|
|
# Move Point Distribution models
|
|
file(GLOB files "lib/local/LandmarkDetector/model/pdms/*.txt")
|
|
foreach(file ${files})
|
|
file(COPY ${file} DESTINATION ${CMAKE_BINARY_DIR}/bin/model/pdms)
|
|
install(FILES ${file} DESTINATION ${CMAKE_CONFIG_DIR}/model/pdms)
|
|
endforeach()
|
|
|
|
# Move OpenCV classifiers
|
|
file(GLOB files "lib/3rdParty/OpenCV3.4/classifiers/*.xml")
|
|
foreach(file ${files})
|
|
file(COPY ${file} DESTINATION ${CMAKE_BINARY_DIR}/bin/classifiers)
|
|
install(FILES ${file} DESTINATION ${CMAKE_CONFIG_DIR}/classifiers)
|
|
endforeach()
|
|
|
|
# Move AU prediction modules
|
|
file(GLOB files "lib/local/FaceAnalyser/AU_predictors/*.txt")
|
|
foreach(file ${files})
|
|
file(COPY ${file} DESTINATION ${CMAKE_BINARY_DIR}/bin/AU_predictors)
|
|
install(FILES ${file} DESTINATION ${CMAKE_CONFIG_DIR}/AU_predictors)
|
|
endforeach()
|
|
|
|
# Move AU prediction modules
|
|
file(GLOB files "lib/local/FaceAnalyser/AU_predictors/svr*")
|
|
foreach(file ${files})
|
|
file(COPY ${file} DESTINATION ${CMAKE_BINARY_DIR}/bin/AU_predictors)
|
|
install(DIRECTORY ${file} DESTINATION ${CMAKE_CONFIG_DIR}/AU_predictors)
|
|
endforeach()
|
|
|
|
# Move AU prediction modules
|
|
file(GLOB files "lib/local/FaceAnalyser/AU_predictors/svm*")
|
|
foreach(file ${files})
|
|
file(COPY ${file} DESTINATION ${CMAKE_BINARY_DIR}/bin/AU_predictors)
|
|
install(DIRECTORY ${file} DESTINATION ${CMAKE_CONFIG_DIR}/AU_predictors)
|
|
endforeach()
|
|
|
|
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
|
|
execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
|
|
if (GCC_VERSION VERSION_LESS 8.0)
|
|
MESSAGE(FATAL_ERROR "Need a 8.0 or newer GCC compiler. Current GCC: ${GCC_VERSION}")
|
|
else ()
|
|
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse -msse2 -msse3")
|
|
endif ()
|
|
endif ()
|
|
|
|
# dlib
|
|
find_package(dlib 19.13)
|
|
if(${dlib_FOUND})
|
|
message("dlib information:")
|
|
message(" dlib version: ${dlib_VERSION}")
|
|
|
|
if (NOT TARGET dlib)
|
|
add_library(dlib INTERFACE IMPORTED GLOBAL)
|
|
endif()
|
|
else()
|
|
message(FATAL_ERROR "dlib not found in the system, please install dlib")
|
|
endif()
|
|
|
|
# suppress auto_ptr deprecation warnings
|
|
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
|
add_compile_options("-Wno-deprecated-declarations")
|
|
endif()
|
|
|
|
# LandmarkDetector library
|
|
add_subdirectory(lib/local/LandmarkDetector)
|
|
# Facial Expression analysis library
|
|
add_subdirectory(lib/local/FaceAnalyser)
|
|
# Gaze estimation library
|
|
add_subdirectory(lib/local/GazeAnalyser)
|
|
# Utilities library
|
|
add_subdirectory(lib/local/Utilities)
|
|
|
|
# test if this file is a top list file
|
|
# thus we're building an OpenFace as a standalone
|
|
# project; otherwise OpenFace is being built as a
|
|
# part or larger tree;
|
|
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL "${CMAKE_SOURCE_DIR}")
|
|
|
|
# for a standalone builds - allow installing package configs;
|
|
message(STATUS "Standalone mode detected; Enabling configuration/targets export.")
|
|
|
|
# export libraries for reuse
|
|
include(CMakePackageConfigHelpers)
|
|
|
|
set(LIB_INSTALL_DIR lib)
|
|
set(CONFIG_DEST_DIR ${LIB_INSTALL_DIR}/cmake/OpenFace/)
|
|
set(OpenFace_LIBRARIES OpenFace::GazeAnalyser OpenFace::FaceAnalyser OpenFace::LandmarkDetector OpenFace::Utilities)
|
|
|
|
# export targets [build tree]
|
|
export(EXPORT OpenFaceTargets
|
|
NAMESPACE OpenFace::
|
|
FILE "${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_DEST_DIR}/OpenFaceTargets.cmake")
|
|
|
|
# write package version file
|
|
write_basic_package_version_file(
|
|
"${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_DEST_DIR}/OpenFaceConfigVersion.cmake"
|
|
COMPATIBILITY AnyNewerVersion)
|
|
|
|
# define [build tree] bindir relative include dir
|
|
foreach(lib ${OpenFace_LIBRARIES})
|
|
if(TARGET ${lib})
|
|
get_target_property(libname ${lib} "NAME")
|
|
file(RELATIVE_PATH rel_incdir ${CMAKE_CURRENT_BINARY_DIR} "${CMAKE_CURRENT_SOURCE_DIR}/lib/local/${libname}/include")
|
|
list(APPEND OPENFACE_INCLUDE_DIRS ${rel_incdir})
|
|
endif()
|
|
endforeach()
|
|
list(REMOVE_DUPLICATES OPENFACE_INCLUDE_DIRS)
|
|
|
|
# write package config file from template [build tree]
|
|
# all PATH_VARS should be relative to a ${CMAKE_CURRENT_BINARY_DIR}
|
|
# as it's the "prefix" of our non installed package in the build tree
|
|
configure_package_config_file(cmake/OpenFaceConfig.cmake.in
|
|
"${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_DEST_DIR}/OpenFaceConfig.cmake"
|
|
INSTALL_DESTINATION ${CONFIG_DEST_DIR}
|
|
PATH_VARS OPENFACE_INCLUDE_DIRS)
|
|
|
|
# store current build dir in the CMake package registry
|
|
# export(PACKAGE OpenFace)
|
|
|
|
# install exported targets [install tree]
|
|
install(EXPORT OpenFaceTargets
|
|
FILE OpenFaceTargets.cmake
|
|
NAMESPACE OpenFace::
|
|
DESTINATION ${CONFIG_DEST_DIR})
|
|
|
|
# redefine [install tree] prefix relative include dir
|
|
set(OPENFACE_INCLUDE_DIRS "include/OpenFace")
|
|
|
|
# write package config file from template [install tree]
|
|
configure_package_config_file(cmake/OpenFaceConfig.cmake.in
|
|
"${CMAKE_CURRENT_BINARY_DIR}/OpenFace/OpenFaceConfig.cmake"
|
|
INSTALL_DESTINATION ${CONFIG_DEST_DIR}
|
|
PATH_VARS OPENFACE_INCLUDE_DIRS)
|
|
|
|
# install package configs
|
|
install(FILES
|
|
"${CMAKE_CURRENT_BINARY_DIR}/OpenFace/OpenFaceConfig.cmake"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_DEST_DIR}/OpenFaceConfigVersion.cmake"
|
|
DESTINATION ${CONFIG_DEST_DIR})
|
|
endif()
|
|
|
|
# executables
|
|
add_subdirectory(exe/FaceLandmarkImg)
|
|
add_subdirectory(exe/FaceLandmarkVid)
|
|
add_subdirectory(exe/FaceLandmarkVidMulti)
|
|
add_subdirectory(exe/FeatureExtraction)
|