feat(engine): HDF5-native galleries with embedded calibration; TensorRT backends; scene detection
Gallery format switches from JSON to HDF5 exclusively (JSON read-only kept for back-compat): save_gallery always writes HDF5, and the fitted Platt-sigmoid calibration (a, b, valid, hash) is now embedded directly in the gallery file instead of a sidecar .calib_cache.json — identity_matcher reads it from the loaded gallery and writes back only when the embeddings actually changed (hash mismatch), skipping the O(n^2) refit otherwise. Also includes: TensorRT inference backend support (ort_backend.cpp, trt_backend.cpp), gemm_backend improvements, TransNetV2-based scene-boundary detection wired through frame_source/face_tracker/main, and CMake build target updates for the new sources. Bumps the KPN submodule to feature/persistent-pipeline-reuse (push_blocking backpressure, node_ptr/node_stats introspection, ObjectVariantNodeWrapper for stateful functors) — needed by the optimizer's sae_kpn Python bindings.
This commit is contained in:
+49
-8
@@ -35,10 +35,11 @@ set(SAE_MODELS_DIR "${CMAKE_SOURCE_DIR}/models"
|
||||
# TRT → SCRFD + ArcFace via raw TensorRT (.engine files)
|
||||
# SAE_GEMM_BACKEND ROCM → gallery similarity GEMM via rocBLAS / HIP
|
||||
# CUDA → gallery similarity GEMM via cuBLAS / CUDA
|
||||
# CPU → portable reference GEMM (no GPU; CI / testing)
|
||||
set(SAE_INFERENCE_BACKEND "ORT" CACHE STRING "Inference backend: ORT | TRT")
|
||||
set(SAE_GEMM_BACKEND "ROCM" CACHE STRING "Gallery GEMM backend: ROCM | CUDA")
|
||||
set(SAE_GEMM_BACKEND "ROCM" CACHE STRING "Gallery GEMM backend: ROCM | CUDA | CPU")
|
||||
set_property(CACHE SAE_INFERENCE_BACKEND PROPERTY STRINGS ORT TRT)
|
||||
set_property(CACHE SAE_GEMM_BACKEND PROPERTY STRINGS ROCM CUDA)
|
||||
set_property(CACHE SAE_GEMM_BACKEND PROPERTY STRINGS ROCM CUDA CPU)
|
||||
|
||||
# Enable the ORT TensorRT/CUDA execution providers inside the ORT inference
|
||||
# backend (only meaningful when ORT was built with the TensorRT EP). Off by
|
||||
@@ -63,8 +64,8 @@ endif()
|
||||
if(NOT SAE_INFERENCE_BACKEND MATCHES "^(ORT|TRT)$")
|
||||
message(FATAL_ERROR "SAE_INFERENCE_BACKEND must be ORT or TRT (got '${SAE_INFERENCE_BACKEND}')")
|
||||
endif()
|
||||
if(NOT SAE_GEMM_BACKEND MATCHES "^(ROCM|CUDA)$")
|
||||
message(FATAL_ERROR "SAE_GEMM_BACKEND must be ROCM or CUDA (got '${SAE_GEMM_BACKEND}')")
|
||||
if(NOT SAE_GEMM_BACKEND MATCHES "^(ROCM|CUDA|CPU)$")
|
||||
message(FATAL_ERROR "SAE_GEMM_BACKEND must be ROCM, CUDA or CPU (got '${SAE_GEMM_BACKEND}')")
|
||||
endif()
|
||||
|
||||
# CUDA runtime is needed by both TRT inference and CUDA GEMM — find it once.
|
||||
@@ -133,7 +134,16 @@ else() # TRT
|
||||
endif()
|
||||
|
||||
# ── GEMM backend dependency: builds the `gemm_backend` object lib ──────────────
|
||||
if(SAE_GEMM_BACKEND STREQUAL "CUDA")
|
||||
if(SAE_GEMM_BACKEND STREQUAL "CPU")
|
||||
# Portable reference GEMM: no GPU libraries, no headers. Used for CI and as
|
||||
# the correctness oracle for the CUDA/ROCm backends.
|
||||
message(STATUS "GEMM backend: CPU (portable reference, no GPU)")
|
||||
|
||||
add_library(gemm_backend OBJECT src/backends/gemm_backend.cpp)
|
||||
set_target_properties(gemm_backend PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
||||
target_include_directories(gemm_backend PRIVATE src)
|
||||
target_compile_definitions(gemm_backend PRIVATE SAE_GEMM_CPU)
|
||||
elseif(SAE_GEMM_BACKEND STREQUAL "CUDA")
|
||||
find_library(CUBLAS_LIB cublas
|
||||
HINTS /opt/cuda/targets/x86_64-linux/lib /opt/cuda/lib64
|
||||
/usr/local/cuda/lib64 /usr/lib)
|
||||
@@ -223,12 +233,16 @@ set(SAE_MODELS_DIR "${CMAKE_SOURCE_DIR}/models"
|
||||
# The backend object libraries carry their own ORT/TRT/CUDA/ROCm linkage and
|
||||
# headers; sae_gallery re-exports those object files so every binary that links
|
||||
# sae_gallery gets the chosen backend without ever seeing its headers.
|
||||
# HDF5 (C++) — gallery fast-load path + embedding dump. Found here so sae_gallery
|
||||
# (gallery_store.cpp) can link it; scene_analyze/dump_embeddings reuse the same vars.
|
||||
find_package(HDF5 REQUIRED COMPONENTS CXX)
|
||||
|
||||
add_library(sae_gallery STATIC
|
||||
src/gallery/gallery_store.cpp
|
||||
src/gallery/gallery_builder.cpp
|
||||
)
|
||||
set_target_properties(sae_gallery PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
||||
target_include_directories(sae_gallery PUBLIC src)
|
||||
target_include_directories(sae_gallery PUBLIC src ${HDF5_INCLUDE_DIRS})
|
||||
target_link_libraries(sae_gallery PUBLIC
|
||||
kpn
|
||||
${OpenCV_LIBS}
|
||||
@@ -236,6 +250,7 @@ target_link_libraries(sae_gallery PUBLIC
|
||||
inference_backend
|
||||
gemm_backend
|
||||
ffmpeg_libs
|
||||
${HDF5_CXX_LIBRARIES}
|
||||
)
|
||||
target_compile_definitions(sae_gallery PUBLIC
|
||||
SAE_MODELS_DIR="${SAE_MODELS_DIR}"
|
||||
@@ -249,15 +264,34 @@ target_link_libraries(embed_faces PRIVATE sae_gallery)
|
||||
nanobind_add_module(sae_embed src/python_bindings.cpp)
|
||||
target_link_libraries(sae_embed PRIVATE sae_gallery)
|
||||
|
||||
# ── sae_kpn — Python module: run the real downstream nodes over dumped embeddings ─
|
||||
# Assembles face_tracker/identity_matcher/scene_tracker in a Python-driven KPN
|
||||
# network (KPN_BUILD_PYTHON is enabled per-TU inside the .cpp). Powers the
|
||||
# threshold-sweep optimizer in scripts/optimizer/.
|
||||
nanobind_add_module(sae_kpn src/kpn_bindings.cpp)
|
||||
target_link_libraries(sae_kpn PRIVATE sae_gallery)
|
||||
|
||||
# HDF5 already found above (before sae_gallery); vars HDF5_CXX_LIBRARIES / _INCLUDE_DIRS
|
||||
# are reused by scene_analyze / dump_embeddings below.
|
||||
|
||||
# ── analyze — main analysis binary ───────────────────────────────────────────
|
||||
add_executable(scene_analyze src/main.cpp)
|
||||
target_link_libraries(scene_analyze PRIVATE sae_gallery)
|
||||
target_link_libraries(scene_analyze PRIVATE sae_gallery ${HDF5_CXX_LIBRARIES})
|
||||
target_include_directories(scene_analyze PRIVATE ${HDF5_INCLUDE_DIRS})
|
||||
|
||||
# ── 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_link_libraries(scene_analyze_debug PRIVATE sae_gallery ${HDF5_CXX_LIBRARIES})
|
||||
target_include_directories(scene_analyze_debug PRIVATE ${HDF5_INCLUDE_DIRS})
|
||||
target_compile_definitions(scene_analyze_debug PRIVATE SAE_DEBUG=1)
|
||||
|
||||
# ── dump_embeddings — standalone embedding dumper, NO gallery/matcher ─────────
|
||||
# Front-half only (decode→detect→align→embed→HDF5) for the optimizer replay corpus
|
||||
# and model bake-off. Skips gallery load + calibration (~24s/run faster).
|
||||
add_executable(dump_embeddings src/dump_embeddings.cpp)
|
||||
target_link_libraries(dump_embeddings PRIVATE sae_gallery ${HDF5_CXX_LIBRARIES})
|
||||
target_include_directories(dump_embeddings PRIVATE ${HDF5_INCLUDE_DIRS})
|
||||
|
||||
# ── scene_preview — live annotated display while analysing ───────────────────
|
||||
add_executable(scene_preview src/scene_preview.cpp)
|
||||
target_link_libraries(scene_preview PRIVATE sae_gallery)
|
||||
@@ -273,5 +307,12 @@ if(SAE_WEB_DEBUG)
|
||||
kpn_target_enable_web_debug(scene_preview)
|
||||
endif()
|
||||
|
||||
# ── Tests ─────────────────────────────────────────────────────────────────────
|
||||
option(SAE_BUILD_TESTS "Build unit tests (GPU-free)" OFF)
|
||||
if(SAE_BUILD_TESTS)
|
||||
enable_testing()
|
||||
add_subdirectory(tests)
|
||||
endif()
|
||||
|
||||
message(STATUS "OpenCV ${OpenCV_VERSION} found")
|
||||
message(STATUS "Models dir: ${SAE_MODELS_DIR}")
|
||||
|
||||
Reference in New Issue
Block a user