diff --git a/.github/workflows/pkg-check.yml b/.github/workflows/pkg-check.yml new file mode 100644 index 0000000..f1bb0dd --- /dev/null +++ b/.github/workflows/pkg-check.yml @@ -0,0 +1,69 @@ +name: Package Check + +on: + push: + branches: + - main + pull_request: + branches: + - main + workflow_dispatch: + +jobs: + build: + name: Build package (static ggml) + runs-on: ubuntu-24.04 + timeout-minutes: 20 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y build-essential cmake ninja-build + + - name: Build package archive + run: | + bash ./scripts/pkg-check/check-package.sh build \ + --work-dir "$RUNNER_TEMP/pkg-check-build" \ + --archive "$RUNNER_TEMP/pkg-check-build/visioncpp-package.tgz" + + - name: Upload package archive + uses: actions/upload-artifact@v4 + with: + name: visioncpp-package-linux + path: ${{ runner.temp }}/pkg-check-build/visioncpp-package.tgz + if-no-files-found: error + + check: + name: Verify package (consumer check) + runs-on: ubuntu-24.04 + timeout-minutes: 30 + needs: build + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y build-essential cmake ninja-build + + - name: Download package archive + uses: actions/download-artifact@v4 + with: + name: visioncpp-package-linux + path: ${{ runner.temp }}/pkg-check-artifact + + - name: Verify package from archive + run: | + bash ./scripts/pkg-check/check-package.sh check \ + --work-dir "$RUNNER_TEMP/pkg-check-check" \ + --from-archive "$RUNNER_TEMP/pkg-check-artifact/visioncpp-package.tgz" \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c1d75b..fe882b1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,15 +1,25 @@ cmake_minimum_required(VERSION 3.28) -project(vision.cpp VERSION 0.3.0 LANGUAGES CXX) +project(vision.cpp VERSION 0.3.1 LANGUAGES CXX) option(BUILD_SHARED_LIBS "Build shared libraries instead of static libraries" ON) option(VISP_VULKAN "Enable Vulkan support" OFF) option(VISP_DEV "Enable development mode" OFF) option(VISP_CI "Enable for continuous integration environment" OFF) option(VISP_TESTS "Build tests" ${PROJECT_IS_TOP_LEVEL}) +option(VISP_INSTALL_MODELS "Download and install default models" OFF) option(VISP_FMT_LIB "Use external fmt library instead of standard C++ " OFF) +option(VISP_STATIC_GGML "Force static build of ggml" OFF) option(VISP_ASAN "Enable AddressSanitizer" OFF) +include(GNUInstallDirs) +set(VISP_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH "Location of header files") +set(VISP_LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Location of library files") +set(VISP_BIN_INSTALL_DIR ${CMAKE_INSTALL_BINDIR} CACHE PATH "Location of binary files") +if(VISP_INSTALL_MODELS) + set(VISP_MODEL_INSTALL_DIR "${CMAKE_INSTALL_DATAROOTDIR}/visioncpp" CACHE PATH "Directory to install default models to") +endif() + if(PROJECT_IS_TOP_LEVEL) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) @@ -94,6 +104,15 @@ if(VISP_FMT_LIB) list(APPEND VISP_DEFINITIONS VISP_FMT_LIB) endif() +set(BUILD_SHARED_LIBS_SAVED ${BUILD_SHARED_LIBS}) +if(VISP_STATIC_GGML) + set(BUILD_SHARED_LIBS OFF) + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + set(GGML_STATIC ON) + # Find shared libgomp before ggml finds a static version + # - undo https://github.com/ggml-org/llama.cpp/pull/16031 + find_package(OpenMP) +endif() set(GGML_VULKAN ${VISP_VULKAN}) set(GGML_LLAMAFILE ON) if(VISP_CI) @@ -110,6 +129,7 @@ if(VISP_CI) endif() endif() add_subdirectory(depend/llama/ggml) +set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_SAVED}) # Vision.cpp libraries and executables @@ -121,15 +141,13 @@ add_subdirectory(src/cli) if(VISP_TESTS) enable_testing() add_subdirectory(tests) +endif() +if(VISP_TESTS OR VISP_INSTALL_MODELS) add_subdirectory(models) endif() # Installation -set(VISP_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH "Location of header files") -set(VISP_LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Location of library files") -set(VISP_BIN_INSTALL_DIR ${CMAKE_INSTALL_BINDIR} CACHE PATH "Location of binary files") - install(TARGETS visioncpp RUNTIME DESTINATION ${VISP_BIN_INSTALL_DIR} LIBRARY DESTINATION ${VISP_LIB_INSTALL_DIR} @@ -138,6 +156,9 @@ install(DIRECTORY include/ DESTINATION ${VISP_INCLUDE_INSTALL_DIR}) if(PROJECT_IS_TOP_LEVEL) install(FILES README.md LICENSE DESTINATION .) endif() +if(VISP_INSTALL_MODELS) + install(FILES ${VISP_DEFAULT_MODELS} DESTINATION ${VISP_MODEL_INSTALL_DIR}) +endif() install(TARGETS vision-cli RUNTIME DESTINATION ${VISP_BIN_INSTALL_DIR}) diff --git a/models/CMakeLists.txt b/models/CMakeLists.txt index a5ad052..77a3c53 100644 --- a/models/CMakeLists.txt +++ b/models/CMakeLists.txt @@ -1,37 +1,43 @@ -# Download models used in tests (happens only if VISP_TESTS is enabled) +# Download models used in tests or for installation -message(STATUS "Checking for models/MobileSAM-F16.gguf") -file(DOWNLOAD +function(download_model url filename hash) + message(STATUS "Checking for ${filename}") + file(DOWNLOAD + ${url} + ${CMAKE_CURRENT_LIST_DIR}/${filename} + EXPECTED_HASH ${hash} + SHOW_PROGRESS + ) + set(DEFAULT_MODELS "${DEFAULT_MODELS};${CMAKE_CURRENT_LIST_DIR}/${filename}" PARENT_SCOPE) +endfunction() + + +download_model( "https://huggingface.co/Acly/MobileSAM-GGUF/resolve/main/MobileSAM-F16.gguf" - ${CMAKE_CURRENT_LIST_DIR}/MobileSAM-F16.gguf - EXPECTED_HASH "SHA256=b546366475e3ad744bb2eaf7634df88e9aaf25f6622797d2de300f5a530831f7" - SHOW_PROGRESS + "MobileSAM-F16.gguf" + "SHA256=b546366475e3ad744bb2eaf7634df88e9aaf25f6622797d2de300f5a530831f7" ) -message(STATUS "Checking for models/BiRefNet-lite-F16.gguf") -file(DOWNLOAD +download_model( "https://huggingface.co/Acly/BiRefNet-GGUF/resolve/main/BiRefNet-lite-F16.gguf" - ${CMAKE_CURRENT_LIST_DIR}/BiRefNet-lite-F16.gguf - EXPECTED_HASH "SHA256=7b5397a2c98d66677f8f74317774bbeac49dbb321b8a3dc744af913db71d4fa5" - SHOW_PROGRESS + "BiRefNet-lite-F16.gguf" + "SHA256=7b5397a2c98d66677f8f74317774bbeac49dbb321b8a3dc744af913db71d4fa5" ) -message(STATUS "Checking for models/Depth-Anything-V2-Small-F16.gguf") -file(DOWNLOAD +download_model( "https://huggingface.co/Acly/Depth-Anything-V2-GGUF/resolve/main/Depth-Anything-V2-Small-F16.gguf" - ${CMAKE_CURRENT_LIST_DIR}/Depth-Anything-V2-Small-F16.gguf - EXPECTED_HASH "SHA256=0f83332d6a8b4375cd7fdcc168f3e3636f474f8e84b0959e903f513aace782f5" - SHOW_PROGRESS + "Depth-Anything-V2-Small-F16.gguf" + "SHA256=0f83332d6a8b4375cd7fdcc168f3e3636f474f8e84b0959e903f513aace782f5" ) -message(STATUS "Checking for models/MIGAN-512-places2-F16.gguf") -file(DOWNLOAD +download_model( "https://huggingface.co/Acly/MIGAN-GGUF/resolve/main/MIGAN-512-places2-F16.gguf" - ${CMAKE_CURRENT_LIST_DIR}/MIGAN-512-places2-F16.gguf - EXPECTED_HASH "SHA256=3e47592bf716d0dc306f8dc02d4476cfcdaf2c055fa3c3c8e0ced4db775eb64b" - SHOW_PROGRESS + "MIGAN-512-places2-F16.gguf" + "SHA256=3e47592bf716d0dc306f8dc02d4476cfcdaf2c055fa3c3c8e0ced4db775eb64b" ) -message(STATUS "Checking for models/RealESRGAN-x4plus_anime-6B-F16.gguf") -file(DOWNLOAD - "https://huggingface.co/Acly/Real-ESRGAN-GGUF/resolve/main/RealESRGAN-x4plus_anime-6B-F16.gguf" - ${CMAKE_CURRENT_LIST_DIR}/RealESRGAN-x4plus_anime-6B-F16.gguf - EXPECTED_HASH "SHA256=730469c5a2269cdef96d0d58aacf87bcf25d7a0d92256685808e6cdce0675c09" - SHOW_PROGRESS -) \ No newline at end of file +if(VISP_TESTS) + download_model( + "https://huggingface.co/Acly/Real-ESRGAN-GGUF/resolve/main/RealESRGAN-x4plus_anime-6B-F16.gguf" + "RealESRGAN-x4plus_anime-6B-F16.gguf" + "SHA256=730469c5a2269cdef96d0d58aacf87bcf25d7a0d92256685808e6cdce0675c09" + ) +endif() + +set(VISP_DEFAULT_MODELS "${DEFAULT_MODELS}" PARENT_SCOPE) diff --git a/scripts/cmake/visioncpp-config.cmake.in b/scripts/cmake/visioncpp-config.cmake.in index 68f4239..2904aa9 100644 --- a/scripts/cmake/visioncpp-config.cmake.in +++ b/scripts/cmake/visioncpp-config.cmake.in @@ -3,6 +3,7 @@ set_and_check(VISP_INCLUDE_DIR "@PACKAGE_VISP_INCLUDE_INSTALL_DIR@") set_and_check(VISP_LIB_DIR "@PACKAGE_VISP_LIB_INSTALL_DIR@") +include(CMakeFindDependencyMacro) find_dependency(ggml) find_library(VISP_LIBRARY visioncpp REQUIRED HINTS ${VISP_LIB_DIR} NO_CMAKE_FIND_ROOT_PATH) diff --git a/scripts/pkg-check/CMakeLists.txt b/scripts/pkg-check/CMakeLists.txt new file mode 100644 index 0000000..1fbbd0e --- /dev/null +++ b/scripts/pkg-check/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.28) + +project(visioncpp_pkg_check LANGUAGES C CXX) + +find_package(visioncpp CONFIG REQUIRED) + +add_executable(pkg-check main.cpp) +target_link_libraries(pkg-check PRIVATE visioncpp) +set_target_properties(pkg-check PROPERTIES BUILD_RPATH "$") diff --git a/scripts/pkg-check/check-package.sh b/scripts/pkg-check/check-package.sh new file mode 100644 index 0000000..71394c8 --- /dev/null +++ b/scripts/pkg-check/check-package.sh @@ -0,0 +1,188 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" + +MODE="all" +WORK_DIR="$REPO_DIR/build/pkg-check" +PACKAGE_PREFIX="$WORK_DIR/install" +ARCHIVE_PATH="$WORK_DIR/visioncpp-package.tgz" +SOURCE_INPUT="" + +usage() { + cat < Working directory (default: $WORK_DIR) + --prefix Install/extract prefix (default: /install) + --archive Archive path (default: /visioncpp-package.tgz) + --from-prefix Use an existing installed prefix for check step + --from-archive Extract and use an existing archive for check step + -h, --help Show this help + +Examples: + $0 all + $0 build --archive /tmp/visioncpp.tgz + $0 check --from-archive /tmp/visioncpp.tgz --work-dir /tmp/pkg-check +EOF +} + +while [[ $# -gt 0 ]]; do + case "$1" in + all|build|check) + MODE="$1" + shift + ;; + --work-dir) + WORK_DIR="$2" + shift 2 + ;; + --prefix) + PACKAGE_PREFIX="$2" + shift 2 + ;; + --archive) + ARCHIVE_PATH="$2" + shift 2 + ;; + --from-prefix) + SOURCE_INPUT="prefix:$2" + shift 2 + ;; + --from-archive) + SOURCE_INPUT="archive:$2" + shift 2 + ;; + -h|--help) + usage + exit 0 + ;; + *) + echo "Unknown argument: $1" >&2 + usage + exit 2 + ;; + esac +done + +SRC_BUILD_DIR="$WORK_DIR/source-build" +PKG_BUILD_DIR="$WORK_DIR/consumer-build" +CONSUMER_SRC_DIR="$REPO_DIR/scripts/pkg-check" +MODEL_REL_PATH="share/visioncpp/Depth-Anything-V2-Small-F16.gguf" + +step1() { + echo "[pkg-check] Build: configure and build package producer" + rm -rf "$SRC_BUILD_DIR" + cmake -S "$REPO_DIR" -B "$SRC_BUILD_DIR" \ + -D CMAKE_BUILD_TYPE=Release \ + -D VISP_VULKAN=OFF \ + -D VISP_TESTS=OFF \ + -D VISP_STATIC_GGML=ON \ + -D VISP_INSTALL_MODELS=ON + + cmake --build "$SRC_BUILD_DIR" + + echo "[pkg-check] Build: install to $PACKAGE_PREFIX" + rm -rf "$PACKAGE_PREFIX" + cmake --install "$SRC_BUILD_DIR" --prefix "$PACKAGE_PREFIX" + + echo "[pkg-check] Build: archive package at $ARCHIVE_PATH" + mkdir -p "$(dirname "$ARCHIVE_PATH")" + tar -C "$PACKAGE_PREFIX" -czf "$ARCHIVE_PATH" . +} + +prepare_step2_prefix() { + mkdir -p "$WORK_DIR" + + if [[ -n "$SOURCE_INPUT" ]]; then + case "$SOURCE_INPUT" in + prefix:*) + PACKAGE_PREFIX="${SOURCE_INPUT#prefix:}" + ;; + archive:*) + local src_archive="${SOURCE_INPUT#archive:}" + rm -rf "$PACKAGE_PREFIX" + mkdir -p "$PACKAGE_PREFIX" + tar -C "$PACKAGE_PREFIX" -xzf "$src_archive" + ;; + *) + echo "Invalid SOURCE_INPUT: $SOURCE_INPUT" >&2 + exit 2 + ;; + esac + return + fi + + if [[ "$MODE" == "check" ]]; then + if [[ -f "$ARCHIVE_PATH" ]]; then + rm -rf "$PACKAGE_PREFIX" + mkdir -p "$PACKAGE_PREFIX" + tar -C "$PACKAGE_PREFIX" -xzf "$ARCHIVE_PATH" + return + fi + if [[ ! -d "$PACKAGE_PREFIX" ]]; then + echo "Check needs an installed package. Run build first or pass --from-prefix/--from-archive." >&2 + exit 2 + fi + fi +} + +step2() { + prepare_step2_prefix + + local model_path="$PACKAGE_PREFIX/$MODEL_REL_PATH" + if [[ ! -f "$model_path" ]]; then + echo "Model not found: $model_path" >&2 + exit 1 + fi + + echo "[pkg-check] Check: run vision-cli" + LD_LIBRARY_PATH="$PACKAGE_PREFIX/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" \ + "$PACKAGE_PREFIX/bin/vision-cli" depthany -m "$model_path" \ + -i "$REPO_DIR/tests/input/wardrobe.jpg" \ + -o "$WORK_DIR/cli_output.png" + if [[ ! -f "$WORK_DIR/cli_output.png" ]]; then + echo "vision-cli failed to produce output image" >&2 + exit 1 + fi + + echo "[pkg-check] Check: configure consumer project" + cmake -S "$CONSUMER_SRC_DIR" -B "$PKG_BUILD_DIR" \ + -D CMAKE_BUILD_TYPE=Release \ + -D CMAKE_PREFIX_PATH="$PACKAGE_PREFIX" + + echo "[pkg-check] Check: build consumer project" + cmake --build "$PKG_BUILD_DIR" + + echo "[pkg-check] Check: run consumer inference" + LD_LIBRARY_PATH="$PACKAGE_PREFIX/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" \ + "$PKG_BUILD_DIR/pkg-check" "$model_path" +} + +mkdir -p "$WORK_DIR" + +case "$MODE" in + all) + step1 + step2 + ;; + build) + step1 + ;; + check) + step2 + ;; + *) + echo "Invalid mode: $MODE" >&2 + exit 2 + ;; +esac + +echo "[pkg-check] done" diff --git a/scripts/pkg-check/main.cpp b/scripts/pkg-check/main.cpp new file mode 100644 index 0000000..32bf077 --- /dev/null +++ b/scripts/pkg-check/main.cpp @@ -0,0 +1,47 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +using namespace visp; + +int main(int argc, char** argv) { + if (argc < 2) { + std::cerr << "Usage: " << argv[0] << " \n"; + return 2; + } + + std::string const model_path = argv[1]; + + try { + backend_device backend = backend_init(backend_type::cpu); + depthany_model model = depthany_load_model(model_path.c_str(), backend); + + image_data input = image_alloc({64, 64}, image_format::rgb_u8); + image_clear(input); + + image_data output = depthany_compute(model, input); + if (output.extent != input.extent) { + std::cerr << "Unexpected output extent: " << output.extent[0] << "x" << output.extent[1] + << " (expected " << input.extent[0] << "x" << input.extent[1] << ")\n"; + return 1; + } + + std::span depth = image_view{output}.as_floats(); + double const mean = std::accumulate(depth.begin(), depth.end(), 0.0) / depth.size(); + if (!std::isfinite(mean)) { + std::cerr << "Depth output mean is not finite\n"; + return 1; + } + return 0; + } catch (std::exception const& ex) { + std::cerr << "pkg-check failed: " << ex.what() << "\n"; + return 1; + } +} diff --git a/src/cli/CMakeLists.txt b/src/cli/CMakeLists.txt index c5127aa..d139103 100644 --- a/src/cli/CMakeLists.txt +++ b/src/cli/CMakeLists.txt @@ -4,4 +4,13 @@ target_include_directories(vision-cli PRIVATE ..) target_compile_definitions(vision-cli PRIVATE ${VISP_ASSERT} ${VISP_DEFINITIONS}) target_compile_options(vision-cli PRIVATE ${VISP_WARNINGS} ${VISP_COMP_OPTIONS}) target_link_options(vision-cli PRIVATE ${VISP_LINK_OPTIONS}) -target_link_libraries(vision-cli PRIVATE ggml visioncpp ${VISP_FMT_LINK}) \ No newline at end of file +target_link_libraries(vision-cli PRIVATE ggml visioncpp ${VISP_FMT_LINK}) + +if(VISP_INSTALL_MODELS) + if(IS_ABSOLUTE "${VISP_MODEL_INSTALL_DIR}") + set(MODEL_DIR "${VISP_MODEL_INSTALL_DIR}") + else() + set(MODEL_DIR "${CMAKE_INSTALL_PREFIX}/${VISP_MODEL_INSTALL_DIR}") + endif() +endif() +target_compile_definitions(vision-cli PRIVATE VISP_MODEL_INSTALL_DIR="${MODEL_DIR}") diff --git a/src/cli/cli.cpp b/src/cli/cli.cpp index 81360de..6715d74 100644 --- a/src/cli/cli.cpp +++ b/src/cli/cli.cpp @@ -140,7 +140,7 @@ cli_args cli_parse(int argc, char** argv) { } else if (arg == "-o" || arg == "--output") { r.output = next_arg(argc, argv, i); } else if (arg == "-m" || arg == "--model") { - r.model = validate_path(next_arg(argc, argv, i)); + r.model = next_arg(argc, argv, i); } else if (arg == "-p" || arg == "--prompt") { r.prompt = collect_args(argc, argv, i, '-'); } else if (arg == "-b" || arg == "--backend") { @@ -245,6 +245,42 @@ char const* to_string(tensor_data_layout l) { } } +path find_model(char const* model_name_or_path) { + path p = path(model_name_or_path); + if (exists(p) || p.is_absolute()) { + return p; + } + path search_paths[5]; + search_paths[0] = path("models"); + if (char const* vision_model_dir = getenv("VISION_MODEL_DIR")) { + search_paths[1] = path(vision_model_dir); + } + if (char const* xdg_data_home = getenv("XDG_DATA_HOME")) { + search_paths[2] = path(xdg_data_home) / "visioncpp"; + } + if (char const* home = getenv("HOME")) { + search_paths[3] = path(home) / ".local/share/visioncpp"; + } + if constexpr (VISP_MODEL_INSTALL_DIR[0] != '\0') { + search_paths[4] = path(VISP_MODEL_INSTALL_DIR); + } + for (auto& sp : search_paths) { + if (!sp.empty()) { + path candidate = sp / p; + if (exists(candidate)) { + return candidate; + } + } + } + printf("Looking for %s\n", p.generic_string().c_str()); + for (auto& sp : search_paths) { + if (!sp.empty()) { + printf("Looking for %s\n", (sp / p).generic_string().c_str()); + } + } + throw except("Model file not found: {}", model_name_or_path); +} + std::tuple load_model_weights( cli_args const& args, backend_device const& dev, @@ -253,10 +289,11 @@ std::tuple load_model_weights( tensor_data_layout preferred_layout = tensor_data_layout::unknown) { timer t; - char const* model_path = args.model ? args.model : default_model; - printf("Loading model weights from '%s'... ", model_path); + path model_path = find_model(args.model ? args.model : default_model); + auto model_path_str = model_path.generic_string(); + printf("Loading model weights from '%s'... ", model_path_str.c_str()); - model_file file = model_load(model_path); + model_file file = model_load(model_path_str.c_str()); model_weights weights = model_init(file.n_tensors() + n_tensors); if (preferred_layout == tensor_data_layout::unknown) { preferred_layout = file.tensor_layout(); @@ -355,7 +392,7 @@ sam_prompt sam_parse_prompt(std::span args, i32x2 extent) { void run_sam(cli_args const& args) { backend_device backend = backend_init(args); auto [file, weights] = load_model_weights( - args, backend, "models/MobileSAM-F16.gguf", 0, backend.preferred_layout()); + args, backend, "MobileSAM-F16.gguf", 0, backend.preferred_layout()); sam_params params{}; require_inputs(args.inputs, 1, ""); @@ -409,7 +446,7 @@ void run_sam(cli_args const& args) { void run_birefnet(cli_args const& args) { backend_device backend = backend_init(args); auto [file, weights] = load_model_weights( - args, backend, "models/BiRefNet-F16.gguf", 0, backend.preferred_layout()); + args, backend, "BiRefNet-lite-F16.gguf", 0, backend.preferred_layout()); require_inputs(args.inputs, 1, ""); image_data image = image_load(args.inputs[0]); @@ -453,7 +490,7 @@ void run_birefnet(cli_args const& args) { void run_depth_anything(cli_args const& args) { backend_device backend = backend_init(args); auto [file, weights] = load_model_weights( - args, backend, "models/DepthAnythingV2-Small-F32.gguf", 0, backend.preferred_layout()); + args, backend, "DepthAnythingV2-Small-F32.gguf", 0, backend.preferred_layout()); require_inputs(args.inputs, 1, ""); image_data image = image_load(args.inputs[0]); @@ -489,7 +526,7 @@ void run_depth_anything(cli_args const& args) { void run_migan(cli_args const& args) { backend_device backend = backend_init(args); auto [file, weights] = load_model_weights( - args, backend, "models/MIGAN-512-places2-F16.gguf", backend.preferred_layout()); + args, backend, "MIGAN-512-places2-F16.gguf", backend.preferred_layout()); migan_params params = migan_detect_params(file); params.invert_mask = true; // -> inpaint opaque areas @@ -527,7 +564,7 @@ void run_migan(cli_args const& args) { void run_esrgan(cli_args const& args) { backend_device backend = backend_init(args); auto [file, weights] = load_model_weights( - args, backend, "models/RealESRGAN-x4.gguf", 0, backend.preferred_layout()); + args, backend, "RealESRGAN-x4.gguf", 0, backend.preferred_layout()); esrgan_params params = esrgan_detect_params(file); printf("- scale: %dx\n", params.scale); printf("- block count: %d\n", params.n_blocks); diff --git a/src/visp/CMakeLists.txt b/src/visp/CMakeLists.txt index 398fa8f..c8d51aa 100644 --- a/src/visp/CMakeLists.txt +++ b/src/visp/CMakeLists.txt @@ -28,10 +28,10 @@ target_link_libraries(visioncpp PUBLIC ggml PRIVATE stb ${VISP_FMT_LINK} ) -# set_target_properties(visioncpp PROPERTIES -# VERSION ${PROJECT_VERSION} -# SOVERSION ${PROJECT_VERSION_MAJOR} -# ) +set_target_properties(visioncpp PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} +) if (MSVC AND VISP_TESTS) set_target_properties(visioncpp PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)