diff --git a/README.md b/README.md index 5f5a765..fd441ea 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,35 @@ pre-build models: - means currently supported. # Examples Compile +## AMLNN SDK Setup + +The C++ demos depend on the **AMLNN nnsdk** runtime library. The build system resolves it using the following priority order: + +**Priority 1 – Environment variable (recommended)** + +```bash +export AMLNN_HOME=/path/to/amlnn-toolkit +``` + +**Priority 2 – CMake auto-find (`FindAMLNN.cmake`)** + +Handled automatically via `cmake/FindAMLNN.cmake` in the project root — useful in IDE and CI environments. + +**Priority 3 – Sibling directory fallback** + +If `AMLNN_HOME` is not set, the script automatically looks for `amlnn-toolkit` as a sibling directory: +``` +modelzoo/ +├── amlnn-model-playground/ ← this repo +└── amlnn-toolkit/ ← SDK placed here automatically found +``` + +Clone it with: +```bash +git clone git@github.com:Amlogic-NN/amlnn-toolkit.git ../amlnn-toolkit +``` + + ​ Each **example** directory contains a **build-android.sh** and build-linux.sh **script**. For compilation steps, refer to **Chapter 4** of the **README.md** file in the corresponding example directory. diff --git a/cmake/FindAMLNN.cmake b/cmake/FindAMLNN.cmake new file mode 100644 index 0000000..16601dc --- /dev/null +++ b/cmake/FindAMLNN.cmake @@ -0,0 +1,64 @@ +# FindAMLNN.cmake +# --------------------------------------------------------------------------- +# Locates the AMLNN nnsdk headers and libraries. +# +# Inputs (set before calling find_package): +# AMLNN_HOME – root of the amlnn-toolkit (contains nn_runtime/) +# May also be supplied as the environment variable AMLNN_HOME. +# +# Outputs: +# AMLNN_INCLUDE_DIR – path to nnsdk include dir +# AMLNN_LIBRARY_DIR – path to the ABI-specific library dir (use link_directories) +# AMLNN_LIBRARY – "nnsdk" (library name, no prefix/suffix) +# AMLNN_FOUND +# --------------------------------------------------------------------------- + +# Resolve AMLNN_HOME: CMake variable → env var → relative sibling fallbacks +if(NOT AMLNN_HOME) + if(DEFINED ENV{AMLNN_HOME} AND NOT "$ENV{AMLNN_HOME}" STREQUAL "") + set(AMLNN_HOME "$ENV{AMLNN_HOME}") + elseif(EXISTS "${CMAKE_SOURCE_DIR}/../../../../../amlnn-toolkit/nn_runtime") + set(AMLNN_HOME "${CMAKE_SOURCE_DIR}/../../../../../amlnn-toolkit") + endif() +endif() + +if(NOT AMLNN_HOME) + message(FATAL_ERROR + "AMLNN_HOME not found.\n" + "Please set the AMLNN_HOME environment variable (or CMake variable) " + "to the root of the amlnn-toolkit directory, e.g.:\n" + " export AMLNN_HOME=/path/to/amlnn-toolkit\n" + " cmake ... -DAMLNN_HOME=/path/to/amlnn-toolkit") +endif() + +get_filename_component(AMLNN_HOME "${AMLNN_HOME}" ABSOLUTE) + +set(AMLNN_NNSDK_ROOT "${AMLNN_HOME}/nn_runtime/nnsdk") +set(AMLNN_INCLUDE_DIR "${AMLNN_NNSDK_ROOT}/include") + +if(CMAKE_SYSTEM_NAME STREQUAL "Android") + if(ANDROID_ABI STREQUAL "arm64-v8a") + set(AMLNN_LIBRARY_DIR "${AMLNN_NNSDK_ROOT}/android/arm64-v8a") + else() + set(AMLNN_LIBRARY_DIR "${AMLNN_NNSDK_ROOT}/android/armeabi-v7a") + endif() +elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(AMLNN_LIBRARY_DIR "${AMLNN_NNSDK_ROOT}/linux/yocto/aarch64-poky-linux") +else() + set(AMLNN_LIBRARY_DIR "${AMLNN_NNSDK_ROOT}/linux/yocto/aarch64-poky-linux") +endif() + +set(AMLNN_LIBRARY "nnsdk") + +# Validate paths +if(NOT EXISTS "${AMLNN_INCLUDE_DIR}") + message(FATAL_ERROR "AMLNN include dir not found: ${AMLNN_INCLUDE_DIR}\n(AMLNN_HOME=${AMLNN_HOME})") +endif() +if(NOT EXISTS "${AMLNN_LIBRARY_DIR}") + message(FATAL_ERROR "AMLNN library dir not found: ${AMLNN_LIBRARY_DIR}\n(AMLNN_HOME=${AMLNN_HOME})") +endif() + +set(AMLNN_FOUND TRUE) +message(STATUS "Found AMLNN: ${AMLNN_HOME}") +message(STATUS " AMLNN_INCLUDE_DIR: ${AMLNN_INCLUDE_DIR}") +message(STATUS " AMLNN_LIBRARY_DIR: ${AMLNN_LIBRARY_DIR}") diff --git a/examples/build-android-all.sh b/examples/build-android-all.sh index 2670595..95d24d9 100755 --- a/examples/build-android-all.sh +++ b/examples/build-android-all.sh @@ -41,20 +41,43 @@ while getopts 'a:h' opt; do esac done -if [ -z "${ANDROID_NDK_PATH}" ]; then - if [ -n "${ANDROID_NDK}" ]; then - ANDROID_NDK_PATH=${ANDROID_NDK} - elif [ -n "${ANDROID_NDK_HOME}" ]; then - ANDROID_NDK_PATH=${ANDROID_NDK_HOME} - else - echo "Error: ANDROID_NDK_PATH is not set." - echo "Please set ANDROID_NDK_PATH to your Android NDK directory." +SCRIPT_DIR=$(cd "$(dirname $0)" && pwd) + +# Priority 1: Environment variable (recommended) +if [ -n "$AMLNN_HOME" ]; then + if [ ! -d "$AMLNN_HOME/nn_runtime" ]; then + echo "Error: AMLNN_HOME is set to '$AMLNN_HOME' but nn_runtime was not found there." + echo "Please check your AMLNN_HOME path." exit 1 fi + RUNTIME_PATH="$AMLNN_HOME/nn_runtime" + echo "Priority 1: Using AMLNN_HOME from environment: $AMLNN_HOME" +# Priority 3: Fallback to sibling amlnn-toolkit (compatibility) +elif [ -d "${SCRIPT_DIR}/../../amlnn-toolkit/nn_runtime" ]; then + export AMLNN_HOME="$(cd "${SCRIPT_DIR}/../../amlnn-toolkit" && pwd)" + RUNTIME_PATH="$AMLNN_HOME/nn_runtime" + echo "Priority 3: Using sibling amlnn-toolkit as fallback: $AMLNN_HOME" +elif [ -d "${SCRIPT_DIR}/../../amlnn-toolkit-a/nn_runtime" ]; then + export AMLNN_HOME="$(cd "${SCRIPT_DIR}/../../amlnn-toolkit-a" && pwd)" + RUNTIME_PATH="$AMLNN_HOME/nn_runtime" + echo "Priority 3: Using sibling amlnn-toolkit-a as fallback: $AMLNN_HOME" +else + echo "" + echo "Error: AMLNN SDK not found." + echo "" + echo "Please do one of the following:" + echo "" + echo " Option A (recommended) – set AMLNN_HOME:" + echo " export AMLNN_HOME=/path/to/amlnn-toolkit" + echo " ./build-android-all.sh" + echo "" + echo " Option B – clone amlnn-toolkit as a sibling directory:" + echo " git clone git@github.com:Amlogic-NN/amlnn-toolkit.git ../../../amlnn-toolkit" + echo " ./build-android-all.sh" + echo "" + exit 1 fi -SCRIPT_DIR=$(cd "$(dirname $0)" && pwd) - echo "============================================" echo "Building all Android examples" echo "NDK_PATH: ${ANDROID_NDK_PATH}" @@ -93,6 +116,10 @@ for EXAMPLE in "${EXAMPLES[@]}"; do echo "Building: ${EXAMPLE}" echo "--------------------------------------------" + # Clean previous build to avoid stale CMake cache + echo "Cleaning: ${EXAMPLE_DIR}/build/android" + rm -rf "${EXAMPLE_DIR}/build/android" + if bash "${BUILD_SCRIPT}" -a "${TARGET_ABI}"; then SUCCEEDED+=("${EXAMPLE}") echo "[SUCCESS] ${EXAMPLE}" diff --git a/examples/clip/README.md b/examples/clip/README.md index f7987e3..7b8a6e5 100644 --- a/examples/clip/README.md +++ b/examples/clip/README.md @@ -18,6 +18,20 @@ TO DO #### 1. Compile +#### AMLNN SDK Setup + +Resolve the AMLNN nnsdk dependency using one of the following methods: + +- **Priority 1 – Environment variable (recommended)** + ```bash + export AMLNN_HOME=/path/to/amlnn-toolkit + ``` +- **Priority 3 – Sibling directory fallback** *(automatic)* + Place `amlnn-toolkit` as a sibling to `amlnn-model-playground`: + ```bash + git clone git@github.com:Amlogic-NN/amlnn-toolkit.git ../amlnn-toolkit + ``` + **Prerequisites:** - Android NDK (r25e recommended) - `ANDROID_NDK_PATH` environment variable set diff --git a/examples/clip/cpp/build-android.sh b/examples/clip/cpp/build-android.sh index 10f9b09..8afa6c0 100755 --- a/examples/clip/cpp/build-android.sh +++ b/examples/clip/cpp/build-android.sh @@ -65,7 +65,8 @@ echo "BUILD_DIR: ${BUILD_DIR}" mkdir -p ${BUILD_DIR} cd ${BUILD_DIR} -cmake ../../src \ +cmake -Wno-dev ../../src \ + -DAMLNN_HOME=${AMLNN_HOME:-} \ -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_PATH}/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=${TARGET_ABI} \ -DANDROID_PLATFORM=android-24 \ diff --git a/examples/clip/cpp/src/CMakeLists.txt b/examples/clip/cpp/src/CMakeLists.txt index c9568d0..e0c5c0b 100755 --- a/examples/clip/cpp/src/CMakeLists.txt +++ b/examples/clip/cpp/src/CMakeLists.txt @@ -1,16 +1,13 @@ -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.10...3.27) project(clip_demo) set(CMAKE_CXX_STANDARD 17) -# Set NNSDK path -if(NOT DEFINED NNSDK_DIR) - set(NNSDK_DIR "${CMAKE_SOURCE_DIR}/../../../../../amlnn-toolkit/nn_runtime/nnsdk") -endif() -set(NNSDK_ROOT "${NNSDK_DIR}") -message(STATUS "NNSDK_ROOT: ${NNSDK_ROOT}") +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../../../../cmake") +find_package(AMLNN REQUIRED) +include_directories(${AMLNN_INCLUDE_DIR}) +link_directories(${AMLNN_LIBRARY_DIR}) -include_directories(${NNSDK_ROOT}/include) include_directories(${CMAKE_SOURCE_DIR}/../../../../common) # Set 3rdparty path @@ -22,15 +19,8 @@ include_directories(${3RDPARTY_DIR}/stb_image) include_directories(${3RDPARTY_DIR}/json) if(CMAKE_SYSTEM_NAME STREQUAL "Android") - if (ANDROID_ABI STREQUAL "arm64-v8a") - link_directories(${NNSDK_ROOT}/android/arm64-v8a) - else() - link_directories(${NNSDK_ROOT}/android/armeabi-v7a) - endif() # Android needs log link_libraries(log) -elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") - link_directories(${NNSDK_ROOT}/linux/yocto/aarch64-poky-linux) endif() add_executable(${PROJECT_NAME} @@ -41,7 +31,7 @@ add_executable(${PROJECT_NAME} ) target_link_libraries(${PROJECT_NAME} - nnsdk + ${AMLNN_LIBRARY} dl m ) diff --git a/examples/mobilenet/README.md b/examples/mobilenet/README.md index fb45516..b4a9324 100644 --- a/examples/mobilenet/README.md +++ b/examples/mobilenet/README.md @@ -1,118 +1,132 @@ -## Model Description - -This model is converted from MobileNetV2 pretrained weights -originally released by Google under the Apache License 2.0. - -Original model: -- Architecture: MobileNetV2 -- Source: TensorFlow / Keras official implementation - -The model has been converted and optimized into ADLA format -for deployment on Amlogic NPU platforms. - -## Demo Run - -### CPP - -#### 1. Compile - -**Prerequisites:** -- Android NDK (r25e recommended) -- `ANDROID_NDK_PATH` environment variable set - -**Build:** -```bash -# Build for arm64-v8a -cd examples/mobilenet/cpp -./build-android.sh -a arm64-v8a -``` - -The executable will be generated at `build/android/mobilenet_v2_demo` (Note: executable name may vary, verify in build folder). - -#### 2. Run - -```bash -# Push executable to device -adb push build/android/mobilenet_v2_demo /data/local/tmp/ -adb push model/mobilenet_v2_1.0_224_quant_A311D2.adla /data/local/tmp/ -adb push model/cat_224x224.jpg /data/local/tmp/ -adb push model/labels.txt /data/local/tmp/ - -# Run on device -adb shell -cd /data/local/tmp -chmod +x mobilenet_v2_demo -export LD_LIBRARY_PATH=/vendor/lib64 or (/vendor/lib) - -# Usage: ./mobilenet_v2_demo -./mobilenet_v2_demo mobilenet_v2_1.0_224_quant_A311D2.adla cat_224x224.jpg labels.txt -``` - -**Note:** Replace `mobilenet_v2_1.0_224_quant_A311D2.adla` with your actual model file path. - -### Python - -**Prerequisites:** -- Python 3.10 -- Required packages: `numpy`, `Pillow`, `amlnnlite` - -**Install dependencies:** -```bash -pip install numpy Pillow amlnnlite-1.0.0-cp310-cp310-linux_aarch64.whl -``` - -**Run on device:** -```bash -# Basic usage -python mobilenetv2.py --model-path ./mobilenet_v2_1.0_224_quant_A311D2.adla - -# Run with performance testing (100 cycles) -python mobilenetv2.py --model-path ./mobilenet_v2_1.0_224_quant_A311D2.adla --run-cycles 100 -``` - -The script will automatically process all image files (`.jpg`, `.jpeg`, `.png`, `.bmp`) in the current directory and display top-5 classification results for each image. - -## Results - -The program will print the top-5 classification results with probabilities for each processed image. - -**Example output:** -``` -# python demo result -============================================================ -Processing image 1/3: dog_224x224.jpg -============================================================ - -Top-5 Classification Results: - 1. Shih-Tzu (probability: 0.9239) - 2. Pekinese (probability: 0.0476) - 3. Lhasa (probability: 0.0263) - 4. Brabancon griffon (probability: 0.0004) - 5. Dandie Dinmont (probability: 0.0003) - -============================================================ -Processing image 2/3: cat_224x224.jpg -============================================================ - -Top-5 Classification Results: - 1. tiger cat (probability: 0.4774) - 2. tabby (probability: 0.4324) - 3. Egyptian cat (probability: 0.0542) - 4. lynx (probability: 0.0150) - 5. Persian cat (probability: 0.0025) - -============================================================ -Processing image 3/3: fish_224x224.jpeg -============================================================ - -Top-5 Classification Results: - 1. goldfish (probability: 0.9998) - 2. conch (probability: 0.0001) - 3. trifle (probability: 0.0000) - 4. axolotl (probability: 0.0000) - 5. American lobster (probability: 0.0000) -``` - -The classification results show the model's confidence scores (probabilities) for each detected class, with the highest probability indicating the most likely classification. - - +## Model Description + +This model is converted from MobileNetV2 pretrained weights +originally released by Google under the Apache License 2.0. + +Original model: +- Architecture: MobileNetV2 +- Source: TensorFlow / Keras official implementation + +The model has been converted and optimized into ADLA format +for deployment on Amlogic NPU platforms. + +## Demo Run + +### CPP + +#### 1. Compile + +#### AMLNN SDK Setup + +Resolve the AMLNN nnsdk dependency using one of the following methods: + +- **Priority 1 – Environment variable (recommended)** + ```bash + export AMLNN_HOME=/path/to/amlnn-toolkit + ``` +- **Priority 3 – Sibling directory fallback** *(automatic)* + Place `amlnn-toolkit` as a sibling to `amlnn-model-playground`: + ```bash + git clone git@github.com:Amlogic-NN/amlnn-toolkit.git ../amlnn-toolkit + ``` + +**Prerequisites:** +- Android NDK (r25e recommended) +- `ANDROID_NDK_PATH` environment variable set + +**Build:** +```bash +# Build for arm64-v8a +cd examples/mobilenet/cpp +./build-android.sh -a arm64-v8a +``` + +The executable will be generated at `build/android/mobilenet_v2_demo` (Note: executable name may vary, verify in build folder). + +#### 2. Run + +```bash +# Push executable to device +adb push build/android/mobilenet_v2_demo /data/local/tmp/ +adb push model/mobilenet_v2_1.0_224_quant_A311D2.adla /data/local/tmp/ +adb push model/cat_224x224.jpg /data/local/tmp/ +adb push model/labels.txt /data/local/tmp/ + +# Run on device +adb shell +cd /data/local/tmp +chmod +x mobilenet_v2_demo +export LD_LIBRARY_PATH=/vendor/lib64 or (/vendor/lib) + +# Usage: ./mobilenet_v2_demo +./mobilenet_v2_demo mobilenet_v2_1.0_224_quant_A311D2.adla cat_224x224.jpg labels.txt +``` + +**Note:** Replace `mobilenet_v2_1.0_224_quant_A311D2.adla` with your actual model file path. + +### Python + +**Prerequisites:** +- Python 3.10 +- Required packages: `numpy`, `Pillow`, `amlnnlite` + +**Install dependencies:** +```bash +pip install numpy Pillow amlnnlite-1.0.0-cp310-cp310-linux_aarch64.whl +``` + +**Run on device:** +```bash +# Basic usage +python mobilenetv2.py --model-path ./mobilenet_v2_1.0_224_quant_A311D2.adla + +# Run with performance testing (100 cycles) +python mobilenetv2.py --model-path ./mobilenet_v2_1.0_224_quant_A311D2.adla --run-cycles 100 +``` + +The script will automatically process all image files (`.jpg`, `.jpeg`, `.png`, `.bmp`) in the current directory and display top-5 classification results for each image. + +## Results + +The program will print the top-5 classification results with probabilities for each processed image. + +**Example output:** +``` +# python demo result +============================================================ +Processing image 1/3: dog_224x224.jpg +============================================================ + +Top-5 Classification Results: + 1. Shih-Tzu (probability: 0.9239) + 2. Pekinese (probability: 0.0476) + 3. Lhasa (probability: 0.0263) + 4. Brabancon griffon (probability: 0.0004) + 5. Dandie Dinmont (probability: 0.0003) + +============================================================ +Processing image 2/3: cat_224x224.jpg +============================================================ + +Top-5 Classification Results: + 1. tiger cat (probability: 0.4774) + 2. tabby (probability: 0.4324) + 3. Egyptian cat (probability: 0.0542) + 4. lynx (probability: 0.0150) + 5. Persian cat (probability: 0.0025) + +============================================================ +Processing image 3/3: fish_224x224.jpeg +============================================================ + +Top-5 Classification Results: + 1. goldfish (probability: 0.9998) + 2. conch (probability: 0.0001) + 3. trifle (probability: 0.0000) + 4. axolotl (probability: 0.0000) + 5. American lobster (probability: 0.0000) +``` + +The classification results show the model's confidence scores (probabilities) for each detected class, with the highest probability indicating the most likely classification. + + diff --git a/examples/mobilenet/cpp/build-android.sh b/examples/mobilenet/cpp/build-android.sh index 95bb9ba..f01664a 100755 --- a/examples/mobilenet/cpp/build-android.sh +++ b/examples/mobilenet/cpp/build-android.sh @@ -49,7 +49,8 @@ echo "BUILD_DIR: ${BUILD_DIR}" mkdir -p ${BUILD_DIR} cd ${BUILD_DIR} -cmake ../../src \ +cmake -Wno-dev ../../src \ + -DAMLNN_HOME=${AMLNN_HOME:-} \ -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_PATH}/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=${TARGET_ABI} \ -DANDROID_PLATFORM=android-24 \ diff --git a/examples/mobilenet/cpp/src/CMakeLists.txt b/examples/mobilenet/cpp/src/CMakeLists.txt index 818f80f..14b0793 100755 --- a/examples/mobilenet/cpp/src/CMakeLists.txt +++ b/examples/mobilenet/cpp/src/CMakeLists.txt @@ -1,31 +1,21 @@ -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.10...3.27) project(mobilenet_v2_demo) set(CMAKE_CXX_STANDARD 17) -# Set NNSDK path -if(NOT DEFINED NNSDK_DIR) - set(NNSDK_DIR "${CMAKE_SOURCE_DIR}/../../../../../amlnn-toolkit/nn_runtime/nnsdk") -endif() -set(NNSDK_ROOT "${NNSDK_DIR}") -message(STATUS "NNSDK_ROOT: ${NNSDK_ROOT}") +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../../../../cmake") +find_package(AMLNN REQUIRED) +include_directories(${AMLNN_INCLUDE_DIR}) +link_directories(${AMLNN_LIBRARY_DIR}) -include_directories(${NNSDK_ROOT}/include) include_directories(${CMAKE_SOURCE_DIR}/../../../../common) # Set dependency path set(3RDPARTY_DIR "${CMAKE_SOURCE_DIR}/../../../../dependency") if(CMAKE_SYSTEM_NAME STREQUAL "Android") - if (ANDROID_ABI STREQUAL "arm64-v8a") - link_directories(${NNSDK_ROOT}/android/arm64-v8a) - else() - link_directories(${NNSDK_ROOT}/android/armeabi-v7a) - endif() # Android needs log link_libraries(log) -elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") - link_directories(${NNSDK_ROOT}/linux/yocto/aarch64-poky-linux) endif() # Find OpenCV @@ -40,5 +30,5 @@ add_executable(mobilenet_v2_demo target_link_libraries(mobilenet_v2_demo ${OpenCV_LIBS} - nnsdk + ${AMLNN_LIBRARY} ) diff --git a/examples/ppocr-det/README.md b/examples/ppocr-det/README.md index e69de29..a1f1540 100644 --- a/examples/ppocr-det/README.md +++ b/examples/ppocr-det/README.md @@ -0,0 +1,34 @@ +# PaddleOCR Detection + +## 4. Demo Run + +### CPP + +#### 1. Compile + +#### AMLNN SDK Setup + +Resolve the AMLNN nnsdk dependency using one of the following methods: + +- **Priority 1 – Environment variable (recommended)** + ```bash + export AMLNN_HOME=/path/to/amlnn-toolkit + ``` +- **Priority 3 – Sibling directory fallback** *(automatic)* + Place `amlnn-toolkit` as a sibling to `amlnn-model-playground`: + ```bash + git clone git@github.com:Amlogic-NN/amlnn-toolkit.git ../amlnn-toolkit + ``` + +**Prerequisites:** +- Android NDK r25c +- `ANDROID_NDK_PATH` environment variable set + +**Build:** +```bash +# Build for arm64-v8a +cd examples/ppocr-det/cpp +./build-android.sh -a arm64-v8a +``` + +The executable will be generated in `build/android/`. diff --git a/examples/ppocr-det/cpp/build-android.sh b/examples/ppocr-det/cpp/build-android.sh index 5d5f564..742794c 100755 --- a/examples/ppocr-det/cpp/build-android.sh +++ b/examples/ppocr-det/cpp/build-android.sh @@ -65,7 +65,8 @@ echo "BUILD_DIR: ${BUILD_DIR}" mkdir -p ${BUILD_DIR} cd ${BUILD_DIR} -cmake ../../src \ +cmake -Wno-dev ../../src \ + -DAMLNN_HOME=${AMLNN_HOME:-} \ -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_PATH}/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=${TARGET_ABI} \ -DANDROID_PLATFORM=android-24 \ diff --git a/examples/ppocr-det/cpp/src/CMakeLists.txt b/examples/ppocr-det/cpp/src/CMakeLists.txt index 220a9df..2bfec1c 100755 --- a/examples/ppocr-det/cpp/src/CMakeLists.txt +++ b/examples/ppocr-det/cpp/src/CMakeLists.txt @@ -1,48 +1,38 @@ -cmake_minimum_required(VERSION 3.5) -project(yolo_world_demo) - -set(CMAKE_CXX_STANDARD 17) - -# Set NNSDK path -if(NOT DEFINED NNSDK_DIR) - set(NNSDK_DIR "${CMAKE_SOURCE_DIR}/../../../../../amlnn-toolkit/nn_runtime/nnsdk") -endif() -set(NNSDK_ROOT "${NNSDK_DIR}") -message(STATUS "NNSDK_ROOT: ${NNSDK_ROOT}") - -include_directories(${NNSDK_ROOT}/include) -include_directories(${CMAKE_SOURCE_DIR}/../../../../common) - -# Set 3rdparty path -set(3RDPARTY_DIR "${CMAKE_SOURCE_DIR}/../../../../dependency") - -if(CMAKE_SYSTEM_NAME STREQUAL "Android") - if (ANDROID_ABI STREQUAL "arm64-v8a") - link_directories(${NNSDK_ROOT}/android/arm64-v8a) - else() - link_directories(${NNSDK_ROOT}/android/armeabi-v7a) - endif() - # Android needs log - link_libraries(log) -elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") - link_directories(${NNSDK_ROOT}/linux/yocto/aarch64-poky-linux) -endif() - -# Find OpenCV -message(STATUS "OpenCV_DIR: ${OpenCV_DIR}") -find_package(OpenCV REQUIRED) -include_directories(${OpenCV_INCLUDE_DIRS}) - -add_executable(paddleocr_det_demo - main.cpp - postprocess.cpp - postprocess.h - clipper.cpp - clipper.h - ${CMAKE_SOURCE_DIR}/../../../../common/model_loader.cpp -) - -target_link_libraries(paddleocr_det_demo - ${OpenCV_LIBS} - nnsdk -) +cmake_minimum_required(VERSION 3.10...3.27) +project(yolo_world_demo) + +set(CMAKE_CXX_STANDARD 17) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../../../../cmake") +find_package(AMLNN REQUIRED) +include_directories(${AMLNN_INCLUDE_DIR}) +link_directories(${AMLNN_LIBRARY_DIR}) + +include_directories(${CMAKE_SOURCE_DIR}/../../../../common) + +# Set 3rdparty path +set(3RDPARTY_DIR "${CMAKE_SOURCE_DIR}/../../../../dependency") + +if(CMAKE_SYSTEM_NAME STREQUAL "Android") + # Android needs log + link_libraries(log) +endif() + +# Find OpenCV +message(STATUS "OpenCV_DIR: ${OpenCV_DIR}") +find_package(OpenCV REQUIRED) +include_directories(${OpenCV_INCLUDE_DIRS}) + +add_executable(paddleocr_det_demo + main.cpp + postprocess.cpp + postprocess.h + clipper.cpp + clipper.h + ${CMAKE_SOURCE_DIR}/../../../../common/model_loader.cpp +) + +target_link_libraries(paddleocr_det_demo + ${OpenCV_LIBS} + ${AMLNN_LIBRARY} +) diff --git a/examples/resnet/README.md b/examples/resnet/README.md index c996c26..f24f6d7 100755 --- a/examples/resnet/README.md +++ b/examples/resnet/README.md @@ -1,165 +1,179 @@ -# resnet - -## 1.Overview - - - -## 2.Model Download - -- **Open Source model** - - - **Open Source projects:** - - - **Export Model Step:** - - - **Install ultralytics** - - pip install torch==2.4.1 - - pip install torchvision==0.19.1 - - pip install ultralytics==8.3.0 - - - **Download weights** - - - - - **Export Model** - - ``` - - ``` - - -- **Exported Model** - - ​ link to amlogic server( **onnx model or quantized tflite**) - - - -## 3. Model Conversion - -``` -cd model -Usage: ./adla_covnert.sh model_path adla_tookkit_path target_platform - -example - -``` - -| Parameter | Discription | -| ----------------- | ------------------------------------------------------------ | -| model_path | onnx model path | -| adla_tookkit_path | path to adla_toolkit | -| target_platform | Specify target platform. for A311D2 : PRODUCT_PID0XA003. for S905X5: PRODUCT_PID0XA005 | - - - -## 4. Demo Run - -### CPP - -#### 1. Compile - -**Prerequisites:** -- Android NDK (r25e recommended) -- `ANDROID_NDK_PATH` environment variable set - -**Build:** -```bash -# Build for arm64-v8a -cd examples/resnet/cpp -./build-android.sh -a arm64-v8a -``` - -The executable will be generated at `build/android/resnet_demo` (Note: executable name may vary, verify in build folder). - -#### 2. Run - -```bash -# Push executable to device -adb push build/android/resnet_demo /data/local/tmp/ -adb push model/res2net50_int8_A311D2.adla /data/local/tmp/ -adb push imgs /data/local/tmp/ -adb push labels.txt /data/local/tmp/ - -# Run on device -adb shell -cd /data/local/tmp -chmod +x resnet_demo -export LD_LIBRARY_PATH=/vendor/lib64 or (/vendor/lib) - -# Usage: ./resnet_demo -./resnet_demo res2net50_int8_A311D2.adla imgs/ labels.txt -``` - -**Note:** Replace `res2net50_int8_A311D2.adla` with your actual model file path. - -### Python - -**Prerequisites:** -- Python 3.10 -- Required packages: `numpy`, `opencv-python`, `amlnnlite` - -**Install dependencies:** -```bash -pip install numpy opencv-python amlnnlite-1.0.0-cp310-cp310-linux_aarch64.whl -``` - -**Run on device:** -```bash -python resnet.py \ - --model-path ./res2net50_int8_A311D2.adla \ - --image-dir ./imgs \ - --labels labels.txt \ - --run-cycles 1 \ - --loglevel INFO -``` -Argument Descriptions: -| Argument | Description | -| ----------------- | ------------------------------------------------------------ | -| --board-work-path | Work path on board, default is /data/local/tmp | -| --model-path | path to .adla model | -| --image-dir | Directory containing test images | -| --labels | Path to synset_words.txt or labels.txt | -| --run-cycles | Number of inference cycles, default is 1 | -| --loglevel | Logging level: DEBUG / INFO / WARNING / ERROR, default is WARNING | - -The script will automatically process all image files (`.jpg`, `.jpeg`, `.png`, `.bmp`) in the current directory and save results to a `{model_name}_result` folder. - -## 5.Results -**Performance Feedback** - -By setting the loglevel to INFO, the program provides real-time performance metrics upon completion. The console log will display essential hardware and execution details, including: -- Hardware Information: System and ADLA library versions. -- Model Overview: Basic input/output configurations. -- NPU Metrics: Total inference time (latency) and total DRAM bandwidth consumption. - -**Classification Output** - -For each image, the program prints the Top-5 classification results with their respective scores: -```bash -============================================================ -Processing image 1/1: dog.jpg -============================================================ Top-5 Results: -1: Pekinese score=9.851644 -2: West Highland white terrier score=5.055449 -3: Maltese dog score=4.796195 -4: basenji score=3.111045 -5: Scotch terrier score=2.786978 ============================================================ -``` -**Profiling Visualization** - -After a successful run of the Python demo, a folder named after the model (e.g., `{model_name}`) will be generated in the script directory. This folder contains 5 HTML files that provide a visual and detailed breakdown of per-layer performance: -- `hard_op_chart.html` & `soft_op_chart.html`: Hardware/Software op execution details. -- `dram_rd_chart.html` & `dram_wr_chart.html`: Bandwidth read/write distribution. -- `pie_charts_distribution.html`: Overall resource allocation. - -You can pull the result folder back to view it: -```bash -adb pull /data/local/tmp/res2net50_int8_A311D2 -``` - -Taking hard_op_chart.html as an example (shown below), each layer's ADLA operator name includes parentheses containing the index of the corresponding quantized .tflite layer(s); by default, these indices are suppressed, and operators are labeled generically as "hardware" or "software" without numerical suffixes. - +# resnet + +## 1.Overview + + + +## 2.Model Download + +- **Open Source model** + + - **Open Source projects:** + + - **Export Model Step:** + + - **Install ultralytics** + + pip install torch==2.4.1 + + pip install torchvision==0.19.1 + + pip install ultralytics==8.3.0 + + - **Download weights** + + + + - **Export Model** + + ``` + + ``` + + +- **Exported Model** + + ​ link to amlogic server( **onnx model or quantized tflite**) + + + +## 3. Model Conversion + +``` +cd model +Usage: ./adla_covnert.sh model_path adla_tookkit_path target_platform + +example + +``` + +| Parameter | Discription | +| ----------------- | ------------------------------------------------------------ | +| model_path | onnx model path | +| adla_tookkit_path | path to adla_toolkit | +| target_platform | Specify target platform. for A311D2 : PRODUCT_PID0XA003. for S905X5: PRODUCT_PID0XA005 | + + + +## 4. Demo Run + +### CPP + +#### 1. Compile + +#### AMLNN SDK Setup + +Resolve the AMLNN nnsdk dependency using one of the following methods: + +- **Priority 1 – Environment variable (recommended)** + ```bash + export AMLNN_HOME=/path/to/amlnn-toolkit + ``` +- **Priority 3 – Sibling directory fallback** *(automatic)* + Place `amlnn-toolkit` as a sibling to `amlnn-model-playground`: + ```bash + git clone git@github.com:Amlogic-NN/amlnn-toolkit.git ../amlnn-toolkit + ``` + +**Prerequisites:** +- Android NDK (r25e recommended) +- `ANDROID_NDK_PATH` environment variable set + +**Build:** +```bash +# Build for arm64-v8a +cd examples/resnet/cpp +./build-android.sh -a arm64-v8a +``` + +The executable will be generated at `build/android/resnet_demo` (Note: executable name may vary, verify in build folder). + +#### 2. Run + +```bash +# Push executable to device +adb push build/android/resnet_demo /data/local/tmp/ +adb push model/res2net50_int8_A311D2.adla /data/local/tmp/ +adb push imgs /data/local/tmp/ +adb push labels.txt /data/local/tmp/ + +# Run on device +adb shell +cd /data/local/tmp +chmod +x resnet_demo +export LD_LIBRARY_PATH=/vendor/lib64 or (/vendor/lib) + +# Usage: ./resnet_demo +./resnet_demo res2net50_int8_A311D2.adla imgs/ labels.txt +``` + +**Note:** Replace `res2net50_int8_A311D2.adla` with your actual model file path. + +### Python + +**Prerequisites:** +- Python 3.10 +- Required packages: `numpy`, `opencv-python`, `amlnnlite` + +**Install dependencies:** +```bash +pip install numpy opencv-python amlnnlite-1.0.0-cp310-cp310-linux_aarch64.whl +``` + +**Run on device:** +```bash +python resnet.py \ + --model-path ./res2net50_int8_A311D2.adla \ + --image-dir ./imgs \ + --labels labels.txt \ + --run-cycles 1 \ + --loglevel INFO +``` +Argument Descriptions: +| Argument | Description | +| ----------------- | ------------------------------------------------------------ | +| --board-work-path | Work path on board, default is /data/local/tmp | +| --model-path | path to .adla model | +| --image-dir | Directory containing test images | +| --labels | Path to synset_words.txt or labels.txt | +| --run-cycles | Number of inference cycles, default is 1 | +| --loglevel | Logging level: DEBUG / INFO / WARNING / ERROR, default is WARNING | + +The script will automatically process all image files (`.jpg`, `.jpeg`, `.png`, `.bmp`) in the current directory and save results to a `{model_name}_result` folder. + +## 5.Results +**Performance Feedback** + +By setting the loglevel to INFO, the program provides real-time performance metrics upon completion. The console log will display essential hardware and execution details, including: +- Hardware Information: System and ADLA library versions. +- Model Overview: Basic input/output configurations. +- NPU Metrics: Total inference time (latency) and total DRAM bandwidth consumption. + +**Classification Output** + +For each image, the program prints the Top-5 classification results with their respective scores: +```bash +============================================================ +Processing image 1/1: dog.jpg +============================================================ Top-5 Results: +1: Pekinese score=9.851644 +2: West Highland white terrier score=5.055449 +3: Maltese dog score=4.796195 +4: basenji score=3.111045 +5: Scotch terrier score=2.786978 ============================================================ +``` +**Profiling Visualization** + +After a successful run of the Python demo, a folder named after the model (e.g., `{model_name}`) will be generated in the script directory. This folder contains 5 HTML files that provide a visual and detailed breakdown of per-layer performance: +- `hard_op_chart.html` & `soft_op_chart.html`: Hardware/Software op execution details. +- `dram_rd_chart.html` & `dram_wr_chart.html`: Bandwidth read/write distribution. +- `pie_charts_distribution.html`: Overall resource allocation. + +You can pull the result folder back to view it: +```bash +adb pull /data/local/tmp/res2net50_int8_A311D2 +``` + +Taking hard_op_chart.html as an example (shown below), each layer's ADLA operator name includes parentheses containing the index of the corresponding quantized .tflite layer(s); by default, these indices are suppressed, and operators are labeled generically as "hardware" or "software" without numerical suffixes. + ![alt text](Visualization.png) \ No newline at end of file diff --git a/examples/resnet/cpp/build-android.sh b/examples/resnet/cpp/build-android.sh index 004d511..bef682f 100755 --- a/examples/resnet/cpp/build-android.sh +++ b/examples/resnet/cpp/build-android.sh @@ -65,7 +65,8 @@ echo "BUILD_DIR: ${BUILD_DIR}" mkdir -p ${BUILD_DIR} cd ${BUILD_DIR} -cmake ../../src \ +cmake -Wno-dev ../../src \ + -DAMLNN_HOME=${AMLNN_HOME:-} \ -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_PATH}/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=${TARGET_ABI} \ -DANDROID_PLATFORM=android-24 \ diff --git a/examples/resnet/cpp/src/CMakeLists.txt b/examples/resnet/cpp/src/CMakeLists.txt index 6401b85..2f9e546 100755 --- a/examples/resnet/cpp/src/CMakeLists.txt +++ b/examples/resnet/cpp/src/CMakeLists.txt @@ -1,46 +1,35 @@ -cmake_minimum_required(VERSION 3.5) -project(resnet_demo) - -set(CMAKE_CXX_STANDARD 17) - -# Set NNSDK path -if(NOT DEFINED NNSDK_DIR) - set(NNSDK_DIR "${CMAKE_SOURCE_DIR}/../../../../../amlnn-toolkit/nn_runtime/nnsdk") -endif() -set(NNSDK_ROOT "${NNSDK_DIR}") -message(STATUS "NNSDK_ROOT: ${NNSDK_ROOT}") - -include_directories(${NNSDK_ROOT}/include) -include_directories(${CMAKE_SOURCE_DIR}/../../../../common) - -# Set dependency path -set(3RDPARTY_DIR "${CMAKE_SOURCE_DIR}/../../../../dependency") - -if(CMAKE_SYSTEM_NAME STREQUAL "Android") - if (ANDROID_ABI STREQUAL "arm64-v8a") - link_directories(${NNSDK_ROOT}/android/arm64-v8a) - else() - link_directories(${NNSDK_ROOT}/android/armeabi-v7a) - endif() - # Android needs log - link_libraries(log) -elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") - link_directories(${NNSDK_ROOT}/linux/yocto/aarch64-poky-linux) -endif() - -# Find OpenCV -message(STATUS "OpenCV_DIR: ${OpenCV_DIR}") -find_package(OpenCV REQUIRED) -include_directories(${OpenCV_INCLUDE_DIRS}) - - -add_executable(resnet_demo - main.cpp - postprocess.cpp - ${CMAKE_SOURCE_DIR}/../../../../common/model_loader.cpp -) - -target_link_libraries(resnet_demo - ${OpenCV_LIBS} - nnsdk +cmake_minimum_required(VERSION 3.10...3.27) +project(resnet_demo) + +set(CMAKE_CXX_STANDARD 17) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../../../../cmake") +find_package(AMLNN REQUIRED) +include_directories(${AMLNN_INCLUDE_DIR}) +link_directories(${AMLNN_LIBRARY_DIR}) + +include_directories(${CMAKE_SOURCE_DIR}/../../../../common) + +# Set dependency path +set(3RDPARTY_DIR "${CMAKE_SOURCE_DIR}/../../../../dependency") + +if(CMAKE_SYSTEM_NAME STREQUAL "Android") + # Android needs log + link_libraries(log) +endif() + +# Find OpenCV +message(STATUS "OpenCV_DIR: ${OpenCV_DIR}") +find_package(OpenCV REQUIRED) +include_directories(${OpenCV_INCLUDE_DIRS}) + +add_executable(resnet_demo + main.cpp + postprocess.cpp + ${CMAKE_SOURCE_DIR}/../../../../common/model_loader.cpp +) + +target_link_libraries(resnet_demo + ${OpenCV_LIBS} + ${AMLNN_LIBRARY} ) \ No newline at end of file diff --git a/examples/retinaface/README.md b/examples/retinaface/README.md index 70f0ddc..7a47df0 100755 --- a/examples/retinaface/README.md +++ b/examples/retinaface/README.md @@ -1,160 +1,174 @@ -# retinaface - -## 1.Overview - - -## 2.Model Download - -- **Open Source model** - - - **Open Source projects:** - - - **Export Model Step:** - - - **Install ultralytics** - - pip install torch==2.4.1 - - pip install torchvision==0.19.1 - - pip install ultralytics==8.3.0 - - - **Download weights** - - - - - **Export Model** - - - - -- **Exported Model** - - ​ link to amlogic server( **onnx model or quantized tflite**) - - - -## 3. Model Conversion - -``` -cd model -Usage: ./adla_covnert.sh model_path adla_tookkit_path target_platform - -example - -``` - -| Parameter | Discription | -| ----------------- | ------------------------------------------------------------ | -| model_path | onnx model path | -| adla_tookkit_path | path to adla_toolkit | -| target_platform | Specify target platform. for A311D2 : PRODUCT_PID0XA003. for S905X5: PRODUCT_PID0XA005 | - - - -## 4. Demo Run - -### CPP - -#### 1. Compile - -**Prerequisites:** -- Android NDK (r25e recommended) -- `ANDROID_NDK_PATH` environment variable set - -**Build:** -```bash -# Build for arm64-v8a -cd examples/retinaface/cpp -./build-android.sh -a arm64-v8a -``` - -The executable will be generated at `build/android/retinaface_demo` (Note: executable name may vary, verify in build folder). - -#### 2. Run - -```bash -# Push executable to device -adb push build/android/retinaface_demo /data/local/tmp/ -adb push model/RetinaFace_int8_A311D2.adla /data/local/tmp/ -adb push imgs /data/local/tmp/ - -# Run on device -adb shell -cd /data/local/tmp -chmod +x retinaface_demo -export LD_LIBRARY_PATH=/vendor/lib64 or (/vendor/lib) - -# Usage: ./retinaface_demo -./retinaface_demo RetinaFace_int8_A311D2.adla ./imgs -``` - -**Note:** Replace `RetinaFace_int8_A311D2.adla` with your actual model file path. - -### Python - -**Prerequisites:** -- Python 3.10 -- Required packages: `numpy`, `opencv-python`, `amlnnlite` - -**Install dependencies:** -```bash -pip install numpy opencv-python amlnnlite-1.0.0-cp310-cp310-linux_aarch64.whl -``` - -**Run on device:** -```bash -python RetinaFace.py \ - --model-path ./RetinaFace_int8_A311D2.adla \ - --image-dir ./imgs \ - --run-cycles 1 \ - --loglevel INFO -``` - -Argument Descriptions: -| Argument | Description | -| ----------------- | ------------------------------------------------------------ | -| --board-work-path | Work path on board, default is /data/local/tmp | -| --model-path | path to .adla model | -| --image-dir | Directory containing test images | -| --run-cycles | Number of inference cycles, default is 1 | -| --loglevel | Logging level: DEBUG / INFO / WARNING / ERROR, default is WARNING | - -The script will automatically process all image files (`.jpg`, `.jpeg`, `.png`, `.bmp`) in the current directory and save results to a `{model_name}_result` folder. - -## 5.Results - -**Performance Feedback** - -By setting the loglevel to INFO, the program provides real-time performance metrics upon completion. The console log will display essential hardware and execution details, including: -- Hardware Information: System and ADLA library versions. -- Model Overview: Basic input/output configurations. -- NPU Metrics: Total inference time (latency) and total DRAM bandwidth consumption. - -**Detection Output** - -The program will print the detection count. The output images, featuring bounding boxes and five facial landmarks (eyes, nose, and mouth corners), will be saved to the `{model_name}_result` folder. - - -You can pull the result folder back to view it: -```bash -adb pull /data/local/tmp/RetinaFace_int8_A311D2_result -``` -![alt text](result.jpg) - - -**Profiling Visualization** - -After a successful run of the Python demo, a folder named after the model (e.g., `{model_name}`) will be generated in the script directory. This folder contains 5 HTML files that provide a visual and detailed breakdown of per-layer performance: -- `hard_op_chart.html` & `soft_op_chart.html`: Hardware/Software op execution details. -- `dram_rd_chart.html` & `dram_wr_chart.html`: Bandwidth read/write distribution. -- `pie_charts_distribution.html`: Overall resource allocation. - -You can pull the result folder back to view it: -```bash -adb pull /data/local/tmp/RetinaFace_int8_A311D2 -``` - -Taking hard_op_chart.html as an example (shown below), each layer's ADLA operator name includes parentheses containing the index of the corresponding quantized .tflite layer(s); by default, these indices are suppressed, and operators are labeled generically as "hardware" or "software" without numerical suffixes. - -![alt text](Visualization.png) +# retinaface + +## 1.Overview + + +## 2.Model Download + +- **Open Source model** + + - **Open Source projects:** + + - **Export Model Step:** + + - **Install ultralytics** + + pip install torch==2.4.1 + + pip install torchvision==0.19.1 + + pip install ultralytics==8.3.0 + + - **Download weights** + + + + - **Export Model** + + + + +- **Exported Model** + + ​ link to amlogic server( **onnx model or quantized tflite**) + + + +## 3. Model Conversion + +``` +cd model +Usage: ./adla_covnert.sh model_path adla_tookkit_path target_platform + +example + +``` + +| Parameter | Discription | +| ----------------- | ------------------------------------------------------------ | +| model_path | onnx model path | +| adla_tookkit_path | path to adla_toolkit | +| target_platform | Specify target platform. for A311D2 : PRODUCT_PID0XA003. for S905X5: PRODUCT_PID0XA005 | + + + +## 4. Demo Run + +### CPP + +#### 1. Compile + +#### AMLNN SDK Setup + +Resolve the AMLNN nnsdk dependency using one of the following methods: + +- **Priority 1 – Environment variable (recommended)** + ```bash + export AMLNN_HOME=/path/to/amlnn-toolkit + ``` +- **Priority 3 – Sibling directory fallback** *(automatic)* + Place `amlnn-toolkit` as a sibling to `amlnn-model-playground`: + ```bash + git clone git@github.com:Amlogic-NN/amlnn-toolkit.git ../amlnn-toolkit + ``` + +**Prerequisites:** +- Android NDK (r25e recommended) +- `ANDROID_NDK_PATH` environment variable set + +**Build:** +```bash +# Build for arm64-v8a +cd examples/retinaface/cpp +./build-android.sh -a arm64-v8a +``` + +The executable will be generated at `build/android/retinaface_demo` (Note: executable name may vary, verify in build folder). + +#### 2. Run + +```bash +# Push executable to device +adb push build/android/retinaface_demo /data/local/tmp/ +adb push model/RetinaFace_int8_A311D2.adla /data/local/tmp/ +adb push imgs /data/local/tmp/ + +# Run on device +adb shell +cd /data/local/tmp +chmod +x retinaface_demo +export LD_LIBRARY_PATH=/vendor/lib64 or (/vendor/lib) + +# Usage: ./retinaface_demo +./retinaface_demo RetinaFace_int8_A311D2.adla ./imgs +``` + +**Note:** Replace `RetinaFace_int8_A311D2.adla` with your actual model file path. + +### Python + +**Prerequisites:** +- Python 3.10 +- Required packages: `numpy`, `opencv-python`, `amlnnlite` + +**Install dependencies:** +```bash +pip install numpy opencv-python amlnnlite-1.0.0-cp310-cp310-linux_aarch64.whl +``` + +**Run on device:** +```bash +python RetinaFace.py \ + --model-path ./RetinaFace_int8_A311D2.adla \ + --image-dir ./imgs \ + --run-cycles 1 \ + --loglevel INFO +``` + +Argument Descriptions: +| Argument | Description | +| ----------------- | ------------------------------------------------------------ | +| --board-work-path | Work path on board, default is /data/local/tmp | +| --model-path | path to .adla model | +| --image-dir | Directory containing test images | +| --run-cycles | Number of inference cycles, default is 1 | +| --loglevel | Logging level: DEBUG / INFO / WARNING / ERROR, default is WARNING | + +The script will automatically process all image files (`.jpg`, `.jpeg`, `.png`, `.bmp`) in the current directory and save results to a `{model_name}_result` folder. + +## 5.Results + +**Performance Feedback** + +By setting the loglevel to INFO, the program provides real-time performance metrics upon completion. The console log will display essential hardware and execution details, including: +- Hardware Information: System and ADLA library versions. +- Model Overview: Basic input/output configurations. +- NPU Metrics: Total inference time (latency) and total DRAM bandwidth consumption. + +**Detection Output** + +The program will print the detection count. The output images, featuring bounding boxes and five facial landmarks (eyes, nose, and mouth corners), will be saved to the `{model_name}_result` folder. + + +You can pull the result folder back to view it: +```bash +adb pull /data/local/tmp/RetinaFace_int8_A311D2_result +``` +![alt text](result.jpg) + + +**Profiling Visualization** + +After a successful run of the Python demo, a folder named after the model (e.g., `{model_name}`) will be generated in the script directory. This folder contains 5 HTML files that provide a visual and detailed breakdown of per-layer performance: +- `hard_op_chart.html` & `soft_op_chart.html`: Hardware/Software op execution details. +- `dram_rd_chart.html` & `dram_wr_chart.html`: Bandwidth read/write distribution. +- `pie_charts_distribution.html`: Overall resource allocation. + +You can pull the result folder back to view it: +```bash +adb pull /data/local/tmp/RetinaFace_int8_A311D2 +``` + +Taking hard_op_chart.html as an example (shown below), each layer's ADLA operator name includes parentheses containing the index of the corresponding quantized .tflite layer(s); by default, these indices are suppressed, and operators are labeled generically as "hardware" or "software" without numerical suffixes. + +![alt text](Visualization.png) diff --git a/examples/retinaface/cpp/build-android.sh b/examples/retinaface/cpp/build-android.sh index e33728a..4e3b6d4 100755 --- a/examples/retinaface/cpp/build-android.sh +++ b/examples/retinaface/cpp/build-android.sh @@ -65,7 +65,8 @@ echo "BUILD_DIR: ${BUILD_DIR}" mkdir -p ${BUILD_DIR} cd ${BUILD_DIR} -cmake ../../src \ +cmake -Wno-dev ../../src \ + -DAMLNN_HOME=${AMLNN_HOME:-} \ -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_PATH}/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=${TARGET_ABI} \ -DANDROID_PLATFORM=android-24 \ diff --git a/examples/retinaface/cpp/src/CMakeLists.txt b/examples/retinaface/cpp/src/CMakeLists.txt index 9fca045..80053d7 100755 --- a/examples/retinaface/cpp/src/CMakeLists.txt +++ b/examples/retinaface/cpp/src/CMakeLists.txt @@ -1,46 +1,35 @@ -cmake_minimum_required(VERSION 3.5) -project(retinaface_demo) - -set(CMAKE_CXX_STANDARD 17) - -# Set NNSDK path -if(NOT DEFINED NNSDK_DIR) - set(NNSDK_DIR "${CMAKE_SOURCE_DIR}/../../../../../amlnn-toolkit/nn_runtime/nnsdk") -endif() -set(NNSDK_ROOT "${NNSDK_DIR}") -message(STATUS "NNSDK_ROOT: ${NNSDK_ROOT}") - -include_directories(${NNSDK_ROOT}/include) -include_directories(${CMAKE_SOURCE_DIR}/../../../../common) - -# Set dependency path -set(3RDPARTY_DIR "${CMAKE_SOURCE_DIR}/../../../../dependency") - -if(CMAKE_SYSTEM_NAME STREQUAL "Android") - if (ANDROID_ABI STREQUAL "arm64-v8a") - link_directories(${NNSDK_ROOT}/android/arm64-v8a) - else() - link_directories(${NNSDK_ROOT}/android/armeabi-v7a) - endif() - # Android needs log - link_libraries(log) -elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") - link_directories(${NNSDK_ROOT}/linux/yocto/aarch64-poky-linux) -endif() - -# Find OpenCV -message(STATUS "OpenCV_DIR: ${OpenCV_DIR}") -find_package(OpenCV REQUIRED) -include_directories(${OpenCV_INCLUDE_DIRS}) - - -add_executable(retinaface_demo - main.cpp - postprocess.cpp - ${CMAKE_SOURCE_DIR}/../../../../common/model_loader.cpp -) - -target_link_libraries(retinaface_demo - ${OpenCV_LIBS} - nnsdk +cmake_minimum_required(VERSION 3.10...3.27) +project(retinaface_demo) + +set(CMAKE_CXX_STANDARD 17) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../../../../cmake") +find_package(AMLNN REQUIRED) +include_directories(${AMLNN_INCLUDE_DIR}) +link_directories(${AMLNN_LIBRARY_DIR}) + +include_directories(${CMAKE_SOURCE_DIR}/../../../../common) + +# Set dependency path +set(3RDPARTY_DIR "${CMAKE_SOURCE_DIR}/../../../../dependency") + +if(CMAKE_SYSTEM_NAME STREQUAL "Android") + # Android needs log + link_libraries(log) +endif() + +# Find OpenCV +message(STATUS "OpenCV_DIR: ${OpenCV_DIR}") +find_package(OpenCV REQUIRED) +include_directories(${OpenCV_INCLUDE_DIRS}) + +add_executable(retinaface_demo + main.cpp + postprocess.cpp + ${CMAKE_SOURCE_DIR}/../../../../common/model_loader.cpp +) + +target_link_libraries(retinaface_demo + ${OpenCV_LIBS} + ${AMLNN_LIBRARY} ) \ No newline at end of file diff --git a/examples/whisper/README.md b/examples/whisper/README.md index e69de29..91103b1 100644 --- a/examples/whisper/README.md +++ b/examples/whisper/README.md @@ -0,0 +1,34 @@ +# Whisper + +## 4. Demo Run + +### CPP + +#### 1. Compile + +#### AMLNN SDK Setup + +Resolve the AMLNN nnsdk dependency using one of the following methods: + +- **Priority 1 – Environment variable (recommended)** + ```bash + export AMLNN_HOME=/path/to/amlnn-toolkit + ``` +- **Priority 3 – Sibling directory fallback** *(automatic)* + Place `amlnn-toolkit` as a sibling to `amlnn-model-playground`: + ```bash + git clone git@github.com:Amlogic-NN/amlnn-toolkit.git ../amlnn-toolkit + ``` + +**Prerequisites:** +- Android NDK r25c +- `ANDROID_NDK_PATH` environment variable set + +**Build:** +```bash +# Build for arm64-v8a +cd examples/whisper/cpp +./build-android.sh -a arm64-v8a +``` + +The executable will be generated in `build/android/`. diff --git a/examples/whisper/cpp/build-android.sh b/examples/whisper/cpp/build-android.sh index 8460c05..fff8e9a 100755 --- a/examples/whisper/cpp/build-android.sh +++ b/examples/whisper/cpp/build-android.sh @@ -65,7 +65,8 @@ echo "BUILD_DIR: ${BUILD_DIR}" mkdir -p ${BUILD_DIR} cd ${BUILD_DIR} -cmake ../../src \ +cmake -Wno-dev ../../src \ + -DAMLNN_HOME=${AMLNN_HOME:-} \ -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_PATH}/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=${TARGET_ABI} \ -DANDROID_PLATFORM=android-24 \ diff --git a/examples/whisper/cpp/src/CMakeLists.txt b/examples/whisper/cpp/src/CMakeLists.txt index 5a10c56..b2f1d3d 100755 --- a/examples/whisper/cpp/src/CMakeLists.txt +++ b/examples/whisper/cpp/src/CMakeLists.txt @@ -1,45 +1,35 @@ -cmake_minimum_required(VERSION 3.5) -project(whisper_demo) - -set(CMAKE_CXX_STANDARD 17) - -# Set NNSDK path -if(NOT DEFINED NNSDK_DIR) - set(NNSDK_DIR "${CMAKE_SOURCE_DIR}/../../../../../amlnn-toolkit/nn_runtime/nnsdk") -endif() -set(NNSDK_ROOT "${NNSDK_DIR}") -message(STATUS "NNSDK_ROOT: ${NNSDK_ROOT}") - -include_directories(${NNSDK_ROOT}/include) -include_directories(${CMAKE_SOURCE_DIR}/../../../../common) - -# Set 3rdparty path -set(3RDPARTY_DIR "${CMAKE_SOURCE_DIR}/../../../../dependency") - -if(CMAKE_SYSTEM_NAME STREQUAL "Android") - if (ANDROID_ABI STREQUAL "arm64-v8a") - link_directories(${NNSDK_ROOT}/android/arm64-v8a) - else() - link_directories(${NNSDK_ROOT}/android/armeabi-v7a) - endif() - # Android needs log - link_libraries(log) -elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") - link_directories(${NNSDK_ROOT}/linux/yocto/aarch64-poky-linux) -endif() - -add_executable(${PROJECT_NAME} - main.cpp - common.cpp - whisper.cpp - whisper_invoke.cpp - pre_process_whisper.cpp - post_process_whisper.cpp -) - -target_link_libraries(${PROJECT_NAME} - nnsdk - dl - m -) - +cmake_minimum_required(VERSION 3.10...3.27) +project(whisper_demo) + +set(CMAKE_CXX_STANDARD 17) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../../../../cmake") +find_package(AMLNN REQUIRED) +include_directories(${AMLNN_INCLUDE_DIR}) +link_directories(${AMLNN_LIBRARY_DIR}) + +include_directories(${CMAKE_SOURCE_DIR}/../../../../common) + +# Set 3rdparty path +set(3RDPARTY_DIR "${CMAKE_SOURCE_DIR}/../../../../dependency") + +if(CMAKE_SYSTEM_NAME STREQUAL "Android") + # Android needs log + link_libraries(log) +endif() + +add_executable(${PROJECT_NAME} + main.cpp + common.cpp + whisper.cpp + whisper_invoke.cpp + pre_process_whisper.cpp + post_process_whisper.cpp +) + +target_link_libraries(${PROJECT_NAME} + ${AMLNN_LIBRARY} + dl + m +) + diff --git a/examples/yoloe/README.md b/examples/yoloe/README.md index e69de29..2a7d192 100644 --- a/examples/yoloe/README.md +++ b/examples/yoloe/README.md @@ -0,0 +1,34 @@ +# YOLOE + +## 4. Demo Run + +### CPP + +#### 1. Compile + +#### AMLNN SDK Setup + +Resolve the AMLNN nnsdk dependency using one of the following methods: + +- **Priority 1 – Environment variable (recommended)** + ```bash + export AMLNN_HOME=/path/to/amlnn-toolkit + ``` +- **Priority 3 – Sibling directory fallback** *(automatic)* + Place `amlnn-toolkit` as a sibling to `amlnn-model-playground`: + ```bash + git clone git@github.com:Amlogic-NN/amlnn-toolkit.git ../amlnn-toolkit + ``` + +**Prerequisites:** +- Android NDK r25c +- `ANDROID_NDK_PATH` environment variable set + +**Build:** +```bash +# Build for arm64-v8a +cd examples/yoloe/cpp +./build-android.sh -a arm64-v8a +``` + +The executable will be generated in `build/android/`. diff --git a/examples/yoloe/cpp/build-android.sh b/examples/yoloe/cpp/build-android.sh index 1c0bcf8..902b364 100755 --- a/examples/yoloe/cpp/build-android.sh +++ b/examples/yoloe/cpp/build-android.sh @@ -65,7 +65,8 @@ echo "BUILD_DIR: ${BUILD_DIR}" mkdir -p ${BUILD_DIR} cd ${BUILD_DIR} -cmake ../../src \ +cmake -Wno-dev ../../src \ + -DAMLNN_HOME=${AMLNN_HOME:-} \ -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_PATH}/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=${TARGET_ABI} \ -DANDROID_PLATFORM=android-24 \ diff --git a/examples/yoloe/cpp/src/CMakeLists.txt b/examples/yoloe/cpp/src/CMakeLists.txt index 98613bc..e735aa5 100644 --- a/examples/yoloe/cpp/src/CMakeLists.txt +++ b/examples/yoloe/cpp/src/CMakeLists.txt @@ -1,31 +1,21 @@ -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.10...3.27) project(yoloe_demo) set(CMAKE_CXX_STANDARD 17) -# Set NNSDK path -if(NOT DEFINED NNSDK_DIR) - set(NNSDK_DIR "${CMAKE_SOURCE_DIR}/../../../../../amlnn-toolkit/nn_runtime/nnsdk") -endif() -set(NNSDK_ROOT "${NNSDK_DIR}") -message(STATUS "NNSDK_ROOT: ${NNSDK_ROOT}") +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../../../../cmake") +find_package(AMLNN REQUIRED) +include_directories(${AMLNN_INCLUDE_DIR}) +link_directories(${AMLNN_LIBRARY_DIR}) -include_directories(${NNSDK_ROOT}/include) include_directories(${CMAKE_SOURCE_DIR}/../../../../common) # Set dependency path set(3RDPARTY_DIR "${CMAKE_SOURCE_DIR}/../../../../dependency") if(CMAKE_SYSTEM_NAME STREQUAL "Android") - if (ANDROID_ABI STREQUAL "arm64-v8a") - link_directories(${NNSDK_ROOT}/android/arm64-v8a) - else() - link_directories(${NNSDK_ROOT}/android/armeabi-v7a) - endif() # Android needs log link_libraries(log) -elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") - link_directories(${NNSDK_ROOT}/linux/yocto/aarch64-poky-linux) endif() # Find OpenCV @@ -40,5 +30,5 @@ add_executable(yoloe_demo target_link_libraries(yoloe_demo ${OpenCV_LIBS} - nnsdk + ${AMLNN_LIBRARY} ) diff --git a/examples/yolov11/README.md b/examples/yolov11/README.md index 6f34ee9..79fff22 100755 --- a/examples/yolov11/README.md +++ b/examples/yolov11/README.md @@ -1,170 +1,184 @@ -# yolov11 - -## 1.Overview - -​ YOLOv11 was released by Ultralytics on October 2, 2024. It introduces significant architectural refinements and efficiency optimizations, delivering superior accuracy-speed trade-offs compared to previous generations. With enhanced feature extraction capabilities, YOLOv11 is designed for high-performance real-time applications—including object detection, instance segmentation, and pose estimation—to handle demanding tasks in a wide range of applications. - -## 2.Model Download - -- **Open Source model** - - - **Open Source projects:** https://github.com/ultralytics/ultralytics/tree/v8.3.0 - - - **Export Model Step:** - - - **Install ultralytics** - - pip install torch==2.4.1 - - pip install torchvision==0.19.1 - - pip install ultralytics==8.3.0 - - - **Download weights** - - wget https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11m.pt - - wget https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11s.pt - - wget https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n.pt - - - **Export Model** - - ``` - from ultralytics import YOLO - - model = YOLO("yolo11n.pt") - model.export(format="onnx", opset=12, simplify=True, dynamic=False, imgsz=640) - ``` - - -- **Exported Model** - - ​ link to amlogic server( **onnx model or quantized tflite**) - - - -## 3. Model Conversion - -``` -cd model -Usage: ./adla_covnert.sh model_path adla_tookkit_path target_platform - -example - ./adla_covnert.sh yolov11m.onnx /xxxx/adla-toolkit-binary-3.2.9.3 PRODUCT_PID0XA005 - ./adla_covnert.sh yolov11s.onnx /xxxx/adla-toolkit-binary-3.2.9.3 PRODUCT_PID0XA005 - ./adla_covnert.sh yolov11n.onnx /xxxx/adla-toolkit-binary-3.2.9.3 PRODUCT_PID0XA005 -``` - -| Parameter | Discription | -| ----------------- | ------------------------------------------------------------ | -| model_path | onnx model path | -| adla_tookkit_path | path to adla_toolkit | -| target_platform | Specify target platform. for A311D2 : PRODUCT_PID0XA003. for S905X5: PRODUCT_PID0XA005 | - - - -## 4. Demo Run - -### CPP - -#### 1. Compile - -**Prerequisites:** -- Android NDK (r25e recommended) -- `ANDROID_NDK_PATH` environment variable set - -**Build:** -```bash -# Build for arm64-v8a -cd examples/yolov11/cpp -./build-android.sh -a arm64-v8a -``` - -The executable will be generated at `build/android/yolo11_demo` (Note: executable name may vary, verify in build folder). - -#### 2. Run - -```bash -# Push executable to device -adb push build/android/yolo11_demo /data/local/tmp/ -adb push model/yolov11n_int8_A311D2.adla /data/local/tmp/ -adb push imgs /data/local/tmp/ - -# Run on device -adb shell -cd /data/local/tmp -chmod +x yolo11_demo -export LD_LIBRARY_PATH=/vendor/lib64 or (/vendor/lib) - -# Usage: ./yolo11_demo -./yolo11_demo yolov11n_int8_A311D2.adla ./imgs -``` - -**Note:** Replace `yolov11n_int8_A311D2.adla` with your actual model file path. - -### Python - -**Prerequisites:** -- Python 3.10 -- Required packages: `numpy`, `opencv-python`, `amlnnlite` - -**Install dependencies:** -```bash -pip install numpy opencv-python amlnnlite-1.0.0-cp310-cp310-linux_aarch64.whl -``` - -**Run on device:** -```bash -python yolov11.py \ - --model-path ./yolov11n_int8_A311D2.adla \ - --image-dir ./imgs \ - --run-cycles 1 \ - --loglevel INFO -``` - -Argument Descriptions: -| Argument | Description | -| ----------------- | ------------------------------------------------------------ | -| --board-work-path | Work path on board, default is /data/local/tmp | -| --model-path | path to .adla model | -| --image-dir | Directory containing test images | -| --run-cycles | Number of inference cycles, default is 1 | -| --loglevel | Logging level: DEBUG / INFO / WARNING / ERROR, default is WARNING | - -The script will automatically process all image files (`.jpg`, `.jpeg`, `.png`, `.bmp`) in the current directory and save results to a `{model_name}_result` folder. - -## 5.Results - -**Performance Feedback** - -By setting the loglevel to INFO, the program provides real-time performance metrics upon completion. The console log will display essential hardware and execution details, including: -- Hardware Information: System and ADLA library versions. -- Model Overview: Basic input/output configurations. -- NPU Metrics: Total inference time (latency) and total DRAM bandwidth consumption. - -**Detection Output** - -The program will print the detection count. The result image with bounding boxes will be saved to the specified output path (`{model_name}_result`). - -You can pull the result folder back to view it: -```bash -adb pull /data/local/tmp/yolov11n_int8_A311D2_result -``` -![alt text](result.jpg) - -**Profiling Visualization** - -After a successful run of the Python demo, a folder named after the model (e.g., `{model_name}`) will be generated in the script directory. This folder contains 5 HTML files that provide a visual and detailed breakdown of per-layer performance: -- `hard_op_chart.html` & `soft_op_chart.html`: Hardware/Software op execution details. -- `dram_rd_chart.html` & `dram_wr_chart.html`: Bandwidth read/write distribution. -- `pie_charts_distribution.html`: Overall resource allocation. - -You can pull the result folder back to view it: -```bash -adb pull /data/local/tmp/yolov11n_int8_A311D2 -``` - -Taking hard_op_chart.html as an example (shown below), each layer's ADLA operator name includes parentheses containing the index of the corresponding quantized .tflite layer(s); by default, these indices are suppressed, and operators are labeled generically as "hardware" or "software" without numerical suffixes. - +# yolov11 + +## 1.Overview + +​ YOLOv11 was released by Ultralytics on October 2, 2024. It introduces significant architectural refinements and efficiency optimizations, delivering superior accuracy-speed trade-offs compared to previous generations. With enhanced feature extraction capabilities, YOLOv11 is designed for high-performance real-time applications—including object detection, instance segmentation, and pose estimation—to handle demanding tasks in a wide range of applications. + +## 2.Model Download + +- **Open Source model** + + - **Open Source projects:** https://github.com/ultralytics/ultralytics/tree/v8.3.0 + + - **Export Model Step:** + + - **Install ultralytics** + + pip install torch==2.4.1 + + pip install torchvision==0.19.1 + + pip install ultralytics==8.3.0 + + - **Download weights** + + wget https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11m.pt + + wget https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11s.pt + + wget https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n.pt + + - **Export Model** + + ``` + from ultralytics import YOLO + + model = YOLO("yolo11n.pt") + model.export(format="onnx", opset=12, simplify=True, dynamic=False, imgsz=640) + ``` + + +- **Exported Model** + + ​ link to amlogic server( **onnx model or quantized tflite**) + + + +## 3. Model Conversion + +``` +cd model +Usage: ./adla_covnert.sh model_path adla_tookkit_path target_platform + +example + ./adla_covnert.sh yolov11m.onnx /xxxx/adla-toolkit-binary-3.2.9.3 PRODUCT_PID0XA005 + ./adla_covnert.sh yolov11s.onnx /xxxx/adla-toolkit-binary-3.2.9.3 PRODUCT_PID0XA005 + ./adla_covnert.sh yolov11n.onnx /xxxx/adla-toolkit-binary-3.2.9.3 PRODUCT_PID0XA005 +``` + +| Parameter | Discription | +| ----------------- | ------------------------------------------------------------ | +| model_path | onnx model path | +| adla_tookkit_path | path to adla_toolkit | +| target_platform | Specify target platform. for A311D2 : PRODUCT_PID0XA003. for S905X5: PRODUCT_PID0XA005 | + + + +## 4. Demo Run + +### CPP + +#### 1. Compile + +#### AMLNN SDK Setup + +Resolve the AMLNN nnsdk dependency using one of the following methods: + +- **Priority 1 – Environment variable (recommended)** + ```bash + export AMLNN_HOME=/path/to/amlnn-toolkit + ``` +- **Priority 3 – Sibling directory fallback** *(automatic)* + Place `amlnn-toolkit` as a sibling to `amlnn-model-playground`: + ```bash + git clone git@github.com:Amlogic-NN/amlnn-toolkit.git ../amlnn-toolkit + ``` + +**Prerequisites:** +- Android NDK (r25e recommended) +- `ANDROID_NDK_PATH` environment variable set + +**Build:** +```bash +# Build for arm64-v8a +cd examples/yolov11/cpp +./build-android.sh -a arm64-v8a +``` + +The executable will be generated at `build/android/yolo11_demo` (Note: executable name may vary, verify in build folder). + +#### 2. Run + +```bash +# Push executable to device +adb push build/android/yolo11_demo /data/local/tmp/ +adb push model/yolov11n_int8_A311D2.adla /data/local/tmp/ +adb push imgs /data/local/tmp/ + +# Run on device +adb shell +cd /data/local/tmp +chmod +x yolo11_demo +export LD_LIBRARY_PATH=/vendor/lib64 or (/vendor/lib) + +# Usage: ./yolo11_demo +./yolo11_demo yolov11n_int8_A311D2.adla ./imgs +``` + +**Note:** Replace `yolov11n_int8_A311D2.adla` with your actual model file path. + +### Python + +**Prerequisites:** +- Python 3.10 +- Required packages: `numpy`, `opencv-python`, `amlnnlite` + +**Install dependencies:** +```bash +pip install numpy opencv-python amlnnlite-1.0.0-cp310-cp310-linux_aarch64.whl +``` + +**Run on device:** +```bash +python yolov11.py \ + --model-path ./yolov11n_int8_A311D2.adla \ + --image-dir ./imgs \ + --run-cycles 1 \ + --loglevel INFO +``` + +Argument Descriptions: +| Argument | Description | +| ----------------- | ------------------------------------------------------------ | +| --board-work-path | Work path on board, default is /data/local/tmp | +| --model-path | path to .adla model | +| --image-dir | Directory containing test images | +| --run-cycles | Number of inference cycles, default is 1 | +| --loglevel | Logging level: DEBUG / INFO / WARNING / ERROR, default is WARNING | + +The script will automatically process all image files (`.jpg`, `.jpeg`, `.png`, `.bmp`) in the current directory and save results to a `{model_name}_result` folder. + +## 5.Results + +**Performance Feedback** + +By setting the loglevel to INFO, the program provides real-time performance metrics upon completion. The console log will display essential hardware and execution details, including: +- Hardware Information: System and ADLA library versions. +- Model Overview: Basic input/output configurations. +- NPU Metrics: Total inference time (latency) and total DRAM bandwidth consumption. + +**Detection Output** + +The program will print the detection count. The result image with bounding boxes will be saved to the specified output path (`{model_name}_result`). + +You can pull the result folder back to view it: +```bash +adb pull /data/local/tmp/yolov11n_int8_A311D2_result +``` +![alt text](result.jpg) + +**Profiling Visualization** + +After a successful run of the Python demo, a folder named after the model (e.g., `{model_name}`) will be generated in the script directory. This folder contains 5 HTML files that provide a visual and detailed breakdown of per-layer performance: +- `hard_op_chart.html` & `soft_op_chart.html`: Hardware/Software op execution details. +- `dram_rd_chart.html` & `dram_wr_chart.html`: Bandwidth read/write distribution. +- `pie_charts_distribution.html`: Overall resource allocation. + +You can pull the result folder back to view it: +```bash +adb pull /data/local/tmp/yolov11n_int8_A311D2 +``` + +Taking hard_op_chart.html as an example (shown below), each layer's ADLA operator name includes parentheses containing the index of the corresponding quantized .tflite layer(s); by default, these indices are suppressed, and operators are labeled generically as "hardware" or "software" without numerical suffixes. + ![alt text](Visualization.png) \ No newline at end of file diff --git a/examples/yolov11/cpp/build-android.sh b/examples/yolov11/cpp/build-android.sh index 7dd0692..f9ec026 100755 --- a/examples/yolov11/cpp/build-android.sh +++ b/examples/yolov11/cpp/build-android.sh @@ -65,7 +65,8 @@ echo "BUILD_DIR: ${BUILD_DIR}" mkdir -p ${BUILD_DIR} cd ${BUILD_DIR} -cmake ../../src \ +cmake -Wno-dev ../../src \ + -DAMLNN_HOME=${AMLNN_HOME:-} \ -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_PATH}/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=${TARGET_ABI} \ -DANDROID_PLATFORM=android-24 \ diff --git a/examples/yolov11/cpp/src/CMakeLists.txt b/examples/yolov11/cpp/src/CMakeLists.txt index 3f157bc..f3b7b85 100755 --- a/examples/yolov11/cpp/src/CMakeLists.txt +++ b/examples/yolov11/cpp/src/CMakeLists.txt @@ -1,46 +1,35 @@ -cmake_minimum_required(VERSION 3.5) -project(yolo11_demo) - -set(CMAKE_CXX_STANDARD 17) - -# Set NNSDK path -if(NOT DEFINED NNSDK_DIR) - set(NNSDK_DIR "${CMAKE_SOURCE_DIR}/../../../../../amlnn-toolkit/nn_runtime/nnsdk") -endif() -set(NNSDK_ROOT "${NNSDK_DIR}") -message(STATUS "NNSDK_ROOT: ${NNSDK_ROOT}") - -include_directories(${NNSDK_ROOT}/include) -include_directories(${CMAKE_SOURCE_DIR}/../../../../common) - -# Set dependency path -set(3RDPARTY_DIR "${CMAKE_SOURCE_DIR}/../../../../dependency") - -if(CMAKE_SYSTEM_NAME STREQUAL "Android") - if (ANDROID_ABI STREQUAL "arm64-v8a") - link_directories(${NNSDK_ROOT}/android/arm64-v8a) - else() - link_directories(${NNSDK_ROOT}/android/armeabi-v7a) - endif() - # Android needs log - link_libraries(log) -elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") - link_directories(${NNSDK_ROOT}/linux/yocto/aarch64-poky-linux) -endif() - -# Find OpenCV -message(STATUS "OpenCV_DIR: ${OpenCV_DIR}") -find_package(OpenCV REQUIRED) -include_directories(${OpenCV_INCLUDE_DIRS}) - - -add_executable(yolo11_demo - main.cpp - postprocess.cpp - ${CMAKE_SOURCE_DIR}/../../../../common/model_loader.cpp -) - -target_link_libraries(yolo11_demo - ${OpenCV_LIBS} - nnsdk +cmake_minimum_required(VERSION 3.10...3.27) +project(yolo11_demo) + +set(CMAKE_CXX_STANDARD 17) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../../../../cmake") +find_package(AMLNN REQUIRED) +include_directories(${AMLNN_INCLUDE_DIR}) +link_directories(${AMLNN_LIBRARY_DIR}) + +include_directories(${CMAKE_SOURCE_DIR}/../../../../common) + +# Set dependency path +set(3RDPARTY_DIR "${CMAKE_SOURCE_DIR}/../../../../dependency") + +if(CMAKE_SYSTEM_NAME STREQUAL "Android") + # Android needs log + link_libraries(log) +endif() + +# Find OpenCV +message(STATUS "OpenCV_DIR: ${OpenCV_DIR}") +find_package(OpenCV REQUIRED) +include_directories(${OpenCV_INCLUDE_DIRS}) + +add_executable(yolo11_demo + main.cpp + postprocess.cpp + ${CMAKE_SOURCE_DIR}/../../../../common/model_loader.cpp +) + +target_link_libraries(yolo11_demo + ${OpenCV_LIBS} + ${AMLNN_LIBRARY} ) \ No newline at end of file diff --git a/examples/yolov8/README.md b/examples/yolov8/README.md index 4735279..43d1c97 100644 --- a/examples/yolov8/README.md +++ b/examples/yolov8/README.md @@ -1,133 +1,147 @@ -# yolov8 - -## 1.Overview - -​ YOLOv8 was released by Ultralytics on January 10, 2023, offering cutting-edge performance in terms of accuracy and speed. Building upon the advancements of previous YOLO versions, YOLOv8 introduced new features and optimizations that make it an ideal choice for various [object detection](https://www.ultralytics.com/blog/a-guide-to-deep-dive-into-object-detection-in-2025) tasks in a wide range of applications. - -## 2.Model Download - -- **Open Source model** - - - **Open Source projects:** https://github.com/ultralytics/ultralytics/tree/v8.2.0 - - - **Export Model Step:** - - - **Install ultralytics** - - pip install torch==2.4.1 - - pip install torchvision==0.19.1 - - pip install ultralytics==8.2.0 - - - **Download weights** - - wget https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8m.pt - - wget https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8s.pt - - wget https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n.pt - - - **Export Model** - - ``` - from ultralytics import YOLO - - model = YOLO("yolov8m.pt") - model.export(format="onnx", opset=12, simplify=True, dynamic=False, imgsz=640) - ``` - - -- **Exported Model** - - ​ link to amlogic server( **onnx model or quantized tflite**) - - - -## 3. Model Conversion - -``` -cd model -Usage: ./adla_covnert.sh model_path adla_tookkit_path target_platform - -example - ./adla_covnert.sh yolov8m.onnx /xxxx/adla-toolkit-binary-3.2.9.3 PRODUCT_PID0XA005 - ./adla_covnert.sh yolov8s.onnx /xxxx/adla-toolkit-binary-3.2.9.3 PRODUCT_PID0XA005 - ./adla_covnert.sh yolov8n.onnx /xxxx/adla-toolkit-binary-3.2.9.3 PRODUCT_PID0XA005 -``` - -| Parameter | Discription | -| ----------------- | ------------------------------------------------------------ | -| model_path | onnx model path | -| adla_tookkit_path | path to adla_toolkit | -| target_platform | Specify target platform. for A311D2 : PRODUCT_PID0XA003。for S905X5: PRODUCT_PID0XA005 | - - - -## 4. Demo Run - -### CPP - -#### 1. Compile - -**Prerequisites:** -- Android NDK (r25e recommended) -- `ANDROID_NDK_PATH` environment variable set - -**Build:** -```bash -# Build for arm64-v8a -cd examples/yolov8/cpp -./build-android.sh -a arm64-v8a -``` - -The executable will be generated at `build/android/yolov8_demo` (Note: executable name may vary, verify in build folder). - -#### 2. Run - -```bash -# Push executable to device -adb push build/android/yolov8_demo /data/local/tmp/ -adb push model/yolov8s_int8_A311D2.adla /data/local/tmp/ -adb push test_image.jpg /data/local/tmp/ - -# Run on device -adb shell -cd /data/local/tmp -chmod +x yolov8_demo -export LD_LIBRARY_PATH=/vendor/lib64 or (/vendor/lib) - -# Usage: ./yolo_world_demo -./yolov8_demo yolov8s_int8_A311D2.adla test_image.jpg" -``` - -**Note:** Replace `yolov8s_int8_A311D2.adla` with your actual model file path. - -### Python - -**Prerequisites:** -- Python 3.10 -- Required packages: `numpy`, `opencv-python`, `amlnnlite` - -**Install dependencies:** -```bash -pip install numpy opencv-python amlnnlite-1.0.0-cp310-cp310-linux_aarch64.whl -``` - -**Run on device:** -```bash -python yolov8.py --model-path ./yolov8s_int8_A311D2.adla -``` - -The script will automatically process all image files (`.jpg`, `.jpeg`, `.png`, `.bmp`) in the current directory and save results to a `{model_name}_result` folder. - -## 5.Results -The program will print the detection count and inference time. The result image with bounding boxes will be saved to the specified output path (`result.jpg` by default). - - -You can pull the result image back to view it: -```bash -adb pull result.jpg. -``` -![alt text](result.jpg) - +# yolov8 + +## 1.Overview + +​ YOLOv8 was released by Ultralytics on January 10, 2023, offering cutting-edge performance in terms of accuracy and speed. Building upon the advancements of previous YOLO versions, YOLOv8 introduced new features and optimizations that make it an ideal choice for various [object detection](https://www.ultralytics.com/blog/a-guide-to-deep-dive-into-object-detection-in-2025) tasks in a wide range of applications. + +## 2.Model Download + +- **Open Source model** + + - **Open Source projects:** https://github.com/ultralytics/ultralytics/tree/v8.2.0 + + - **Export Model Step:** + + - **Install ultralytics** + + pip install torch==2.4.1 + + pip install torchvision==0.19.1 + + pip install ultralytics==8.2.0 + + - **Download weights** + + wget https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8m.pt + + wget https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8s.pt + + wget https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n.pt + + - **Export Model** + + ``` + from ultralytics import YOLO + + model = YOLO("yolov8m.pt") + model.export(format="onnx", opset=12, simplify=True, dynamic=False, imgsz=640) + ``` + + +- **Exported Model** + + ​ link to amlogic server( **onnx model or quantized tflite**) + + + +## 3. Model Conversion + +``` +cd model +Usage: ./adla_covnert.sh model_path adla_tookkit_path target_platform + +example + ./adla_covnert.sh yolov8m.onnx /xxxx/adla-toolkit-binary-3.2.9.3 PRODUCT_PID0XA005 + ./adla_covnert.sh yolov8s.onnx /xxxx/adla-toolkit-binary-3.2.9.3 PRODUCT_PID0XA005 + ./adla_covnert.sh yolov8n.onnx /xxxx/adla-toolkit-binary-3.2.9.3 PRODUCT_PID0XA005 +``` + +| Parameter | Discription | +| ----------------- | ------------------------------------------------------------ | +| model_path | onnx model path | +| adla_tookkit_path | path to adla_toolkit | +| target_platform | Specify target platform. for A311D2 : PRODUCT_PID0XA003。for S905X5: PRODUCT_PID0XA005 | + + + +## 4. Demo Run + +### CPP + +#### 1. Compile + +#### AMLNN SDK Setup + +Resolve the AMLNN nnsdk dependency using one of the following methods: + +- **Priority 1 – Environment variable (recommended)** + ```bash + export AMLNN_HOME=/path/to/amlnn-toolkit + ``` +- **Priority 3 – Sibling directory fallback** *(automatic)* + Place `amlnn-toolkit` as a sibling to `amlnn-model-playground`: + ```bash + git clone git@github.com:Amlogic-NN/amlnn-toolkit.git ../amlnn-toolkit + ``` + +**Prerequisites:** +- Android NDK (r25e recommended) +- `ANDROID_NDK_PATH` environment variable set + +**Build:** +```bash +# Build for arm64-v8a +cd examples/yolov8/cpp +./build-android.sh -a arm64-v8a +``` + +The executable will be generated at `build/android/yolov8_demo` (Note: executable name may vary, verify in build folder). + +#### 2. Run + +```bash +# Push executable to device +adb push build/android/yolov8_demo /data/local/tmp/ +adb push model/yolov8s_int8_A311D2.adla /data/local/tmp/ +adb push test_image.jpg /data/local/tmp/ + +# Run on device +adb shell +cd /data/local/tmp +chmod +x yolov8_demo +export LD_LIBRARY_PATH=/vendor/lib64 or (/vendor/lib) + +# Usage: ./yolo_world_demo +./yolov8_demo yolov8s_int8_A311D2.adla test_image.jpg" +``` + +**Note:** Replace `yolov8s_int8_A311D2.adla` with your actual model file path. + +### Python + +**Prerequisites:** +- Python 3.10 +- Required packages: `numpy`, `opencv-python`, `amlnnlite` + +**Install dependencies:** +```bash +pip install numpy opencv-python amlnnlite-1.0.0-cp310-cp310-linux_aarch64.whl +``` + +**Run on device:** +```bash +python yolov8.py --model-path ./yolov8s_int8_A311D2.adla +``` + +The script will automatically process all image files (`.jpg`, `.jpeg`, `.png`, `.bmp`) in the current directory and save results to a `{model_name}_result` folder. + +## 5.Results +The program will print the detection count and inference time. The result image with bounding boxes will be saved to the specified output path (`result.jpg` by default). + + +You can pull the result image back to view it: +```bash +adb pull result.jpg. +``` +![alt text](result.jpg) + diff --git a/examples/yolov8/cpp/build-android.sh b/examples/yolov8/cpp/build-android.sh index daa39df..cbb66a0 100755 --- a/examples/yolov8/cpp/build-android.sh +++ b/examples/yolov8/cpp/build-android.sh @@ -65,13 +65,13 @@ echo "BUILD_DIR: ${BUILD_DIR}" mkdir -p ${BUILD_DIR} cd ${BUILD_DIR} -cmake ../../src \ +cmake -Wno-dev ../../src \ + -DAMLNN_HOME=${AMLNN_HOME:-} \ -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_PATH}/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=${TARGET_ABI} \ -DANDROID_PLATFORM=android-24 \ -DCMAKE_BUILD_TYPE=Release \ -DOpenCV_DIR=${ROOT_PWD}/../../../dependency/opencv/opencv-android-sdk-build/sdk/native/jni/abi-${TARGET_ABI} \ - -DNNSDK_DIR=${ROOT_PWD}/../../../../amlnn-toolkit/nn_runtime/nnsdk make -j4 diff --git a/examples/yolov8/cpp/src/CMakeLists.txt b/examples/yolov8/cpp/src/CMakeLists.txt index d132750..0b41eb6 100755 --- a/examples/yolov8/cpp/src/CMakeLists.txt +++ b/examples/yolov8/cpp/src/CMakeLists.txt @@ -1,46 +1,36 @@ -cmake_minimum_required(VERSION 3.5) -project(yolo_world_demo) - -set(CMAKE_CXX_STANDARD 17) - -# Set NNSDK path -if(NOT DEFINED NNSDK_DIR) - set(NNSDK_DIR "${CMAKE_SOURCE_DIR}/../../../../../amlnn-toolkit/nn_runtime/nnsdk") -endif() -set(NNSDK_ROOT "${NNSDK_DIR}") -message(STATUS "NNSDK_ROOT: ${NNSDK_ROOT}") - -include_directories(${NNSDK_ROOT}/include) -include_directories(${CMAKE_SOURCE_DIR}/../../../../common) - -# Set 3rdparty path -set(3RDPARTY_DIR "${CMAKE_SOURCE_DIR}/../../../../dependency") - -if(CMAKE_SYSTEM_NAME STREQUAL "Android") - if (ANDROID_ABI STREQUAL "arm64-v8a") - link_directories(${NNSDK_ROOT}/android/arm64-v8a) - else() - link_directories(${NNSDK_ROOT}/android/armeabi-v7a) - endif() - # Android needs log - link_libraries(log) -elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") - link_directories(${NNSDK_ROOT}/linux/yocto/aarch64-poky-linux) -endif() - -# Find OpenCV -message(STATUS "OpenCV_DIR: ${OpenCV_DIR}") -find_package(OpenCV REQUIRED) -include_directories(${OpenCV_INCLUDE_DIRS}) - -add_executable(yolov8_demo - main.cpp - postprocess.cpp - postprocess.h - ${CMAKE_SOURCE_DIR}/../../../../common/model_loader.cpp -) - -target_link_libraries(yolov8_demo - ${OpenCV_LIBS} - nnsdk -) +cmake_minimum_required(VERSION 3.10...3.27) +project(yolo_world_demo) + +set(CMAKE_CXX_STANDARD 17) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../../../../cmake") +find_package(AMLNN REQUIRED) +include_directories(${AMLNN_INCLUDE_DIR}) +link_directories(${AMLNN_LIBRARY_DIR}) + +include_directories(${CMAKE_SOURCE_DIR}/../../../../common) + +# Set 3rdparty path +set(3RDPARTY_DIR "${CMAKE_SOURCE_DIR}/../../../../dependency") + +if(CMAKE_SYSTEM_NAME STREQUAL "Android") + # Android needs log + link_libraries(log) +endif() + +# Find OpenCV +message(STATUS "OpenCV_DIR: ${OpenCV_DIR}") +find_package(OpenCV REQUIRED) +include_directories(${OpenCV_INCLUDE_DIRS}) + +add_executable(yolov8_demo + main.cpp + postprocess.cpp + postprocess.h + ${CMAKE_SOURCE_DIR}/../../../../common/model_loader.cpp +) + +target_link_libraries(yolov8_demo + ${OpenCV_LIBS} + ${AMLNN_LIBRARY} +) diff --git a/examples/yoloworld/README.md b/examples/yoloworld/README.md index 9c7c032..0c6c126 100644 --- a/examples/yoloworld/README.md +++ b/examples/yoloworld/README.md @@ -1,72 +1,86 @@ -## Demo Run - -### CPP - -#### 1. Compile - -**Prerequisites:** -- Android NDK (r25e recommended) -- `ANDROID_NDK_PATH` environment variable set - -**Build:** -```bash -# Build for arm64-v8a -cd examples/yoloworld/cpp -./build-android.sh -a arm64-v8a -``` - -The executable will be generated at `build/android/yolo_world_demo` (Note: executable name may vary, verify in build folder). - -#### 2. Run - -```bash -# Push executable to device -adb push build/android/yolo_world_demo /data/local/tmp/ -adb push model/yoloworld_int8_A311D2.adla /data/local/tmp/ -adb push test_image.jpg /data/local/tmp/ - -# Run on device -adb shell -cd /data/local/tmp -chmod +x yolo_world_demo -export LD_LIBRARY_PATH=/vendor/lib64 or (/vendor/lib) - -# Usage: ./yolo_world_demo -./yolo_world_demo yoloworld_int8_A311D2.adla test_image.jpg -``` - -**Note:** Replace `yoloworld_int8_A311D2.adla` with your actual model file path. - -### Python - -**Prerequisites:** -- Python 3.10 -- Required packages: `numpy`, `opencv-python`, `amlnnlite` - -**Install dependencies:** -```bash -pip install numpy opencv-python amlnnlite-1.0.0-cp310-cp310-linux_aarch64.whl -``` - -**Run on device:** -```bash -# Basic usage (process current directory) -python yoloworld.py --model-path ./yoloworld_int8_A311D2.adla - -# Specify image directory -python yoloworld.py --model-path ./yoloworld_int8_A311D2.adla --image-dir ./ -``` - -The script will automatically process all image files (`.jpg`, `.jpeg`, `.png`, `.bmp`) in the specified directory and save results to a `{model_name}_result` folder. - -## Results - -The program will print the detection count and detected objects for each processed image. The result image with bounding boxes will be saved to the specified output directory. - -You can pull the result image back to view it: -```bash -adb pull result.jpg. -``` -![alt text](result.jpg) - -The program detects objects from predefined classes (handbag, backpack, wallet, watch, necklace, bracelet, earrings, finger ring, sunglass, hat, shoes, belt, makeup palette, lipstick tube, car, truck, bicycle, motorcycle, phone, laptop, camera, wine bottle, stuffed toy) and draws bounding boxes with class labels on the result images. +## Demo Run + +### CPP + +#### 1. Compile + +#### AMLNN SDK Setup + +Resolve the AMLNN nnsdk dependency using one of the following methods: + +- **Priority 1 – Environment variable (recommended)** + ```bash + export AMLNN_HOME=/path/to/amlnn-toolkit + ``` +- **Priority 3 – Sibling directory fallback** *(automatic)* + Place `amlnn-toolkit` as a sibling to `amlnn-model-playground`: + ```bash + git clone git@github.com:Amlogic-NN/amlnn-toolkit.git ../amlnn-toolkit + ``` + +**Prerequisites:** +- Android NDK (r25e recommended) +- `ANDROID_NDK_PATH` environment variable set + +**Build:** +```bash +# Build for arm64-v8a +cd examples/yoloworld/cpp +./build-android.sh -a arm64-v8a +``` + +The executable will be generated at `build/android/yolo_world_demo` (Note: executable name may vary, verify in build folder). + +#### 2. Run + +```bash +# Push executable to device +adb push build/android/yolo_world_demo /data/local/tmp/ +adb push model/yoloworld_int8_A311D2.adla /data/local/tmp/ +adb push test_image.jpg /data/local/tmp/ + +# Run on device +adb shell +cd /data/local/tmp +chmod +x yolo_world_demo +export LD_LIBRARY_PATH=/vendor/lib64 or (/vendor/lib) + +# Usage: ./yolo_world_demo +./yolo_world_demo yoloworld_int8_A311D2.adla test_image.jpg +``` + +**Note:** Replace `yoloworld_int8_A311D2.adla` with your actual model file path. + +### Python + +**Prerequisites:** +- Python 3.10 +- Required packages: `numpy`, `opencv-python`, `amlnnlite` + +**Install dependencies:** +```bash +pip install numpy opencv-python amlnnlite-1.0.0-cp310-cp310-linux_aarch64.whl +``` + +**Run on device:** +```bash +# Basic usage (process current directory) +python yoloworld.py --model-path ./yoloworld_int8_A311D2.adla + +# Specify image directory +python yoloworld.py --model-path ./yoloworld_int8_A311D2.adla --image-dir ./ +``` + +The script will automatically process all image files (`.jpg`, `.jpeg`, `.png`, `.bmp`) in the specified directory and save results to a `{model_name}_result` folder. + +## Results + +The program will print the detection count and detected objects for each processed image. The result image with bounding boxes will be saved to the specified output directory. + +You can pull the result image back to view it: +```bash +adb pull result.jpg. +``` +![alt text](result.jpg) + +The program detects objects from predefined classes (handbag, backpack, wallet, watch, necklace, bracelet, earrings, finger ring, sunglass, hat, shoes, belt, makeup palette, lipstick tube, car, truck, bicycle, motorcycle, phone, laptop, camera, wine bottle, stuffed toy) and draws bounding boxes with class labels on the result images. diff --git a/examples/yoloworld/cpp/build-android.sh b/examples/yoloworld/cpp/build-android.sh index c3844bc..437c2cb 100755 --- a/examples/yoloworld/cpp/build-android.sh +++ b/examples/yoloworld/cpp/build-android.sh @@ -65,7 +65,8 @@ echo "BUILD_DIR: ${BUILD_DIR}" mkdir -p ${BUILD_DIR} cd ${BUILD_DIR} -cmake ../../src \ +cmake -Wno-dev ../../src \ + -DAMLNN_HOME=${AMLNN_HOME:-} \ -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_PATH}/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=${TARGET_ABI} \ -DANDROID_PLATFORM=android-24 \ diff --git a/examples/yoloworld/cpp/src/CMakeLists.txt b/examples/yoloworld/cpp/src/CMakeLists.txt index 3712bfd..99ffda2 100755 --- a/examples/yoloworld/cpp/src/CMakeLists.txt +++ b/examples/yoloworld/cpp/src/CMakeLists.txt @@ -1,45 +1,35 @@ -cmake_minimum_required(VERSION 3.5) -project(yolo_world_demo) - -set(CMAKE_CXX_STANDARD 17) - -# Set NNSDK path -if(NOT DEFINED NNSDK_DIR) - set(NNSDK_DIR "${CMAKE_SOURCE_DIR}/../../../../../amlnn-toolkit/nn_runtime/nnsdk") -endif() -set(NNSDK_ROOT "${NNSDK_DIR}") -message(STATUS "NNSDK_ROOT: ${NNSDK_ROOT}") - -include_directories(${NNSDK_ROOT}/include) -include_directories(${CMAKE_SOURCE_DIR}/../../../../common) - -# Set 3rdparty path -set(3RDPARTY_DIR "${CMAKE_SOURCE_DIR}/../../../../dependency") - -if(CMAKE_SYSTEM_NAME STREQUAL "Android") - if (ANDROID_ABI STREQUAL "arm64-v8a") - link_directories(${NNSDK_ROOT}/android/arm64-v8a) - else() - link_directories(${NNSDK_ROOT}/android/armeabi-v7a) - endif() - # Android needs log - link_libraries(log) -elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") - link_directories(${NNSDK_ROOT}/linux/yocto/aarch64-poky-linux) -endif() - -# Find OpenCV -find_package(OpenCV REQUIRED) -include_directories(${OpenCV_INCLUDE_DIRS}) - -add_executable(yolo_world_demo - main.cpp - postprocess.cpp - postprocess.h - ${CMAKE_SOURCE_DIR}/../../../../common/model_loader.cpp -) - -target_link_libraries(yolo_world_demo - ${OpenCV_LIBS} - nnsdk -) +cmake_minimum_required(VERSION 3.10...3.27) +project(yolo_world_demo) + +set(CMAKE_CXX_STANDARD 17) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../../../../cmake") +find_package(AMLNN REQUIRED) +include_directories(${AMLNN_INCLUDE_DIR}) +link_directories(${AMLNN_LIBRARY_DIR}) + +include_directories(${CMAKE_SOURCE_DIR}/../../../../common) + +# Set 3rdparty path +set(3RDPARTY_DIR "${CMAKE_SOURCE_DIR}/../../../../dependency") + +if(CMAKE_SYSTEM_NAME STREQUAL "Android") + # Android needs log + link_libraries(log) +endif() + +# Find OpenCV +find_package(OpenCV REQUIRED) +include_directories(${OpenCV_INCLUDE_DIRS}) + +add_executable(yolo_world_demo + main.cpp + postprocess.cpp + postprocess.h + ${CMAKE_SOURCE_DIR}/../../../../common/model_loader.cpp +) + +target_link_libraries(yolo_world_demo + ${OpenCV_LIBS} + ${AMLNN_LIBRARY} +) diff --git a/examples/yolox/cpp/build-android.sh b/examples/yolox/cpp/build-android.sh index 11d1a5d..4724df2 100755 --- a/examples/yolox/cpp/build-android.sh +++ b/examples/yolox/cpp/build-android.sh @@ -65,7 +65,8 @@ echo "BUILD_DIR: ${BUILD_DIR}" mkdir -p ${BUILD_DIR} cd ${BUILD_DIR} -cmake ../../src \ +cmake -Wno-dev ../../src \ + -DAMLNN_HOME=${AMLNN_HOME:-} \ -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_PATH}/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=${TARGET_ABI} \ -DANDROID_PLATFORM=android-24 \ diff --git a/examples/yolox/cpp/src/CMakeLists.txt b/examples/yolox/cpp/src/CMakeLists.txt index 507c038..b8b1901 100755 --- a/examples/yolox/cpp/src/CMakeLists.txt +++ b/examples/yolox/cpp/src/CMakeLists.txt @@ -1,31 +1,21 @@ -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.10...3.27) project(yolo11_demo) set(CMAKE_CXX_STANDARD 17) -# Set NNSDK path -if(NOT DEFINED NNSDK_DIR) - set(NNSDK_DIR "${CMAKE_SOURCE_DIR}/../../../../../amlnn-toolkit/nn_runtime/nnsdk") -endif() -set(NNSDK_ROOT "${NNSDK_DIR}") -message(STATUS "NNSDK_ROOT: ${NNSDK_ROOT}") +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../../../../cmake") +find_package(AMLNN REQUIRED) +include_directories(${AMLNN_INCLUDE_DIR}) +link_directories(${AMLNN_LIBRARY_DIR}) -include_directories(${NNSDK_ROOT}/include) include_directories(${CMAKE_SOURCE_DIR}/../../../../common) # Set dependency path set(3RDPARTY_DIR "${CMAKE_SOURCE_DIR}/../../../../dependency") if(CMAKE_SYSTEM_NAME STREQUAL "Android") - if (ANDROID_ABI STREQUAL "arm64-v8a") - link_directories(${NNSDK_ROOT}/android/arm64-v8a) - else() - link_directories(${NNSDK_ROOT}/android/armeabi-v7a) - endif() # Android needs log link_libraries(log) -elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") - link_directories(${NNSDK_ROOT}/linux/yocto/aarch64-poky-linux) endif() # Find OpenCV @@ -33,7 +23,6 @@ message(STATUS "OpenCV_DIR: ${OpenCV_DIR}") find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) - add_executable(yolox_demo main.cpp postprocess.cpp @@ -42,5 +31,5 @@ add_executable(yolox_demo target_link_libraries(yolox_demo ${OpenCV_LIBS} - nnsdk + ${AMLNN_LIBRARY} ) \ No newline at end of file