From 00381a379f3e0ef3594a52913ac5bf17cdf13041 Mon Sep 17 00:00:00 2001 From: wangguokun Date: Wed, 31 Jul 2024 19:22:24 +0800 Subject: [PATCH] app/object-detect-micro: port app object detection micro to tenonos Signed-off-by: wangguokun --- .gitignore | 13 +- Config.uk | 19 +++ Makefile | 12 ++ Makefile.uk | 64 +++++++ README.md | 135 +++++++++++++++ defconfigs/qemu-arm64-helloworld | 18 ++ defconfigs/qemu-arm64-persondetection | 23 +++ examples/hello_world/hello_world_test.cc | 156 ++++++++++++++++++ .../models/hello_world_float_model_data.cc | 5 + .../models/hello_world_float_model_data.h | 4 + .../models/hello_world_int8_model_data.cc | 5 + .../models/hello_world_int8_model_data.h | 4 + .../sample_images/sample_images/README.md | 17 ++ .../sample_images/sample_images/image0 | 4 + .../sample_images/sample_images/image1 | Bin 0 -> 9216 bytes .../sample_images/sample_images/image2 | 1 + .../sample_images/sample_images/image3 | 3 + .../sample_images/sample_images/image4 | Bin 0 -> 9216 bytes .../sample_images/sample_images/image5 | Bin 0 -> 9216 bytes .../sample_images/sample_images/image6 | Bin 0 -> 9216 bytes .../sample_images/sample_images/image7 | Bin 0 -> 9216 bytes .../sample_images/sample_images/image8 | 1 + .../sample_images/sample_images/image9 | Bin 0 -> 9216 bytes .../src/detection_responder.cc | 26 +++ .../src/detection_responder.h | 32 ++++ .../person_detection/src/image_provider.cc | 57 +++++++ .../person_detection/src/image_provider.h | 38 +++++ examples/person_detection/src/main.cc | 27 +++ .../person_detection/src/main_functions.cc | 115 +++++++++++++ .../person_detection/src/main_functions.h | 37 +++++ .../person_detection/src/model_settings.cc | 21 +++ .../person_detection/src/model_settings.h | 35 ++++ main.c | 8 + scripts/setup.sh | 14 ++ 34 files changed, 885 insertions(+), 9 deletions(-) create mode 100644 Config.uk create mode 100644 Makefile create mode 100644 Makefile.uk create mode 100644 README.md create mode 100644 defconfigs/qemu-arm64-helloworld create mode 100644 defconfigs/qemu-arm64-persondetection create mode 100644 examples/hello_world/hello_world_test.cc create mode 100644 examples/hello_world/models/hello_world_float_model_data.cc create mode 100644 examples/hello_world/models/hello_world_float_model_data.h create mode 100644 examples/hello_world/models/hello_world_int8_model_data.cc create mode 100644 examples/hello_world/models/hello_world_int8_model_data.h create mode 100644 examples/person_detection/sample_images/sample_images/README.md create mode 100644 examples/person_detection/sample_images/sample_images/image0 create mode 100644 examples/person_detection/sample_images/sample_images/image1 create mode 100644 examples/person_detection/sample_images/sample_images/image2 create mode 100644 examples/person_detection/sample_images/sample_images/image3 create mode 100644 examples/person_detection/sample_images/sample_images/image4 create mode 100644 examples/person_detection/sample_images/sample_images/image5 create mode 100644 examples/person_detection/sample_images/sample_images/image6 create mode 100644 examples/person_detection/sample_images/sample_images/image7 create mode 100644 examples/person_detection/sample_images/sample_images/image8 create mode 100644 examples/person_detection/sample_images/sample_images/image9 create mode 100644 examples/person_detection/src/detection_responder.cc create mode 100644 examples/person_detection/src/detection_responder.h create mode 100644 examples/person_detection/src/image_provider.cc create mode 100644 examples/person_detection/src/image_provider.h create mode 100644 examples/person_detection/src/main.cc create mode 100644 examples/person_detection/src/main_functions.cc create mode 100644 examples/person_detection/src/main_functions.h create mode 100644 examples/person_detection/src/model_settings.cc create mode 100644 examples/person_detection/src/model_settings.h create mode 100644 main.c create mode 100644 scripts/setup.sh diff --git a/.gitignore b/.gitignore index 85813e1..76660e4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,4 @@ -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.code-workspace - -# Local History for Visual Studio Code -.history/ +/workdir/ +/.config +/.vscode +.config* diff --git a/Config.uk b/Config.uk new file mode 100644 index 0000000..00321e3 --- /dev/null +++ b/Config.uk @@ -0,0 +1,19 @@ +choice APPOBJECTDETECTIONMICRO_DEFAULT_ENTRY + prompt "set app entry" + default APPOBJECTDETECTIONMICRO_DEMO_HELLOWORLD + + config APPOBJECTDETECTIONMICRO_CUSTOM_MAIN + bool "app object detection custom entry" + + config APPOBJECTDETECTIONMICRO_DEMO_HELLOWORLD + bool "use library's helloworld demo main function" + + config APPOBJECTDETECTIONMICRO_DEMO_PERSON_DETECTION + bool "run library's person detection demo" + + if APPOBJECTDETECTIONMICRO_DEMO_PERSON_DETECTION + config APPOBJECTDETECTIONMICRO_DEMO_PERSON_DETECTION_IMAGE_DIR + string "static image root directory" + default "/" + endif +endchoice diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9b4a079 --- /dev/null +++ b/Makefile @@ -0,0 +1,12 @@ +UK_ROOT ?= $(PWD)/workdir/tenon +UK_LIBS ?= $(PWD)/workdir/libs +UK_BUILD ?= $(PWD)/workdir/build + +all: + @$(MAKE) -C $(UK_ROOT) A=$(PWD) L=$(UK_LIBS) O=$(UK_BUILD) + +$(MAKECMDGOALS): + @$(MAKE) -C $(UK_ROOT) A=$(PWD) L=$(UK_LIBS) O=$(UK_BUILD) $(MAKECMDGOALS) + +initrd-img: + (cd examples/person_detection/sample_images/sample_images; find . -depth -print | cpio -H newc -o > $(PWD)/workdir/build/initrd.img) \ No newline at end of file diff --git a/Makefile.uk b/Makefile.uk new file mode 100644 index 0000000..3a6585f --- /dev/null +++ b/Makefile.uk @@ -0,0 +1,64 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright 2024 The TenonOS Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +################################################################################ +# App registration +################################################################################ +$(eval $(call addlib,appobjectdetectionmicro)) + +################################################################################ +# APP flags +################################################################################ +TFLITE_MICRO_FLAG = \ + -DTF_LITE_STATIC_MEMORY \ + -DTF_LITE_DISABLE_X86_NEON + +ifdef CONFIG_ARCH_ARM_64 +GCC_INSTALLDIR_FLAGS := -idirafter $(shell LC_ALL=C $(CC) -v 2>&1 | \ + $(SED) -e '/^COLLECT_LTO_WRAPPER=\(.*\)\/lto-wrapper/!d' -e 's//\1/')/include +TFLITE_MICRO_FLAG += $(GCC_INSTALLDIR_FLAGS) +endif + +################################################################################ +# App entry +################################################################################ +ifeq ($(CONFIG_APPOBJECTDETECTIONMICRO_CUSTOM_MAIN),y) +APPOBJECTDETECTIONMICRO_SRCS-y += $(APPOBJECTDETECTIONMICRO_BASE)/main.c +endif + +ifeq ($(CONFIG_APPOBJECTDETECTIONMICRO_DEMO_HELLOWORLD), y) +DEMO_HELLOWORLD_BASE=$(APPOBJECTDETECTIONMICRO_BASE)/examples/hello_world +APPOBJECTDETECTIONMICRO_SRCS-$(CONFIG_APPOBJECTDETECTIONMICRO_DEMO_HELLOWORLD) += $(DEMO_HELLOWORLD_BASE)/hello_world_test.cc +APPOBJECTDETECTIONMICRO_SRCS-$(CONFIG_APPOBJECTDETECTIONMICRO_DEMO_HELLOWORLD) += $(DEMO_HELLOWORLD_BASE)/models/hello_world_float_model_data.cc +APPOBJECTDETECTIONMICRO_SRCS-$(CONFIG_APPOBJECTDETECTIONMICRO_DEMO_HELLOWORLD) += $(DEMO_HELLOWORLD_BASE)/models/hello_world_int8_model_data.cc + +CXXINCLUDES-$(CONFIG_APPOBJECTDETECTIONMICRO_DEMO_HELLOWORLD) += -I$(DEMO_HELLOWORLD_BASE)/ +CINCLUDES-$(CONFIG_APPOBJECTDETECTIONMICRO_DEMO_HELLOWORLD) += -I$(DEMO_HELLOWORLD_BASE)/ + +APPOBJECTDETECTIONMICRO_CFLAGS-y += $(TFLITE_MICRO_FLAG) +APPOBJECTDETECTIONMICRO_CXXFLAGS-y += $(TFLITE_MICRO_FLAG) +endif + +ifeq ($(CONFIG_APPOBJECTDETECTIONMICRO_DEMO_PERSON_DETECTION), y) +DEMO_PERSON_DETECTION_BASE=$(APPOBJECTDETECTIONMICRO_BASE)/examples/person_detection/src +APPOBJECTDETECTIONMICRO_SRCS-$(CONFIG_APPOBJECTDETECTIONMICRO_DEMO_PERSON_DETECTION) += $(wildcard $(DEMO_PERSON_DETECTION_BASE)/*.cc) +APPOBJECTDETECTIONMICRO_SRCS-$(CONFIG_APPOBJECTDETECTIONMICRO_DEMO_PERSON_DETECTION) := $(sort $(APPOBJECTDETECTIONMICRO_SRCS-$(CONFIG_APPOBJECTDETECTIONMICRO_DEMO_PERSON_DETECTION))) + +CXXINCLUDES-$(CONFIG_APPOBJECTDETECTIONMICRO_DEMO_PERSON_DETECTION) += -I$(DEMO_PERSON_DETECTION_BASE)/ +CINCLUDES-$(CONFIG_APPOBJECTDETECTIONMICRO_DEMO_PERSON_DETECTION) += -I$(DEMO_PERSON_DETECTION_BASE)/ + +APPOBJECTDETECTIONMICRO_CFLAGS-y += $(TFLITE_MICRO_FLAG) +APPOBJECTDETECTIONMICRO_CXXFLAGS-y += $(TFLITE_MICRO_FLAG) +endif diff --git a/README.md b/README.md new file mode 100644 index 0000000..709e941 --- /dev/null +++ b/README.md @@ -0,0 +1,135 @@ +# app object detection micro + +## 介绍 + +TensorFlow Lite for Microcontrollers 是 TensorFlow 微控制器轻量级解决方案,旨在在只有几千字节内存的微控制器和其他设备上运行机器学习模型。核心运行时仅占用 Arm Cortex M3 上的 16 KB,并且能运行许多基本模型。它不需要操作系统支持,任何标准的 C 或 C++ 库,也不需要动态内存分配。 + +为TenonOS移植后,提供运行物体识别模型的能力,对输入图片中的物体进行识别项目提供两个应用示例,分别为Hello World和人脸识别。 + +## 支持架构 + +- AArch64 +- 运行平台:qemu + +## 运行项目示例 + +下载应用 + +```powershell +git clone git@gitee.com:tenonos/app-object-detect-micro.git +cd app-object-detect-micro +``` + +拉取微库依赖 + +```powershell +sh scripts/setup.sh +``` + +### 示例场景 - HelloWorld + +构建 + +```powershell +make defconfig UK_DEFCONFIG=$PWD/defconfigs/qemu-arm64-helloworld +make +``` + +运行 + +```powershell +qemu-system-aarch64 -cpu cortex-a53 -machine virt -kernel workdir/build/app-object-detection-micro_qemu-arm64 -nographic +``` + +运行结果 + +```powershell + __ __ _ _ _______ ____ _____ + \ \ / / | | | | |__ __| / __ \ / ____| + \ \ /\ / /__| | ___ ___ _ __ ___ ___ | |_ ___ | | ___ _ __ ___ _ __ | | | | (___ + \ \/ \/ / _ \ |/ __/ _ \| '_ ` _ \ / _ \ | __/ _ \ | |/ _ \ '_ \ / _ \| '_ \| | | |\___ \ + \ /\ / __/ | (_| (_) | | | | | | __/ | || (_) | | | __/ | | | (_) | | | | |__| |____) | + \/ \/ \___|_|\___\___/|_| |_| |_|\___| \__\___/ |_|\___|_| |_|\___/|_| |_|\____/|_____/ + Powered by TenonOS (0.1.0~2b9cdc31-custom) + + +[ 0.045000] Info: [libukboot] Pre-init table at 0x404820a0 - 0x404820a0 +[ 0.046000] Info: [libukboot] Constructor table at 0x404820a0 - 0x404820b8 +[ 0.046000] Info: [libukboot] Environment variables: +[ 0.048000] Info: [libukboot] PATH=/bin +[ 0.048000] Info: [libukboot] Calling main(1, ['app-object-detection-micro']) +[ 0.048000] Info: [libtflitemicro] +[ 0.048000] Info: [libtflitemicro] "Unique Tag","Total ticks across all events with that tag." +[ 0.048000] Info: [libtflitemicro] FULLY_CONNECTED, 0 +[ 0.048000] Info: [libtflitemicro] "total number of ticks", 0 +[ 0.048000] Info: [libtflitemicro] +[ 0.048000] Info: [libtflitemicro] [RecordingMicroAllocator] Arena allocation total 2360 bytes +[ 0.048000] Info: [libtflitemicro] [RecordingMicroAllocator] Arena allocation head 136 bytes +[ 0.048000] Info: [libtflitemicro] [RecordingMicroAllocator] Arena allocation tail 2224 bytes +[ 0.048000] Info: [libtflitemicro] [RecordingMicroAllocator] 'TfLiteEvalTensor data' used 240 bytes with alignment overhead (requested 240 bytes for 10 allocations) +[ 0.048000] Info: [libtflitemicro] [RecordingMicroAllocator] 'Persistent TfLiteTensor data' used 128 bytes with alignment overhead (requested 128 bytes for 2 tensors) +[ 0.048000] Info: [libtflitemicro] [RecordingMicroAllocator] 'Persistent buffer data' used 1160 bytes with alignment overhead (requested 1100 bytes for 7 allocations) +[ 0.055000] Info: [libtflitemicro] [RecordingMicroAllocator] 'NodeAndRegistration struct' used 192 bytes with alignment overhead (requested 192 bytes for 3 NodeAndRegistration structs) +[ 0.055000] Info: [libtflitemicro] ~~~ALL TESTS PASSED~~~ +``` + +### 示例场景 - 人脸识别 + +人脸识别场景所需的测试数据(examples/person_detection/sample_images),图像是96*96的灰阶raw格式,无法直接查看 + +构建 + +```powershell +make defconfig UK_DEFCONFIG=$PWD/defconfigs/qemu-arm64-persondetection +make +``` + +打包待识别的图像 + +```powershell +make initrd-img +``` + +运行 + +```powershell +qemu-system-aarch64 -cpu cortex-a53 -machine virt -kernel workdir/build/app-object-detection-micro_qemu-arm64 -nographic -initrd workdir/build/initrd.img +``` + +运行结果 + +```powershell + __ __ _ _ _______ ____ _____ + \ \ / / | | | | |__ __| / __ \ / ____| + \ \ /\ / /__| | ___ ___ _ __ ___ ___ | |_ ___ | | ___ _ __ ___ _ __ | | | | (___ + \ \/ \/ / _ \ |/ __/ _ \| '_ ` _ \ / _ \ | __/ _ \ | |/ _ \ '_ \ / _ \| '_ \| | | |\___ \ + \ /\ / __/ | (_| (_) | | | | | | __/ | || (_) | | | __/ | | | (_) | | | | |__| |____) | + \/ \/ \___|_|\___\___/|_| |_| |_|\___| \__\___/ |_|\___|_| |_|\___/|_| |_|\____/|_____/ + Powered by TenonOS (0.1.0~2b9cdc31-custom) + + +[ 0.033000] Info: [libukboot] Pre-init table at 0x404840b0 - 0x404840b0 +[ 0.033000] Info: [libukboot] Constructor table at 0x404840b0 - 0x404840c8 +[ 0.033000] Info: [libukboot] Environment variables: +[ 0.033000] Info: [libukboot] PATH=/bin +[ 0.033000] Info: [libukboot] Calling main(1, ['app-object-detection-micro']) +[ 0.048000] Info: [libtflitemicro] Read image: //image0 +[ 0.337000] Info: [libtflitemicro] person score:95%, no person score 5% +[ 0.351000] Info: [libtflitemicro] Read image: //image1 +[ 0.612000] Info: [libtflitemicro] person score:35%, no person score 65% +[ 0.612000] Info: [libtflitemicro] Read image: //image2 +[ 0.892000] Info: [libtflitemicro] person score:95%, no person score 5% +[ 0.893000] Info: [libtflitemicro] Read image: //image3 +[ 1.211000] Info: [libtflitemicro] person score:76%, no person score 24% +[ 1.211000] Info: [libtflitemicro] Read image: //image4 +[ 1.456000] Info: [libtflitemicro] person score:93%, no person score 7% +[ 1.465000] Info: [libtflitemicro] Read image: //image5 +[ 1.734000] Info: [libtflitemicro] person score:11%, no person score 89% +[ 1.744000] Info: [libtflitemicro] Read image: //image6 +[ 1.967000] Info: [libtflitemicro] person score:88%, no person score 12% +[ 1.974000] Info: [libtflitemicro] Read image: //image7 +[ 2.244000] Info: [libtflitemicro] person score:12%, no person score 88% +[ 2.244000] Info: [libtflitemicro] Read image: //image8 +[ 2.566000] Info: [libtflitemicro] person score:95%, no person score 5% +[ 2.569000] Info: [libtflitemicro] Read image: //image9 +``` diff --git a/defconfigs/qemu-arm64-helloworld b/defconfigs/qemu-arm64-helloworld new file mode 100644 index 0000000..da5fab6 --- /dev/null +++ b/defconfigs/qemu-arm64-helloworld @@ -0,0 +1,18 @@ +CONFIG_ARCH_ARM_64=y +# CONFIG_ARM64_ERRATUM_858921 is not set +# CONFIG_ARM64_ERRATUM_835769 is not set +# CONFIG_ARM64_ERRATUM_843419 is not set +CONFIG_PLAT_KVM=y +CONFIG_STACK_SIZE_PAGE_ORDER=8 +CONFIG_LIBUKBUS=y +CONFIG_LIBUKSGLIST=y +CONFIG_LIBCXX=y +CONFIG_LIBCOMPILER_RT=y +CONFIG_LIBMUSL=y + +CONFIG_LIBTFLITEMICRO=y + +CONFIG_APPOBJECTDETECTIONMICRO_DEMO_HELLOWORLD=y + +CONFIG_LIBUKDEBUG_PRINTK_INFO=y +CONFIG_LIBUKDEBUG_PRINT_TIME=y diff --git a/defconfigs/qemu-arm64-persondetection b/defconfigs/qemu-arm64-persondetection new file mode 100644 index 0000000..02313ac --- /dev/null +++ b/defconfigs/qemu-arm64-persondetection @@ -0,0 +1,23 @@ +CONFIG_ARCH_ARM_64=y +# CONFIG_ARM64_ERRATUM_858921 is not set +# CONFIG_ARM64_ERRATUM_835769 is not set +# CONFIG_ARM64_ERRATUM_843419 is not set +CONFIG_PLAT_KVM=y +CONFIG_STACK_SIZE_PAGE_ORDER=8 +CONFIG_LIBUKBUS=y +CONFIG_LIBUKSGLIST=y +CONFIG_LIBCXX=y +CONFIG_LIBCOMPILER_RT=y +CONFIG_LIBMUSL=y +CONFIG_LIBTFLITEMICRO=y + +CONFIG_APPOBJECTDETECTIONMICRO_DEMO_PERSON_DETECTION=y + +CONFIG_LIBUKDEBUG_PRINTK_INFO=y +CONFIG_LIBUKDEBUG_PRINT_TIME=y + +CONFIG_LIBVFSCORE_AUTOMOUNT_ROOTFS=y +CONFIG_LIBVFSCORE_ROOTFS_INITRD=y +CONFIG_LIBVFSCORE_ROOTFS="initrd" + +CONFIG_ARM_GENERIC_TIMER=y diff --git a/examples/hello_world/hello_world_test.cc b/examples/hello_world/hello_world_test.cc new file mode 100644 index 0000000..0787b9d --- /dev/null +++ b/examples/hello_world/hello_world_test.cc @@ -0,0 +1,156 @@ +/* Copyright 2023 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include "tensorflow/lite/core/c/common.h" +#include "models/hello_world_float_model_data.h" +#include "models/hello_world_int8_model_data.h" +#include "tensorflow/lite/micro/micro_interpreter.h" +#include "tensorflow/lite/micro/micro_log.h" +#include "tensorflow/lite/micro/micro_mutable_op_resolver.h" +#include "tensorflow/lite/micro/micro_profiler.h" +#include "tensorflow/lite/micro/recording_micro_interpreter.h" +#include "tensorflow/lite/micro/system_setup.h" +#include "tensorflow/lite/schema/schema_generated.h" + +namespace { +using HelloWorldOpResolver = tflite::MicroMutableOpResolver<1>; + +TfLiteStatus RegisterOps(HelloWorldOpResolver& op_resolver) { + TF_LITE_ENSURE_STATUS(op_resolver.AddFullyConnected()); + return kTfLiteOk; +} +} // namespace + +TfLiteStatus ProfileMemoryAndLatency() { + tflite::MicroProfiler profiler; + HelloWorldOpResolver op_resolver; + TF_LITE_ENSURE_STATUS(RegisterOps(op_resolver)); + // Arena size just a round number. The exact arena usage can be determined + // using the RecordingMicroInterpreter. + constexpr int kTensorArenaSize = 3000; + uint8_t tensor_arena[kTensorArenaSize]; + constexpr int kNumResourceVariables = 24; + tflite::RecordingMicroAllocator* allocator( + tflite::RecordingMicroAllocator::Create(tensor_arena, kTensorArenaSize)); + tflite::RecordingMicroInterpreter interpreter( + tflite::GetModel(g_hello_world_float_model_data), op_resolver, allocator, + tflite::MicroResourceVariables::Create(allocator, kNumResourceVariables), + &profiler); + TF_LITE_ENSURE_STATUS(interpreter.AllocateTensors()); + TFLITE_CHECK_EQ(interpreter.inputs_size(), 1); + interpreter.input(0)->data.f[0] = 1.f; + TF_LITE_ENSURE_STATUS(interpreter.Invoke()); + + MicroPrintf(""); // Print an empty new line + profiler.LogTicksPerTagCsv(); + + MicroPrintf(""); // Print an empty new line + interpreter.GetMicroAllocator().PrintAllocations(); + return kTfLiteOk; +} + +TfLiteStatus LoadFloatModelAndPerformInference() { + const tflite::Model* model = + ::tflite::GetModel(g_hello_world_float_model_data); + TFLITE_CHECK_EQ(model->version(), TFLITE_SCHEMA_VERSION); + + HelloWorldOpResolver op_resolver; + TF_LITE_ENSURE_STATUS(RegisterOps(op_resolver)); + + // Arena size just a round number. The exact arena usage can be determined + // using the RecordingMicroInterpreter. + constexpr int kTensorArenaSize = 3000; + uint8_t tensor_arena[kTensorArenaSize]; + + tflite::MicroInterpreter interpreter(model, op_resolver, tensor_arena, + kTensorArenaSize); + TF_LITE_ENSURE_STATUS(interpreter.AllocateTensors()); + + // Check if the predicted output is within a small range of the + // expected output + float epsilon = 0.05f; + constexpr int kNumTestValues = 4; + float golden_inputs[kNumTestValues] = {0.f, 1.f, 3.f, 5.f}; + + for (int i = 0; i < kNumTestValues; ++i) { + interpreter.input(0)->data.f[0] = golden_inputs[i]; + TF_LITE_ENSURE_STATUS(interpreter.Invoke()); + float y_pred = interpreter.output(0)->data.f[0]; + TFLITE_CHECK_LE(abs(sin(golden_inputs[i]) - y_pred), epsilon); + } + + return kTfLiteOk; +} + +TfLiteStatus LoadQuantModelAndPerformInference() { + // Map the model into a usable data structure. This doesn't involve any + // copying or parsing, it's a very lightweight operation. + const tflite::Model* model = + ::tflite::GetModel(g_hello_world_int8_model_data); + TFLITE_CHECK_EQ(model->version(), TFLITE_SCHEMA_VERSION); + + HelloWorldOpResolver op_resolver; + TF_LITE_ENSURE_STATUS(RegisterOps(op_resolver)); + + // Arena size just a round number. The exact arena usage can be determined + // using the RecordingMicroInterpreter. + constexpr int kTensorArenaSize = 3000; + uint8_t tensor_arena[kTensorArenaSize]; + + tflite::MicroInterpreter interpreter(model, op_resolver, tensor_arena, + kTensorArenaSize); + + TF_LITE_ENSURE_STATUS(interpreter.AllocateTensors()); + + TfLiteTensor* input = interpreter.input(0); + TFLITE_CHECK_NE(input, nullptr); + + TfLiteTensor* output = interpreter.output(0); + TFLITE_CHECK_NE(output, nullptr); + + float output_scale = output->params.scale; + int output_zero_point = output->params.zero_point; + + // Check if the predicted output is within a small range of the + // expected output + float epsilon = 0.05; + + constexpr int kNumTestValues = 4; + float golden_inputs_float[kNumTestValues] = {0.77, 1.57, 2.3, 3.14}; + + // The int8 values are calculated using the following formula + // (golden_inputs_float[i] / input->params.scale + input->params.scale) + int8_t golden_inputs_int8[kNumTestValues] = {-96, -63, -34, 0}; + + for (int i = 0; i < kNumTestValues; ++i) { + input->data.int8[0] = golden_inputs_int8[i]; + TF_LITE_ENSURE_STATUS(interpreter.Invoke()); + float y_pred = (output->data.int8[0] - output_zero_point) * output_scale; + TFLITE_CHECK_LE(abs(sin(golden_inputs_float[i]) - y_pred), epsilon); + } + + return kTfLiteOk; +} + +int main(int argc, char* argv[]) { + tflite::InitializeTarget(); + TF_LITE_ENSURE_STATUS(ProfileMemoryAndLatency()); + TF_LITE_ENSURE_STATUS(LoadFloatModelAndPerformInference()); + TF_LITE_ENSURE_STATUS(LoadQuantModelAndPerformInference()); + MicroPrintf("~~~ALL TESTS PASSED~~~\n"); + return kTfLiteOk; +} diff --git a/examples/hello_world/models/hello_world_float_model_data.cc b/examples/hello_world/models/hello_world_float_model_data.cc new file mode 100644 index 0000000..d0e7639 --- /dev/null +++ b/examples/hello_world/models/hello_world_float_model_data.cc @@ -0,0 +1,5 @@ +#include + +#include "models/hello_world_float_model_data.h" + +alignas(16) const unsigned char g_hello_world_float_model_data[] = {0x1c,0x0,0x0,0x0,0x54,0x46,0x4c,0x33,0x14,0x0,0x20,0x0,0x1c,0x0,0x18,0x0,0x14,0x0,0x10,0x0,0xc,0x0,0x0,0x0,0x8,0x0,0x4,0x0,0x14,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0x90,0x0,0x0,0x0,0xe8,0x0,0x0,0x0,0x0,0x7,0x0,0x0,0x10,0x7,0x0,0x0,0x8,0xc,0x0,0x0,0x3,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x0,0x0,0xa,0x0,0x10,0x0,0xc,0x0,0x8,0x0,0x4,0x0,0xa,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0x38,0x0,0x0,0x0,0xf,0x0,0x0,0x0,0x73,0x65,0x72,0x76,0x69,0x6e,0x67,0x5f,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x0,0x1,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x98,0xff,0xff,0xff,0x9,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x64,0x65,0x6e,0x73,0x65,0x5f,0x32,0x0,0x1,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0xca,0xf9,0xff,0xff,0x4,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x64,0x65,0x6e,0x73,0x65,0x5f,0x69,0x6e,0x70,0x75,0x74,0x0,0x2,0x0,0x0,0x0,0x34,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0xdc,0xff,0xff,0xff,0xc,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x13,0x0,0x0,0x0,0x43,0x4f,0x4e,0x56,0x45,0x52,0x53,0x49,0x4f,0x4e,0x5f,0x4d,0x45,0x54,0x41,0x44,0x41,0x54,0x41,0x0,0x8,0x0,0xc,0x0,0x8,0x0,0x4,0x0,0x8,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x13,0x0,0x0,0x0,0x6d,0x69,0x6e,0x5f,0x72,0x75,0x6e,0x74,0x69,0x6d,0x65,0x5f,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x0,0xd,0x0,0x0,0x0,0x14,0x6,0x0,0x0,0xc,0x6,0x0,0x0,0xbc,0x5,0x0,0x0,0xa0,0x5,0x0,0x0,0x50,0x5,0x0,0x0,0x0,0x5,0x0,0x0,0xf0,0x0,0x0,0x0,0xa0,0x0,0x0,0x0,0x98,0x0,0x0,0x0,0x90,0x0,0x0,0x0,0x88,0x0,0x0,0x0,0x68,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x76,0xfa,0xff,0xff,0x4,0x0,0x0,0x0,0x54,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x8,0x0,0xe,0x0,0x8,0x0,0x4,0x0,0x8,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x24,0x0,0x0,0x0,0x0,0x0,0x6,0x0,0x8,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xa,0x0,0x10,0x0,0xc,0x0,0x8,0x0,0x4,0x0,0xa,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x32,0x2e,0x31,0x31,0x2e,0x30,0x0,0x0,0xd6,0xfa,0xff,0xff,0x4,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x31,0x2e,0x35,0x2e,0x30,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc0,0xf5,0xff,0xff,0xc4,0xf5,0xff,0xff,0xc8,0xf5,0xff,0xff,0xfe,0xfa,0xff,0xff,0x4,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0xea,0x85,0xf1,0xbe,0xef,0x1c,0x9a,0x3f,0xa3,0x23,0xa1,0x3f,0x12,0x94,0xb7,0x3e,0x0,0x89,0xe2,0x3d,0xeb,0x7a,0x86,0xbe,0x18,0x6f,0xa9,0x3e,0xec,0x6d,0x61,0x3f,0x12,0x4a,0x3d,0xbe,0x42,0x6b,0x8a,0x3f,0xc1,0xc3,0x3c,0xbf,0xe8,0xc0,0x9f,0x3e,0xee,0xaf,0x59,0xbf,0xc1,0x51,0x6e,0xbf,0x98,0x8c,0xb,0x3e,0xe1,0xc3,0xe3,0x3d,0x4a,0xfb,0xff,0xff,0x4,0x0,0x0,0x0,0x0,0x4,0x0,0x0,0x80,0x6d,0x32,0x3b,0xa,0x64,0x42,0x3e,0xf5,0xa4,0xd3,0x3e,0x1a,0xc7,0x3a,0xbe,0x66,0x99,0x4d,0x3e,0xac,0xe9,0x49,0xbe,0x38,0x73,0x7b,0xbd,0x2,0xb3,0x4,0xbe,0x34,0xae,0xff,0xbd,0xb7,0xf5,0xdb,0xbe,0xaf,0xb3,0xb2,0xbe,0x4d,0x95,0xb1,0x3e,0x83,0xa6,0xbc,0x3e,0x8e,0x14,0x3b,0x3e,0xfa,0x7c,0x74,0x3e,0xe9,0xf9,0x6d,0xbe,0x90,0x31,0xd3,0xbc,0x56,0xf2,0x48,0x3e,0x4a,0x1,0xa,0x3d,0x5b,0x82,0x1b,0xbf,0xe5,0x26,0x92,0x3d,0xcd,0x5a,0xcd,0x3e,0x69,0x43,0xcc,0xbe,0x24,0xaa,0xff,0xbd,0xf3,0x2,0xc2,0xbe,0xe5,0x2a,0x87,0x3e,0x71,0x62,0xbd,0xbe,0x2f,0xa3,0xae,0x3e,0x2a,0x47,0x89,0xbe,0x64,0x3b,0x25,0x3e,0xee,0x6f,0x9,0xbe,0x65,0xe0,0xba,0x3e,0x16,0xff,0x11,0x3e,0x60,0x69,0x38,0xbe,0x5f,0x7c,0xb6,0x3e,0xd4,0xec,0x13,0xbf,0xbd,0xa3,0xc9,0xbe,0x3,0x41,0x4e,0x3f,0xa9,0xf2,0x86,0xbe,0x70,0x4f,0x85,0xbc,0x53,0xec,0x9a,0x3e,0x4f,0xc9,0xe9,0x3e,0xe2,0xfa,0x60,0x3e,0x9c,0x7f,0x60,0xbe,0x86,0xc7,0x21,0x3e,0x2a,0xc5,0x0,0xbf,0xd1,0xda,0xaa,0x3e,0xaa,0x8b,0x14,0xbe,0x51,0x60,0x54,0xbe,0x48,0xc1,0xb7,0xbe,0xd3,0x8,0x38,0x3e,0x58,0x2e,0xeb,0x3e,0x3,0x92,0x4f,0x3e,0x5a,0x49,0xcb,0xbe,0xf5,0x1e,0xbf,0x3e,0x80,0xdc,0x9c,0xbe,0xcf,0x99,0xa2,0x3e,0x59,0x82,0x3d,0xbe,0x87,0x6f,0x98,0x3e,0x86,0xa5,0x8a,0xbe,0xe,0x9b,0x63,0xbe,0xfb,0x7a,0x33,0xbe,0x6,0x10,0x71,0xbe,0xa8,0xfc,0x10,0xbd,0x9c,0x46,0x91,0x3d,0x88,0x3c,0x92,0xbe,0xd4,0xbc,0xf4,0xbd,0x4d,0x74,0xbf,0x3e,0x88,0x6c,0x3,0xbd,0x7b,0xe9,0xdb,0xbe,0x9f,0xdf,0xc1,0x3e,0x6c,0xe4,0x82,0x3d,0x44,0x78,0xd5,0x3d,0x80,0x8a,0xfc,0xbb,0x6,0x7b,0x14,0x3e,0xb0,0x24,0x21,0x3d,0x18,0xce,0x9,0x3d,0xc2,0x28,0xb3,0xbe,0xd6,0xb0,0x8,0xbe,0x1c,0x63,0xc3,0xbe,0x80,0x98,0x5e,0x3b,0xac,0xd8,0xe7,0x3d,0x31,0x12,0xa4,0x3c,0x22,0x2,0xed,0x3d,0x47,0xf3,0xa6,0xbb,0x82,0xab,0xd8,0x3e,0x0,0xfc,0x1,0xbb,0xa7,0xc9,0x8a,0x3e,0x80,0x5d,0x97,0xbd,0x5f,0xe8,0x3b,0xbe,0x44,0x62,0xc2,0xbd,0x8,0x96,0x78,0xbd,0xda,0xd8,0x72,0x3e,0xa0,0xf3,0x8f,0x3e,0x68,0xd8,0x33,0xbd,0x26,0x14,0x17,0x3e,0xac,0xc0,0xc9,0xbe,0x8e,0x8a,0x94,0xbe,0x50,0x3d,0xb5,0xbc,0xcf,0xbb,0x82,0x3e,0x9a,0x88,0xb3,0xbe,0x11,0x8a,0xda,0xbe,0xe9,0xd9,0x95,0x3e,0xa0,0x13,0x4b,0x3d,0xf9,0xb6,0x83,0x3e,0xf4,0x14,0xbc,0xbe,0x1c,0x89,0xc1,0x3d,0xeb,0xee,0xca,0x3e,0xfc,0x30,0xab,0xbe,0xfc,0x62,0x9b,0xbd,0x50,0x74,0xaf,0xbe,0x37,0x16,0xd6,0x3e,0x30,0x3e,0xb5,0xbc,0x0,0xd1,0xf6,0x3a,0x66,0xbd,0xf9,0x3d,0x94,0x2a,0x6,0x3f,0xf7,0xc8,0xcb,0xbe,0x4a,0xa5,0xdc,0xbe,0xb5,0xd0,0xa2,0xbe,0x99,0xf0,0x7a,0xbe,0x42,0x1b,0x53,0xbe,0xdf,0x90,0x6e,0xbe,0xee,0xfe,0xbf,0x3e,0x80,0xd3,0x53,0x3c,0x20,0x0,0x45,0x3c,0x2c,0xd0,0x4f,0xbe,0xf0,0x67,0xdf,0xbd,0xce,0xb1,0x5,0x3e,0xc,0x4a,0xf3,0x3d,0x3a,0xf1,0x50,0x3e,0xa0,0xb2,0x29,0xbe,0x78,0x69,0x14,0x3e,0x44,0x93,0xf8,0x3d,0x24,0x67,0xa3,0x3d,0x7a,0x9b,0x96,0xbe,0x48,0x69,0xca,0xbd,0x7c,0xea,0xab,0x3d,0x32,0xd6,0x8b,0x3e,0xa3,0xca,0x47,0xbd,0xbe,0x1a,0xcd,0xbe,0xc1,0x54,0xce,0x3e,0xd8,0xbb,0xc3,0x3e,0x5c,0xfc,0xdb,0xbe,0x50,0xf0,0xa0,0x3c,0x80,0x30,0xd0,0x3c,0x65,0x29,0xb3,0xbe,0xf1,0x1f,0xaf,0xbc,0x40,0xfa,0xcd,0x3e,0xf3,0x33,0x46,0xbe,0xe8,0x9a,0xe7,0xbe,0x10,0xa1,0x9d,0xbe,0xce,0xc4,0x43,0x3e,0x16,0xaf,0x5c,0xbe,0x5,0xf8,0xf,0xbf,0x9a,0x81,0xd0,0x3e,0x80,0x94,0xc6,0x3b,0x2b,0xc,0x5f,0xbe,0x3d,0xc6,0xbf,0x3e,0x28,0xf6,0x7d,0xbd,0xca,0x61,0x8e,0xbe,0x40,0x24,0xe7,0x3c,0xc3,0xf1,0x83,0x3e,0x27,0x30,0x3f,0x3e,0x35,0x15,0xda,0xbe,0x60,0xa3,0xa7,0xbb,0xfc,0x0,0x65,0x3f,0x7,0x96,0xbd,0x3e,0x37,0x93,0x83,0x3e,0x88,0x45,0x3b,0x3d,0xf5,0xff,0xc7,0xbc,0x30,0x5d,0x8b,0xbd,0xc5,0x79,0x91,0x3e,0x78,0x14,0x15,0xbe,0xef,0xe5,0x23,0xbf,0x11,0x2a,0xa7,0x3e,0x41,0x7e,0xda,0x3e,0xb7,0x32,0x7b,0xbe,0x8d,0x63,0xc4,0x3e,0x3e,0x29,0x26,0x3e,0xbc,0x5b,0xe9,0xbd,0x90,0x49,0x59,0x3d,0xe0,0x87,0x7d,0xbc,0xb1,0xef,0xac,0x3e,0xb8,0x30,0x16,0xbd,0xac,0x56,0x8e,0xbd,0x18,0x58,0xbb,0xbe,0x90,0x6f,0xab,0xbd,0xe3,0x61,0x84,0x3e,0x48,0x41,0x6d,0x3d,0xfb,0x22,0xcd,0x3e,0x80,0x9b,0x2,0x3c,0x8d,0xc3,0xb1,0xbe,0xca,0xb2,0xcc,0xbe,0x62,0xab,0x65,0xbe,0xaf,0x17,0x53,0x3e,0x97,0xdf,0x7,0xbe,0x98,0x21,0x7f,0x3e,0x63,0x10,0x51,0x3f,0x4e,0x1e,0x3,0x3e,0x38,0xa3,0x99,0xbe,0x78,0x1f,0x20,0xbe,0xd,0xda,0xf2,0x3e,0x86,0xac,0x43,0xbe,0x39,0xcb,0xa9,0x3e,0x20,0x72,0x52,0x3d,0x2,0x97,0xca,0xbe,0x5c,0xe8,0xd8,0xbd,0x5f,0x38,0xb2,0x3e,0x83,0x15,0xbc,0x3e,0xa7,0xfb,0xa2,0x3e,0xae,0x3c,0x77,0xbe,0x0,0xe4,0x7e,0xbe,0xb,0xc4,0x7c,0xbe,0x13,0x4c,0x4b,0x3f,0x73,0x84,0xd0,0x3e,0xe0,0x67,0x55,0x3c,0xa4,0x27,0xa7,0xbe,0x6f,0x6f,0xed,0xbd,0xc5,0xb8,0xe,0x3f,0x50,0x5d,0x80,0x3c,0x6e,0x37,0x9,0x3e,0x91,0x74,0x2f,0xbf,0xec,0x2b,0xb1,0x3d,0xff,0xad,0x83,0x3e,0xc,0x4,0xbb,0xbd,0x88,0xdc,0xb7,0xbd,0xb5,0x1b,0x22,0xbe,0x88,0x9b,0x86,0x3e,0xef,0x1a,0x40,0x3e,0x7a,0x62,0xd0,0xbe,0xfc,0x4d,0xef,0x3d,0x14,0xe9,0xdb,0xbe,0x81,0x7c,0x89,0xbe,0xf,0xd7,0x7c,0x3e,0x91,0xcd,0x16,0xbe,0x6b,0xfb,0x87,0x3e,0xc2,0xbf,0x8f,0xbe,0x64,0x69,0x84,0x3e,0x8f,0x1c,0xd6,0xbe,0x3c,0x63,0xb7,0xbd,0x6a,0x68,0x60,0x3e,0xcd,0x69,0x93,0x3e,0xcb,0x23,0x87,0xbe,0xf,0xe1,0xa8,0xbe,0x30,0x40,0x2d,0x3e,0xb6,0xc9,0x2c,0x3d,0xb4,0x1e,0x52,0xbe,0x49,0x94,0xc1,0xbe,0x0,0x2b,0x9e,0xbb,0x44,0x9e,0xaa,0x3e,0xb,0xa2,0x9e,0x3e,0x4a,0x26,0x37,0xbe,0x8,0x8e,0x30,0xbe,0x54,0xbf,0x69,0x3d,0x50,0x33,0xa1,0xbe,0xdf,0x29,0xcb,0xbe,0x56,0xff,0xff,0xff,0x4,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x30,0x77,0xf9,0xbd,0xbb,0x30,0xc9,0xbe,0x45,0xf5,0x48,0x3e,0x52,0x14,0x32,0x3f,0x64,0xcc,0x12,0x3e,0xe0,0xe1,0x83,0xbd,0xec,0x89,0x38,0xbe,0x10,0xd0,0x5e,0xbd,0x36,0x7f,0xec,0xbe,0xd3,0xa6,0xcf,0x3e,0x42,0x2b,0x8f,0x3e,0xff,0x9e,0x3,0xbf,0xf0,0x88,0xd7,0xbe,0xbc,0x27,0x20,0x3f,0x52,0xa5,0xbf,0xbe,0x30,0xa3,0xa9,0xbe,0xa2,0xff,0xff,0xff,0x4,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x99,0xde,0xc1,0x3e,0xf8,0xdf,0x38,0xbf,0x9d,0x42,0xba,0x3d,0x32,0x8f,0x5b,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x9d,0xa1,0x97,0x3f,0x16,0xce,0x55,0xbe,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x49,0xbe,0x41,0xbc,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xee,0xff,0xff,0xff,0x4,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0xbc,0xf9,0x23,0xbe,0x0,0x0,0x6,0x0,0x8,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc5,0xb3,0x0,0x3f,0xa4,0xba,0xd0,0x3e,0x52,0xce,0x82,0xbe,0x0,0x0,0x0,0x0,0x4f,0x1b,0x33,0x3e,0x0,0x0,0x0,0x0,0x21,0x72,0x77,0xbe,0xcc,0xcd,0x8f,0x3d,0xfd,0xa3,0xdc,0xbe,0x88,0xe3,0x18,0x3f,0x0,0x0,0x0,0x0,0x91,0x8c,0x61,0x3e,0xe,0x76,0xb,0x3f,0xb0,0x55,0x47,0xbe,0x14,0x9,0x92,0xbd,0x20,0xfb,0xff,0xff,0x24,0xfb,0xff,0xff,0xf,0x0,0x0,0x0,0x4d,0x4c,0x49,0x52,0x20,0x43,0x6f,0x6e,0x76,0x65,0x72,0x74,0x65,0x64,0x2e,0x0,0x1,0x0,0x0,0x0,0x14,0x0,0x0,0x0,0x0,0x0,0xe,0x0,0x18,0x0,0x14,0x0,0x10,0x0,0xc,0x0,0x8,0x0,0x4,0x0,0xe,0x0,0x0,0x0,0x14,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0xd8,0x0,0x0,0x0,0xdc,0x0,0x0,0x0,0xe0,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x6d,0x61,0x69,0x6e,0x0,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x80,0x0,0x0,0x0,0x38,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x9a,0xff,0xff,0xff,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x8,0xc,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x9c,0xfb,0xff,0xff,0x1,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0xca,0xff,0xff,0xff,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x8,0x10,0x0,0x0,0x0,0x14,0x0,0x0,0x0,0xba,0xff,0xff,0xff,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x5,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0xe,0x0,0x16,0x0,0x0,0x0,0x10,0x0,0xc,0x0,0xb,0x0,0x4,0x0,0xe,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0x8,0x18,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0x0,0x0,0x6,0x0,0x8,0x0,0x7,0x0,0x6,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xa,0x0,0x0,0x0,0x8c,0x3,0x0,0x0,0x1c,0x3,0x0,0x0,0xac,0x2,0x0,0x0,0x58,0x2,0x0,0x0,0x10,0x2,0x0,0x0,0xc4,0x1,0x0,0x0,0x78,0x1,0x0,0x0,0xf0,0x0,0x0,0x0,0x60,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0xb2,0xfc,0xff,0xff,0x0,0x0,0x0,0x1,0x14,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0xa,0x0,0x0,0x0,0x34,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0x9c,0xfc,0xff,0xff,0x19,0x0,0x0,0x0,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x3a,0x30,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xa,0xfd,0xff,0xff,0x0,0x0,0x0,0x1,0x14,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0x68,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0xff,0xff,0xff,0xff,0x10,0x0,0x0,0x0,0xf4,0xfc,0xff,0xff,0x4c,0x0,0x0,0x0,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x5f,0x31,0x2f,0x4d,0x61,0x74,0x4d,0x75,0x6c,0x3b,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x5f,0x31,0x2f,0x52,0x65,0x6c,0x75,0x3b,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x5f,0x31,0x2f,0x42,0x69,0x61,0x73,0x41,0x64,0x64,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x96,0xfd,0xff,0xff,0x0,0x0,0x0,0x1,0x14,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x60,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0xff,0xff,0xff,0xff,0x10,0x0,0x0,0x0,0x80,0xfd,0xff,0xff,0x46,0x0,0x0,0x0,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x2f,0x4d,0x61,0x74,0x4d,0x75,0x6c,0x3b,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x3b,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x2f,0x42,0x69,0x61,0x73,0x41,0x64,0x64,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x86,0xfe,0xff,0xff,0x0,0x0,0x0,0x1,0x10,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0xf4,0xfd,0xff,0xff,0x19,0x0,0x0,0x0,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x5f,0x32,0x2f,0x4d,0x61,0x74,0x4d,0x75,0x6c,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0xce,0xfe,0xff,0xff,0x0,0x0,0x0,0x1,0x10,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x3c,0xfe,0xff,0xff,0x19,0x0,0x0,0x0,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x5f,0x31,0x2f,0x4d,0x61,0x74,0x4d,0x75,0x6c,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x16,0xff,0xff,0xff,0x0,0x0,0x0,0x1,0x10,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x5,0x0,0x0,0x0,0x24,0x0,0x0,0x0,0x84,0xfe,0xff,0xff,0x17,0x0,0x0,0x0,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x2f,0x4d,0x61,0x74,0x4d,0x75,0x6c,0x0,0x2,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x5a,0xff,0xff,0xff,0x0,0x0,0x0,0x1,0x10,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x34,0x0,0x0,0x0,0xc8,0xfe,0xff,0xff,0x27,0x0,0x0,0x0,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x2f,0x42,0x69,0x61,0x73,0x41,0x64,0x64,0x2f,0x52,0x65,0x61,0x64,0x56,0x61,0x72,0x69,0x61,0x62,0x6c,0x65,0x4f,0x70,0x0,0x1,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0xaa,0xff,0xff,0xff,0x0,0x0,0x0,0x1,0x10,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x38,0x0,0x0,0x0,0x18,0xff,0xff,0xff,0x29,0x0,0x0,0x0,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x5f,0x32,0x2f,0x42,0x69,0x61,0x73,0x41,0x64,0x64,0x2f,0x52,0x65,0x61,0x64,0x56,0x61,0x72,0x69,0x61,0x62,0x6c,0x65,0x4f,0x70,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x16,0x0,0x18,0x0,0x14,0x0,0x0,0x0,0x10,0x0,0xc,0x0,0x8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0x0,0x16,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x10,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x38,0x0,0x0,0x0,0x84,0xff,0xff,0xff,0x29,0x0,0x0,0x0,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x5f,0x31,0x2f,0x42,0x69,0x61,0x73,0x41,0x64,0x64,0x2f,0x52,0x65,0x61,0x64,0x56,0x61,0x72,0x69,0x61,0x62,0x6c,0x65,0x4f,0x70,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x0,0x0,0x16,0x0,0x1c,0x0,0x18,0x0,0x0,0x0,0x14,0x0,0x10,0x0,0xc,0x0,0x0,0x0,0x0,0x0,0x8,0x0,0x7,0x0,0x16,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x14,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x3c,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0x4,0x0,0x4,0x0,0x4,0x0,0x0,0x0,0x1d,0x0,0x0,0x0,0x73,0x65,0x72,0x76,0x69,0x6e,0x67,0x5f,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x5f,0x64,0x65,0x6e,0x73,0x65,0x5f,0x69,0x6e,0x70,0x75,0x74,0x3a,0x30,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0xc,0x0,0xc,0x0,0xb,0x0,0x0,0x0,0x0,0x0,0x4,0x0,0xc,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0x0,0x0,0x0,0x9}; diff --git a/examples/hello_world/models/hello_world_float_model_data.h b/examples/hello_world/models/hello_world_float_model_data.h new file mode 100644 index 0000000..3c2dcb8 --- /dev/null +++ b/examples/hello_world/models/hello_world_float_model_data.h @@ -0,0 +1,4 @@ +#include + +constexpr unsigned int g_hello_world_float_model_data_size = 3164; +extern const unsigned char g_hello_world_float_model_data[]; diff --git a/examples/hello_world/models/hello_world_int8_model_data.cc b/examples/hello_world/models/hello_world_int8_model_data.cc new file mode 100644 index 0000000..49bc2fe --- /dev/null +++ b/examples/hello_world/models/hello_world_int8_model_data.cc @@ -0,0 +1,5 @@ +#include + +#include "models/hello_world_int8_model_data.h" + +alignas(16) const unsigned char g_hello_world_int8_model_data[] = {0x28,0x0,0x0,0x0,0x54,0x46,0x4c,0x33,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x14,0x0,0x20,0x0,0x4,0x0,0x8,0x0,0xc,0x0,0x10,0x0,0x14,0x0,0x0,0x0,0x18,0x0,0x1c,0x0,0x14,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x3c,0xa,0x0,0x0,0xf0,0x3,0x0,0x0,0xd8,0x3,0x0,0x0,0xe0,0x0,0x0,0x0,0x80,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x0,0x0,0xa,0x0,0x10,0x0,0x4,0x0,0x8,0x0,0xc,0x0,0xa,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0xf,0x0,0x0,0x0,0x73,0x65,0x72,0x76,0x69,0x6e,0x67,0x5f,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x0,0x1,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x98,0xff,0xff,0xff,0x8,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x64,0x65,0x6e,0x73,0x65,0x5f,0x32,0x0,0x1,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0xba,0xfc,0xff,0xff,0x4,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x64,0x65,0x6e,0x73,0x65,0x5f,0x69,0x6e,0x70,0x75,0x74,0x0,0x2,0x0,0x0,0x0,0x34,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0xdc,0xff,0xff,0xff,0x8,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x13,0x0,0x0,0x0,0x43,0x4f,0x4e,0x56,0x45,0x52,0x53,0x49,0x4f,0x4e,0x5f,0x4d,0x45,0x54,0x41,0x44,0x41,0x54,0x41,0x0,0x8,0x0,0xc,0x0,0x4,0x0,0x8,0x0,0x8,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x13,0x0,0x0,0x0,0x6d,0x69,0x6e,0x5f,0x72,0x75,0x6e,0x74,0x69,0x6d,0x65,0x5f,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x0,0xd,0x0,0x0,0x0,0xec,0x2,0x0,0x0,0xe4,0x2,0x0,0x0,0xcc,0x2,0x0,0x0,0x98,0x2,0x0,0x0,0x44,0x2,0x0,0x0,0x30,0x1,0x0,0x0,0xdc,0x0,0x0,0x0,0xb8,0x0,0x0,0x0,0xb0,0x0,0x0,0x0,0xa8,0x0,0x0,0x0,0xa0,0x0,0x0,0x0,0x78,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x66,0xfd,0xff,0xff,0x4,0x0,0x0,0x0,0x58,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x8,0x0,0xe,0x0,0x8,0x0,0x4,0x0,0x8,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x0,0x6,0x0,0x8,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xeb,0x3,0x0,0x0,0x0,0x0,0xa,0x0,0x10,0x0,0xc,0x0,0x8,0x0,0x4,0x0,0xa,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x32,0x2e,0x31,0x31,0x2e,0x30,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xd6,0xfd,0xff,0xff,0x4,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x31,0x2e,0x31,0x34,0x2e,0x30,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x64,0xfd,0xff,0xff,0x68,0xfd,0xff,0xff,0x6c,0xfd,0xff,0xff,0x6,0xfe,0xff,0xff,0x4,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0xf7,0xca,0x39,0x47,0x68,0x73,0x62,0x63,0x40,0xe6,0x7f,0x19,0xae,0x44,0x5f,0x56,0x0,0x0,0x0,0x0,0x26,0xfe,0xff,0xff,0x4,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc2,0xea,0xff,0xff,0x75,0xea,0xff,0xff,0xb8,0xfa,0xff,0xff,0x24,0xfa,0xff,0xff,0xc8,0xef,0xff,0xff,0xac,0xff,0xff,0xff,0x44,0xd,0x0,0x0,0x0,0x0,0x0,0x0,0xbd,0x7,0x0,0x0,0x33,0xea,0xff,0xff,0x0,0x0,0x0,0x0,0xcc,0xe4,0xff,0xff,0x4f,0xd,0x0,0x0,0xcf,0xe3,0xff,0xff,0x0,0x0,0x0,0x0,0x76,0xfe,0xff,0xff,0x4,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0xf4,0x1a,0xed,0x9,0x19,0x21,0xf4,0x24,0xe0,0x21,0xef,0xbc,0xf7,0xf5,0xfa,0x19,0x3,0xdc,0xd2,0x2,0x6,0xf9,0xf4,0x2,0xff,0xfa,0xef,0xf1,0xef,0xd3,0x27,0xe1,0xfb,0x27,0xdd,0xeb,0xdb,0xe4,0x5,0x1a,0x17,0xfc,0x24,0x12,0x15,0xef,0x1e,0xe4,0x10,0xfe,0x14,0xda,0x1c,0xf8,0xf3,0xf1,0xef,0xe2,0xf3,0x9,0xe3,0xe9,0xed,0xe3,0xe4,0x15,0x7,0xb,0x4,0x1b,0x1a,0xfe,0xeb,0x1,0xde,0x21,0xe6,0xb,0xec,0x3,0x23,0xa,0x22,0x24,0x1e,0x27,0x3,0xe6,0x3,0x24,0xff,0xc0,0x11,0xf8,0xfc,0xf1,0x11,0xc,0xf5,0xe0,0xf3,0x7,0x17,0xe5,0xe8,0xed,0xfa,0xdc,0xe8,0x23,0xfb,0x7,0xdd,0xfb,0xfd,0x0,0x14,0x26,0x11,0x17,0xe7,0xf1,0x11,0xea,0x2,0x26,0x4,0x4,0x25,0x21,0x1d,0xa,0xdb,0x1d,0xdc,0x20,0x1,0xfa,0xe3,0x37,0xb,0xf1,0x1a,0x16,0xef,0x1c,0xe7,0x3,0xe0,0x16,0x2,0x3,0x21,0x18,0x9,0x2e,0xd9,0xe5,0x14,0xb,0xea,0x1a,0xfc,0xd8,0x13,0x0,0xc4,0xd8,0xec,0xd9,0xfe,0xd,0x19,0x20,0xd8,0xd6,0xe2,0x1f,0xe9,0xd7,0xca,0xe2,0xdd,0xc6,0x13,0xe7,0x4,0x3e,0x0,0x1,0x14,0xc7,0xdb,0xe7,0x15,0x15,0xf5,0x6,0xd6,0x1a,0xdc,0x9,0x22,0xfe,0x8,0x2,0x13,0xef,0x19,0x1e,0xe2,0x9,0xfd,0xf3,0x14,0xdd,0xda,0x20,0xd9,0xf,0xe3,0xf9,0xf7,0xee,0xe9,0x24,0xe6,0x29,0x0,0x7,0x16,0xe2,0x1e,0xd,0x23,0xd3,0xdd,0xf7,0x14,0xfa,0x8,0x22,0x26,0x21,0x9,0x8,0xf,0xb,0xe0,0x12,0xf4,0x7f,0xdc,0x58,0xe5,0x26,0x0,0x0,0x0,0x0,0x86,0xff,0xff,0xff,0x4,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x27,0xfd,0xff,0xff,0xa2,0x7,0x0,0x0,0x62,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0xf1,0x0,0x0,0x0,0x29,0xfe,0xff,0xff,0xdd,0xff,0xff,0xff,0x9d,0xfc,0xff,0xff,0x3b,0x2,0x0,0x0,0x45,0x2,0x0,0x0,0xa4,0x10,0x0,0x0,0x67,0xf,0x0,0x0,0x4f,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x87,0xfc,0xff,0xff,0x11,0xec,0xff,0xff,0x0,0x0,0x0,0x0,0xd6,0xff,0xff,0xff,0x4,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0xd9,0x3b,0x27,0x15,0x1c,0xe0,0xde,0xdd,0xf,0x1b,0xc5,0xd7,0x12,0xdd,0xf9,0x7f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x6,0x0,0x8,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0xad,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x84,0xff,0xff,0xff,0x88,0xff,0xff,0xff,0xf,0x0,0x0,0x0,0x4d,0x4c,0x49,0x52,0x20,0x43,0x6f,0x6e,0x76,0x65,0x72,0x74,0x65,0x64,0x2e,0x0,0x1,0x0,0x0,0x0,0x14,0x0,0x0,0x0,0x0,0x0,0xe,0x0,0x18,0x0,0x4,0x0,0x8,0x0,0xc,0x0,0x10,0x0,0x14,0x0,0xe,0x0,0x0,0x0,0x4,0x1,0x0,0x0,0xf8,0x0,0x0,0x0,0xec,0x0,0x0,0x0,0x14,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x6d,0x61,0x69,0x6e,0x0,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x94,0x0,0x0,0x0,0x4c,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0xca,0xff,0xff,0xff,0x0,0x0,0x0,0x8,0x1c,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x4,0x0,0x4,0x0,0x4,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0xe,0x0,0x14,0x0,0x0,0x0,0x8,0x0,0xc,0x0,0x7,0x0,0x10,0x0,0xe,0x0,0x0,0x0,0x0,0x0,0x0,0x8,0x1c,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0xba,0xff,0xff,0xff,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0xe,0x0,0x16,0x0,0x0,0x0,0x8,0x0,0xc,0x0,0x7,0x0,0x10,0x0,0xe,0x0,0x0,0x0,0x0,0x0,0x0,0x8,0x24,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x0,0x0,0x6,0x0,0x8,0x0,0x7,0x0,0x6,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x5,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xa,0x0,0x0,0x0,0x9c,0x4,0x0,0x0,0xc,0x4,0x0,0x0,0x88,0x3,0x0,0x0,0x14,0x3,0x0,0x0,0xa8,0x2,0x0,0x0,0x34,0x2,0x0,0x0,0xd0,0x1,0x0,0x0,0x2c,0x1,0x0,0x0,0x80,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0xa2,0xfb,0xff,0xff,0x0,0x0,0x9,0x1,0x64,0x0,0x0,0x0,0xa,0x0,0x0,0x0,0x3c,0x0,0x0,0x0,0x14,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0x8c,0xfb,0xff,0xff,0x18,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x5,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xcb,0xd6,0x7,0x3c,0x19,0x0,0x0,0x0,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x3a,0x30,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1a,0xfc,0xff,0xff,0x0,0x0,0x9,0x1,0x94,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0x38,0x0,0x0,0x0,0x14,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0xff,0xff,0xff,0xff,0x10,0x0,0x0,0x0,0x4,0xfc,0xff,0xff,0x14,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0x5d,0x4f,0x51,0x3c,0x4c,0x0,0x0,0x0,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x5f,0x31,0x2f,0x4d,0x61,0x74,0x4d,0x75,0x6c,0x3b,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x5f,0x31,0x2f,0x52,0x65,0x6c,0x75,0x3b,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x5f,0x31,0x2f,0x42,0x69,0x61,0x73,0x41,0x64,0x64,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0xc2,0xfc,0xff,0xff,0x0,0x0,0x9,0x1,0x8c,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x38,0x0,0x0,0x0,0x14,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0xff,0xff,0xff,0xff,0x10,0x0,0x0,0x0,0xac,0xfc,0xff,0xff,0x14,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0x9f,0x51,0x5a,0x3c,0x46,0x0,0x0,0x0,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x2f,0x4d,0x61,0x74,0x4d,0x75,0x6c,0x3b,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x3b,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x2f,0x42,0x69,0x61,0x73,0x41,0x64,0x64,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0xee,0xfd,0xff,0xff,0x0,0x0,0x9,0x1,0x4c,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x3c,0xfd,0xff,0xff,0x14,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xaa,0x59,0x84,0x3b,0x17,0x0,0x0,0x0,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x2f,0x4d,0x61,0x74,0x4d,0x75,0x6c,0x0,0x2,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x4e,0xfe,0xff,0xff,0x0,0x0,0x2,0x1,0x60,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x2c,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x9c,0xfd,0xff,0xff,0x18,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x55,0x5b,0xcf,0x38,0x27,0x0,0x0,0x0,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x2f,0x42,0x69,0x61,0x73,0x41,0x64,0x64,0x2f,0x52,0x65,0x61,0x64,0x56,0x61,0x72,0x69,0x61,0x62,0x6c,0x65,0x4f,0x70,0x0,0x1,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0xbe,0xfe,0xff,0xff,0x0,0x0,0x9,0x1,0x54,0x0,0x0,0x0,0x5,0x0,0x0,0x0,0x2c,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0xc,0xfe,0xff,0xff,0x18,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x7f,0x7f,0x32,0x3c,0x19,0x0,0x0,0x0,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x5f,0x31,0x2f,0x4d,0x61,0x74,0x4d,0x75,0x6c,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x26,0xff,0xff,0xff,0x0,0x0,0x2,0x1,0x60,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x74,0xfe,0xff,0xff,0x14,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x7b,0x39,0x18,0x39,0x29,0x0,0x0,0x0,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x5f,0x31,0x2f,0x42,0x69,0x61,0x73,0x41,0x64,0x64,0x2f,0x52,0x65,0x61,0x64,0x56,0x61,0x72,0x69,0x61,0x62,0x6c,0x65,0x4f,0x70,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x96,0xff,0xff,0xff,0x0,0x0,0x9,0x1,0x54,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x2c,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0xe4,0xfe,0xff,0xff,0x18,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x17,0x44,0x7c,0x3c,0x19,0x0,0x0,0x0,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x5f,0x32,0x2f,0x4d,0x61,0x74,0x4d,0x75,0x6c,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x0,0x0,0x16,0x0,0x18,0x0,0x8,0x0,0x6,0x0,0xc,0x0,0x10,0x0,0x14,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0x0,0x16,0x0,0x0,0x0,0x0,0x0,0x2,0x1,0x64,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x2c,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x64,0xff,0xff,0xff,0x18,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xcb,0x41,0x4e,0x39,0x29,0x0,0x0,0x0,0x73,0x65,0x71,0x75,0x65,0x6e,0x74,0x69,0x61,0x6c,0x2f,0x64,0x65,0x6e,0x73,0x65,0x5f,0x32,0x2f,0x42,0x69,0x61,0x73,0x41,0x64,0x64,0x2f,0x52,0x65,0x61,0x64,0x56,0x61,0x72,0x69,0x61,0x62,0x6c,0x65,0x4f,0x70,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x16,0x0,0x1c,0x0,0x8,0x0,0x6,0x0,0xc,0x0,0x10,0x0,0x14,0x0,0x0,0x0,0x0,0x0,0x18,0x0,0x7,0x0,0x16,0x0,0x0,0x0,0x0,0x0,0x9,0x1,0x74,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x48,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xc,0x0,0xc,0x0,0x0,0x0,0x0,0x0,0x4,0x0,0x8,0x0,0xc,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x86,0x8a,0xc8,0x3c,0x1d,0x0,0x0,0x0,0x73,0x65,0x72,0x76,0x69,0x6e,0x67,0x5f,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x5f,0x64,0x65,0x6e,0x73,0x65,0x5f,0x69,0x6e,0x70,0x75,0x74,0x3a,0x30,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0xc,0x0,0x10,0x0,0x7,0x0,0x0,0x0,0x8,0x0,0xc,0x0,0xc,0x0,0x0,0x0,0x0,0x0,0x0,0x9,0x4,0x0,0x0,0x0,0x9,0x0,0x0,0x0}; diff --git a/examples/hello_world/models/hello_world_int8_model_data.h b/examples/hello_world/models/hello_world_int8_model_data.h new file mode 100644 index 0000000..ed6259d --- /dev/null +++ b/examples/hello_world/models/hello_world_int8_model_data.h @@ -0,0 +1,4 @@ +#include + +constexpr unsigned int g_hello_world_int8_model_data_size = 2704; +extern const unsigned char g_hello_world_int8_model_data[]; diff --git a/examples/person_detection/sample_images/sample_images/README.md b/examples/person_detection/sample_images/sample_images/README.md new file mode 100644 index 0000000..3b38072 --- /dev/null +++ b/examples/person_detection/sample_images/sample_images/README.md @@ -0,0 +1,17 @@ +# About Images + + - The images embedded here are 96x96 greyscale images. + - These can be viewed at https://rawpixels.net + +## Image descriptions: + + - image0: A person + - image1: A dog + - image2: A person + - image3: A Monkey + - image4: A person + - image5: A cat + - image6: A person (not in focus) + - image7: Portrait of a person + - image8: A person + - image9: A person diff --git a/examples/person_detection/sample_images/sample_images/image0 b/examples/person_detection/sample_images/sample_images/image0 new file mode 100644 index 0000000..0b1b471 --- /dev/null +++ b/examples/person_detection/sample_images/sample_images/image0 @@ -0,0 +1,4 @@ +ffffffffeeeeffffeeeegggggggggggggggghhhhhhhhhhhhhhhhhhhhhggggggghhhhhhhhhiiiihhhiiiiihhhiiiiiiiiffffffffffffffffffffggggggggggggggggghhhhhhhhhhhhhhhhhhhhiiiiiiihhhhhhhhhiiiijjjjiiiihhhhiiiiiiiffffffffggggffffgggggggggggggggggggghhhhhhhhhhhhhhhhhhhiijjjjjjjihhhhhhhhiiijkjkjiiiihhhhiiiiiiigggggfgggggggggggfffghhhhhhhhhhhhhhhhhhhgghiiiiiihhgilkiijjjjkkkjhhhiiiiikkkkjjjjkkkkkkkkjjjjkkkgggggggggggggggggggghhhhhhhhhhhhhhhhhhhhghiiiiiijkjijljijkkkkkkkkjjjiiiijkkkkkkkkkkkkkkkkkkkkkkkgggghhhhgggggggghhhhhhhhhhhhhhhhhhhhhhhhhfikjjhhgc`a_\bjmjikkklljkllkiiijkkkkllllkkkkkkkkllllkkkhhhhhhhhhhhhhhhhiiiiiiiiiiiiiiiijiihhhiif]XYXUU[`]Z]]TNOTUX_ca_`dfgikjjkllllllllllllllllllllllllhhhhhhhhhhhhhhhhiiiiiiiiiiiiihijigb_`bbcYHKOLPVYZZXRT[\\YQJMQQSSOPYcikkkllllllllllllllllllllllllhhhhhhhhhhhhhhhhijjjjjjjiiiiimid`[URKFFE?>KJBFGDFQ\_^XQNPUTOKG@@DFNV]gkkkkkmmllllllllllllllllllliiiiiiiiiiiiiiiikkkkkkkkiijkilcZVMDB>;<;9>CDA<=?8;NXW\b[MA?FNQOH;46=ELVckmmmjmmmmllllmmmmmmmmllliiiiiiiijjjjiiiikkkkkkkkllmnme`YH;2-16;B?EJIHGC::;:LZVWTSRKA=CHKND4,251JZRRMCFID<=ACFME4246:>NjlmnnlnnnnmmmmmmmmnnnkkkkjjjjkkkkkkkkkkkkmllknkkljU:$"Nly~{vkXB6CYIE@=<58;<=@AHM<15797<^kklonnnnmmmmmmmmnnnkkkkkkkkkkkkkkkkllllmllkj^dgV2" CpzgRCO]SGA=3120-1=AFIF:8;61Efpjpnnnnoooooooonnnkkkkllllkkkkllllmmmmolkk`YbT43fxn]_bZRKD<2.+$#.:CIG>;673@`nopnnnoooooooooookkkkkkkkkkkkmmmmmmmmnnif\YQ9'Oz~tlfa^[VOJ=881*'08=@?9<83,?q}xsl`VVLHI?<6/+*,($')(&0:=9@ftpppppppppoppmmmmmmmmmmmmnnnnnnnnkj[YV77p{vlg^QQD;@64.((*,,+$"!"-75CfrqqqqqqqqopqnnnnmmmmnnnnoooooooonjR`Ytvuuuuuurrrrrrrrrrrrrrrrtrr]DVygWVSNMRKSeoy~~|zxtmhggggfb_^][SD6*%$('##(-0476-1gxvvvuuurrrrrrrrrrrrrrrrtrr]I`q_ckj]SMBHYkp{via]Y]bdefefljfeeedb`^\YTH;-&"$$#+.36846fxvvvvvvrrrrrrrrrrrrrrrrsrrZNkkkuz|~~yo]X^extmd\RLLIIGHMPOPX_acccb`^\YUL@0& !*-169:7;DMIEJIHFFLY`bca_]ZTLE3$!#)+-77;=fwvvvwwwttttttttttttttttrqe`OxzaQTB/-7IQTbah~qe[L?H]c]UQLSZRORQKCBMZbca_\URNI8&#**(2389bywwwwwwuuuuuuuutttttttuuvaSLoz^ZSK;43?FPWrjqg^\JM]\W^afhSJNGLYRMIMW`cb_[WRHA8(#*(%,144azxxxwwwuuuuuuuuttuvuuvwvu{pdyz|{{~vrrZganCI[YJZ^]_[<$+979=BJ@LMNV_dd_YXQG=0*! $&)+35:izxxxxxxuuuuuuuuttuvuuvwvuxtmzwlq~yh}vaFX^h|~}{q\TF:5798.>LC><:%Wzxyzzzzzzzzwwwwwwwwwwwwxxxxyx|rd_^eigkvzvpoqsuuvyzwussqh_YUTSSTPLC/0eEMI=3KA*a{yz{zzzzzzzxxxxxxxxxxxxxxxxyzqbqh^^hpnkd^k}|xvtqolgb]URRSROMJ@BjTd^QIX77s{zzzzzzz{|{xxxxxxxxxxxxyyyyz|uhan{kf~sfPNQ^fheYMUdw}{xtokhda]VRSVRPNMMGZE[]\Yb,>w|{{{{{{{}}}xxxxxxxxxxxxyyyyz|}sklysO;U`UC,' "1DHBO`feq{|xvuplgaba_WSUWRPNLOXV:M[h``(W}|||||||}}}xxxxyyyyyyyyyzzzy{~~tnmt~riehlZF95++(%)8P_iklswz{vrpnlhb]^_]VRTVSQNNLcaMK[q]X[dblV^[t}{|}}}}}}}}}}zzzz{{{{{yqx{{pvuy}{uk`XYWSQU[[ZXW]fea\N\fa_]ZTPRVUSPON_zf\M\an}}}~~~}}}}~~~zzzz{{{{{yy~idnpqhL>@Vrtzysof`[UOOQRSSS\kkgaWkmca^[WSSUSQNMXiqYOgch{~z~~~~~~~~zzzz{{{{}}zxtl[cr{w|uJ?~g_h^LMMJKLHEIIGJMN]ttka]qjdb_^\URRPNLIWnvid^h~~~~~~~{{{{}}}}}~~z{yxx{pX]gz|D*}|ipN?1*)3X]kyrg``mjec`]YQNOKIILcrudUj~~{{{{}}}}}}}}||}}}xedbx~Q[y~tF?"#@cqw|~sf_fqokfa[OHFEHJFPXYS8H|{{{{}}}}}}}}~~~~~qnn}zxrmRJE831038I`svq||pc^lvpjcZQF?;@EGMH200$<|}}}}~~~~~~~~~~~~~~{zypgaa`ciqtty|h^ctuog[PE;1=EEDO?*/4/Dy~~~~~~~~~~~~~~~~~~}}tke]_acktvwubakwrg\PF73BPIHPJAD<19Lp~~~~~~~~~~~~~~~~~~{ytnigffedfowyzj[dsyn_QF83FOGLOQBMTC@BWj|~~~~~~~~~|wsmmplhfc`cfitzv}n[]murcRI54JMJOVPDGSHNONcsz~~~~~wutpnmmmmmpuyzy~}nUXpxzjTF42INRVZXFANLL\SLn~~~~{|yw{|wtwkWVmzvlXC69HPSWZUHGPFFUM:#,Gp~}{{{tppfUYpysoZB1;FMUYXSMOPEDTF%$<]{~}yyyx{}tmf^YKVlrpm^@48GMQVYWRTP??K22wv~|zxuroa\QDCXjkieR97BCKRUXWTSK>711J]owymxv}}~{xrgd`\P@6CUdhe[I@@?CLTWWXYWD*#.>Xl~h(5qqls{zxy{~}rea\POMB00@X`\\TKDEEBMXX[YUM3(>Vk \podW^igbZVNEEF?82,5MZ^XVQQJA>DPUUWVN3|l_(Lpfh]PE=9644674/.4EV^[VTPMH@=DPTPNG0}hL;,# 1|iZ^e_UHA>;8649DPVWTPLHDA:9EJIH=( !!!"yaWA& ! t{nXOSUTKC@=9;CJHDB?>=::85=F>. !" !!oG$!N{r_MGDD@<:89:764221010282& p9! ^~yh\J=8754321/./...-+% kE%FizvqfWG>9764310-($ + t@" " 4N_jcXL=51-'# U  " " &+%  +  L ""!    !  %  #"!!!! !! !#  !!  "#!!  !# !! "! ! ! !! "" !"   !! ""  "#!! " !! ""  "#!!  ! !! ""  "$"!   !! "!  "#!!  +!! !!!!  !! !!!! !! !!!! ""!!!! ""!!!!  ""!!!!  !!!!!! !!!!!! !"""!!  \ No newline at end of file diff --git a/examples/person_detection/sample_images/sample_images/image1 b/examples/person_detection/sample_images/sample_images/image1 new file mode 100644 index 0000000000000000000000000000000000000000..66e7ba7d9212c1256d58dafd956ac64db6e5afdb GIT binary patch literal 9216 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 Y-Qf)wbOw_vJQN$67``&|llu050J0Ng3;+NC literal 0 HcmV?d00001 diff --git a/examples/person_detection/sample_images/sample_images/image2 b/examples/person_detection/sample_images/sample_images/image2 new file mode 100644 index 0000000..3918618 --- /dev/null +++ b/examples/person_detection/sample_images/sample_images/image2 @@ -0,0 +1 @@ +IJKLMMNPRSUUVX[^``bcdcghehe]Pd^TE;?IVE;50(%&&&$$&()(&$$$$$%%#)>Yoqlokjjiiidc`^\[YWUTTRQONLKKIHGGJJLLMNOPRTUVWY\^`abcddhifeebVlcWK<33=L@2,*('&%%%')*)'$$$$$$'% &4Qhmnkjjjiieba^\[ZWUUTRQONLKJIHGGKKLNOOPRSTVWXZ]`abceeehje^_aVneSDD@54432.'&'())))**)($$$$$"&(" ,Icnklkjiieca^][ZXUUURQONLKJIHGGLMMOPPQSTVWXY[^`bcdffgjkcTSZTkc[SC:8CE9*#'')/11.+*)))$$$$$"$'&&("*Sqqmlkiiedb_]\[XVVURQONLKJIHGGMNOPQQRTVWXYZ\_acdffghjj_JDQOdacZLF=8>;0'%)1:<6/+('''$$$$$$#"#$)!5Wmomkjhfeb`^][YWVURQONLKJIHGGNNOQRRSTVXYZ[]`bdefghjki\B6FGYZe^QSMA:6-&)0:FD6,*(%%&$$$$$$#"$$"#&5hqnljhfdc`^]\YWVVRQONLKJIHGGOOPRRSTUWXZ[]_acfghijojmS828,-/.9K[ry__cf[X\RGI@0)%'&&%$$$%%&&&%$$%#$%%8cpklifedba^[ZWUTRQONLJIHGFGPQRSTUVXZ[]`bdfhijklmlqd7+-03;HZnsn_RNV``TC>6--***)((&&&&'&&%%$%#$&"$Ejlhigfeba_\ZXVTRQONLJIHGFGQQRTTVXY[]_acfhijklmnmra4,,/3:IZfvtYWRD7:ID;1*,)(((((&&%$$%&%$$$#$&#,Wmijigecb_][XVURQONLIHGFEEQQRTUWXZ\]`bdgijkkmnomp\2++06Dawqu`TI@<27=4.*&++,./-,*('&%%$$#$%$&%&Alokigfcb`][YVUSQONLIHGFEDSTUVWXXZ]^aefhjklmnnonpV124<>[uriTFC:9;63//8??@C952/,)'&'%$%%#$%$6koljhfdba][XVUQPNMMJIHFECUUVXYXY[^`bfgijlmnnooqpS3:4.,+(%%%$$$#-gpnkjgeca_[XWUSPNMMJIGFECVVWYYZ[]`aehikmnoppqrriI0>;?l~wrmdXND940.*&&%%$$#+frokjhfdb_\YWWURNLKJIGEDBVWXYZ[\^abfijlnoqqrrrupN1C@N~xn`SG?940+'&&%%%#/hroljifdc`]ZXWWSOLJIHGDCBVWXZZ\]_bcfjkmopqrsssuvS/CDYwgYLC=72,''&&%%$5lqolkifec`]ZXYZUOKJIGFDCBWXYZ[\^`cehkkmopqrsstuvS1AEaþynaSF>:4-)'&%%%#9nqpmligdca][XWVSOKIIGFDCBWXZ\]^_adgjklmnoqqrstwxX:3,*'&%%&"@qsromjgeda][XTQPMKIHFECB@Z[]^`abcgjmnoqrsttvwxzxgI9Iuÿ}yrdVMA91)('%%%&#Ctrrpnkhfea][XTQPMKIGFDBA@[\^`abcdhlnoprrsuvwxyx{mH7Ft}xl]SOC90'''%%%&#Fvrrqnkhfda]\XTQOMKIFEDBA?\]^`acdehlnpqrstvvxyyx|tJ5Cqſwi[RL@80+*'&%%&#Ivsspnlifea]\YTQPMKIGFDBA?\]_abcegjlnprstvxyyzz}yyL2?op`WPH@4,,+)('%% Oxxspnlifdb_\YVRPMJHIHECA?]^`acdehjlnpqstvxyyzz{yzO1Evxk]SMF>4,++)('%%$Tyxspolifdb_\YVRPMJHHGEB@?^_acdefhjlnpqstvxyyzzzy{T0Xxl_WOE<4.-+)('%%([yvtpnlifdb_\YVRPMJHHFDB@>_`bdeghiklnpqstvxyyzzzy{Z4pƿwl`VNC<50/,(('%%)ayutpnlifdb_\YVRPMJHGECA?>aacefhijkkmpqstvxyyzz{z{`;ýyocWN?83.-+)('%$(dxsupnlifdb_\YVRPMJHFEC@?>abdfghjjklmpqstvxyyzz|zzd@{uk]PE:4/*)))('&$'evtvpolifdb_\YVRPMJHFEB@>>bbdghiiklnprsuwxxyz|||~yq<~kiqy|om^E:-00-&(*&''&!.oyxvqpliged`]ZWRPMJHGCA@;;bceghiikmnpstuwxxyz||~zp?~sWVTNVN>>Z|taTB7()&))+-&#'''& 2vwquspligec`]ZWRPMJHGCBC?DG@=5-)(()(&&2$1kwspliged`]ZWRPMJHFDEHGFdegijjkmoprtuwyzxyz||zohtaMCO`lT2,24AI@664;>7)$)))(%)+,[uspligec`]ZWRPMJHFDEHGFdegijkkmoqrtuxzzxyz||~|n}oiZFBR`fl7(10=abJ14.+2;1&)))''+**[yrpliged`]ZWRPMJHFDEHFCefhjkmnprstvwxyz{||}}~~q]lrg8g}jW0*.-=yH?=5./980)'*&'('*Tzspnkhgda_[VSQMJGFECA@=eghjknoqrtuvwyz{||}}~~~onɂSLw~xR1*/4GIBE@5/340)(*&&(+(Rxrqnkhgda`\VSQMJGFEB@?J]psrfXLD=70,-'(/6oxtsqnjggdb_]YUSOLIGEC@>;hiknorstvwxyy{|}}~zŽM-,-1;GYiooi_UKA:0,-)),6oxurqnjhfeb_]ZUSOLIHFC@>ijloqssuwxyz{|}}~~ļQ0+-/4@N[djibXNC8-*,()'Jsvutsoligeb_]ZVTPMKIHEB@?ikmoqstvwyzz{}}~~{ýR2*,-13*),))+dzwtutpljgec_]ZWTRNLLJGDB@klnqrttvxzz{|}~~Y6*,,-7?JWbgcYJ91,,)')0izwuutpmjgdb_]\[WSNLKJHEB@kmoqsttvxzz{|}~»ƭc6,,,,4;HU^a_WG6/(-*)(2kyxwutpmjgdb`]]]YSNJKJHEB?kmoqstuwxz{{|}~[0+-++/9HSY\YPA3/'(&$!@s{twuspmjgeb_\[XUQMJJIHDA@kmoqstvwy{{|}~|sS+*.++/;JSUWSJ=2-)+%2Bf}|vvutpmjgec_\YTROLJIHFC??kmoqsuwxz{||}zl]bD)*.,/5?LRSSOD92+).)Ms{zyywutpmjhgc_[XSROKIHGEA>=kmoqsuvxz||}~}jÿs9'*-.49AKOPOI>4/,,,&R{|wxyxuspmjhgc_[XUSOKIGFDA>DIKMJC91,*)&+_{||xxvtpmjhgc_[YWTOLIFEC@<:noqstwz{|~~hwogK0-0=CFEBFB<71+)*&1j|{|}|{wtplihfc_[YXTOLKFDC@;:opqstwy{|~~mmº}{hN.'+:@CB>;:74/+)():u{}~~}{wtplhfdb_][YVQNMKGC@>@oprtuwy{|~~ve{{i^LxuQ8514;?@<5320-++&'C{}|wspkhecb`^]ZWTQQOJC?AEpqstuwz{|~~cxxyrfEskH=0,49<91..-+*+%$O}}{vsokhdba`_^[XUSRPMD>BFprsuvxy{|~~eu{^ybQ@788:8/,-,+*)%&a}~~{yurnjgeca`_]ZWTSSONE=@Cqrsuvxy{}~~gv^YH9A@@=2-,,+*(%/rz~~~}zxtrnjgedb`^\YWTSSNOF;pqtvxyz{|}~zfriquwxn[RWYQB0.5NdY9-+('(('S|~}{ztqnjhecb_ZWTRNMMHFC><;prtvxyz{|}~byt~lL0/8Sh[9,,*(' 5j~~}{zurokheb`\WTSOKIHDC@=<:qruwyyz{|}~kkij}|y[A03;KYN5*,.+%K}~}{yusoliea_ZUSRNKHGDB@>=;rsuxyyz{|}`uZH:7;@E?/)+,*%1f~~~|{zuspljeb_ZUROMJHHECA>=;rsvxzzz{|}Zlkb]TD=<<<7,,+&'%G{~|~|{zvtpmjfb`[UQLJHGGDC@=;9qsvxyz{|}~tRp}heWZYPMC;54/++(+!/n{{}zytroljie`\VPNMJHGCA@<;:qtwyyz{|}~\Q]OOEHOSSE<43.+.%$ >z~}zytqolihe`\VPOMKHGCA@=;:ruxy{{|}~tG`oiffimpdKA86.*'$%!C{~}~}{xxsqnkihe`]WPNMJHGCA@=;:swy{|||~~k>gqXI>8.'!&' C}}{~|zxvrqnkhgd`]WQMLJGFCA@<;:uwz|}}}~iNnydRH>7-%$&#"Ax~}{ywurpmjhfc`]XQMLIGECA@<;:ux{}}}}~zQrqVK@63+%$!&,)Ov~|zxvtqpmjgfb_]YRLKIFECA@=;:vy|~a}|ZlviQ>40-($#$*-",Z~}{{zwronljgeb_\WRNJHFEB@>;99vy|~~~~r,m]nwj^K8-,)%##'+*'"4l~}{|zvqmmmjhfb^\VQNIHGDA?=:98vx{}~~~~~LpeYaufXL>0)'&%$%(**'! E{|zzytpnnmkifa^[VQMHGEC@?<:87ux{}}}}}~~w+o[;Rjsrf[WOE?6+&&'((()*)'%$,kzyxvronnmlif`][UPMGEDB@><987uwz|}||}}~F'hbB=JG:681/1.'&()*+***)'#'G}{xvspnmmljhd`]ZUOKFDCA?=<976tvz|}|||}~W+-ivl]J@<<7-,+&&()++++*('$%#/ozvuqnmkkkhfd`\ZUOJECB@>>;976tvyzz{{|}~f--,exaTA30.'&'*+--+)''%%'U|xqmnmkiihd`]ZXRMHEB@?=<9765tvxxxz{|}~x<&/+X{pP6.+)&',-..+)'&%%":rtnnnikfaca]ZWUQJEDB?>;:8655tvxyxz{|}~L'1+-!BnH51-*(*///.,*'''()Uyplljhdbbb]XUTOIEDA?=;98654tvxyxz{|}~e0&1-/%,g?541-,/320/-*()'&$$7ahnlg_beb\YVSQLGDB@=<:97544tvxyxz{|}~v=*0,//("pc>72/004761/-+)*'#)(#-=NZafe_YXWSQOJDCA?<;987543tvxyxz{|}~ucF+/1,/-*"QM7:55337:82/-+)''&('" 1JX^^XWVROMHCA@>;:986432tvxxxz{{}~pY;,*//,.-+,$<{O?A;855:<920/,*'')%$%#&$!".@UZTRQNKGBA?=:8875432suwwwy{{}~}w]>0+,...//-,,#-oiTKG>77<>7210.,*(('&&$$$$$#'6JWWQLGCA@?<97665332stvwwz||||{{xk]M=-+.000////.,)$*VjYOD89==8200.-+)('&%$$$$$&&%+?JIGDB@?=;::765322rtvwvxxy}wgM8.-)).+/0,+./00.-)((:z{hVG:<><8210/0.*)'&%$$$$$%&$"#'0=:777654321qsuvuw{}ypdP;.,,*-,+.-.-)+/000.-*+(-_xaL<@@;8421252+*(&%$$$$$%"#&" $)19==<:86543211qsuvvyvgP;.*+.-+-..,)***-/0011/-)+(*I|w\G>CA;76435:5,+(&%$$$$$%""'()% *37:;96543110ptvtrbK3%&+,,..+-+-0.-*,0.-1110-()'+:grUB?EC:79757>7-+)&%$$$$$"')%###$%$$*1664443100qriT>-*,,+,-,,+++++,,/../1///0/.*)*(,R~{iSKJPJ::CC:9D3*+(%##$%$######$$%%&%"%)044320/.bP9,)*+--+,,,++*+++,,--,-///00/.*(+),Bhwj[Za\G8>II=9C1*+(%##$%$######$$%%&&%%&(*/000/.4,$%,,+--++,++**+++,-,++,-./00/.)'+)*6T~yofjseE7BOP@9B/++(%##$%$######$$%%&&'%##$),.//. \ No newline at end of file diff --git a/examples/person_detection/sample_images/sample_images/image3 b/examples/person_detection/sample_images/sample_images/image3 new file mode 100644 index 0000000..9afbafa --- /dev/null +++ b/examples/person_detection/sample_images/sample_images/image3 @@ -0,0 +1,3 @@ + !"###$$$$$$$$$$$$$$$##"  !"#""#$&&&&%$#"! !!! !"#$$$$$$$$$$$$$$$$####"!  !"###$$$$%%%%%%%%%%%$#"!!!! """#$$%&')))('&&$$""""""!!"#$%%%%%%%%%%%%$$$$###""!  !"###$$$$&&&&&&&&&&&%$#"""""#$%%&'())++++**)''&%$$$#""#$%%&&&&&&&&&&&$$$####""!  !!"##$$%%&'''''''''&&%%%%%%%&''()**,-////.-+**)('&&%%%%&'''''''''''&&%%$$##"!!  !""#$$%&''())(((((((((())))*++,-../12444431///.-+*)())))))((((((()(''&&%$$#"!!  !"$$%&&'(()*++++++*++++--,./013345579::::97655430/.-,-,,,,+*+++++*)(((&&%%$#!!  !"$%'''())*+,,,-,--.-..011245689:;<=>@@@@?=<;:986542110///.----,,++**)(''&%$"!  "$%'()**+,-.../0/01112345789;<>@ABCCDGGGFEDCA@??=;:9864432110/0/...--+*))(&%$"!  !!#$&')++,--/0023444456688:;=?@BDEGHJJKLNNNNLLKIHGFDBA?><:9876544443211/-,++*('&%#!  !!#$&')*,--.02335788789:;<=?ACEGIIKMOOQRRTUUSRRPNMNLIIGECA@>=<:9878765432/.--,*)(&%"! !"##%&(+,../234678:;<;=>?@BDFHJKOOHJNY[]XWV][XVWZZXRGKOKKJHFDA?>><;<:98876320/.,+)'&$" !"$%&')+-/0134579:;<>?@ACEFHIKNPRRPNTRd{cj`_^alh{bQOPQQQOMKIGEDB@??=<;:9864310.-+)(&$#"!  !!"$&')*,.0234578:<=>?ABEFHJLNOQTVYUQUW_SrzqihqzpU_YSSWWTQPPMKIGFDB@>>==;976420/-+*)(&$#""!"$%&')*+-.034678;=?@AACFHJKMOQSUWWUZXQ`YHQirugTFV_SZWTTTUSQPNLJHECBA@?><986421.,,+)(&%#"%'(*+,./12478:;=@BDDEFHKMOPRTVWYZYVWhhmZVa_{|}b`X\meiYXZZYXVTSQPNKHFEDCC@><:86530/.-+)'&%(*+-/12568:<>?ADGHIJJLOQSUWXZ[\]]\ZYmwkY]QPSmvxjWOO[[jxmUXZ[^\[YXVUSQOKJIIHFC@><::854310,+)(+,.02469;=?@BCFIKLNOORTVWY[]]_ace[_pde^NE;4<\zlkgjt^=3:DPbfdna[dgd`^\ZYXVTRQNMLKIEBA??=:97420.,*-/0258::864103468;=@DFHKST`fb_]bib_``cikomfk]QVNWN\OSJ>ZQSXQKGU[QR\ADVOZPXOWQ\lgkojfba`_che]\`h`RPKIFC@=:96434579<@CHGIPH6uylgkgoksopn[cbOMT=HYAR_RUbu[WgdZYxdUPaR?TJ?XMKabZktsoinhghnvv3HSMGED?;9865679;>BEIIOZ7 -pywl{pl~TCLF][FHMKHTs]^```ml\`a[_nSJOMGEZZIICXnp|jwv~o-4WQKHEA=;:8789;=@DGJLV\-0l{wykP@FAMUKEVZWU\X_o`WPQXaiaZ^RXWZCKSQ=;:<=?ADHLPQ]S6HQI:3Ropu~}xdJSD@ACFJMK^rJ0>QMD8?Wjgen{zvyl]TS?8P?)9>G;C::HJA=;?HD:@A>E?8)EO@ABDGKOP]pR839CF?@8KU[^uvof^Z9>8=K7/8;<8B9ANB;ADOB:A8:7326M=5:9\bbmqw[\UI9<=HB26>Sp^QOJGCBA@CCDEIMPTjxRDNKJ>12.46N[gl{heQE86/?A>?4A8:FC228GQefzjh\N72153=IJP@OyhSPLHEDDCFFGHKOSXjp=;F@860#!$#<\T{v||hg_L53/+0EmjXRNJGFEEHIIKMQT\sz<32++,+!3DIm}|k`WMI=,038AJZBJ??9988>:@>FA[JB432,:LQU`l~lHE1%',.,2/F@B/>B/@>H>FX[BMIF80$ "9XivhXRSXhnvxktrRWMUFSTCTNUOtsnwsmeXTMUlz~fW>$ %,:>-1oj]XTQPONMPPPQSWZ_ku6+;5(&ITe|~}yvpjuqjr{~~y~zfUI& '47-;pm`ZVSRRQPTTTTUY]bkx=13) 3RQf~~{dRP3'12!=tn`]YUTTTTVVVUW[_dnzC!$1  =RPluzgTU;# + +.' Ewoc^ZWVVVVXXXXY]aeo{R'0. >\E`kr¸{sh`G[; !.-(Oxof`\YXXXXYYYYZ^bhq{S 082"2POZyx|²¯®yxYJX/ 380#Typgc^ZYYYYZZZZ[`djs{\"",0$("1ZLXqwsutsqktzu}qwqWHY/ )#-.$#]yrhe`\ZZZZZZZZ]adiszo',2(&&$9;:;>>Ru¯tOA=:>:::9?KJQ^eVKPV]disshe^Y_mvxwtrqqqrrrrrsuwzvh]\_a_hkgbXWTOOYif\XTG>@A[rs]=AJV\[\ba[^cfehjnoomd^e|y|~xxxvyvxx}|w|d\hmmnnigjgb\[`a\[\VG@BBBNk}|zywwwxxxxyz{{nLBBA@EC@DR]a_`abdfhptttptn|r`m}|iflrnhfhz}}m_pyqqtssrrjdedb_^_]RCBEC@AABOn~|zxxxxxyyyyyzzufMD?<:?:9AMTV^a_`gjmttrp{}||}xih]fZUWVKKWWW_g\gn{}|yosuvpge`aa]ZTJ>9;=;>BKQRRWZ]_ciosvxzxmbC-#&!!($0Egoy{wwsnied_YXVQNJBB>86;?Karvwyzzzyyz{zyxwtdF358;<:>IRQQUZaedfhnw{xlYMCMMFJ[l~}y{uokfcf`[USTSJ?9;;733Jftwxzzzzyyz{zyxwvlN44:82/4;BIPUXZ[]cimw}uqmx}~yse]WTTV^gsy|mr}xtkhc]WZ]UOKF:2138:37Rjuxz{zzzyxyzzzyzzpX:42,,-/2;EJMPUXZ^bekpusg`o|tnmmlk\QTRM`kpkkqwp\gwzvpjfb_\XTOMMG=30..021ACBCGLQT[ckpp||tkeZbeOQPOOLNOKMTVda\`lv|wqkigZSQLHABCA?<6/-+/1?\z}}}}|{zzyxyz{|}bA4..0/01357:@EKJNX]`lqspg`X[_bWHOFEEEOKYaa[Zagltula\YNLKEA=94320/../4B`}{zyyyz{|~|Q:2.-)+-+,-08>CGKPTZZ_c]WQUXX_[S[KLKNZQ[_YUUUXZ^a\TSSLFC=94/),.,*+/28Qy~|{zzz{{|cD5/-,--*),.27=DHKMKNQLLNORUU\b^WRTSUXYb\QVQMMMORPKKMIC>83--+-.-+,04Cd~||{{}|{|~w\=200-*((+,.38=94/+*((*-.25;Vy~{{}}~}}}sJ971.+*+-./13358;>@BBDHJKJHIMPRWXXUQPNIIJKJGEDB@AA:421.--,**+.04;No~}~~~}]E81/,+-.//.-/26889;>BEGECB@AHMSTURLGCABBEGEC?=;9642///0/-,+,/17Aa~~~~pS>420./011111234578<=;;?><77?FIJJJF>78;<=>>><97532222220/./135<986569! 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 HT*CYxJ*hL| literal 0 HcmV?d00001 diff --git a/examples/person_detection/sample_images/sample_images/image5 b/examples/person_detection/sample_images/sample_images/image5 new file mode 100644 index 0000000000000000000000000000000000000000..480902801442e8f42e530b8955c6084a161723a3 GIT binary patch literal 9216 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 literal 0 HcmV?d00001 diff --git a/examples/person_detection/sample_images/sample_images/image7 b/examples/person_detection/sample_images/sample_images/image7 new file mode 100644 index 0000000000000000000000000000000000000000..860857e32e6e2f271dafa7312ff579388e7790f7 GIT binary patch literal 9216 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"/Xjljkkkjhea_]ZWVUTSSSSSSSROG=4+#FHJKMOQSVY]_beea^WPJB:40+'%#$%(++'&,2BBGO:,!Dfnjmmmljgdb`]ZXWVUUUUUUTSPG=4+#GIKLNPRTW[^acfeb_WQJB:40+'%#"$&&'! -/BHZ\B,*Ypopoomkifdb_\ZYXVVVUUUUTPG=4+#GIKMOQRUY\_bfhgdaYRKC<61-*(&$'*(# *,:DXR0 &*##'Cjoppomkjhfc`]\[YXWWWWWWUPG=4+"GIKNPQSVY]`cgiifb\UNG?:61,*())'%&$3@VK4' #'!&5.%-_nppomlkigea_^\ZYXWXXXXVQG=4+"GILNPRTWZ]adgjlie_XRLE=8320/0*##+->TV9-!###""&5D<-! Kloooonmkigda`^\[ZYYYXXVPG=4+"GILOQSUX[^aehknkgb[UPIEA=<;97,-,5JcN<%(((&(-19=HOL<-(! ,bonnqpnljifda_]\\ZZZYWVQG=4+"GJMORTVX\_ceimnmje^YTOMKGD@?7)$*-E[YK4,;CEFACLRPOSUUK<0&!'Nmlnoqqmjigcba_^]\[ZZXTOF<2*"GJMNRTVY\`dfjmnnmgb]XTSROIDB5!%#1W_PI,'8GOQRQSVXWWWWXUH73-%):koomoqokljedb`__]\[ZWRMD:1)"GJMOQTWZ]adgjnopokea]XWUROMC.# %#BbZR@-1?KQTWY\\[[[[ZVXSF33!'(%]ppkjkmmljjfca`_^]\ZVQLB80)!GJMNRUX[]aegkopppnheb]ZXUVVE+"&+UdVO44=FPTWZ]____^_^Z[US>00'-Afmjecehgfhfcba`_]\ZUQJA7/(!HKMORUY\_bfilprsspkhebca^[WA'$!;^]UH29GOW[]__`ccccccc`YVN<9$"+)'*^heb_\bbaeeddba`^\ZUOH@5-'!IKMPSVY]_cgknqrturokhiigd`V4$"%P\_X=43+&!JLNQTWY\_cgknqsuvspnnnmjhdS)("0[_`Q79BMU[`bfkmkiikjigb]ZUNB715+ .V[[\W\\\^`bdcba_\XRKE;1*%! KMORUWY]_cfjnqtvwuqrttrolbA(?`\[G:D-""!2QTQJJOTW[^addc_[WOH@6-($!KNPRUXZ^behloruwzrsyxvwskH"%(3Z[RP;=HMV\adhlnpqqqpnkhd`_][ZR2)NFGIJMRUZ_acd_YTMD<4,&!KOQSVXZ^aehkoruwyrv{yxwrc8 *%D^RHB7EJPW]cjnpprsssspmjfba_]\V?*>C:& -==ACDHMQV\_ac^XRLB:2*$LPRTWYZ^aeikoruwxs{}{z{v_0'%S[LC<7IOUY_flpssuvuuvtqmieda__\K2?;=&"588;=AFMRW]`a]WQJA80'!MPRTWYZ^aeiloruwws~~|{ysT&')1[VH@9CNRX[`fjnrtwwwwxwsokgec``_V5=>D+-3357;@IOT\_`]VPI?6.&MPRSVX[_cfimpsuvvs|}||zpE-*5]RB:?CB6##,-/15;BJSX_^[UNF<3+$MPRTWY\`cfimpsuvvr{|{yvl;3$FWL98?MVY]_chlptvy}~~}{zvrnkhfdbaH?E?;'%)+-17>GPU]\YSMD:1*"MPRTXZ]adfimpsuvvqz}{vt`- 0$WQH09CSY]`bgkptxz}zwspmjgfeTCEC@*#"$',2:CKRYYXQJA7/'MPSUX[]bdfimpsuvupz}{ruS"))-ZPF39FX\_ceinrvz~~zvspmjifZIJAC0%!#(.6?HOVVVPI?5,%NQSUX\_bdfjmpstvvow|vprD+&=^M93INUUUOI?2)"NQTUX\_bdfimpstvwovzuvi;, L`I33DPZ^bimty{~xpbWadROEH9$#!'.9EMUTTOI>0' NQTUX\_bdfimpstvxptuuxY0#/!QY=15JSRXeltx{~eF.(/_ZJFDF&""$/;FLTSSNG<.%NQTUY\_bdfimpstvxqrsspF&(3)\T;08I?.,3K]ky~fM1 ,%3[GLBO&"'!-9ELSRRMF:,#OQSVX[^aegjmpstvxqonq`="(,2fM=/GKOPKD8*JLNRSUX[^begjmorsrfheF6"*N`H54,+[kknpZD3%7OrdN8Oiz}yyv`5QCI>, *$/;DHLLGA5(GIKNPRTW[^acfilnqsai]?1%'W^E13-J]bjnuxmT?9Hjy~hW[krtsrssqsJIC@D -#)'!+8AEIJD>3%EFHLMOQSVY\_bfikmn\eQ7'&#!\_E22;W\aglllomaYUix}|icjnigbcghloXCCBFFA;1$CDEGHIKMORUY]adefdZ]H8!'*b]D64?Y[]__[a_eb\]it|wib`\PUPSP]gi]>I9P&+0%1 )2;?CB>7-#BCCBCDFHKMPTX\^_`a\VA8#$2hXA71@SSPDDDNNL\_X_myo^\YHEE;A;DK[]9K9F2(8)2"'07:4+ @@BBCEFIJMPTX\]__cXM=4!!!8iSA83@?8/$*AN_ZNdu~fZYN: /4U]4L@:<%;03'$-37;:61'@ACEFHJLOQTX\_abdfUG;."DbND:6<.1(CJSbIUpw`YUC4)5+GZ4MG8>$976+"*04872-$DEEGIJLOSVX[^adegdTF7(!P_OH?94%:'&>yIQdHFgnZhbBf6'-N:\6!,V8NjMjG>]h[u`\lB=e- KiB:SL;)9B?5#).10+%EFGILMMQSVX[^abdd]N=4& #$RfPA>FA6,+9C&>TY\NoT@\|j^v]PRF44GB2D_lN/VM>.5CC: &*-+&!FGHKMNNQSVX[^abcc[K:2$"$&YcWBAKMME67=EYacklsW>Yx{lZotdVUMKFBG]gjX,UIA1.AF<#'+("FILMOPPQSVY\^`abZVJ71$!"2][SEBNLZ\QU[^dggiifO=X{qc\cjg]\[]ZZajmna.JNB/'=K<#!#%%GJLMOPPQSUX[]_`aXVJ7-%""<\YOFFRS_ddcfjjfknjeO=Xxja^`ddkeijjjloqlg3;TA*(;MC,! HKMMOPPQRTWZ\^``XUI7(&"#A[^QFDRYafnoquuxusmfO>Wtmdcepkpqtuwwsonji<+TA)&6JI7HKMMOPPQQSVZ\]__WTH7$("$J\\XD>NYclrsuy{{{xofO=[xodkrzztuwyxxwuqlgC$NB+#1BI>ILOOQQQQSUVZ^``]XYE6$'$Q_\RA=L[hkqsw}}{rbJ>`pdmy}{|{wyzzskhJ AH1.AL>LNQRSTUV[_`_`a^YVUF7$'#Tb]P;K\fjpw}~ubCGd{pehx}{zridQ!(J4&4ECRUXXZZ_glmoieaYNUSG."+#Zc\O<:K]ekpyw^>MkwpefxzzshbU%$B>*-BEVXZ[[\bmsttpieTJVTE( ($![^cM;9J\cjsz|T;Wqwrf_w}yqh`S&(6A1 (=E&XYZ\]`itxxxtnfQKXX@&&"&Z[iS=7IZbity}FAcn`l~xpg_Q%+1A1#%;G,YZ[[_gsz}}}xrdNMY[;& '+YWlY>7HY`grx}}8Hive^|vnf^P#,3>3$":I2##Z[[[blvz{{{{wdKOZU<(!(0WSjR@4FX^fpx~m@E_of_~|ume^O"-696#:L8(#!!'%ZZZZcpwyzyy|zbKQZO>)!*2UTlND/FU\dox~YFRKhwoehbwzsjd]N!/75:%7K=9G7&%' WWWWbrwwxxxyy_LSWK='!*2S[mJL/DRZbmw~HB6D_egL_etxqhb\M"152=)4G@!2NW?##%RRRS^mrssrrssZMTRH=($*.SXoJJ6APYakv|EJA#Ub[8C[v}wpgaZL#/137,"3BB&CcbA "$LLLNYhmnmmmmmTNUMD<*(**R[lLL8?MV`jtz[Hh,?Q]o[^y|vog_XK%.0/5.&0 HFDDP_dca_`aZ\RG@B6.2)&ERaRBR;GQXajuy{|{uojfktmzyvuyztz|}zvqkf]]I)34*1534696#1T\=HFCAM[]]]^^\TZTE?A405)%CO]TFS=FQW`hsxyxvqkfbjwotspmuwpsuxzvoif]_H*65*1429:77'&Q]<KFA=FSZZXYYWR[TD=B76:'>HZWFPAETU]fqvvooid`\chbfjnkmsrttuywnigcaG,@4*,738<:6/)RY3JF@<@KTVSRRWS\SC;?7=<%>DYTGOAETU\fpsoihb\VMN]fgYVcipprrptrljge`D0H;,-74;=@=6'MV.ID@;9AMRQRRSNXR@9;8F?!>?USGNAEST[fmmijfVJ?;=@IGDAEWceiqnqolkhg\>4K:1.65@AB=;#DL+IC?:35>FIKKLGQP?888LA">;SRFNAESSZeliieT?:;<863>@=59GL^sstrmlihZ;@Q94.56CF@5=!"25, IB;5.*,17;</]cB848/CM@:<6" !).!IC;4-(&%$%'*,9K=+.3=2(#,.OD4JNGOKX[fmjc\N;@GT`^^]XQLZjhjopkihf`23egE95:-AQA>4:!"#.!IC;4-('%#"#,0J>+.38**%.1JK2KSISGS[bkiecXE;;I[Z\WQNWckkjmomnieY&4inK?9:,@R@?.?%"!&3"JC<5.)'$",0+HA-/57$+',1CG7KVPTIPY`hgecaYN96EJMLMQ`inkklmnlfcP6jsKB=;+>Q?>/@."!!57"JD=6/)&$(;/(EF-/53 "+'&0@?6ITXROOV]fgecdee`K=@CO[dmpokkkkljf`=:isOG@=+;M?<1>:% ';5(!LD=7/)%# !7@(&DL,)0-&,(%4D=5CQ\VSMU[cgecceflndeiglttplkkjjjicR";cl]R@9+7J>83=D' )7:<.KE?91+%" )@=#$?L+%.(*.'%6E=9?O\ZTMSX`fedeghr|vqvtvyupkkkkkif[=#>`fj]<8,9IA55;J+ %5FS<JE@:3-% "7?/$"6L/$.$,0&$4C;<>K\^VORW^dddehjr~|~zyuqmkjjjd^N"'Baeo\5;.:GC458K-(4J^EID?:3,$",=3% ,N5$, ,0&#3B:@;AZ`ZLMU\_acehjuwtsokihhhaV1(C_amM,>.5CC:45F6$29LbM"HC?<4.)+46&%!$A5%).1&"2@:B96RdXCCNUY^cehkwtnqmiggdc[B)CYWf=)=//>BA42BG5:>NhW$GB><50.25,#%&$ /0$&-1'!2><60/4.(('*%& )-)#7?=A92=aS?&>CKU]`dku}}wqomje`ZL0&GPMMA)?4*6:D<'3NVXEJcb*EB@<2023-(&)+#"''&<@;@<26TQA)7>,&/7?EGIJF@@DFHKL?$7F;A=2A4+537;;-5SXfXDM+0R1>;DEBAA@?@;67/)-=F6*,B@FE9.!"%(-28>KNNOQQ="4E:@@26<.155>>47SajX>G(2W=#F>FDEFEDBC=8;4$&6E8+);??<# 090-'=;JRTSSQMJJPVXXZXXYZYWWVS6(D>>A<=).4/03ECBUmg\E>(0MU<F=CFHIIIGH>CB?*'.(*(<=KSVUUUTRQV\aaa`__^ZXYWS49>BK>A0$7440;FEYhd^H='1L\?E?BGIJJJJI@HFC6"%*8?JRXXYXTRSZ`eggfff`\Z[YT5+;CQB@:$/78/.;M\i``J<&1IY=!CBBHIKLLNIDLJG> +4BIQZ[[[YWUX^ehhgggb^[\[U4&8AIJKKHJNMLLH>#! *@ITX^acb]ZXZbehhfb`_^^]Q7 0EGLEB4'(++CKIZIWbM<*7GMO+BC@?HIJJEJPNMMLE+!&?ITX^aee_\ZYaeggeb`_^^]Q8$'DKOHG9+(().EMRKVjK=.2JMQ0 \ No newline at end of file diff --git a/examples/person_detection/sample_images/sample_images/image9 b/examples/person_detection/sample_images/sample_images/image9 new file mode 100644 index 0000000000000000000000000000000000000000..473049c4754f99d383abef194dfafdcb1de30a6d GIT binary patch literal 9216 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 F{|63-frbD8 literal 0 HcmV?d00001 diff --git a/examples/person_detection/src/detection_responder.cc b/examples/person_detection/src/detection_responder.cc new file mode 100644 index 0000000..def70dd --- /dev/null +++ b/examples/person_detection/src/detection_responder.cc @@ -0,0 +1,26 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "detection_responder.h" + +#include "tensorflow/lite/micro/micro_log.h" + +// This dummy implementation writes person and no person scores to the error +// console. Real applications will want to take some custom action instead, and +// should implement their own versions of this function. +void RespondToDetection(int8_t person_score, int8_t no_person_score) { + MicroPrintf("person score:%d%%, no person score %d%%", person_score, + no_person_score); +} diff --git a/examples/person_detection/src/detection_responder.h b/examples/person_detection/src/detection_responder.h new file mode 100644 index 0000000..d2d945f --- /dev/null +++ b/examples/person_detection/src/detection_responder.h @@ -0,0 +1,32 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// Provides an interface to take an action based on the output from the person +// detection model. + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_DETECTION_RESPONDER_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_DETECTION_RESPONDER_H_ + +#include "tensorflow/lite/c/common.h" + +// Called every time the results of a person detection run are available. The +// `person_score` has the numerical confidence that the captured image contains +// a person, and `no_person_score` has the numerical confidence that the image +// does not contain a person. Typically if person_score > no person score, the +// image is considered to contain a person. This threshold may be adjusted for +// particular applications. +void RespondToDetection(int8_t person_score, int8_t no_person_score); + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_DETECTION_RESPONDER_H_ diff --git a/examples/person_detection/src/image_provider.cc b/examples/person_detection/src/image_provider.cc new file mode 100644 index 0000000..9e67b93 --- /dev/null +++ b/examples/person_detection/src/image_provider.cc @@ -0,0 +1,57 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "image_provider.h" + +#include "model_settings.h" +#include "tensorflow/lite/micro/micro_log.h" + +#include +#include + +static uint32_t index = 0; +static char *image_dir = CONFIG_APPOBJECTDETECTIONMICRO_DEMO_PERSON_DETECTION_IMAGE_DIR; + +// readImage read image from file /static_image/image{index} to image_data +uint8_t *readImage(int index) +{ + // read image from file + uint8_t *image_data = (uint8_t *)malloc(kMaxImageSize); + char filename[100]; + sprintf(filename, "%s/image%d", image_dir, index); + FILE *file = fopen(filename, "rb"); + if (file == NULL) + { + printf("Failed to open file: %s\n", filename); + return NULL; + } + fread(image_data, 1, kMaxImageSize, file); + fclose(file); + MicroPrintf("Read image: %s", filename); + return image_data; +} + +TfLiteStatus GetImage(int image_width, int image_height, int channels, + int8_t *image_data) +{ + uint8_t *ptr = readImage(index++ % 10); + + /* Convert from uint8 picture data to int8 */ + for (int i = 0; i < image_width * image_height; i++) + { + image_data[i] = ((uint8_t *)ptr)[i] ^ 0x80; + } + return kTfLiteOk; +} diff --git a/examples/person_detection/src/image_provider.h b/examples/person_detection/src/image_provider.h new file mode 100644 index 0000000..f379992 --- /dev/null +++ b/examples/person_detection/src/image_provider.h @@ -0,0 +1,38 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_IMAGE_PROVIDER_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_IMAGE_PROVIDER_H_ + +#include "tensorflow/lite/c/common.h" + +// This is an abstraction around an image source like a camera, and is +// expected to return 8-bit sample data. The assumption is that this will be +// called in a low duty-cycle fashion in a low-power application. In these +// cases, the imaging sensor need not be run in a streaming mode, but rather can +// be idled in a relatively low-power mode between calls to GetImage(). The +// assumption is that the overhead and time of bringing the low-power sensor out +// of this standby mode is commensurate with the expected duty cycle of the +// application. The underlying sensor may actually be put into a streaming +// configuration, but the image buffer provided to GetImage should not be +// overwritten by the driver code until the next call to GetImage(); +// +// The reference implementation can have no platform-specific dependencies, so +// it just returns a static image. For real applications, you should +// ensure there's a specialized implementation that accesses hardware APIs. +TfLiteStatus GetImage(int image_width, int image_height, int channels, + int8_t* image_data); + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_IMAGE_PROVIDER_H_ diff --git a/examples/person_detection/src/main.cc b/examples/person_detection/src/main.cc new file mode 100644 index 0000000..e08c300 --- /dev/null +++ b/examples/person_detection/src/main.cc @@ -0,0 +1,27 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "main_functions.h" + +// This is the default main used on systems that have the standard C entry +// point. Other devices (for example FreeRTOS or ESP32) that have different +// requirements for entry code (like an app_main function) should specialize +// this main.cc file in a target-specific subfolder. +int main(int argc, char* argv[]) { + setup(); + while (true) { + loop(); + } +} diff --git a/examples/person_detection/src/main_functions.cc b/examples/person_detection/src/main_functions.cc new file mode 100644 index 0000000..7c3eaae --- /dev/null +++ b/examples/person_detection/src/main_functions.cc @@ -0,0 +1,115 @@ +/* Copyright 2022 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "main_functions.h" + +#include "detection_responder.h" +#include "image_provider.h" +#include "model_settings.h" +#include "tensorflow/lite/micro/micro_interpreter.h" +#include "tensorflow/lite/micro/micro_log.h" +#include "tensorflow/lite/micro/micro_mutable_op_resolver.h" +#include "tensorflow/lite/micro/models/person_detect_model_data.h" +#include "tensorflow/lite/micro/system_setup.h" +#include "tensorflow/lite/schema/schema_generated.h" + +// Globals, used for compatibility with Arduino-style sketches. +namespace { +const tflite::Model* model = nullptr; +tflite::MicroInterpreter* interpreter = nullptr; +TfLiteTensor* input = nullptr; + +// In order to use optimized tensorflow lite kernels, a signed int8_t quantized +// model is preferred over the legacy unsigned model format. This means that +// throughout this project, input images must be converted from unisgned to +// signed format. The easiest and quickest way to convert from unsigned to +// signed 8-bit integers is to subtract 128 from the unsigned value to get a +// signed value. + +// An area of memory to use for input, output, and intermediate arrays. +constexpr int kTensorArenaSize = 136 * 1024; +alignas(16) static uint8_t tensor_arena[kTensorArenaSize]; +} // namespace + +// The name of this function is important for Arduino compatibility. +void setup() { + tflite::InitializeTarget(); + + // Map the model into a usable data structure. This doesn't involve any + // copying or parsing, it's a very lightweight operation. + model = tflite::GetModel(g_person_detect_model_data); + if (model->version() != TFLITE_SCHEMA_VERSION) { + MicroPrintf( + "Model provided is schema version %d not equal " + "to supported version %d.", + model->version(), TFLITE_SCHEMA_VERSION); + return; + } + + // Pull in only the operation implementations we need. + // This relies on a complete list of all the ops needed by this graph. + + // NOLINTNEXTLINE(runtime-global-variables) + + static tflite::MicroMutableOpResolver<5> micro_op_resolver; + micro_op_resolver.AddAveragePool2D(tflite::Register_AVERAGE_POOL_2D_INT8()); + micro_op_resolver.AddConv2D(tflite::Register_CONV_2D_INT8()); + micro_op_resolver.AddDepthwiseConv2D( + tflite::Register_DEPTHWISE_CONV_2D_INT8()); + micro_op_resolver.AddReshape(); + micro_op_resolver.AddSoftmax(tflite::Register_SOFTMAX_INT8()); + + // Build an interpreter to run the model with. + // NOLINTNEXTLINE(runtime-global-variables) + static tflite::MicroInterpreter static_interpreter( + model, micro_op_resolver, tensor_arena, kTensorArenaSize); + interpreter = &static_interpreter; + + // Allocate memory from the tensor_arena for the model's tensors. + TfLiteStatus allocate_status = interpreter->AllocateTensors(); + if (allocate_status != kTfLiteOk) { + MicroPrintf("AllocateTensors() failed"); + return; + } + + // Get information about the memory area to use for the model's input. + input = interpreter->input(0); +} + +// The name of this function is important for Arduino compatibility. +void loop() { + // Get image from provider. + if (kTfLiteOk != + GetImage(kNumCols, kNumRows, kNumChannels, input->data.int8)) { + MicroPrintf("Image capture failed."); + } + + // Run the model on this input and make sure it succeeds. + if (kTfLiteOk != interpreter->Invoke()) { + MicroPrintf("Invoke failed."); + } + + TfLiteTensor* output = interpreter->output(0); + + // Process the inference results. + int8_t person_score = output->data.uint8[kPersonIndex]; + int8_t no_person_score = output->data.uint8[kNotAPersonIndex]; + + int8_t person_score_f = + ((person_score - output->params.zero_point) * output->params.scale) * 100 + 0.5; + int8_t no_person_score_f = + ((no_person_score - output->params.zero_point) * output->params.scale) * 100 + 0.5 ; + RespondToDetection(person_score_f, no_person_score_f); +} diff --git a/examples/person_detection/src/main_functions.h b/examples/person_detection/src/main_functions.h new file mode 100644 index 0000000..2620097 --- /dev/null +++ b/examples/person_detection/src/main_functions.h @@ -0,0 +1,37 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_MAIN_FUNCTIONS_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_MAIN_FUNCTIONS_H_ + +// Expose a C friendly interface for main functions. +#ifdef __cplusplus +extern "C" { +#endif + +// Initializes all data needed for the example. The name is important, and needs +// to be setup() for Arduino compatibility. +void setup(); + +// Runs one iteration of data gathering and inference. This should be called +// repeatedly from the application code. The name needs to be loop() for Arduino +// compatibility. +void loop(); + +#ifdef __cplusplus +} +#endif + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_MAIN_FUNCTIONS_H_ diff --git a/examples/person_detection/src/model_settings.cc b/examples/person_detection/src/model_settings.cc new file mode 100644 index 0000000..2d4ad1e --- /dev/null +++ b/examples/person_detection/src/model_settings.cc @@ -0,0 +1,21 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "model_settings.h" + +const char* kCategoryLabels[kCategoryCount] = { + "notperson", + "person", +}; diff --git a/examples/person_detection/src/model_settings.h b/examples/person_detection/src/model_settings.h new file mode 100644 index 0000000..f94d58e --- /dev/null +++ b/examples/person_detection/src/model_settings.h @@ -0,0 +1,35 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_MODEL_SETTINGS_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_MODEL_SETTINGS_H_ + +// Keeping these as constant expressions allow us to allocate fixed-sized arrays +// on the stack for our working memory. + +// All of these values are derived from the values used during model training, +// if you change your model you'll need to update these constants. +constexpr int kNumCols = 96; +constexpr int kNumRows = 96; +constexpr int kNumChannels = 1; + +constexpr int kMaxImageSize = kNumCols * kNumRows * kNumChannels; + +constexpr int kCategoryCount = 2; +constexpr int kPersonIndex = 1; +constexpr int kNotAPersonIndex = 0; +extern const char* kCategoryLabels[kCategoryCount]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_MODEL_SETTINGS_H_ diff --git a/main.c b/main.c new file mode 100644 index 0000000..3dd0c08 --- /dev/null +++ b/main.c @@ -0,0 +1,8 @@ +#include +#include + +int main() +{ + uk_pr_crit("Hello World~~~~~~~~\n"); + return 0; +} diff --git a/scripts/setup.sh b/scripts/setup.sh new file mode 100644 index 0000000..2c0110b --- /dev/null +++ b/scripts/setup.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +test ! -d "workdir" && echo "Cloning repositories ..." || true +test ! -d "workdir/tenon" && git clone git@gitee.com:tenonos/tenon.git workdir/tenon -b master || true +test ! -d "workdir/libs/compiler-rt" && git clone git@gitee.com:tenonos-mirror/lib-compiler-rt.git -b RELEASE-0.16.0 workdir/libs/compiler-rt || true +test ! -d "workdir/libs/cxx" && git clone git@gitee.com:tenonos-mirror/lib-libcxx.git -b RELEASE-0.16.0 workdir/libs/cxx || true +test ! -d "workdir/libs/cxxabi" && git clone git@gitee.com:tenonos-mirror/lib-libcxxabi.git -b RELEASE-0.16.0 workdir/libs/cxxabi || true +test ! -d "workdir/libs/musl" && git clone git@gitee.com:tenonos-mirror/lib-musl.git -b RELEASE-0.16.0 workdir/libs/musl || true +test ! -d "workdir/libs/unwind" && git clone git@gitee.com:tenonos-mirror/lib-libunwind.git -b RELEASE-0.16.0 workdir/libs/unwind || true +test ! -d "workdir/libs/tflite-micro" && git clone git@gitee.com:tenonos/lib-tflite-micro.git -b master workdir/libs/tflite-micro || true +test ! -d "workdir/libs/flatbuffers" && git clone git@gitee.com:tenonos-mirror/lib-flatbuffers.git -b master workdir/libs/flatbuffers || true +test ! -d "workdir/libs/gemmlowp" && git clone git@gitee.com:tenonos-mirror/lib-gemmlowp.git -b master workdir/libs/gemmlowp || true +test ! -d "workdir/libs/ruy" && git clone git@gitee.com:tenonos/lib-ruy.git -b master workdir/libs/ruy || true +test ! -d "workdir/libs/kissfft" && git clone git@gitee.com:tenonos/lib-kissfft.git -b master workdir/libs/kissfft || true -- Gitee