From ad12861894f8aa59229b55f73fd9dadaa0d4646f Mon Sep 17 00:00:00 2001 From: John Hoy Date: Fri, 22 Nov 2024 21:22:16 -0500 Subject: [PATCH] Ryzen-AI-Library release v1.3.0 (CVMLSDK_R24.11.12_RC1) --- .../include/cvml-api-common.h | 65 +- .../Ryzen-AI-Library/include/cvml-context.h | 136 ++- .../include/cvml-depth-estimation.h | 61 +- example/Ryzen-AI-Library/include/cvml-image.h | 59 +- .../Ryzen-AI-Library/include/cvml-logger.h | 50 +- example/Ryzen-AI-Library/include/cvml-types.h | 123 +- example/Ryzen-AI-Library/include/float16.hpp | 289 ----- .../include/common-sample-utils.h | 45 +- .../src/common-sample-camera-utils.cpp | 236 ++++ .../src/common-sample-utils.cpp | 156 +-- .../cvml-sample-depth-estimation/README.md | 4 +- .../cvml-sample-depth-estimation.exe | Bin 56320 -> 77520 bytes .../cvml-sample-depth-estimation/main.cpp | 54 +- .../Ryzen-AI-Library/windows/amdblitter.dll | 3 - .../windows/common-sample-utils.lib | Bin 289846 -> 131 bytes .../windows/cvml-depth-estimation.dll | 4 +- .../windows/cvml-depth-estimation.lib | Bin 86480 -> 130 bytes example/Ryzen-AI-Library/windows/cvml-sdk.dll | 4 +- example/Ryzen-AI-Library/windows/cvml-sdk.lib | Bin 168296 -> 131 bytes .../windows/onnx/cpu/onnxruntime.dll | 3 + .../windows/onnx/dml/DirectML.dll | 3 + .../windows/onnx/dml/onnxruntime.dll | 3 + .../windows/onnx/dml19/DirectML.dll | 3 + .../windows/onnx/dml19/onnxruntime.dll | 3 + .../windows/onnx/ryzenAI/npu1/1x4.xclbin | Bin 0 -> 1092429 bytes .../windows/onnx/ryzenAI/npu1/4x4.xclbin | Bin 0 -> 4037696 bytes .../windows/onnx/ryzenAI/npu1/onnxruntime.dll | 3 + .../npu1/onnxruntime_providers_shared.dll | 3 + .../npu1/onnxruntime_providers_vitisai.dll | 3 + .../npu1/onnxruntime_vitis_ai_custom_ops.dll | 3 + .../ryzenAI/npu1/onnxruntime_vitisai_ep.dll | 3 + .../onnx/ryzenAI/npu1/vaip_config_npu_1.json | 1019 +++++++++++++++++ .../windows/onnx/ryzenAI/npu1_wdf/1x4.xclbin | Bin 0 -> 1131547 bytes .../windows/onnx/ryzenAI/npu1_wdf/4x4.xclbin | Bin 0 -> 4183014 bytes .../onnx/ryzenAI/npu1_wdf/onnxruntime.dll | 3 + .../npu1_wdf/onnxruntime_providers_shared.dll | 3 + .../onnxruntime_providers_vitisai.dll | 3 + .../npu1_wdf/onnxruntime_vitisai_ep.dll | 3 + .../ryzenAI/npu1_wdf/vaip_config_npu_1.json | 214 ++++ .../ryzenAI/npu2/AMD_AIE2P_4x4_Overlay.xclbin | Bin 0 -> 4008428 bytes .../npu2/AMD_AIE2P_4x4_Overlay_CFG0.xclbin | Bin 0 -> 5630357 bytes .../npu2/AMD_AIE2P_4x4_Overlay_CFG1.xclbin | Bin 0 -> 2315789 bytes .../ryzenAI/npu2/AMD_AIE2P_Nx4_Overlay.xclbin | Bin 0 -> 1007164 bytes .../windows/onnx/ryzenAI/npu2/onnxruntime.dll | 3 + .../npu2/onnxruntime_providers_shared.dll | 3 + .../npu2/onnxruntime_providers_vitisai.dll | 3 + .../npu2/onnxruntime_vitis_ai_custom_ops.dll | 3 + .../ryzenAI/npu2/onnxruntime_vitisai_ep.dll | 3 + .../onnx/ryzenAI/npu2/vaip_config_npu_2.json | 1019 +++++++++++++++++ .../Ryzen-AI-Library/windows/vaip_config.json | 287 ----- 50 files changed, 2958 insertions(+), 927 deletions(-) delete mode 100644 example/Ryzen-AI-Library/include/float16.hpp create mode 100644 example/Ryzen-AI-Library/samples/common-sample-utils/src/common-sample-camera-utils.cpp delete mode 100644 example/Ryzen-AI-Library/windows/amdblitter.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/cpu/onnxruntime.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/dml/DirectML.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/dml/onnxruntime.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/dml19/DirectML.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/dml19/onnxruntime.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu1/1x4.xclbin create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu1/4x4.xclbin create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu1/onnxruntime.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu1/onnxruntime_providers_shared.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu1/onnxruntime_providers_vitisai.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu1/onnxruntime_vitis_ai_custom_ops.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu1/onnxruntime_vitisai_ep.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu1/vaip_config_npu_1.json create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu1_wdf/1x4.xclbin create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu1_wdf/4x4.xclbin create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu1_wdf/onnxruntime.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu1_wdf/onnxruntime_providers_shared.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu1_wdf/onnxruntime_providers_vitisai.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu1_wdf/onnxruntime_vitisai_ep.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu1_wdf/vaip_config_npu_1.json create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu2/AMD_AIE2P_4x4_Overlay.xclbin create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu2/AMD_AIE2P_4x4_Overlay_CFG0.xclbin create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu2/AMD_AIE2P_4x4_Overlay_CFG1.xclbin create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu2/AMD_AIE2P_Nx4_Overlay.xclbin create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu2/onnxruntime.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu2/onnxruntime_providers_shared.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu2/onnxruntime_providers_vitisai.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu2/onnxruntime_vitis_ai_custom_ops.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu2/onnxruntime_vitisai_ep.dll create mode 100644 example/Ryzen-AI-Library/windows/onnx/ryzenAI/npu2/vaip_config_npu_2.json delete mode 100644 example/Ryzen-AI-Library/windows/vaip_config.json diff --git a/example/Ryzen-AI-Library/include/cvml-api-common.h b/example/Ryzen-AI-Library/include/cvml-api-common.h index 13c6b910..823e3c7b 100644 --- a/example/Ryzen-AI-Library/include/cvml-api-common.h +++ b/example/Ryzen-AI-Library/include/cvml-api-common.h @@ -1,5 +1,5 @@ // -// Copyright (C) 2021-2023 Advanced Micro Devices, Inc. All rights reserved. +// Copyright (C) 2021-2024 Advanced Micro Devices, Inc. All rights reserved. // #ifndef EDGEML_FEATURES_COMMON_FRAMEWORK_PUBLIC_INCLUDE_CVML_API_COMMON_H_ @@ -7,6 +7,14 @@ #include +#ifndef WIN32 +#define CVML_SDK_EXPORT +#define CVML_SDK_NO_EXPORT +#define CVML_SDK_DEPRECATED +#define CVML_SDK_DEPRECATED_EXPORT +#define CVML_SDK_DEPRECATED_NO_EXPORT +#else + #ifdef CVML_SDK_STATIC_DEFINE #define CVML_SDK_EXPORT #define CVML_SDK_NO_EXPORT @@ -38,6 +46,8 @@ #define CVML_SDK_DEPRECATED_NO_EXPORT CVML_SDK_NO_EXPORT CVML_SDK_DEPRECATED #endif +#endif + #define AMD_CVML_INTERFACE(TypeName) \ public: \ virtual ~TypeName(); \ @@ -49,57 +59,4 @@ TypeName(TypeName&&) noexcept = delete; \ TypeName& operator=(TypeName&&) noexcept = delete; -namespace amd { -namespace cvml { - -/** - * Encapsulates success or failure of an API call. - */ -template -struct Result { - R result; /**< result of running or building models*/ - F error; /**< error code*/ - /** - * Implementation of operator bool for Result - */ - explicit operator bool() const { return error == F::kSuccess; } - /** - * Implementation of operator-> for Result - */ - R operator->() const { return result; } - /** - * Implementation of operator() for Result - */ - R operator()() const { return result; } -}; - -/** - * Result output due to success - * @param r result to be returned from an successful operation - * @return result object of success - */ -template -const Result Success(const R& r) { - Result ret; - ret.result = r; - ret.error = F::kSuccess; - return ret; -} - -/** - * Result output due to failure - * @param f error code from an failed operation - * @return result object of failure - */ -template -const Result Error(F f) { - Result ret; - ret.result = {}; - ret.error = f; - return ret; -} - -} // namespace cvml -} // namespace amd - #endif // EDGEML_FEATURES_COMMON_FRAMEWORK_PUBLIC_INCLUDE_CVML_API_COMMON_H_ diff --git a/example/Ryzen-AI-Library/include/cvml-context.h b/example/Ryzen-AI-Library/include/cvml-context.h index 740cd601..ce5850d0 100644 --- a/example/Ryzen-AI-Library/include/cvml-context.h +++ b/example/Ryzen-AI-Library/include/cvml-context.h @@ -3,7 +3,7 @@ * * @file * - * Definitions for CVML SDK Contexts and associated structures/functions. + * Definitions for SDK contexts and associated structures/functions. */ #ifndef EDGEML_FEATURES_COMMON_FRAMEWORK_PUBLIC_INCLUDE_CVML_CONTEXT_H_ @@ -16,132 +16,188 @@ namespace amd { namespace cvml { /** - * Maximal number of different platforms CVML SDK can support + * Maximum number of different platforms the SDK can support. */ static const uint32_t MAX_SUPPORTED_PLATFORMS = 10; /** - * Information of platforms supported by CVML SDK + * Structure of platforms supported by the SDK. + * * @see \a amd::cvml::Context */ -typedef struct SupportedPlatformInformation { +struct SupportedPlatformInformation { + /** + * Structure describing a single supported platform. + */ struct SupportedPlatform { /// Device ID of supported AMD APU + /// @deprecated Always returns -1 int64_t device_id; - /// Required mininal vulkan driver version on supported AMD APU + /// Required minimum Vulkan driver version on supported AMD APU int64_t required_gpu_minimal_vulkan_driver_version; - } platform[MAX_SUPPORTED_PLATFORMS]; + } platform[MAX_SUPPORTED_PLATFORMS]; ///< Array of supported platforms. /// Total number of supported AMD APU platforms. + /// @deprecated Always returns amd::cvml::MAX_SUPPORTED_PLATFORMS /// @see \a amd::cvml::MAX_SUPPORTED_PLATFORMS uint32_t supported_platform_count; /// Whether supported platform checking is enforced. bool checking_enforced; -} SupportedPlatformInformation; +}; /** - * Represents a context of a CVML SDK feature - * Can be shared by multiple features of the CVML SDK. + * Execution context for Ryzen AI Library features. + * + * An appropriate context must be created by calling, + * + * amd::cvml::CreateContext() + * + * before using any features in the Ryzen AI Library and provided to the + * feature constructor(s). + * + * The context can be shared by multiple features of the SDK. */ class CVML_SDK_EXPORT Context { AMD_CVML_INTERFACE(Context); public: /** - * Releases the memory allocated by the context. + * Releases all resources for the context and destroys it. */ virtual void Release() = 0; /** * Sets the verbosity of the log. * - * @param level CVML SDK feature log level + * @param level SDK feature log level */ - virtual void SetLogLevel(CvmlLogger::LogLevels level) = 0; + virtual void SetLogLevel(Logger::LogLevels level) = 0; /** - * Gets the pointer to the cvml logger + * Gets the pointer to the logger object. + * + * @return Pointer to logger object */ - virtual CvmlLogger* GetLogger() const = 0; + virtual Logger* GetLogger() const = 0; /** - * Get the Supported Platform Information object + * Get the Supported Platform Information object. * * @param info Pointer to structure for receiving platform information - * @return True on success - * @return False on failure + * @return true on success, false on failure */ static bool GetSupportedPlatformInformation(amd::cvml::SupportedPlatformInformation* info); /** - * Defines the inference backends that can be supported by the CVML SDK. + * Defines the inference backends that can be supported by the SDK. * * These are provided to the \a SetInferenceBackend API function. */ enum InferenceBackend { - AUTO, ///< Allow the CVML SDK to select the hardware for inference operations + AUTO, ///< Allow the SDK to select the hardware for inference operations GPU, ///< Use GPU hardware for inference operations NPU, ///< Use NPU hardware for inference operations CPU, ///< Use CPU hardware for inference operations - ONNX, ///< Use NPU hardware for ONNX inference operations + dGPU ///< Use discrete GPU hardware, if available, for inference operations }; /** - * Define input source streaming mode that can be supported by CVMLSDK - * + * Defines the source streaming mode for feature processing. */ enum StreamingMode { - ONE_SHOT, ///< Input source is image - ONLINE_STREAMING, ///< Input source is video/audio file, or camera stream - OFFLINE_STREAMING ///< Input source is image playback + ONE_SHOT, ///< Features should expect to process independent images. + ONLINE_STREAMING, ///< Input images are part of real-time streaming content. + OFFLINE_STREAMING ///< Features are intended to process offline streaming content. }; /** * Specifies the inference backend for subsequently created features. * - * This function does not affect any CVML features that were instantiated - * via the context before its call. If a CVML feature is unable to support + * This function does not affect any features that were instantiated + * via the context before its call. If a feature is unable to support * a specified inference backend, it will refuse to construct and an * exception will be thrown instead. * * @param inference_backend Desired hardware inference backend + * @return true if backend updated */ - virtual void SetInferenceBackend(InferenceBackend inference_backend) = 0; + bool SetInferenceBackend(InferenceBackend inference_backend); /** * Returns the inference backend selection strategy for newly created features. * * @return Current hardware inference backend selection */ - virtual InferenceBackend GetInferenceBackend(void) = 0; + InferenceBackend GetInferenceBackend(void); + + /** + * Returns the current streaming mode. + * + * See \a amd::cvml::Context::SetStreamingMode for more details. + * + * @return Currently configured streaming mode. + */ + StreamingMode GetStreamingMode(void); + + /** + * Set the streaming mode for the context. + * + * The requested streaming mode is used to configure new features + * that are constructed against the context. Any features that + * were created before are not affected by changing streaming + * mode changes. + * + * See \a amd::cvml::Context::StreamingMode + * + * @param mode Desired streaming mode. + */ + void SetStreamingMode(StreamingMode mode); + + /** + * Return if NPU is available on platform + * + * @return true if NPU available + */ + static bool IsNPUAvailable(); + + /** + * Return if iGPU is available on platform + * + * @return true if iGPU available + */ + static bool IsiGPUAvailable(); /** - * Returns StreamingMode of input source, an enum class + * Return if dGPU is available on platform * + * @return true if dGPU available */ - virtual StreamingMode GetStreamingMode(void) = 0; + static bool IsdGPUAvailable(); /** - * Set input source type - * 0: one-shot image - * 1: online streaming mode (e.g. streaming video/audio, camera) - * 2: offline streaming model (e.g. image loop playback) + * Get detected NPU driver version. + * + * @return NPU driver version, or 0 if not detected */ - virtual void SetStreamingMode(StreamingMode mode) = 0; + uint32_t GetNPUDriverVersion(); + + public: + class Impl; + Impl* impl_; ///< Pointer to context implementation }; /** - * API to Create CVML Context. + * Create a Ryzen AI context. * * @param log_level Sets the log level. Default value is kINFO - * @param logger External logger for cvml context. Default value is nullptr - * @see \a amd::cvml::CvmlLogger + * @param logger External logger for the context. Default value is nullptr + * @see \a amd::cvml::Logger * @return Pointer to the created Context */ CVML_SDK_EXPORT amd::cvml::Context* CreateContext( - CvmlLogger::LogLevels log_level = CvmlLogger::LogLevels::kINFO, CvmlLogger* logger = nullptr); + Logger::LogLevels log_level = Logger::LogLevels::kINFO, Logger* logger = nullptr); } // namespace cvml } // namespace amd diff --git a/example/Ryzen-AI-Library/include/cvml-depth-estimation.h b/example/Ryzen-AI-Library/include/cvml-depth-estimation.h index 0ce6257c..ba93a2b9 100644 --- a/example/Ryzen-AI-Library/include/cvml-depth-estimation.h +++ b/example/Ryzen-AI-Library/include/cvml-depth-estimation.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022-2023 Advanced Micro Devices, Inc. All rights reserved. + * Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved. */ #ifndef EDGEML_FEATURES_DEPTH_ESTIMATION_INCLUDE_CVML_DEPTH_ESTIMATION_H_ @@ -14,39 +14,68 @@ namespace amd { namespace cvml { /** - * Interface class for the depth estimation feature. + * Depth Estimation feature class. + * + * Based on the provided images, the feature calculates a relative depth map + * for each invocation of the \a GenerateDepthMap() function. Appropriate + * resize and normalization is done during pre/post processing by the + * \a GenerateDepthMap() function to generate a depth map for each frame. + * + * Example + * + * // create Ryzen AI context + * auto context = amd::cvml::CreateContext(); + * + * // create depth estimation feature + * amd::cvml::DepthEstimation feature(context); + * + * // iterate over input frames + * for (auto frame ... ) { + * // encapsulate input image + * amd::cvml::Image input( ... ); + * + * // encapsulate output image + * amd::cvml::Image output( ... ); + * + * // generate depth map + * feature.GenerateDepthMap(input, &output); + * } */ class CVML_SDK_EXPORT DepthEstimation { AMD_CVML_INTERFACE(DepthEstimation); public: - // Depth Estimation model types - enum class DepthModelType { Fast, Precise }; - /** - * Constructor + * Constructor for the Depth Estimation feature. * * @param context Pointer to CVML SDK context - * @param model_type Whether to prefer Fast or Precise depth estimation */ - explicit DepthEstimation(Context* context, DepthModelType model_type = DepthModelType::Fast); + explicit DepthEstimation(Context* context); /** - * Generate depth map from an image + * Generate depth map from an image. + * + * This function throws exceptions on errors. * - * @param input A reference to the Image input; format: rgb-interleaved-uint8_t - * @param output a pointer to the Image output; format: NCHW grayscale-float32 - * @return true, if inference output is assigned to output - * \n data from image is valid as long as the feature has not been destroyed + * Each call of this function returns a depth map of + * floating point values representing the relative depth of the pixels + * corresponding to the width/height of the uncropped image frame. + * + * @param input Reference to the Image input + * @param output Pointer to the Image output as a floating point grayscale buffer + * @return true if the output Image has been populated with inference information */ bool GenerateDepthMap(const Image& input, Image* output); /** - * Set the image type of the depth map output data/ + * Set the image type of the depth map output data. + * + * This function throws exceptions on errors. * * @param t The desired ImageType of the depth map output data - * \n valid values are: kGrayScaleFloat16, kGrayScaleFloat32. + * \n Valid values are: kGrayScaleFloat16, kGrayScaleFloat32. */ + [[deprecated("Output type is determined by the provided output image buffer")]] void SetOutputType(ImageType t); /** @@ -58,7 +87,7 @@ class CVML_SDK_EXPORT DepthEstimation { protected: class Impl; - Impl* impl_; + Impl* impl_; ///< Implementation of depth estimation interface. }; } // namespace cvml diff --git a/example/Ryzen-AI-Library/include/cvml-image.h b/example/Ryzen-AI-Library/include/cvml-image.h index fb7281d4..aab54d77 100644 --- a/example/Ryzen-AI-Library/include/cvml-image.h +++ b/example/Ryzen-AI-Library/include/cvml-image.h @@ -10,7 +10,6 @@ #include "cvml-types.h" namespace amd { - namespace cvml { class Context; @@ -38,10 +37,11 @@ class CVML_SDK_EXPORT Image { kYUV420p, kYUYV422, kP010, + kUNDEFINED = -1 }; /** - * An enumeration of image data types + * Defines supported image data types. */ enum DataType { kUint8, @@ -54,7 +54,7 @@ class CVML_SDK_EXPORT Image { }; /** - * A valid set of flags used to describe the image + * A valid set of flags used to describe the image. */ enum Flags { /** @@ -83,19 +83,20 @@ class CVML_SDK_EXPORT Image { }; /** - * Construct a CVML Image class object - * @param format: Image format - * @param data_type: Image data type - * @param width: The pixel width of the image - * @param height: The pixel height of the image - * @param buffer: (optional): A pointer to the image data. + * Initializing constructor for image objects. + * + * @param format Image format + * @param data_type Image data type + * @param width The pixel width of the image + * @param height The pixel height of the image + * @param buffer (optional) A pointer to the image data. * If buffer is null, the data will be allocated by the CVML context specified via Map() * If buffer not null: * - If Flags::kDeviceMemoryImport is not specified, the buffer is expected to be a host buffer. * - If Flags::kDeviceMemoryImport is specified, the buffer shall point to a HANDLE/fd * to a device local memory (for example, vulkan device local memory). - * @param stride: (optional) if stride is not specified, image will be stored continuously. - * @param flags: (optional): bit mask of Flags specifying the valid usage of the image. + * @param stride (optional) if stride is not specified, image will be stored continuously. + * @param flags (optional): bit mask of Flags specifying the valid usage of the image. * See Image::Flags for more information. Defaults to both source and target. * If not specified, the default value is Flags::kSource | Flags::kTarget */ @@ -119,28 +120,34 @@ class CVML_SDK_EXPORT Image { [[deprecated("Use GetFormat()/GetDataType().")]] ImageType GetImageType() const; /** - * @deprecated - * @return address fo the CVML Image buffer + * Get CPU pointer to the buffer. + * If the Image object was constructed without an existing buffer pointer, + * a new CPU buffer is allocated to back the object and returned by this + * function. + * @return Underlying CPU pointer for the Image buffer object */ uint8_t* GetBuffer() const; /** - * Map CVML Image buffer using the specified CVML context - * @param context: CVML context to be associated with the image - * @param flags: flags for the operation - * @return address of the mapped CVML Image buffer + * @deprecated + * Map CVML Image buffer using the specified CVML context. + * This function is deprecated. Use GetBuffer() instead. + * + * @param context CVML context to be associated with the image + * @param flags Flags for the operation + * @return Address of the mapped CVML Image buffer */ uint8_t* Map(Context* context, uint32_t flags = 0); /** * Get the width of the image. - * @return: The width of the image. + * @return The width of the image. */ uint32_t GetWidth() const; /** * Get the height of the image. - * @return: The height of the image. + * @return The height of the image. */ uint32_t GetHeight() const; @@ -150,6 +157,12 @@ class CVML_SDK_EXPORT Image { */ Format GetFormat() const; + /** + * Get the stride of the image. + * @return The stride (bytes per row) that the image was created with. + */ + uint32_t GetStride() const; + /** * Get data type for this image. * @return The data type that the image was created with. @@ -158,6 +171,7 @@ class CVML_SDK_EXPORT Image { /** * Get the usage flag bit mask for this image. + * * @return The bit mask of flags that the image was created with. */ uint32_t GetFlags() const; @@ -166,10 +180,11 @@ class CVML_SDK_EXPORT Image { * Export the image so that it can be imported in a different device context * (for example, vulkan context). To make an image exportable, the image must * be created with Flags::kExport in constructor. - * @param handle: pointer to a handle the image wil be exported to. + * + * @param handle Pointer to a handle the image wil be exported to. * For windows, the pointer shall point to windows HANDLE struct. * For linux, the pointer shall point to file desriptor (int). - * @return Returns true on success, false on failure. + * @return true on success, false on failure. */ bool Export(void* handle); @@ -180,7 +195,7 @@ class CVML_SDK_EXPORT Image { Image& operator=(Image&&) noexcept = delete; class Impl; - Impl* impl_; + Impl* impl_; ///< Implementation of Image interface. }; } // namespace cvml diff --git a/example/Ryzen-AI-Library/include/cvml-logger.h b/example/Ryzen-AI-Library/include/cvml-logger.h index 9f6a9267..ab3421f4 100644 --- a/example/Ryzen-AI-Library/include/cvml-logger.h +++ b/example/Ryzen-AI-Library/include/cvml-logger.h @@ -1,33 +1,36 @@ /* - * Copyright (C) 2021-2023 Advanced Micro Devices, Inc. All rights reserved. + * Copyright (C) 2021-2024 Advanced Micro Devices, Inc. All rights reserved. */ #ifndef EDGEML_FEATURES_COMMON_FRAMEWORK_PUBLIC_INCLUDE_CVML_LOGGER_H_ #define EDGEML_FEATURES_COMMON_FRAMEWORK_PUBLIC_INCLUDE_CVML_LOGGER_H_ -#include #include #include "cvml-api-common.h" -using std::time_t; - namespace amd { namespace cvml { /** - * Interface to handle logging in cvml sdk + * Base class for capturing log messages from the SDK. + * + * To customize the target of log messages from the SDK, create a new C++ + * class derived from amd::cvml::Logger and implement its \a LogStr member + * function to direct formatted log messages to the target of choice. For + * example, a derived Logger class may choose to capture all log messages + * to a file on the file system or send them to another process or device. */ -class CVML_SDK_EXPORT CvmlLogger { - AMD_CVML_INTERFACE(CvmlLogger); +class CVML_SDK_EXPORT Logger { + AMD_CVML_INTERFACE(Logger); public: /** * Log levels to set the log output verbosity. * Logger will print all the log messages if the log level is greater than - * or equal to the level which is already set + * or equal to the level which is already set. */ - enum class LogLevels { + enum LogLevels { kVERBOSE = 0, ///< To print all types of log messages kDEBUG = 1, ///< To print debug type messages and the levels above kDEBUG kINFO = 2, ///< To print information type messages and the levels above kINFO @@ -40,16 +43,16 @@ class CVML_SDK_EXPORT CvmlLogger { /** * Set the required log level * - * @param level A valid value from CvmlLogger::LogLevels + * @param level A valid value from Logger::LogLevels */ - void SetLogLevel(CvmlLogger::LogLevels level) { level_ = level; } + void SetLogLevel(Logger::LogLevels level) { level_ = level; } /** * Get the log level * - * @return level A valid value from CvmlLogger::LogLevels + * @return level A valid value from Logger::LogLevels */ - CvmlLogger::LogLevels GetLogLevel() { return level_; } + Logger::LogLevels GetLogLevel() { return level_; } /** * Write an entry into the log with a std::string message as input @@ -57,7 +60,7 @@ class CVML_SDK_EXPORT CvmlLogger { * @param log_level Type of the log message * @param msg Message of std::string type that needs to be logged */ - void Log(amd::cvml::CvmlLogger::LogLevels log_level, const std::string& msg); + void Log(amd::cvml::Logger::LogLevels log_level, const std::string& msg); /** * Write an entry into the log with a C type string as input @@ -65,22 +68,29 @@ class CVML_SDK_EXPORT CvmlLogger { * @param log_level Type of the log message * @param msg C type string message that needs to be logged */ - void Log(amd::cvml::CvmlLogger::LogLevels log_level, const char* msg); + void Log(amd::cvml::Logger::LogLevels log_level, const char* msg); /** - * Print the actual log message.Implemented by the respective child class + * Output the actual log message. * - * @param msg C type string message that needs to be logged + * This capability is must be implemented by a derived class. + * + * @param msg C type string message to be logged */ virtual void LogStr(const char* msg) = 0; protected: - CvmlLogger::LogLevels level_ = CvmlLogger::LogLevels::kINFO; + /// Currently configured log level + Logger::LogLevels level_ = Logger::LogLevels::kINFO; }; // \deprecated -// Below typedef is retained for backward compatibility -typedef CvmlLogger ICvmlLogger; +// This definition is retained for backward compatibility only. +using ICvmlLogger = Logger; + +// \deprecated +// This definition is retained for backward compatibility only. +using CvmlLogger = Logger; } // namespace cvml } // namespace amd diff --git a/example/Ryzen-AI-Library/include/cvml-types.h b/example/Ryzen-AI-Library/include/cvml-types.h index 7d7c6c6c..dd6366d9 100644 --- a/example/Ryzen-AI-Library/include/cvml-types.h +++ b/example/Ryzen-AI-Library/include/cvml-types.h @@ -1,5 +1,5 @@ /*! - * Copyright (C) 2022-2023 Advanced Micro Devices, Inc. All rights reserved. + * Copyright (C) 2022-2024 Advanced Micro Devices, Inc. All rights reserved. * * @file * @@ -57,7 +57,7 @@ struct CVML_SDK_EXPORT Rect { * * @param x X cordinate of top left corner * @param y Y cordinate of top left corner - * @param wdith Rectange width + * @param width Rectange width * @param height Rectange height */ Rect(_Tp x, _Tp y, _Tp width, _Tp height) : x_(x), y_(y), width_(width), height_(height) {} @@ -75,17 +75,13 @@ struct CVML_SDK_EXPORT Rect { _Tp height_; }; -// explicitly exporting template definition -template struct CVML_SDK_EXPORT Rect; -template struct CVML_SDK_EXPORT Rect; -template struct CVML_SDK_EXPORT Rect; - typedef Rect Rect_i; typedef Rect Rect_f; typedef Rect Rect_d; +typedef Rect Rect_u; /** - * Point with integer values + * Structure for 2-dimensional Point values. */ template struct CVML_SDK_EXPORT Point { @@ -109,17 +105,12 @@ struct CVML_SDK_EXPORT Point { _Tp y_; }; -// explicitly exporting template definition -template struct CVML_SDK_EXPORT Point; -template struct CVML_SDK_EXPORT Point; -template struct CVML_SDK_EXPORT Point; - typedef Point Point2i; typedef Point Point2f; typedef Point Point2d; /** - * Point with 3D values + * Structure for 3-dimensional Point values. */ template struct CVML_SDK_EXPORT Point3 { @@ -147,42 +138,36 @@ struct CVML_SDK_EXPORT Point3 { _Tp z_; }; -// explicitly exporting template definition -template struct CVML_SDK_EXPORT Point3; -template struct CVML_SDK_EXPORT Point3; -template struct CVML_SDK_EXPORT Point3; - typedef Point3 Point3i; typedef Point3 Point3f; typedef Point3 Point3d; /** - * Struct for bounding boxes at angles + * Structure for quadrilaterals at arbitrary angles. */ template -struct CVML_SDK_EXPORT BoundingQuad { +struct CVML_SDK_EXPORT Quad { /** * Default constructor. */ - BoundingQuad() = default; + Quad() = default; /** - * Initializing constructor using Points + * Initializing constructor using Points. * * @param top_left coordinates of top left point * @param top_right coordinates of top right point * @param bottom_left coordinates of bottom left point * @param bottom_right coordinates of bottom right point */ - BoundingQuad(Point<_Tp> top_left, Point<_Tp> top_right, Point<_Tp> bottom_left, - Point<_Tp> bottom_right) + Quad(Point<_Tp> top_left, Point<_Tp> top_right, Point<_Tp> bottom_left, Point<_Tp> bottom_right) : top_left_(top_left), top_right_(top_right), bottom_left_(bottom_left), bottom_right_(bottom_right) {} /** - * Initializing contrustor using explict x and y values + * Initializing contructor using explict x and y values. * * @param x_tl top left x value * @param y_tl top left y value @@ -193,7 +178,7 @@ struct CVML_SDK_EXPORT BoundingQuad { * @param x_br bottom right x value * @param y_br bottom right y value */ - BoundingQuad(_Tp x_tl, _Tp y_tl, _Tp x_tr, _Tp y_tr, _Tp x_bl, _Tp y_bl, _Tp x_br, _Tp y_br) + Quad(_Tp x_tl, _Tp y_tl, _Tp x_tr, _Tp y_tr, _Tp x_bl, _Tp y_bl, _Tp x_br, _Tp y_br) : top_left_(Point<_Tp>(x_tl, y_tl)), top_right_(Point<_Tp>(x_tr, y_tr)), bottom_left_(Point<_Tp>(x_bl, y_bl)), @@ -209,37 +194,41 @@ struct CVML_SDK_EXPORT BoundingQuad { Point<_Tp> bottom_right_; }; -// explicitly exporting template definition -template struct CVML_SDK_EXPORT BoundingQuad; -template struct CVML_SDK_EXPORT BoundingQuad; -template struct CVML_SDK_EXPORT BoundingQuad; +/// Alias to older 'BoundingQuad' template definition. +template +using BoundingQuad = Quad; -typedef BoundingQuad BoundingQuadi; -typedef BoundingQuad BoundingQuadf; -typedef BoundingQuad BoundingQuadd; +typedef Quad Quadi; +typedef Quad Quadf; +typedef Quad Quadd; /** - * An Array class that can contain instances of classes T + * Fixed size array template class for multiple instances of class T. */ template class CVML_SDK_EXPORT Array { public: /** - * Default constructor - **/ + * Default constructor. + */ Array() : v_(nullptr), size_(0) {} /** - * Move constructor - **/ + * Move constructor. + * + * @param other Source array + */ Array(Array&& other) noexcept : v_(std::move(other.v_)), size_(std::exchange(other.size_, 0)) { other.v_ = nullptr; other.size_ = 0; } /** - * Move assignment - **/ + * Move assignment operator. + * + * @param other Source array + * @return Reference to updated object + */ Array& operator=(Array&& other) noexcept { if (this != &other) { if (v_) delete[] v_; @@ -252,24 +241,34 @@ class CVML_SDK_EXPORT Array { } /** - * Constructor that initilize required number of classes T - * throw an exception in case of error - **/ + * Constructor that initilize required number of classes T. + * + * This function throws exceptions on errors. + * + * @param size Desired size of the array + */ explicit Array(size_t size) : v_{new T[size]}, size_(size) {} /** - * Copy constructor - * throw an exception in case of error - **/ + * Copy constructor. + * + * This function throws exceptions on errors. + * + * @param other Source array + */ Array(const Array& other) : v_{new T[other.size()]}, size_(other.size()) { for (size_t i = 0; i < other.size(); i++) // copy elements v_[i] = other[i]; } /** - * assign operator - * throw an exception in case of error - **/ + * Assignment operator. + * + * This operator throws exceptions on errors. + * + * @param other Source array + * @return Reference to updated object + */ Array& operator=(const Array& other) { if (&other != this) { T* p = new T[other.size()]; @@ -284,7 +283,7 @@ class CVML_SDK_EXPORT Array { /** * Read only operator[] for const objects. * - * Throws exceptions on out-of-range subscript. + * This operator throws exceptions on out-of-range subscripts. * * @param i Index to array * @return Array value @@ -297,7 +296,7 @@ class CVML_SDK_EXPORT Array { /** * operator[] for subscript access. * - * Throws exceptions on out-of-range subscript. + * This operator throws exceptions on out-of-range subscripts. * * @param i Index to array * @return Reference to array entry @@ -308,7 +307,9 @@ class CVML_SDK_EXPORT Array { } /** - * Returns the size of the array + * Returns the size of the array. + * + * @return Current size of the array */ size_t size() const { return size_; } @@ -325,14 +326,8 @@ class CVML_SDK_EXPORT Array { size_t size_; ///< Current size of the array }; -/// explicitly exporting template definition -template class CVML_SDK_EXPORT Array; -template class CVML_SDK_EXPORT Array; -template class CVML_SDK_EXPORT Array; -template class CVML_SDK_EXPORT Array; - /** - * This structure represents face location and landmarks for a single person. + * Structure representing face location and landmarks for a single person. */ struct CVML_SDK_EXPORT Face { /// Constructor @@ -351,13 +346,16 @@ struct CVML_SDK_EXPORT Face { /// Facial landmarks are used to localize and represent important regions of the face, such as: /// mouth, eyes, eyebrows, nose Array landmarks_; + + /// Get bounding box + Rect_i GetROI() { return face_; } }; /// explicitly exporting template definition template class CVML_SDK_EXPORT Array; /** - * This structure represents the landmarks and bounding box for a single person. + * Structure representing landmarks and bounding box for a single person. */ struct Person { /// Bounding box for this person @@ -371,6 +369,9 @@ struct Person { /// Detected landmark scores for this person Array landmark_scores_; + + /// Get bounding box + Rect_i GetROI() { return person_; } }; } // namespace cvml diff --git a/example/Ryzen-AI-Library/include/float16.hpp b/example/Ryzen-AI-Library/include/float16.hpp deleted file mode 100644 index ae5313d2..00000000 --- a/example/Ryzen-AI-Library/include/float16.hpp +++ /dev/null @@ -1,289 +0,0 @@ -/** - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright Shilei Tian - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef HALF_PRECISION_LIBRARY_H -#define HALF_PRECISION_LIBRARY_H - -#pragma once - -#include -#include - -#define HLF_EPSILON 1e-3 -#define HLF_MAX 65504 -#define HLF_MIN 6.1035e-05 - -struct float16 { - float16() = default; - - float16(const float16&) = default; - - float16(float16&&) = default; - - explicit float16(const float& rhs); - - float16& operator=(const float& rhs); - - // Operator +=, -=, *=, /= -#define BINARY_ARITHMETIC_OPERATOR(OP) \ - float16& operator OP##=(const float16& rhs) { \ - *this = operator float() OP static_cast(rhs); \ - return *this; \ - } - - BINARY_ARITHMETIC_OPERATOR(+) - - BINARY_ARITHMETIC_OPERATOR(-) - - BINARY_ARITHMETIC_OPERATOR(*) - - BINARY_ARITHMETIC_OPERATOR(/) - -#undef BINARY_ARITHMETIC_OPERATOR - - // Operator ++, -- - float16& operator++() { - *this += float16(1); - return *this; - } - - float16 operator++(int) { - float16 ret(*this); - operator++(); - return ret; - } - - float16& operator--() { - *this -= float16(1); - return *this; - } - - float16 operator--(int) { - float16 ret(*this); - operator--(); - return ret; - } - - // Operator float - operator float() const; - - template friend - struct std::hash; - -private: - uint16_t buf; -}; - -namespace std { - - template<> - struct hash { - std::size_t operator()(const float16& key) const { - return hash()(key.buf); - } - }; - -} - -#endif diff --git a/example/Ryzen-AI-Library/samples/common-sample-utils/include/common-sample-utils.h b/example/Ryzen-AI-Library/samples/common-sample-utils/include/common-sample-utils.h index 524bfd12..c6d04067 100644 --- a/example/Ryzen-AI-Library/samples/common-sample-utils/include/common-sample-utils.h +++ b/example/Ryzen-AI-Library/samples/common-sample-utils/include/common-sample-utils.h @@ -1,10 +1,11 @@ /* - * Copyright (C) 2021-2023 Advanced Micro Devices, Inc. All rights reserved. + * Copyright (C) 2021-2024 Advanced Micro Devices, Inc. All rights reserved. */ #ifndef SAMPLES_COMMON_SAMPLE_UTILS_INCLUDE_COMMON_SAMPLE_UTILS_H_ #define SAMPLES_COMMON_SAMPLE_UTILS_INCLUDE_COMMON_SAMPLE_UTILS_H_ +#include #include #include @@ -24,6 +25,16 @@ typedef struct CamRes { int height; } CamRes; +/** + * Returns list of files in folder with specified file extensions (excludes subdirectories) + * @param folder path to folder + * @param supported_exts accepted file extensions + * + * @return list of filenames + */ +std::vector GetListOfFilesInDir(const std::filesystem::path& folder, + std::vector supported_exts); + /** * Sets up the camera with the specified camera id according to the preferred resolution list * @param camera_index: camera to open @@ -79,6 +90,16 @@ class RunFeatureClass { // Called for specific run feature code in each feature virtual cv::Mat Feature(const cv::Mat& input_frame_rgb) { return input_frame_rgb; } + /** + * The input extension is used to establish streaming mode. If a camera index is + * passed then the streaming mode is set to be online. + * + * @param src_path: Uses the same semantics as RunFeature's input. + * Input file name, or "" if camera desired + * @param context: CVML context being used in the sample + */ + void SetContextStreamingModeBySrc(amd::cvml::Context* context, const std::string& src_path); + /** * Opens video source and executes the feature. * @@ -104,6 +125,7 @@ class RunFeatureClass { std::vector* supported_res = nullptr); protected: + bool is_camera_; ///< Whether input is camera cv::VideoCapture video_input_; ///< OpenCV video capture device cv::VideoWriter video_output_; ///< Video writer for main output @@ -168,21 +190,34 @@ bool ParseArguments(int argc, char** const argv, std::string* input_str, std::st */ void PutRectangle(cv::Mat* image, const cv::Rect& rect, const cv::Scalar& color); +/** + * Specify extra flags for PutText's override_x parameter. + */ +enum PUTTEXT { + /// Specify X center for PutText() + OVERRIDE_CENTER = 0x0, + + /// Specify absolute X offset for PutText() + OVERRIDE_ABSOLUTE = 1 << (sizeof(int) * 8 - 2) +}; + /** * Render text strings into the frame. + * To center text around a point, set override_x = PUTTEXT * * @param image Target image buffer * @param display_text String of text to render * @param row Zero-based row number to render text, assuming text console * @param text_color Color of text to render - * @param center_x If non-zero, text will be centered around this point + * @param override_x If non-zero, change behavior based on PUTTEXT flags * @param text_height If non-zero, specifies text height as a percentage of the frame height * @param fill_background Whether or not an opaque background should be added * @param background_color Color of background, if specified + * @return End X value of the rendered text */ -void PutText(cv::Mat* image, const std::string& display_text, const int text_row, - cv::Scalar text_color, const int center_x, const int text_height, - const bool fill_background = false, cv::Scalar background_color = cv::Scalar(0, 0, 0)); +int PutText(cv::Mat* image, const std::string& display_text, const int text_row, + cv::Scalar text_color, const int override_x, const int text_height, + const bool fill_background = false, cv::Scalar background_color = cv::Scalar(0, 0, 0)); } // namespace utils } // namespace sample diff --git a/example/Ryzen-AI-Library/samples/common-sample-utils/src/common-sample-camera-utils.cpp b/example/Ryzen-AI-Library/samples/common-sample-utils/src/common-sample-camera-utils.cpp new file mode 100644 index 00000000..12abfff7 --- /dev/null +++ b/example/Ryzen-AI-Library/samples/common-sample-utils/src/common-sample-camera-utils.cpp @@ -0,0 +1,236 @@ +/* + * Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved. + */ + +#include "common-sample-utils.h" + +#ifdef _WIN32 +#include +#include +#include +#include +#include + +#pragma comment(lib, "Mfplat.lib") +#pragma comment(lib, "Mf.lib") +#pragma comment(lib, "mfreadwrite.lib") +#pragma comment(lib, "mfuuid.lib") +#endif + +using amd::cvml::sample::utils::CamRes; + +namespace amd { +namespace cvml { +namespace sample { +namespace utils { + +#ifdef _WIN32 +/** + * camera supported media type + */ +struct MediaTypeInfo { + GUID type; /// Image type + UINT32 width; + UINT32 height; /// Resolution + UINT32 fps; /// Frame rate +}; + +/** + * Helper function to enumerate camera supported image type and resolution. + * + * @param camera_index: selected camera index + * @return Enumeration of image type and resolution + */ +std::vector EnumerateCameraImageTypes(int camera_index) { + std::vector formats; + + // Initialize Media Foundation + HRESULT hr = MFStartup(MF_VERSION); + if (FAILED(hr)) { + std::cout << "Failed to initialize Media Foundation" << std::endl; + return formats; + } + + // Enumerate video capture devices + IMFAttributes* pAttributes = nullptr; + IMFActivate** ppDevices = nullptr; + UINT32 devicecount = 0; + + hr = MFCreateAttributes(&pAttributes, 1); + if (FAILED(hr) || pAttributes == nullptr) { + std::cerr << "Failed to create source resolver" << std::endl; + MFShutdown(); + return formats; + } + + hr = pAttributes->SetGUID(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, + MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID); + if (FAILED(hr)) { + std::cerr << "Failed to set device capture attribute" << std::endl; + pAttributes->Release(); + MFShutdown(); + return formats; + } + + hr = MFEnumDeviceSources(pAttributes, &ppDevices, &devicecount); + pAttributes->Release(); + if (FAILED(hr) || ppDevices == nullptr || devicecount == 0 || + camera_index >= static_cast(devicecount)) { + std::cerr << "No valid video capture devices found" << std::endl; + if (ppDevices) { + for (UINT32 i = 0; i < devicecount; i++) { + ppDevices[i]->Release(); + } + CoTaskMemFree(ppDevices); + } + MFShutdown(); + return formats; + } + + // Activate the selected device + IMFMediaSource* pMediaSource = nullptr; + hr = ppDevices[camera_index]->ActivateObject(IID_PPV_ARGS(&pMediaSource)); + for (UINT32 i = 0; i < devicecount; i++) { + ppDevices[i]->Release(); + } + CoTaskMemFree(ppDevices); + if (FAILED(hr) || pMediaSource == nullptr) { + std::cerr << "Failed to activate media source" << std::endl; + MFShutdown(); + return formats; + } + + IMFSourceReader* pSourceReader = nullptr; + hr = MFCreateSourceReaderFromMediaSource(pMediaSource, nullptr, &pSourceReader); + pMediaSource->Release(); + if (FAILED(hr) || pSourceReader == nullptr) { + std::cerr << "Failed to create source reader" << std::endl; + MFShutdown(); + return formats; + } + + // Enumerate available formats + DWORD dwStreamIndex = 0, mediaTypeIndex = 0; + while (true) { + IMFMediaType* pType = nullptr; + hr = pSourceReader->GetNativeMediaType(dwStreamIndex, mediaTypeIndex, &pType); + if (hr == MF_E_NO_MORE_TYPES) { + mediaTypeIndex = 0; + dwStreamIndex++; + hr = pSourceReader->GetNativeMediaType(dwStreamIndex, mediaTypeIndex, &pType); + if (hr == MF_E_INVALIDREQUEST || hr == MF_E_NO_MORE_TYPES) break; + } + if (FAILED(hr)) break; + GUID subtype; + hr = pType->GetGUID(MF_MT_SUBTYPE, &subtype); + if (SUCCEEDED(hr)) { + // Get the resolution + UINT32 width = 0, height = 0; + hr = MFGetAttributeSize(pType, MF_MT_FRAME_SIZE, &width, &height); + if (SUCCEEDED(hr)) { + // Get the frame rate + UINT32 numerator = 0, denominator = 0; + hr = MFGetAttributeRatio(pType, MF_MT_FRAME_RATE, &numerator, &denominator); + if (SUCCEEDED(hr) && denominator != 0) { + UINT32 fps = numerator / denominator; + if (fps <= 30) { + formats.push_back({subtype, width, height, fps}); + } + } + } + } + pType->Release(); + mediaTypeIndex++; + } + + pSourceReader->Release(); + MFShutdown(); + + return formats; +} +#endif + +bool SetupCamera(int camera_index, const std::vector& res_list, cv::VideoCapture* camera) { + // list certain API preferences before CAP_ANY to try them first + // regardless of opencv's ordering + static const int camera_api_preference[] = { +#ifdef _WIN32 + cv::CAP_DSHOW, cv::CAP_MSMF, +#endif + cv::CAP_ANY}; + + if (camera == nullptr) { + return false; + } + +#ifdef _WIN32 + std::vector camera_format = EnumerateCameraImageTypes(camera_index); +#endif + + for (auto api : camera_api_preference) { + try { + camera->open(camera_index, api); + if (camera->isOpened()) { + break; + } + } catch (std::exception& e) { + std::cout << "SetupCamera exception(" << api << "): " << e.what() << std::endl; + } + } + + if (camera->isOpened() != true) { + std::cout << "Failed to open camera device with id:" << camera_index << std::endl; + return false; + } + + bool result = false; + + for (auto res : res_list) { + camera->set(cv::CAP_PROP_FRAME_WIDTH, res.width); + camera->set(cv::CAP_PROP_FRAME_HEIGHT, res.height); + camera->set(cv::CAP_PROP_FPS, 30); + auto w = camera->get(cv::CAP_PROP_FRAME_WIDTH); + auto h = camera->get(cv::CAP_PROP_FRAME_HEIGHT); + auto fps = camera->get(cv::CAP_PROP_FPS); + if (w != res.width || h != res.height) { + std::cout << "Camera doesn't support " << res.width << "x" << res.height << std::endl; + } else { + std::cout << "Camera enabled at " << w << "x" << h << "@" << fps << std::endl; + result = true; + break; + } + } + if (!result) { + std::cout << "No supported resolution for camera." << std::endl; + camera->release(); + return result; + } + +#ifdef _WIN32 + if (std::any_of(camera_format.cbegin(), camera_format.cend(), + [&camera](const MediaTypeInfo& format) { + return format.type == MFVideoFormat_MJPG && + format.width == camera->get(cv::CAP_PROP_FRAME_WIDTH) && + format.height == camera->get(cv::CAP_PROP_FRAME_HEIGHT) && + camera->get(cv::CAP_PROP_FRAME_HEIGHT) >= 1080 && format.fps >= 30; + })) { + camera->set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G')); + std::cout << "Image type set to MJPG!" << std::endl; + if (!camera->isOpened()) { + std::cout << "Set MJPG format failed!" << std::endl; + result = false; + } + } + std::cout << "Selected " << camera->get(cv::CAP_PROP_FRAME_WIDTH) << "x" + << camera->get(cv::CAP_PROP_FRAME_HEIGHT) << "@" << camera->get(cv::CAP_PROP_FPS) + << std::endl; + +#endif + + return result; +} + +} // namespace utils +} // namespace sample +} // namespace cvml +} // namespace amd diff --git a/example/Ryzen-AI-Library/samples/common-sample-utils/src/common-sample-utils.cpp b/example/Ryzen-AI-Library/samples/common-sample-utils/src/common-sample-utils.cpp index 20a0bf81..2f870ee6 100644 --- a/example/Ryzen-AI-Library/samples/common-sample-utils/src/common-sample-utils.cpp +++ b/example/Ryzen-AI-Library/samples/common-sample-utils/src/common-sample-utils.cpp @@ -7,6 +7,7 @@ #include #include #include +#include using amd::cvml::sample::utils::CamRes; @@ -15,57 +16,6 @@ namespace cvml { namespace sample { namespace utils { -bool SetupCamera(int camera_index, const std::vector& res_list, cv::VideoCapture* camera) { - // list certain API preferences before CAP_ANY to try them first - // regardless of opencv's ordering - static const int camera_api_preference[] = { -#ifdef _WIN32 - cv::CAP_DSHOW, cv::CAP_MSMF, -#endif - cv::CAP_ANY}; - - if (camera == nullptr) { - return false; - } - - for (auto api : camera_api_preference) { - try { - camera->open(camera_index, api); - if (camera->isOpened()) { - break; - } - } catch (std::exception& e) { - std::cout << "SetupCamera exception(" << api << "): " << e.what() << std::endl; - } - } - - if (camera->isOpened() != true) { - std::cout << "Failed to open camera device with id:" << camera_index << std::endl; - return false; - } - - bool result = false; - - for (auto res : res_list) { - camera->set(cv::CAP_PROP_FRAME_WIDTH, res.width); - camera->set(cv::CAP_PROP_FRAME_HEIGHT, res.height); - auto w = camera->get(cv::CAP_PROP_FRAME_WIDTH); - auto h = camera->get(cv::CAP_PROP_FRAME_HEIGHT); - if (w != res.width || h != res.height) { - std::cout << "Camera doesn't support " << res.width << "x" << res.height << std::endl; - } else { - std::cout << "Camera enabled at " << w << "x" << h << std::endl; - result = true; - break; - } - } - if (!result) { - std::cout << "No supported resolution for camera." << std::endl; - camera->release(); - } - return result; -} - /** * Helper function to determine output display scale factor. * @@ -109,6 +59,25 @@ bool RunFeatureClass::GetSingleVideoFrame(uint32_t frame_id) { return true; } +void RunFeatureClass::SetContextStreamingModeBySrc(amd::cvml::Context* context, + const std::string& src_path) { + // assume camera index if a number is provided + const std::string input_str = src_path.empty() ? "0" : src_path; + std::string ext = static_cast(input_str).extension().string(); + if (ext.length() == 0 && std::isdigit(input_str[0])) { + context->SetStreamingMode(amd::cvml::Context::StreamingMode::ONLINE_STREAMING); + } else { + // check if we can treat the input as an image + auto frame_rgb = cv::imread(input_str); + if (!frame_rgb.empty()) { + context->SetStreamingMode(amd::cvml::Context::StreamingMode::ONE_SHOT); + } else { + // assume the input is a video file + context->SetStreamingMode(amd::cvml::Context::StreamingMode::OFFLINE_STREAMING); + } + } +} + bool RunFeatureClass::RunFeatureStreaming() { bool user_exit = false; @@ -117,6 +86,7 @@ bool RunFeatureClass::RunFeatureStreaming() { // set FPS to be the same as the input device/file, or 30FPS if (video_input_.isOpened()) { stream_fps_ = video_input_.get(cv::CAP_PROP_FPS); + if (is_camera_) stream_fps_ = 30.0f; } // ms time for stream_fps_ @@ -124,7 +94,8 @@ bool RunFeatureClass::RunFeatureStreaming() { std::chrono::milliseconds(static_cast(1000 / stream_fps_)); // record start time - std::chrono::steady_clock::time_point start_time = std::chrono::steady_clock::now(); + // std::chrono::steady_clock::time_point start_time = std::chrono::steady_clock::now(); + std::chrono::steady_clock::time_point start_time; // // Iterate over frames @@ -132,6 +103,8 @@ bool RunFeatureClass::RunFeatureStreaming() { // so is good enough for a sample application. // for (frame_id = 1; GetSingleVideoFrame(frame_id - 1); ++frame_id) { + if (frame_id == 2) start_time = std::chrono::steady_clock::now(); + // Run feature and measure effective fps (execution time of a single feature call) std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now(); cv::Mat frame_out = Feature(frame_rgb_); @@ -239,7 +212,8 @@ bool RunFeatureClass::RunFeatureStreaming() { std::chrono::duration_cast(current_time - start_time); // extra sleep to simulate expected FPS - if (elapsed_time < test_fps_period_ * frame_id) { + if (elapsed_time < test_fps_period_ * (frame_id - 1)) { + // std::cout << "Sleep triggered, printout" << std::endl; std::this_thread::sleep_for(test_fps_period_ * frame_id - elapsed_time); } } @@ -279,7 +253,10 @@ void RunFeatureClass::RunFeature(const std::string& input, const std::string& ou std::vector* supported_res) { // attempt to open output file later if name specified open_output_file_ = output_file.size() > 0; - output_file_ = output_file; + if (open_output_file_) { + std::filesystem::path output_path(output_file); + output_file_ = std::filesystem::absolute(output_path).string(); + } output_window_name_ = window_title; // default frame rate @@ -297,11 +274,11 @@ void RunFeatureClass::RunFeature(const std::string& input, const std::string& ou std::string ext = static_cast(input_str).extension().string(); bool is_image{false}; bool is_video{false}; - bool is_camera{false}; + is_camera_ = false; // assume camera index if a number is provided if (ext.length() == 0 && std::isdigit(input_str[0])) { - is_camera = true; + is_camera_ = true; } else { // check if we can treat the input as an image frame_rgb_ = cv::imread(input_str); @@ -314,7 +291,7 @@ void RunFeatureClass::RunFeature(const std::string& input, const std::string& ou } } - if (is_camera) { + if (is_camera_) { // // Camera // @@ -354,6 +331,26 @@ void RunFeatureClass::RunFeature(const std::string& input, const std::string& ou } } +std::vector GetListOfFilesInDir(const std::filesystem::path& folder, + std::vector supported_exts) { + std::vector listOfFiles{}; + if (std::filesystem::exists(folder) && std::filesystem::is_directory(folder)) { + for (const std::filesystem::directory_entry& iter : + std::filesystem::directory_iterator(folder)) { + if (iter.is_regular_file()) { + std::string ext = iter.path().extension().string(); + if (std::find(supported_exts.begin(), supported_exts.end(), ext) != + supported_exts.end()) { // Add current file to list if extension is supported + listOfFiles.push_back(iter.path().string()); + } + } + } + } else { + std::cout << "Error accessing folder " << folder.string() << std::endl; + } + return listOfFiles; +} + std::string CreateFolderWithTimestamp() { std::string file_save_path = GetTimestamp(); namespace fs = std::filesystem; @@ -365,10 +362,16 @@ std::string CreateFolderWithTimestamp() { std::string GetTimestamp() { std::string timestamp{}; + std::stringstream mon_s, day_s, hour_s, min_s, sec_s; +#ifdef _WIN32 struct tm ltm; time_t now = time(0); localtime_s(<m, &now); - std::stringstream mon_s, day_s, hour_s, min_s, sec_s; +#else + time_t now = time(&now); + struct tm ltm; + localtime_r(&now, <m); +#endif mon_s << std::setw(2) << std::setfill('0') << (ltm.tm_mon + 1); day_s << std::setw(2) << std::setfill('0') << ltm.tm_mday; hour_s << std::setw(2) << std::setfill('0') << ltm.tm_hour; @@ -383,14 +386,10 @@ void GetPlatformInformation() { amd::cvml::SupportedPlatformInformation info{}; amd::cvml::Context::GetSupportedPlatformInformation(&info); - for (size_t i = 0; i < info.supported_platform_count; i++) { - std::cout << "supported APU devide-id: 0x" << std::hex << info.platform[i].device_id << std::dec - << std::endl; - std::cout << "required minimal-vulkan-driver-version: 0x" << std::hex - << info.platform[i].required_gpu_minimal_vulkan_driver_version << std::dec - << std::endl; + if (info.supported_platform_count > 0) { + std::cout << "Required minimam Vulkan driver version: 0x" << std::hex + << info.platform[0].required_gpu_minimal_vulkan_driver_version << std::endl; } - std::cout << "supported_platform_count=" << info.supported_platform_count << std::endl; } bool ParseArguments(int argc, char** const argv, std::string* input_str, std::string* output_file, @@ -415,7 +414,7 @@ bool ParseArguments(int argc, char** const argv, std::string* input_str, std::st (void)e; } if (arg_help == nullptr) { - std::cout << "Usage: " << app_name << ".exe" + std::cout << "Usage: " << app_name << " [-i input] [-o file]\n" " -i\tSpecify an input image/video file or camera device index\n" " -o\tSpecify output image/video file name\n"; @@ -469,9 +468,9 @@ void PutRectangle(cv::Mat* image, const cv::Rect& rect, const cv::Scalar& color) } } -void PutText(cv::Mat* image, const std::string& display_text, const int text_row, - cv::Scalar text_color, const int center_x, const int text_height, - const bool fill_background, cv::Scalar background_color) { +int PutText(cv::Mat* image, const std::string& display_text, const int text_row, + cv::Scalar text_color, const int override_x, const int text_height, + const bool fill_background, cv::Scalar background_color) { static int TEXT_HEIGHT = 30; // hard coded text height, because getTextSize isn't reliable static int TEXT_BOX_OFFSET = 5; // offset for background box static int TEXT_PADDING = 3; // space between rows of text @@ -480,7 +479,7 @@ void PutText(cv::Mat* image, const std::string& display_text, const int text_row if (image == nullptr || text_row < 0) { // silently return - return; + return -1; } double text_scale = TEXT_SCALE; @@ -496,7 +495,7 @@ void PutText(cv::Mat* image, const std::string& display_text, const int text_row } // cppcheck-suppress knownConditionTrueFalse - int text_font = text_scale > 1.0 ? cv::FONT_HERSHEY_COMPLEX : cv::FONT_HERSHEY_DUPLEX; + int text_font = text_scale > 1.0 ? cv::FONT_HERSHEY_DUPLEX : cv::FONT_HERSHEY_PLAIN; int text_box_offset = static_cast(TEXT_BOX_OFFSET * text_scale + 0.5); int text_padding = static_cast(TEXT_PADDING * text_scale + 0.5); int text_thickness = static_cast(TEXT_THICKNESS * text_scale); @@ -505,14 +504,18 @@ void PutText(cv::Mat* image, const std::string& display_text, const int text_row auto text_size = cv::getTextSize(display_text, text_font, text_scale, text_thickness, nullptr); // constant left starting point for english text - int origin_x = TEXT_PADDING; + int org_x = TEXT_PADDING; - // handle text centering - if (center_x != 0) { - origin_x += center_x - text_size.width / 2; + if (override_x > 0) { + if (override_x & PUTTEXT::OVERRIDE_ABSOLUTE) { + org_x = override_x & ~(PUTTEXT::OVERRIDE_ABSOLUTE); + } else { + // handle text centering + org_x = override_x - text_size.width / 2; + } } - cv::Point2i origin = cv::Point2i(origin_x, (text_h + text_padding) * (text_row + 1)); + cv::Point2i origin = cv::Point2i(org_x, (text_h + text_padding) * (text_row + 1)); if (fill_background) { // draw rectangle on frame for each text @@ -523,6 +526,7 @@ void PutText(cv::Mat* image, const std::string& display_text, const int text_row // actually display the text cv::putText(*image, display_text, origin, text_font, text_scale, text_color, text_thickness); + return org_x + text_size.width; } } // namespace utils diff --git a/example/Ryzen-AI-Library/samples/cvml-sample-depth-estimation/README.md b/example/Ryzen-AI-Library/samples/cvml-sample-depth-estimation/README.md index a2487ed7..b7f7e3a4 100644 --- a/example/Ryzen-AI-Library/samples/cvml-sample-depth-estimation/README.md +++ b/example/Ryzen-AI-Library/samples/cvml-sample-depth-estimation/README.md @@ -18,7 +18,7 @@ set PYTHONHOME=\envs\ set PYTHONPATH=\envs\ ``` -4. Move ``vaip_config.json`` from ``path\to\ryzen-ai-sw-1.0\voe-4.0-win_amd64\`` to ``path\to\Ryzen-AI-Library-Public-Release\windows`` +4. Move ``vaip_config.json`` from ``path\to\ryzen-ai-sw-1.0\voe-4.0-win_amd64\`` to ``path\to\Ryzen-AI-Library-Public-Release\windows\onnx\vai`` 5. Navigate to the samples directory and run depth-estimation application: ``` cvml-samples-depth-estimation.exe -i path\to\input -o path\to\output @@ -38,7 +38,7 @@ pip install numpy pip install voe-0.1.0-cp39-cp39-win_amd64.whl ``` -3. Move ``vaip_config.json`` from ``path\to\ryzen-ai-sw-1.0\voe-4.0-win_amd64\`` to ``path\to\Ryzen-AI-Library-Public-Release\windows`` +3. Move ``vaip_config.json`` from ``path\to\ryzen-ai-sw-1.0\voe-4.0-win_amd64\`` to ``path\to\Ryzen-AI-Library-Public-Release\windows\onnx\vai`` 4. Run RyzenAI sample diff --git a/example/Ryzen-AI-Library/samples/cvml-sample-depth-estimation/cvml-sample-depth-estimation.exe b/example/Ryzen-AI-Library/samples/cvml-sample-depth-estimation/cvml-sample-depth-estimation.exe index 0a5c98bc447f6c671804eb6d2a7c0971a628c14e..97601de0488137bbc830d3b353a1debc5cad0abf 100644 GIT binary patch literal 77520 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 #include @@ -22,7 +22,6 @@ class DepthEstimationSample : public amd::cvml::sample::utils::RunFeatureClass { std::string input_str_{}; ///< frame source: image or video or camera std::string output_file_{}; ///< Output file path/name bool use_fp16_; ///< depth output type - amd::cvml::DepthEstimation::DepthModelType de_model_{}; ///< Depth model to use /** * Post process depth map for opencv visualization. @@ -64,7 +63,7 @@ cv::Mat DepthEstimationSample::Feature(const cv::Mat& frame_rgb) { depth_estimation_->GenerateDepthMap(input_frame_amd_image, &output_img); if (!depth_map_generated) { std::cout << "Failed to generate depth map" << std::endl; - throw std::exception("Failed to generate depth map!"); + throw std::runtime_error("Failed to generate depth map!"); } return DepthEstimationCvmlToOpenCV(&output_img); } @@ -77,7 +76,7 @@ cv::Mat DepthEstimationSample::DepthEstimationCvmlToOpenCV(const Image* depth_ma float* depth_map_or_p = reinterpret_cast(reinterpret_cast(depth_map->GetBuffer())); if (depth_map_or_p == nullptr) { - throw std::exception("Failed to get depth map data!"); + throw std::runtime_error("Failed to get depth map data!"); } if (use_fp16_) { cv::Mat depth_map_or_mat_raw2 = @@ -98,48 +97,6 @@ cv::Mat DepthEstimationSample::DepthEstimationCvmlToOpenCV(const Image* depth_ma return frame_out; } -void PrintHelpMessage() { - std::cout << "Usage: cvml-sample-depth-estimation.exe [-i input image/video] [-o output " - "image/video] [-m depth model] [-h]" - << std::endl; - std::cout << " -i\tSpecify an input image/video file or camera device index" << std::endl; - std::cout << " -o\tSpecify output image/video file name" << std::endl; - std::cout << " -m\tspecify depth estimation model. e.g. . Optional. Fast " - "is the default" - << std::endl; - std::cout << " -h\tshow usage" << std::endl; - - std::cout << "Example 1: cvml-sample-depth-estimation.exe -i image.jpg" << std::endl; - std::cout << "Example 2: cvml-sample-depth-estimation.exe -i image.jpg -m precise" << std::endl; -} - -bool ParseArguments(int argc, char** argv, DepthEstimationSample* local_data) { - std::string de_model_str; - for (int i = 1; i < argc; i++) { - if (std::string(argv[i]) == "-i" && ((i + 1) < argc)) { - local_data->input_str_ = argv[i + 1]; - } else if (std::string(argv[i]) == "-o" && ((i + 1) < argc)) { - local_data->output_file_ = argv[i + 1]; - } else if (std::string(argv[i]) == "-m" && ((i + 1) < argc)) { - de_model_str = argv[i + 1]; - } else if (std::string(argv[i]) == "-h") { - PrintHelpMessage(); - return false; - } - } - - // choose depth model - if (de_model_str == "precise") { - local_data->de_model_ = amd::cvml::DepthEstimation::DepthModelType::Precise; - std::cout << "Running with precise Depth Estimation model" << std::endl; - } else { // default - local_data->de_model_ = amd::cvml::DepthEstimation::DepthModelType::Fast; - std::cout << "Running with fast Depth Estimation model" << std::endl; - } - - return true; -} - /** * Main entry point of the sample application. * @@ -154,7 +111,8 @@ int main(int argc, char** argv) { de_sample.side_by_side_ = true; // parse command line arguments - if (!ParseArguments(argc, argv, &de_sample)) { + if (!amd::cvml::sample::utils::ParseArguments(argc, argv, &de_sample.input_str_, + &de_sample.output_file_)) { return -1; } @@ -168,7 +126,7 @@ int main(int argc, char** argv) { context->SetInferenceBackend(amd::cvml::Context::InferenceBackend::AUTO); // initialize depth estimation class - amd::cvml::DepthEstimation depth_estimation(context, de_sample.de_model_); + amd::cvml::DepthEstimation depth_estimation(context); // execute main sample application loop with the created feature de_sample.depth_estimation_ = &depth_estimation; diff --git a/example/Ryzen-AI-Library/windows/amdblitter.dll b/example/Ryzen-AI-Library/windows/amdblitter.dll deleted file mode 100644 index 0c14956b..00000000 --- a/example/Ryzen-AI-Library/windows/amdblitter.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe8c2df7c1ad31bac2a73d59b8ef3df3b73d414c0d71dde5fec0fc093cb5a721 -size 8950784 diff --git a/example/Ryzen-AI-Library/windows/common-sample-utils.lib b/example/Ryzen-AI-Library/windows/common-sample-utils.lib index d5c4343d18493ff537a5dd1b478349946ff3ce31..e50cba7cc5ea6bc14773a8bc5e7b38f3b55fc117 100644 GIT binary patch literal 131 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 diff --git a/example/Ryzen-AI-Library/windows/cvml-depth-estimation.dll b/example/Ryzen-AI-Library/windows/cvml-depth-estimation.dll index ac3f6c59..41cbf572 100644 --- a/example/Ryzen-AI-Library/windows/cvml-depth-estimation.dll +++ b/example/Ryzen-AI-Library/windows/cvml-depth-estimation.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9dda0a9191ebcd19ec8831b0b15bffeec339467e62b2349a87f2f342de46235b -size 54267904 +oid sha256:80b530ecfa97203b8b1d0a6d390bc7e72f1ae9decde840741e7d51f837e24d2b +size 67993808 diff --git a/example/Ryzen-AI-Library/windows/cvml-depth-estimation.lib b/example/Ryzen-AI-Library/windows/cvml-depth-estimation.lib index 0a84854713fd14f7eb2ba36cab7fd628765b0879..66dc540f2ff282138ef482b0967a761542b4852d 100644 GIT binary patch literal 130 zcmWN_!41P83;@7CQ?NjTA%G#=o^3u}Wh}S# z%nS9m8V8fQwCHV@qbB407E?k1%sLPTDz;c=YmhPl*upvaf*P}Pum)c^Mgn$p7w#cy N4q~()OY6gG#2@?SC$Rtk literal 86480 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 diff --git a/example/Ryzen-AI-Library/windows/cvml-sdk.dll b/example/Ryzen-AI-Library/windows/cvml-sdk.dll index dbd65e4a..2fd95b3a 100644 --- a/example/Ryzen-AI-Library/windows/cvml-sdk.dll +++ b/example/Ryzen-AI-Library/windows/cvml-sdk.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4dbcd9001699cdc142ef9a0cf6d99c3a9953e44e80e4ef675e01b7b7200e347a -size 307712 +oid sha256:2b482748e079d91e6d8654380631eaa39646078a46df1b4d1a1a3bee5effdd4b +size 2659024 diff --git a/example/Ryzen-AI-Library/windows/cvml-sdk.lib b/example/Ryzen-AI-Library/windows/cvml-sdk.lib index ef9e63674f1486505177482335fc56da13c2e5e3..a12436809da3cd4fde2df6b032aec48b5c539164 100644 GIT binary patch literal 131 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