aboutsummaryrefslogtreecommitdiff
path: root/samples/ObjectDetection/cmake
diff options
context:
space:
mode:
authorÉanna Ó Catháin <eanna.ocathain@arm.com>2020-09-14 17:36:49 +0100
committerJim Flynn <jim.flynn@arm.com>2020-09-14 18:40:01 +0000
commit919c14ef132986aa1514b2070ce6d19b5579a6ab (patch)
tree5c281e02a083768f65871cb861ab9b32ac7d8767 /samples/ObjectDetection/cmake
parent589e3e81a86c83456580e112978bf7a0ed5f43ac (diff)
downloadarmnn-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.cmake20
-rw-r--r--samples/ObjectDetection/cmake/arm-linux-gnueabihf-toolchain.cmake20
-rw-r--r--samples/ObjectDetection/cmake/find_armnn.cmake35
-rw-r--r--samples/ObjectDetection/cmake/find_catch.cmake16
-rw-r--r--samples/ObjectDetection/cmake/find_opencv.cmake204
-rw-r--r--samples/ObjectDetection/cmake/unit_tests.cmake65
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