cmake_minimum_required(VERSION 3.21) project(scene_actor_extraction VERSION 0.1.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # ── Dependencies ────────────────────────────────────────────────────────────── # KPN++ (pipeline backbone) set(KPN_BUILD_TESTS OFF CACHE BOOL "" FORCE) set(KPN_BUILD_PYTHON OFF CACHE BOOL "" FORCE) set(KPN_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) option(SAE_WEB_DEBUG "Enable KPN web debug UI (localhost:9090)" OFF) if(SAE_WEB_DEBUG) set(KPN_WEB_DEBUG ON CACHE BOOL "" FORCE) endif() add_subdirectory(external/KPN) # OpenCV (video decode, image ops, DNN inference, face detection) find_package(OpenCV 4 REQUIRED COMPONENTS core imgproc imgcodecs videoio dnn objdetect highgui) # ONNX Runtime (SCRFD detector — cv::dnn cannot handle dynamic Shape nodes) find_library(ORT_LIB onnxruntime REQUIRED HINTS /usr/lib /usr/local/lib) find_path(ORT_INCLUDE onnxruntime_cxx_api.h PATH_SUFFIXES onnxruntime HINTS /usr/include /usr/local/include REQUIRED) add_library(onnxruntime UNKNOWN IMPORTED) set_target_properties(onnxruntime PROPERTIES IMPORTED_LOCATION "${ORT_LIB}" INTERFACE_INCLUDE_DIRECTORIES "${ORT_INCLUDE}") message(STATUS "ONNX Runtime: ${ORT_LIB} headers: ${ORT_INCLUDE}") # TensorRT + CUDA runtime (raw-TRT ArcFace embedder; activated by --arcface-engine). find_library(NVINFER_LIB nvinfer HINTS /usr/lib /usr/local/lib /opt/tensorrt/lib) find_path(NVINFER_INCLUDE NvInfer.h HINTS /usr/include /usr/local/include /opt/tensorrt/include) find_library(CUDART_LIB cudart HINTS /opt/cuda/lib64 /usr/local/cuda/lib64 /usr/lib) find_path(CUDART_INCLUDE cuda_runtime_api.h HINTS /opt/cuda/targets/x86_64-linux/include /opt/cuda/include /usr/local/cuda/include /usr/include) if(NOT (NVINFER_LIB AND NVINFER_INCLUDE AND CUDART_LIB AND CUDART_INCLUDE)) message(FATAL_ERROR "TensorRT or CUDA runtime not found " "(nvinfer=${NVINFER_LIB} headers=${NVINFER_INCLUDE} " "cudart=${CUDART_LIB} headers=${CUDART_INCLUDE})") endif() add_library(trt_runtime INTERFACE) target_include_directories(trt_runtime INTERFACE "${NVINFER_INCLUDE}" "${CUDART_INCLUDE}") target_link_libraries(trt_runtime INTERFACE "${NVINFER_LIB}" "${CUDART_LIB}") message(STATUS "TensorRT: ${NVINFER_LIB} CUDA runtime: ${CUDART_LIB}") # FFmpeg (NVDEC hardware video decode + swscale colour conversion) find_package(PkgConfig REQUIRED) pkg_check_modules(AVFORMAT REQUIRED libavformat) pkg_check_modules(AVCODEC REQUIRED libavcodec) pkg_check_modules(AVUTIL REQUIRED libavutil) pkg_check_modules(SWSCALE REQUIRED libswscale) add_library(ffmpeg_libs INTERFACE) target_compile_options(ffmpeg_libs INTERFACE ${AVFORMAT_CFLAGS_OTHER} ${AVCODEC_CFLAGS_OTHER} ${AVUTIL_CFLAGS_OTHER} ${SWSCALE_CFLAGS_OTHER}) target_include_directories(ffmpeg_libs INTERFACE ${AVFORMAT_INCLUDE_DIRS} ${AVCODEC_INCLUDE_DIRS} ${AVUTIL_INCLUDE_DIRS} ${SWSCALE_INCLUDE_DIRS}) target_link_libraries(ffmpeg_libs INTERFACE ${AVFORMAT_LIBRARIES} ${AVCODEC_LIBRARIES} ${AVUTIL_LIBRARIES} ${SWSCALE_LIBRARIES}) message(STATUS "FFmpeg: avformat=${AVFORMAT_VERSION} avcodec=${AVCODEC_VERSION}") # nlohmann/json (gallery + output serialisation) include(FetchContent) FetchContent_Declare( nlohmann_json GIT_REPOSITORY https://github.com/nlohmann/json.git GIT_TAG v3.11.3 GIT_SHALLOW TRUE ) FetchContent_MakeAvailable(nlohmann_json) # nanobind (Python bindings for the sae_embed module) find_package(Python 3.8 COMPONENTS Interpreter Development.Module REQUIRED) FetchContent_Declare( nanobind GIT_REPOSITORY https://github.com/wjakob/nanobind.git GIT_TAG v2.4.0 GIT_SHALLOW TRUE ) FetchContent_MakeAvailable(nanobind) # ── Model paths ─────────────────────────────────────────────────────────────── set(SAE_MODELS_DIR "${CMAKE_SOURCE_DIR}/models" CACHE PATH "Directory containing ONNX model files") # ── Shared library: gallery store ───────────────────────────────────────────── add_library(sae_gallery STATIC src/gallery/gallery_store.cpp src/gallery/gallery_builder.cpp ) target_include_directories(sae_gallery PUBLIC src) target_link_libraries(sae_gallery PUBLIC kpn ${OpenCV_LIBS} nlohmann_json::nlohmann_json onnxruntime trt_runtime ffmpeg_libs ) target_compile_definitions(sae_gallery PUBLIC SAE_MODELS_DIR="${SAE_MODELS_DIR}" ) # ── embed_faces — image → embedding JSON (used by gallery builder scripts) ──── add_executable(embed_faces src/embed_faces.cpp) target_link_libraries(embed_faces PRIVATE kpn ${OpenCV_LIBS} nlohmann_json::nlohmann_json onnxruntime trt_runtime ffmpeg_libs ) target_compile_definitions(embed_faces PRIVATE SAE_MODELS_DIR="${SAE_MODELS_DIR}") # ── sae_embed — Python module: load SCRFD+ArcFace once, embed many images ─── nanobind_add_module(sae_embed src/python_bindings.cpp) target_include_directories(sae_embed PRIVATE src) target_link_libraries(sae_embed PRIVATE ${OpenCV_LIBS} onnxruntime ) target_compile_definitions(sae_embed PRIVATE SAE_MODELS_DIR="${SAE_MODELS_DIR}") # ── analyze — main analysis binary ─────────────────────────────────────────── add_executable(scene_analyze src/main.cpp) target_link_libraries(scene_analyze PRIVATE sae_gallery) # ── analyze_debug — same binary with debug frame/crop output ───────────────── add_executable(scene_analyze_debug src/main.cpp) target_link_libraries(scene_analyze_debug PRIVATE sae_gallery) target_compile_definitions(scene_analyze_debug PRIVATE SAE_DEBUG=1) # ── scene_preview — live annotated display while analysing ─────────────────── add_executable(scene_preview src/scene_preview.cpp) target_link_libraries(scene_preview PRIVATE sae_gallery) # ── build_gallery — offline gallery construction tool ──────────────────────── add_executable(build_gallery src/build_gallery.cpp) target_link_libraries(build_gallery PRIVATE sae_gallery) # ── Optional: web debug UI for pipeline introspection ──────────────────────── if(SAE_WEB_DEBUG) kpn_target_enable_web_debug(scene_analyze) kpn_target_enable_web_debug(scene_analyze_debug) kpn_target_enable_web_debug(scene_preview) endif() message(STATUS "OpenCV ${OpenCV_VERSION} found") message(STATUS "Models dir: ${SAE_MODELS_DIR}")