diff options
author | Éanna Ó Catháin <eanna.ocathain@arm.com> | 2020-09-14 17:36:49 +0100 |
---|---|---|
committer | Jim Flynn <jim.flynn@arm.com> | 2020-09-14 18:40:01 +0000 |
commit | 919c14ef132986aa1514b2070ce6d19b5579a6ab (patch) | |
tree | 5c281e02a083768f65871cb861ab9b32ac7d8767 /samples/ObjectDetection/cmake | |
parent | 589e3e81a86c83456580e112978bf7a0ed5f43ac (diff) | |
download | armnn-919c14ef132986aa1514b2070ce6d19b5579a6ab.tar.gz |
MLECO-929 Add Object Detection sample application using the public ArmNN C++ API
Change-Id: I14aa1b4b726212cffbefd6687203f93f936fa872
Signed-off-by: Éanna Ó Catháin <eanna.ocathain@arm.com>
Diffstat (limited to 'samples/ObjectDetection/cmake')
-rw-r--r-- | samples/ObjectDetection/cmake/aarch64-toolchain.cmake | 20 | ||||
-rw-r--r-- | samples/ObjectDetection/cmake/arm-linux-gnueabihf-toolchain.cmake | 20 | ||||
-rw-r--r-- | samples/ObjectDetection/cmake/find_armnn.cmake | 35 | ||||
-rw-r--r-- | samples/ObjectDetection/cmake/find_catch.cmake | 16 | ||||
-rw-r--r-- | samples/ObjectDetection/cmake/find_opencv.cmake | 204 | ||||
-rw-r--r-- | samples/ObjectDetection/cmake/unit_tests.cmake | 65 |
6 files changed, 360 insertions, 0 deletions
diff --git a/samples/ObjectDetection/cmake/aarch64-toolchain.cmake b/samples/ObjectDetection/cmake/aarch64-toolchain.cmake new file mode 100644 index 0000000000..bdd02f88c0 --- /dev/null +++ b/samples/ObjectDetection/cmake/aarch64-toolchain.cmake @@ -0,0 +1,20 @@ +# Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +# SPDX-License-Identifier: MIT + +# specify the cross compiler +set(GNU_MACHINE "aarch64-linux-gnu") +set(CROSS_PREFIX "aarch64-linux-gnu-") + +set(CMAKE_C_COMPILER ${CROSS_PREFIX}gcc) +set(CMAKE_CXX_COMPILER ${CROSS_PREFIX}g++) +set(CMAKE_AR ${CROSS_PREFIX}ar) +set(CMAKE_STRIP ${CROSS_PREFIX}strip) +set(CMAKE_LINKER ${CROSS_PREFIX}ld) + +set(CMAKE_CROSSCOMPILING true) +set(CMAKE_SYSTEM_NAME Linux) + +set(CMAKE_SYSTEM_PROCESSOR aarch64) + +set(OPENCV_EXTRA_ARGS "-DENABLE_NEON=ON" + "-DCMAKE_TOOLCHAIN_FILE=platforms/linux/aarch64-gnu.toolchain.cmake")
\ No newline at end of file diff --git a/samples/ObjectDetection/cmake/arm-linux-gnueabihf-toolchain.cmake b/samples/ObjectDetection/cmake/arm-linux-gnueabihf-toolchain.cmake new file mode 100644 index 0000000000..f66b964c35 --- /dev/null +++ b/samples/ObjectDetection/cmake/arm-linux-gnueabihf-toolchain.cmake @@ -0,0 +1,20 @@ +# Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +# SPDX-License-Identifier: MIT + +# specify the cross compiler +set(GNU_MACHINE "arm-linux-gnueabihf") +set(CROSS_PREFIX "arm-linux-gnueabihf-") + +set(CMAKE_C_COMPILER ${CROSS_PREFIX}gcc) +set(CMAKE_CXX_COMPILER ${CROSS_PREFIX}g++) +set(CMAKE_AR ${CROSS_PREFIX}ar) +set(CMAKE_STRIP ${CROSS_PREFIX}strip) +set(CMAKE_LINKER ${CROSS_PREFIX}ld) + +set(CMAKE_CROSSCOMPILING true) +set(CMAKE_SYSTEM_NAME Linux) + +set(CMAKE_SYSTEM_PROCESSOR arm) + +set(OPENCV_EXTRA_ARGS "-DENABLE_NEON=ON" + "-DCMAKE_TOOLCHAIN_FILE=platforms/linux/arm.toolchain.cmake")
\ No newline at end of file diff --git a/samples/ObjectDetection/cmake/find_armnn.cmake b/samples/ObjectDetection/cmake/find_armnn.cmake new file mode 100644 index 0000000000..289e9127f6 --- /dev/null +++ b/samples/ObjectDetection/cmake/find_armnn.cmake @@ -0,0 +1,35 @@ +# Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +# SPDX-License-Identifier: MIT +# Search for ArmNN built libraries in user-provided path first, then current repository, then system + +set(ARMNN_LIB_NAMES "libarmnn.so" + "libarmnnTfLiteParser.so") + +set(ARMNN_LIBS "") + +get_filename_component(PARENT_DIR ${PROJECT_SOURCE_DIR} DIRECTORY) +get_filename_component(REPO_DIR ${PARENT_DIR} DIRECTORY) + +foreach(armnn_lib ${ARMNN_LIB_NAMES}) + find_library(ARMNN_${armnn_lib} + NAMES + ${armnn_lib} + HINTS + ${ARMNN_LIB_DIR} ${REPO_DIR} + PATHS + ${ARMNN_LIB_DIR} ${REPO_DIR} + PATH_SUFFIXES + "lib" + "lib64") + if(ARMNN_${armnn_lib}) + message("Found library ${ARMNN_${armnn_lib}}") + list(APPEND ARMNN_LIBS ${ARMNN_${armnn_lib}}) + get_filename_component(LIB_DIR ${ARMNN_${armnn_lib}} DIRECTORY) + get_filename_component(LIB_PARENT_DIR ${LIB_DIR} DIRECTORY) + set(ARMNN_INCLUDE_DIR ${LIB_PARENT_DIR}/include) + endif() +endforeach() + +if(NOT ARMNN_LIBS) + message(FATAL_ERROR "Could not find ArmNN libraries ${ARMNN_LIB_NAMES}") +endif() diff --git a/samples/ObjectDetection/cmake/find_catch.cmake b/samples/ObjectDetection/cmake/find_catch.cmake new file mode 100644 index 0000000000..584b8073bd --- /dev/null +++ b/samples/ObjectDetection/cmake/find_catch.cmake @@ -0,0 +1,16 @@ +# Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +# SPDX-License-Identifier: MIT + +#Test TPIP +set(TEST_TPIP ${DEPENDENCIES_DIR}/test) +file(MAKE_DIRECTORY ${TEST_TPIP}) +set(TEST_TPIP_INCLUDE ${TEST_TPIP}/include) +file(MAKE_DIRECTORY ${TEST_TPIP_INCLUDE}) + +ExternalProject_Add(catch2-headers + URL https://github.com/catchorg/Catch2/releases/download/v2.11.1/catch.hpp + DOWNLOAD_NO_EXTRACT 1 + CONFIGURE_COMMAND "" + BUILD_COMMAND ${CMAKE_COMMAND} -E copy <DOWNLOAD_DIR>/catch.hpp ${TEST_TPIP_INCLUDE} + INSTALL_COMMAND "" + )
\ No newline at end of file diff --git a/samples/ObjectDetection/cmake/find_opencv.cmake b/samples/ObjectDetection/cmake/find_opencv.cmake new file mode 100644 index 0000000000..4d26953d74 --- /dev/null +++ b/samples/ObjectDetection/cmake/find_opencv.cmake @@ -0,0 +1,204 @@ +# Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +# SPDX-License-Identifier: MIT + +set(OPENCV_VERSION 4.0.0) +set(FFMPEG_VERSION 4.2.1) +set(LIBX264_VERSION stable) + +set(OPENCV_LIB OpenCV${OPENCV_VERSION}) +set(FFMPEG_LIB ffmpeg${FFMPEG_VERSION}) +set(X264_LIB x264${LIBX264_VERSION}) + +set(OPENCV_NAMES + libopencv_core.so.${OPENCV_VERSION} + libopencv_imgproc.so.${OPENCV_VERSION} + libopencv_imgcodecs.so.${OPENCV_VERSION} + libopencv_videoio.so.${OPENCV_VERSION} + libopencv_video.so.${OPENCV_VERSION} + libopencv_highgui.so.${OPENCV_VERSION}) + +set(OPENCV_LIBS) +set(FFMPEG_LIBS) + +foreach(opencv_lib ${OPENCV_NAMES}) + find_library(OPENCV_${opencv_lib} + NAMES + ${opencv_lib} + HINTS + ${OPENCV_LIB_DIR} + PATHS + ${OPENCV_LIB_DIR} + PATH_SUFFIXES + "lib" + "lib64") + if(OPENCV_${opencv_lib}) + message("Found library ${OPENCV_${opencv_lib}}") + list(APPEND OPENCV_LIBS ${OPENCV_${opencv_lib}}) + get_filename_component(OPENCV_LIB_DIR ${OPENCV_${opencv_lib}} DIRECTORY) + get_filename_component(OPENCV_ROOT_DIR ${OPENCV_LIB_DIR} DIRECTORY) + set(OPENCV_INCLUDE_DIR ${OPENCV_ROOT_DIR}/include/opencv4) + endif() +endforeach() + +if(OPENCV_LIBS) + message("OpenCV libraries found") + set(OPENCV_LIBS_FOUND TRUE) +else() + set(OPENCV_ROOT_DIR ${DEPENDENCIES_DIR}/opencv) + set(OPENCV_DEPENDENCIES_ARGS) + set(OPENCV_EXTRA_LINKER_ARGS) + set(OPENCV_PKGCONFIG) + + if(CMAKE_CROSSCOMPILING) + set(FFMPEG_ROOT_DIR ${DEPENDENCIES_DIR}/ffmpeg) + set(LIBX264_ROOT_DIR ${DEPENDENCIES_DIR}/x264) + + if (CMAKE_BUILD_TYPE STREQUAL Debug) + set(CONFIGURE_DEBUG --enable-debug) + set(OPENCV_DEBUG "-DBUILD_WITH_DEBUG_INFO=ON") + endif() + + + ExternalProject_Add(${X264_LIB} + URL "https://code.videolan.org/videolan/x264/-/archive/${LIBX264_VERSION}/x264-${LIBX264_VERSION}.tar.gz" + URL_HASH MD5=07eae2352f6ba201999be45fece0c26c + DOWNLOAD_DIR ${LIBX264_ROOT_DIR} + PREFIX ${LIBX264_ROOT_DIR} + CONFIGURE_COMMAND <SOURCE_DIR>/configure + --host=${GNU_MACHINE} + --enable-static + --enable-shared + --cross-prefix=${CROSS_PREFIX} + --prefix=${CMAKE_BINARY_DIR} + --extra-ldflags=-static-libstdc++ + --extra-cflags=-fPIC + ${CONFIGURE_DEBUG} + INSTALL_DIR ${CMAKE_BINARY_DIR} + BUILD_COMMAND $(MAKE) + INSTALL_COMMAND $(MAKE) install + ) + + set(FFMPEG_Config + --enable-shared + --enable-cross-compile + --cross-prefix=${CROSS_PREFIX} + --arch=${CMAKE_SYSTEM_PROCESSOR} + --target-os=linux + --prefix=${CMAKE_BINARY_DIR} + --enable-gpl + --enable-nonfree + --enable-libx264 + --extra-cflags=-I${CMAKE_BINARY_DIR}/include + --extra-cflags=-fPIC + --extra-ldflags=-L${CMAKE_BINARY_DIR}/lib + --extra-libs=-ldl + --extra-libs=-static-libstdc++ + ) + + ExternalProject_Add(${FFMPEG_LIB} + URL "https://github.com/FFmpeg/FFmpeg/archive/n${FFMPEG_VERSION}.tar.gz" + URL_HASH MD5=05792c611d1e3ebdf2c7003ff4467390 + DOWNLOAD_DIR ${FFMPEG_ROOT_DIR} + PREFIX ${FFMPEG_ROOT_DIR} + CONFIGURE_COMMAND <SOURCE_DIR>/configure ${FFMPEG_Config} ${CONFIGURE_DEBUG} + INSTALL_DIR ${CMAKE_BINARY_DIR} + BUILD_COMMAND $(MAKE) VERBOSE=1 + INSTALL_COMMAND $(MAKE) install + ) + + set(OPENCV_DEPENDENCIES_ARGS "-static-libstdc++ -Wl,-rpath,${CMAKE_BINARY_DIR}/lib") + set(OPENCV_EXTRA_LINKER_ARGS "-DOPENCV_EXTRA_EXE_LINKER_FLAGS=${OPENCV_DEPENDENCIES_ARGS}") + + set(OPENCV_PKGCONFIG "PKG_CONFIG_LIBDIR=${CMAKE_BINARY_DIR}/lib/pkgconfig") + + set(FFMPEG_NAMES + libavcodec.so + libavformat.so + libavutil.so + libswscale.so + ) + + foreach(ffmpeg_lib ${FFMPEG_NAMES}) + add_library(FFMPEG_${ffmpeg_lib} SHARED IMPORTED) + set_target_properties(FFMPEG_${ffmpeg_lib} PROPERTIES IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/lib/${ffmpeg_lib}) + list(APPEND OPENCV_LIBS FFMPEG_${ffmpeg_lib}) + endforeach() + + add_library(X264_lib264.so SHARED IMPORTED) + set_target_properties(X264_lib264.so PROPERTIES IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/lib/libx264.so) + list(APPEND OPENCV_LIBS X264_lib264.so) + endif() + + set(OPENCV_CMAKE_ARGS + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_C_FLAGS=-fPIC + -DCMAKE_CXX_FLAGS=-fPIC + -DWITH_GTK=OFF + -DWITH_JPEG=ON + -DWITH_IPP=OFF + -DBUILD_opencv_java_bindings_generator=OFF + -DBUILD_opencv_ml=OFF + -DBUILD_opencv_objdetect=OFF + -DBUILD_opencv_photo=OFF + -DBUILD_opencv_python_bindings_generator=OFF + -DBUILD_opencv_stitching=OFF + -DBUILD_opencv_gapi=OFF + -DBUILD_opencv_features2d=OFF + -DBUILD_opencv_dnn=OFF + -DBUILD_opencv_flann=OFF + -DBUILD_opencv_calib3d=OFF + -DBUILD_opencv_python2=OFF + -DBUILD_opencv_python3=OFF + -DBUILD_opencv_java=OFF + -DBUILD_opencv_js=OFF + -DBUILD_opencv_ts=OFF + -DBUILD_JPEG=ON + -DBUILD_JPEG_TURBO_DISABLE=ON + -DBUILD_PNG=ON + -DBUILD_TIFF=ON + -DZLIB_FOUND=OFF + -DBUILD_ZLIB=ON + -DBUILD_PERF_TESTS=OFF + -DBUILD_TESTS=OFF + -DBUILD_DOCS=OFF + -DBUILD_opencv_apps=OFF + -DBUILD_EXAMPLES=OFF + -DWITH_V4L=ON + -DWITH_LIBV4L=OFF + -DWITH_FFMPEG=ON + -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR} + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_INSTALL_RPATH=\$ORIGIN:\$ORIGIN/lib:\$ORIGIN/../lib + -DCMAKE_SHARED_LINKER_FLAGS=-static-libstdc++ + ${OPENCV_DEBUG} + ) + + ExternalProject_Add(${OPENCV_LIB} + URL "https://codeload.github.com/opencv/opencv/tar.gz/${OPENCV_VERSION}" + URL_HASH MD5=f051c1ff7b327b60123d71b53801b316 + DOWNLOAD_DIR ${OPENCV_ROOT_DIR} + PREFIX ${OPENCV_ROOT_DIR} + CONFIGURE_COMMAND ${OPENCV_PKGCONFIG} + ${CMAKE_COMMAND} ${OPENCV_CMAKE_ARGS} ${OPENCV_EXTRA_ARGS} + ${OPENCV_EXTRA_LINKER_ARGS} ${OPENCV_ROOT_DIR}/src/${OPENCV_LIB} + INSTALL_DIR ${CMAKE_BINARY_DIR} + BUILD_COMMAND $(MAKE) + INSTALL_COMMAND $(MAKE) install + ) + + if(CMAKE_CROSSCOMPILING) + ExternalProject_Add_StepDependencies(${FFMPEG_LIB} build ${X264_LIB}) + ExternalProject_Add_StepDependencies(${OPENCV_LIB} build ${FFMPEG_LIB}) + endif() + + set(OPENCV_INCLUDE_DIR ${CMAKE_BINARY_DIR}/include/opencv4) + set(OPENCV_LIB_DIR ${CMAKE_BINARY_DIR}/lib) + + foreach(opencv_lib ${OPENCV_NAMES}) + add_library(OPENCV_${opencv_lib} SHARED IMPORTED) + set_target_properties(OPENCV_${opencv_lib} PROPERTIES IMPORTED_LOCATION ${OPENCV_LIB_DIR}/${opencv_lib}) + list(APPEND OPENCV_LIBS OPENCV_${opencv_lib}) + endforeach() + +endif()
\ No newline at end of file diff --git a/samples/ObjectDetection/cmake/unit_tests.cmake b/samples/ObjectDetection/cmake/unit_tests.cmake new file mode 100644 index 0000000000..dcfa512893 --- /dev/null +++ b/samples/ObjectDetection/cmake/unit_tests.cmake @@ -0,0 +1,65 @@ +# Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +# SPDX-License-Identifier: MIT + +set(TEST_RESOURCES_DIR ${CMAKE_SOURCE_DIR}/test/resources) +add_definitions (-DTEST_RESOURCE_DIR="${TEST_RESOURCES_DIR}") +set(TEST_TARGET_NAME "${CMAKE_PROJECT_NAME}-tests") + +file(GLOB TEST_SOURCES "test/*") + +include(cmake/find_catch.cmake) + +file(DOWNLOAD "https://storage.googleapis.com/download.tensorflow.org/models/tflite/coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip" + ${CMAKE_CURRENT_SOURCE_DIR}/test/resources/models.zip SHOW_PROGRESS) + +# Extract +execute_process( + COMMAND ${CMAKE_COMMAND} -E tar xf models.zip + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/resources/ + RESULT_VARIABLE return_code +) + +ExternalProject_Add(basketball-image + URL https://raw.githubusercontent.com/opencv/opencv/4.0.0/samples/data/basketball1.png + DOWNLOAD_NO_EXTRACT 1 + CONFIGURE_COMMAND "" + BUILD_COMMAND ${CMAKE_COMMAND} -E copy <DOWNLOAD_DIR>/basketball1.png ${CMAKE_CURRENT_SOURCE_DIR}/test/resources + INSTALL_COMMAND "" +) + +ExternalProject_Add(messi + URL https://raw.githubusercontent.com/opencv/opencv/4.0.0/samples/data/messi5.jpg + DOWNLOAD_NO_EXTRACT 1 + CONFIGURE_COMMAND "" + BUILD_COMMAND ${CMAKE_COMMAND} -E copy <DOWNLOAD_DIR>/messi5.jpg ${CMAKE_CURRENT_SOURCE_DIR}/test/resources + INSTALL_COMMAND "" + ) + +ExternalProject_Add(vtest + URL https://raw.githubusercontent.com/opencv/opencv/4.0.0/samples/data/Megamind.avi + DOWNLOAD_NO_EXTRACT 1 + CONFIGURE_COMMAND "" + BUILD_COMMAND ${CMAKE_COMMAND} -E copy <DOWNLOAD_DIR>/Megamind.avi ${CMAKE_CURRENT_SOURCE_DIR}/test/resources + INSTALL_COMMAND "" + ) + +add_executable("${TEST_TARGET_NAME}" ${SOURCES} ${TEST_SOURCES}) + +add_dependencies( + "${TEST_TARGET_NAME}" + "catch2-headers" + "vtest" + "messi" + "basketball-image" +) + +if (NOT OPENCV_LIBS_FOUND) + message("Building OpenCV libs") + add_dependencies("${TEST_TARGET_NAME}" "${OPENCV_LIB}") +endif() + +target_include_directories("${TEST_TARGET_NAME}" PUBLIC ${TEST_TPIP_INCLUDE} + ${ARMNN_INCLUDE_DIR} + ${OPENCV_INCLUDE_DIR} ${DEPENDENCIES_DIR} ${TEST_RESOURCES_DIR}) + +target_link_libraries("${TEST_TARGET_NAME}" PUBLIC ${ARMNN_LIBS} ${OPENCV_LIBS} ${FFMPEG_LIBS})
\ No newline at end of file |