From b473e92d092e9ae1bb362bc3191fdc512cb71c0c Mon Sep 17 00:00:00 2001 From: WenmuZhou <572459439@qq.com> Date: Fri, 17 Jun 2022 09:12:46 +0000 Subject: [PATCH] add tvm --- deploy/tvm/.gitignore | 5 + deploy/tvm/Makefile | 129 +++++++++++ deploy/tvm/README.md | 100 +++++++++ deploy/tvm/arm-none-eabi-gcc.cmake | 79 +++++++ deploy/tvm/convert_image.py | 102 +++++++++ deploy/tvm/corstone300.ld | 295 ++++++++++++++++++++++++++ deploy/tvm/imgs_words_en/word_10.png | Bin 0 -> 5738 bytes deploy/tvm/imgs_words_en/word_116.png | Bin 0 -> 74135 bytes deploy/tvm/include/crt_config.h | 26 +++ deploy/tvm/include/tvm_runtime.h | 55 +++++ deploy/tvm/requirements.txt | 3 + deploy/tvm/run_demo.sh | 152 +++++++++++++ deploy/tvm/src/demo_bare_metal.c | 78 +++++++ 13 files changed, 1024 insertions(+) create mode 100644 deploy/tvm/.gitignore create mode 100644 deploy/tvm/Makefile create mode 100644 deploy/tvm/README.md create mode 100644 deploy/tvm/arm-none-eabi-gcc.cmake create mode 100755 deploy/tvm/convert_image.py create mode 100644 deploy/tvm/corstone300.ld create mode 100644 deploy/tvm/imgs_words_en/word_10.png create mode 100644 deploy/tvm/imgs_words_en/word_116.png create mode 100644 deploy/tvm/include/crt_config.h create mode 100644 deploy/tvm/include/tvm_runtime.h create mode 100644 deploy/tvm/requirements.txt create mode 100755 deploy/tvm/run_demo.sh create mode 100644 deploy/tvm/src/demo_bare_metal.c diff --git a/deploy/tvm/.gitignore b/deploy/tvm/.gitignore new file mode 100644 index 00000000..faeba235 --- /dev/null +++ b/deploy/tvm/.gitignore @@ -0,0 +1,5 @@ +include/inputs.h +include/outputs.h + +__pycache__/ +build/ \ No newline at end of file diff --git a/deploy/tvm/Makefile b/deploy/tvm/Makefile new file mode 100644 index 00000000..cf7d375b --- /dev/null +++ b/deploy/tvm/Makefile @@ -0,0 +1,129 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +# Makefile to build demo + +# Setup build environment +BUILD_DIR := build + +ARM_CPU = ARMCM55 +ETHOSU_PATH = /opt/arm/ethosu +CMSIS_PATH ?= ${ETHOSU_PATH}/cmsis +ETHOSU_PLATFORM_PATH ?= ${ETHOSU_PATH}/core_platform +STANDALONE_CRT_PATH := $(abspath $(BUILD_DIR))/runtime +CORSTONE_300_PATH = ${ETHOSU_PLATFORM_PATH}/targets/corstone-300 +PKG_COMPILE_OPTS = -g -Wall -O2 -Wno-incompatible-pointer-types -Wno-format -mcpu=cortex-m55 -mthumb -mfloat-abi=hard -std=gnu99 +CMAKE ?= cmake +CC = arm-none-eabi-gcc +AR = arm-none-eabi-ar +RANLIB = arm-none-eabi-ranlib +PKG_CFLAGS = ${PKG_COMPILE_OPTS} \ + -I${STANDALONE_CRT_PATH}/include \ + -I${STANDALONE_CRT_PATH}/src/runtime/crt/include \ + -I${PWD}/include \ + -I${CORSTONE_300_PATH} \ + -I${CMSIS_PATH}/Device/ARM/${ARM_CPU}/Include/ \ + -I${CMSIS_PATH}/CMSIS/Core/Include \ + -I${CMSIS_PATH}/CMSIS/NN/Include \ + -I${CMSIS_PATH}/CMSIS/DSP/Include \ + -I$(abspath $(BUILD_DIR))/codegen/host/include +CMSIS_NN_CMAKE_FLAGS = -DCMAKE_TOOLCHAIN_FILE=$(abspath $(BUILD_DIR))/../arm-none-eabi-gcc.cmake \ + -DTARGET_CPU=cortex-m55 \ + -DBUILD_CMSIS_NN_FUNCTIONS=YES +PKG_LDFLAGS = -lm -specs=nosys.specs -static -T corstone300.ld + +$(ifeq VERBOSE,1) +QUIET ?= +$(else) +QUIET ?= @ +$(endif) + +DEMO_MAIN = src/demo_bare_metal.c +CODEGEN_SRCS = $(wildcard $(abspath $(BUILD_DIR))/codegen/host/src/*.c) +CODEGEN_OBJS = $(subst .c,.o,$(CODEGEN_SRCS)) +CMSIS_STARTUP_SRCS = $(wildcard ${CMSIS_PATH}/Device/ARM/${ARM_CPU}/Source/*.c) +UART_SRCS = $(wildcard ${CORSTONE_300_PATH}/*.c) + +demo: $(BUILD_DIR)/demo + +$(BUILD_DIR)/stack_allocator.o: $(STANDALONE_CRT_PATH)/src/runtime/crt/memory/stack_allocator.c + $(QUIET)mkdir -p $(@D) + $(QUIET)$(CC) -c $(PKG_CFLAGS) -o $@ $^ + +$(BUILD_DIR)/crt_backend_api.o: $(STANDALONE_CRT_PATH)/src/runtime/crt/common/crt_backend_api.c + $(QUIET)mkdir -p $(@D) + $(QUIET)$(CC) -c $(PKG_CFLAGS) -o $@ $^ + +# Build generated code +$(BUILD_DIR)/libcodegen.a: $(CODEGEN_SRCS) + $(QUIET)cd $(abspath $(BUILD_DIR)/codegen/host/src) && $(CC) -c $(PKG_CFLAGS) $(CODEGEN_SRCS) + $(QUIET)$(AR) -cr $(abspath $(BUILD_DIR)/libcodegen.a) $(CODEGEN_OBJS) + $(QUIET)$(RANLIB) $(abspath $(BUILD_DIR)/libcodegen.a) + +# Build CMSIS startup code +${BUILD_DIR}/libcmsis_startup.a: $(CMSIS_STARTUP_SRCS) + $(QUIET)mkdir -p $(abspath $(BUILD_DIR)/libcmsis_startup) + $(QUIET)cd $(abspath $(BUILD_DIR)/libcmsis_startup) && $(CC) -c $(PKG_CFLAGS) -D${ARM_CPU} $^ + $(QUIET)$(AR) -cr $(abspath $(BUILD_DIR)/libcmsis_startup.a) $(abspath $(BUILD_DIR))/libcmsis_startup/*.o + $(QUIET)$(RANLIB) $(abspath $(BUILD_DIR)/libcmsis_startup.a) + +CMSIS_SHA_FILE=${CMSIS_PATH}/977abe9849781a2e788b02282986480ff4e25ea6.sha +ifneq ("$(wildcard $(CMSIS_SHA_FILE))","") +${BUILD_DIR}/cmsis_nn/Source/libcmsis-nn.a: + $(QUIET)mkdir -p $(@D) + $(QUIET)cd $(CMSIS_PATH)/CMSIS/NN && $(CMAKE) -B $(abspath $(BUILD_DIR)/cmsis_nn) $(CMSIS_NN_CMAKE_FLAGS) + $(QUIET)cd $(abspath $(BUILD_DIR)/cmsis_nn) && $(MAKE) all +else +# Build CMSIS-NN +${BUILD_DIR}/cmsis_nn/Source/SoftmaxFunctions/libCMSISNNSoftmax.a: + $(QUIET)mkdir -p $(@D) + $(QUIET)cd $(CMSIS_PATH)/CMSIS/NN && $(CMAKE) -B $(abspath $(BUILD_DIR)/cmsis_nn) $(CMSIS_NN_CMAKE_FLAGS) + $(QUIET)cd $(abspath $(BUILD_DIR)/cmsis_nn) && $(MAKE) all +endif + +# Build demo application +ifneq ("$(wildcard $(CMSIS_SHA_FILE))","") +$(BUILD_DIR)/demo: $(DEMO_MAIN) $(UART_SRCS) $(BUILD_DIR)/stack_allocator.o $(BUILD_DIR)/crt_backend_api.o \ + ${BUILD_DIR}/libcodegen.a ${BUILD_DIR}/libcmsis_startup.a ${BUILD_DIR}/cmsis_nn/Source/libcmsis-nn.a + $(QUIET)mkdir -p $(@D) + $(QUIET)$(CC) $(PKG_CFLAGS) $(FREERTOS_FLAGS) -o $@ -Wl,--whole-archive $^ -Wl,--no-whole-archive $(PKG_LDFLAGS) +else +$(BUILD_DIR)/demo: $(DEMO_MAIN) $(UART_SRCS) $(BUILD_DIR)/stack_allocator.o $(BUILD_DIR)/crt_backend_api.o \ + ${BUILD_DIR}/libcodegen.a ${BUILD_DIR}/libcmsis_startup.a \ + ${BUILD_DIR}/cmsis_nn/Source/SoftmaxFunctions/libCMSISNNSoftmax.a \ + ${BUILD_DIR}/cmsis_nn/Source/FullyConnectedFunctions/libCMSISNNFullyConnected.a \ + ${BUILD_DIR}/cmsis_nn/Source/SVDFunctions/libCMSISNNSVDF.a \ + ${BUILD_DIR}/cmsis_nn/Source/ReshapeFunctions/libCMSISNNReshape.a \ + ${BUILD_DIR}/cmsis_nn/Source/ActivationFunctions/libCMSISNNActivation.a \ + ${BUILD_DIR}/cmsis_nn/Source/NNSupportFunctions/libCMSISNNSupport.a \ + ${BUILD_DIR}/cmsis_nn/Source/ConcatenationFunctions/libCMSISNNConcatenation.a \ + ${BUILD_DIR}/cmsis_nn/Source/BasicMathFunctions/libCMSISNNBasicMaths.a \ + ${BUILD_DIR}/cmsis_nn/Source/ConvolutionFunctions/libCMSISNNConvolutions.a \ + ${BUILD_DIR}/cmsis_nn/Source/PoolingFunctions/libCMSISNNPooling.a + $(QUIET)mkdir -p $(@D) + $(QUIET)$(CC) $(PKG_CFLAGS) $(FREERTOS_FLAGS) -o $@ -Wl,--whole-archive $^ -Wl,--no-whole-archive $(PKG_LDFLAGS) +endif + +clean: + $(QUIET)rm -rf $(BUILD_DIR)/codegen + +cleanall: + $(QUIET)rm -rf $(BUILD_DIR) + +.SUFFIXES: + +.DEFAULT: demo diff --git a/deploy/tvm/README.md b/deploy/tvm/README.md new file mode 100644 index 00000000..ecd635cc --- /dev/null +++ b/deploy/tvm/README.md @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + +Running PaddleOCR text recognition model via TVM on bare metal Arm(R) Cortex(R)-M55 CPU and CMSIS-NN +=============================================================== + +This folder contains an example of how to use TVM to run a PaddleOCR model +on bare metal Cortex(R)-M55 CPU and CMSIS-NN. + +Prerequisites +------------- +If the demo is run in the ci_cpu Docker container provided with TVM, then the following +software will already be installed. + +If the demo is not run in the ci_cpu Docker container, then you will need the following: +- Software required to build and run the demo (These can all be installed by running + tvm/docker/install/ubuntu_install_ethosu_driver_stack.sh.) + - [Fixed Virtual Platform (FVP) based on Arm(R) Corstone(TM)-300 software](https://developer.arm.com/tools-and-software/open-source-software/arm-platforms-software/arm-ecosystem-fvps) + - [cmake 3.19.5](https://github.com/Kitware/CMake/releases/) + - [GCC toolchain from Arm(R)](https://developer.arm.com/-/media/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2) + - [Arm(R) Ethos(TM)-U NPU driver stack](https://review.mlplatform.org) + - [CMSIS](https://github.com/ARM-software/CMSIS_5) +- The python libraries listed in the requirements.txt of this directory + - These can be installed by running the following from the current directory: + ```bash + pip install -r ./requirements.txt + ``` + +You will also need TVM which can either be: + - Built from source (see [Install from Source](https://tvm.apache.org/docs/install/from_source.html)) + - When building from source, the following need to be set in config.cmake: + - set(USE_CMSISNN ON) + - set(USE_MICRO ON) + - set(USE_LLVM ON) + - Installed from TLCPack nightly(see [TLCPack](https://tlcpack.ai/)) + +You will need to update your PATH environment variable to include the path to cmake 3.19.5 and the FVP. +For example if you've installed these in ```/opt/arm``` , then you would do the following: +```bash +export PATH=/opt/arm/FVP_Corstone_SSE-300/models/Linux64_GCC-6.4:/opt/arm/cmake/bin:$PATH +``` + +Running the demo application +---------------------------- +Type the following command to run the bare metal text recognition application ([src/demo_bare_metal.c](./src/demo_bare_metal.c)): + +```bash +./run_demo.sh +``` + +If the Ethos(TM)-U platform and/or CMSIS have not been installed in /opt/arm/ethosu then +the locations for these can be specified as arguments to run_demo.sh, for example: + +```bash +./run_demo.sh --cmsis_path /home/tvm-user/cmsis \ +--ethosu_platform_path /home/tvm-user/ethosu/core_platform +``` + +This will: +- Download a PaddleOCR text recognition model +- Use tvmc to compile the text recognition model for Cortex(R)-M55 CPU and CMSIS-NN +- Create a C header file inputs.c containing the image data as a C array +- Create a C header file outputs.c containing a C array where the output of inference will be stored +- Build the demo application +- Run the demo application on a Fixed Virtual Platform (FVP) based on Arm(R) Corstone(TM)-300 software +- The application will report the text on the image and the corresponding score. + +Using your own image +-------------------- +The create_image.py script takes a single argument on the command line which is the path of the +image to be converted into an array of bytes for consumption by the model. + +The demo can be modified to use an image of your choice by changing the following line in run_demo.sh + +```bash +python3 ./convert_image.py path/to/image +``` + +Model description +----------------- +In this demo, the model we use is an English recognition model based on [PP-OCRv3](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/doc/doc_ch/PP-OCRv3_introduction.md). PP-OCRv3 is the third version of the PP-OCR series model released by [PaddleOCR](https://github.com/PaddlePaddle/PaddleOCR). This series of models has the following features: + - PP-OCRv3: ultra-lightweight OCR system: detection (3.6M) + direction classifier (1.4M) + recognition (12M) = 17.0M + - Support more than 80 kinds of multi-language recognition models, including English, Chinese, French, German, Arabic, Korean, Japanese and so on. For details + - Support vertical text recognition, and long text recognition + +The text recognition model in PP-OCRv3 supports more than 80 languages. In the process of model development, since Arm(R) Cortex(R)-M55 CPU does not support rnn operator, we delete the unsupported operator based on the PP-OCRv3 text recognition model to obtain the current model. \ No newline at end of file diff --git a/deploy/tvm/arm-none-eabi-gcc.cmake b/deploy/tvm/arm-none-eabi-gcc.cmake new file mode 100644 index 00000000..415b3139 --- /dev/null +++ b/deploy/tvm/arm-none-eabi-gcc.cmake @@ -0,0 +1,79 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +if (__TOOLCHAIN_LOADED) + return() +endif() +set(__TOOLCHAIN_LOADED TRUE) + +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_C_COMPILER "arm-none-eabi-gcc") +set(CMAKE_CXX_COMPILER "arm-none-eabi-g++") +set(CMAKE_SYSTEM_PROCESSOR "cortex-m55" CACHE STRING "Select Arm(R) Cortex(R)-M architecture. (cortex-m0, cortex-m3, cortex-m33, cortex-m4, cortex-m55, cortex-m7, etc)") + +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) + +SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +set(CMAKE_C_STANDARD 99) +set(CMAKE_CXX_STANDARD 14) + +# The system processor could for example be set to cortex-m33+nodsp+nofp. +set(__CPU_COMPILE_TARGET ${CMAKE_SYSTEM_PROCESSOR}) +string(REPLACE "+" ";" __CPU_FEATURES ${__CPU_COMPILE_TARGET}) +list(POP_FRONT __CPU_FEATURES CMAKE_SYSTEM_PROCESSOR) + +string(FIND ${__CPU_COMPILE_TARGET} "+" __OFFSET) +if(__OFFSET GREATER_EQUAL 0) + string(SUBSTRING ${__CPU_COMPILE_TARGET} ${__OFFSET} -1 CPU_FEATURES) +endif() + +# Add -mcpu to the compile options to override the -mcpu the CMake toolchain adds +add_compile_options(-mcpu=${__CPU_COMPILE_TARGET}) + +# Set floating point unit +if("${__CPU_COMPILE_TARGET}" MATCHES "\\+fp") + set(FLOAT hard) +elseif("${__CPU_COMPILE_TARGET}" MATCHES "\\+nofp") + set(FLOAT soft) +elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "cortex-m33" OR + "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "cortex-m55") + set(FLOAT hard) +else() + set(FLOAT soft) +endif() + +add_compile_options(-mfloat-abi=${FLOAT}) +add_link_options(-mfloat-abi=${FLOAT}) + +# Link target +add_link_options(-mcpu=${__CPU_COMPILE_TARGET}) +add_link_options(-Xlinker -Map=output.map) + +# +# Compile options +# +set(cxx_flags "-fno-unwind-tables;-fno-rtti;-fno-exceptions") + +add_compile_options("-Wall;-Wextra;-Wsign-compare;-Wunused;-Wswitch-default;\ +-Wdouble-promotion;-Wredundant-decls;-Wshadow;-Wnull-dereference;\ +-Wno-format-extra-args;-Wno-unused-function;-Wno-unused-label;\ +-Wno-missing-field-initializers;-Wno-return-type;-Wno-format;-Wno-int-conversion" + "$<$:${cxx_flags}>" +) diff --git a/deploy/tvm/convert_image.py b/deploy/tvm/convert_image.py new file mode 100755 index 00000000..747ab29e --- /dev/null +++ b/deploy/tvm/convert_image.py @@ -0,0 +1,102 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +import os +import pathlib +import re +import sys +import cv2 +import math +from PIL import Image +import numpy as np + +def resize_norm_img(img, image_shape, padding=True): + imgC, imgH, imgW = image_shape + h = img.shape[0] + w = img.shape[1] + if not padding: + resized_image = cv2.resize( + img, (imgW, imgH), interpolation=cv2.INTER_LINEAR) + resized_w = imgW + else: + ratio = w / float(h) + if math.ceil(imgH * ratio) > imgW: + resized_w = imgW + else: + resized_w = int(math.ceil(imgH * ratio)) + resized_image = cv2.resize(img, (resized_w, imgH)) + resized_image = resized_image.astype('float32') + if image_shape[0] == 1: + resized_image = resized_image / 255 + resized_image = resized_image[np.newaxis, :] + else: + resized_image = resized_image.transpose((2, 0, 1)) / 255 + resized_image -= 0.5 + resized_image /= 0.5 + padding_im = np.zeros((imgC, imgH, imgW), dtype=np.float32) + padding_im[:, :, 0:resized_w] = resized_image + return padding_im + + +def create_header_file(name, tensor_name, tensor_data, output_path): + """ + This function generates a header file containing the data from the numpy array provided. + """ + file_path = pathlib.Path(f"{output_path}/" + name).resolve() + # Create header file with npy_data as a C array + raw_path = file_path.with_suffix(".h").resolve() + with open(raw_path, "w") as header_file: + header_file.write( + "\n" + + f"const size_t {tensor_name}_len = {tensor_data.size};\n" + + f'__attribute__((section(".data.tvm"), aligned(16))) float {tensor_name}[] = ' + ) + + header_file.write("{") + for i in np.ndindex(tensor_data.shape): + header_file.write(f"{tensor_data[i]}, ") + header_file.write("};\n\n") + + +def create_headers(image_name): + """ + This function generates C header files for the input and output arrays required to run inferences + """ + img_path = os.path.join("./", f"{image_name}") + + # Resize image to 32x320 + img = cv2.imread(img_path) + img = resize_norm_img(img, [3,32,320]) + img_data = img.astype("float32") + + # # Add the batch dimension, as we are expecting 4-dimensional input: NCHW. + img_data = np.expand_dims(img_data, axis=0) + + # Create input header file + create_header_file("inputs", "input", img_data, "./include") + # Create output header file + output_data = np.zeros([7760], np.float) + create_header_file( + "outputs", + "output", + output_data, + "./include", + ) + + +if __name__ == "__main__": + create_headers(sys.argv[1]) diff --git a/deploy/tvm/corstone300.ld b/deploy/tvm/corstone300.ld new file mode 100644 index 00000000..e52b23da --- /dev/null +++ b/deploy/tvm/corstone300.ld @@ -0,0 +1,295 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +/*------------------ Reference System Memories ------------- + +===================+============+=======+============+============+ + | Memory | Address | Size | CPU Access | NPU Access | + +===================+============+=======+============+============+ + | ITCM | 0x00000000 | 512KB | Yes (RO) | No | + +-------------------+------------+-------+------------+------------+ + | DTCM | 0x20000000 | 512KB | Yes (R/W) | No | + +-------------------+------------+-------+------------+------------+ + | SSE-300 SRAM | 0x21000000 | 2MB | Yes (R/W) | Yes (R/W) | + +-------------------+------------+-------+------------+------------+ + | Data SRAM | 0x01000000 | 2MB | Yes (R/W) | Yes (R/W) | + +-------------------+------------+-------+------------+------------+ + | DDR | 0x60000000 | 32MB | Yes (R/W) | Yes (R/W) | + +-------------------+------------+-------+------------+------------+ */ + +/*---------------------- ITCM Configuration ---------------------------------- + Flash Configuration + Flash Base Address <0x0-0xFFFFFFFF:8> + Flash Size (in Bytes) <0x0-0xFFFFFFFF:8> + + -----------------------------------------------------------------------------*/ +__ROM_BASE = 0x00000000; +__ROM_SIZE = 0x00080000; + +/*--------------------- DTCM RAM Configuration ---------------------------- + RAM Configuration + RAM Base Address <0x0-0xFFFFFFFF:8> + RAM Size (in Bytes) <0x0-0xFFFFFFFF:8> + + -----------------------------------------------------------------------------*/ +__RAM_BASE = 0x20000000; +__RAM_SIZE = 0x00080000; + +/*----------------------- Data SRAM Configuration ------------------------------ + Data SRAM Configuration + DATA_SRAM Base Address <0x0-0xFFFFFFFF:8> + DATA_SRAM Size (in Bytes) <0x0-0xFFFFFFFF:8> + + -----------------------------------------------------------------------------*/ +__DATA_SRAM_BASE = 0x01000000; +__DATA_SRAM_SIZE = 0x00200000; + +/*--------------------- Embedded SRAM Configuration ---------------------------- + SRAM Configuration + SRAM Base Address <0x0-0xFFFFFFFF:8> + SRAM Size (in Bytes) <0x0-0xFFFFFFFF:8> + + -----------------------------------------------------------------------------*/ +__SRAM_BASE = 0x21000000; +__SRAM_SIZE = 0x00200000; + +/*--------------------- Stack / Heap Configuration ---------------------------- + Stack / Heap Configuration + Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> + Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> + + -----------------------------------------------------------------------------*/ +__STACK_SIZE = 0x00008000; +__HEAP_SIZE = 0x00008000; + +/*--------------------- Embedded RAM Configuration ---------------------------- + DDR Configuration + DDR Base Address <0x0-0xFFFFFFFF:8> + DDR Size (in Bytes) <0x0-0xFFFFFFFF:8> + + -----------------------------------------------------------------------------*/ +__DDR_BASE = 0x60000000; +__DDR_SIZE = 0x02000000; + +/* + *-------------------- <<< end of configuration section >>> ------------------- + */ + +MEMORY +{ + ITCM (rx) : ORIGIN = __ROM_BASE, LENGTH = __ROM_SIZE + DTCM (rwx) : ORIGIN = __RAM_BASE, LENGTH = __RAM_SIZE + DATA_SRAM (rwx) : ORIGIN = __DATA_SRAM_BASE, LENGTH = __DATA_SRAM_SIZE + SRAM (rwx) : ORIGIN = __SRAM_BASE, LENGTH = __SRAM_SIZE + DDR (rwx) : ORIGIN = __DDR_BASE, LENGTH = __DDR_SIZE +} + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions ITCM and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + /* .ddr is placed before .text so that .rodata.tvm is encountered before .rodata* */ + .ddr : + { + . = ALIGN (16); + *(.rodata.tvm) + . = ALIGN (16); + *(.data.tvm); + . = ALIGN(16); + } > DDR + + .text : + { + KEEP(*(.vectors)) + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_frame*)) + } > ITCM + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > ITCM + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > ITCM + __exidx_end = .; + + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + LONG (__etext) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + /* Add each additional data section here */ + __copy_table_end__ = .; + } > ITCM + + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + __zero_table_end__ = .; + } > ITCM + + /** + * Location counter can end up 2byte aligned with narrow Thumb code but + * __etext is assumed by startup code to be the LMA of a section in DTCM + * which must be 4byte aligned + */ + __etext = ALIGN (4); + + .sram : + { + . = ALIGN(16); + } > SRAM AT > SRAM + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data) + *(.data.*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > DTCM + + .bss.noinit (NOLOAD): + { + . = ALIGN(16); + *(.bss.noinit.*) + . = ALIGN(16); + } > SRAM AT > SRAM + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss) + *(.bss.*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > DTCM AT > DTCM + + .data_sram : + { + . = ALIGN(16); + } > DATA_SRAM + + .heap (COPY) : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + . = . + __HEAP_SIZE; + . = ALIGN(8); + __HeapLimit = .; + } > DTCM + + .stack (ORIGIN(DTCM) + LENGTH(DTCM) - __STACK_SIZE) (COPY) : + { + . = ALIGN(8); + __StackLimit = .; + . = . + __STACK_SIZE; + . = ALIGN(8); + __StackTop = .; + } > DTCM + PROVIDE(__stack = __StackTop); + + /* Check if data + stack exceeds DTCM limit */ + ASSERT(__StackLimit >= __bss_end__, "region DTCM overflowed with stack") +} diff --git a/deploy/tvm/imgs_words_en/word_10.png b/deploy/tvm/imgs_words_en/word_10.png new file mode 100644 index 0000000000000000000000000000000000000000..07370f757ea83d5e3c5b1f7498b1f95d3aec2d18 GIT binary patch literal 5738 zcmV-w7M1CVP)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBU{=t)FDR9Hu4Soc$+*_u8`GPP}YPv>9)0Tsjul0`tGf+8xSAi*3l zwrwOw#nk4UMa(@tGds0gcYoM_XY1bGzH>WF&mQmHs=HN7o%((_!1>PeKF|BS?>PvT z=V#QnFJJ%qm-uKb`1(5%iH?a&`26L26gukbAD>ZZ1O^iw6&3Zzcku1o_ix|9AAkJu zw=ZA6!_V&keh>%*{1$#tNW|w)f4QF!k42;4Bz%JJ-@g3qGXUQ|efoq%B0qoq2LFV@ zM1TAKJ6tC^I_9sRzQjgHBYywOI1(SQE*+aCZ6 zw+MLdoBY1@SDMk3>anz{5nR<6xxq`Q^HEGQRC6G&IZ)U(ThKmB?_4Yy*{ksXSikxo za{ouM=T_*v;XAKO+_xg%M`7TXQr}0p_k+@V%kJOEZknNWEEIOk(L3g46Niea;|kBY z%yv>bek5~TNSzlV`-R;5W0~*Qa_`S9>o&V*t-#_h?p+iOZ!|3YQW3aS_jLf3h^!3lCJK!yxt$pAr$AXfm229u{nlU3*}1t7vn37mY$GZSm4Xr1#a|CM^? zW5w(*^593I=UU*s7WqF&e7D+#UxjbCABs9bMmfmQ0BRMwpf;s)SUS3+_FSmk5%I*K z)Nux}N$giL&j-2pr;@SA6Zr_DpdR35F|@iA)qv7*QXBfH^j(*XAL9)k4BHIyYh#&p zF$`@%hhOeKDi2wTE}TbXm7#JgO9tLo_`^z7$(f4GGbBA~k^<`P7Nb7M3{9#kNba z^IGEiAQ(S;A{zqK8t{e>NU}tZK|H*!o&Heix#SIPK9O5NiU7P|g7jiIo=KVo?^ZRT z4>Iq$%y%PpUyB@(%HWM`VjovE2=F4fXOLa-LOCdzJdwI@fXaQ6sfAy#5d>B&MF3J5 zC?X$`UIJdxWAVJWG;VY%8=cHVB(p#&2f+D^(&X|^ZvTAU{B8C82chGLJFzSBgezxm zbiqivsuvJSL54IoPld@=fJ|9bwlc5LUTHtl&;F=#L1q3gwo=Dcng1t+=k}HA9lEdq z5M&6l@^P`b%6`x=ecKTFP-Z*AY2Mzc3CF{d1xOMPkuAy6k1Om4D*t7-UWOAJllk>Y?5Y%Y z)f+~|qZ|pAzyqlakj4fiepI%c+%Q_@JJrtJ$Xv(5sRKErW%|0_bNq~5176cnBmt6G z5=G!+DYB?cNvfi=Y;@DS@RP=OCAXhJ-k>HWt{bW2x^yy}DChv`a`1u;*^Z~xswZ~q z+-D7eOVz|4PGto+K1eD;;flbk9DrlrXVubLeVV|fCU{%!x=^_;q1tu6^GwY!GP4Y1 z$fGE#zY9Aou|=n_w%aC2UZ%r5wrhV=QyV8$3Y4UlS)Ir$hb!+1Zjl;&%9Tp zX0`dD!s`OJ6}Hm`|22#PRWpLgkb^fo=zK}CF7fcD+It1Gb027J?kK7lq!mHcCFDv= zT5NjPUY+MaKC!B>Z-_=0l&($f^nR9M5M+x0wG`kun1V`i|B}IXt#e+f$HHx)Kh;g1 zk;E2M8XY{R#F98vrG-}A5l0rm9|K%5p~9+~*wIbj!1O3{oo!nB5Z`900 zDrdq9*N%GnuqJerWgG$7LXge|={!_UnYeG!hGc}$w=$7TKJ6S>-PKUM!9opO%+Q6ADdT>CzeirIB2eB=3|At<^Zf5SzgjW;fdJcuVDBDT-uyYo%i! z`VG)8+%Q^f=GQpm7(h0x0bD@h zB(l}Yk$JsmzrlUf;5gCQP6)E@D7X)D$vv`&tZZtWS~WU03Tt}fvSEtzpj*C?v`U6n zV9G&9fyDqKRJjh-&OK`V2!bd?;P@DV=uv*PdT_njcWd$8Ho&&Spl4n9A#8&0M0LFz2UWYT9Qi4b+ z#HKS7DWan4-m3n2?bwFFc5HNp8*KZf9o|%_2?GU5U;+{o;0j-hp;^z>+Sd%;gBr(< zxNrUuOM8a_$A&q^F}!UL9>T$I8b=cOup|I{$$f^F(c-J~UqE=U7^ppwD$h}sdpEb? zZB&K;i7$@+KiJIP4|>NX-{OaWF*r_a8V$#hHHx^0kSRspiN zgUNHNcU_gVhOik@R2mnXN=xNPEq1@b?qwUT2{hOV3S$dvA$6LmeeLAFxFdiemBNY& z2qoBjRoT?0%6kghmd+&Iwzw>ITsrM#fhdv0j)x5jjvb#~{2*Nzm&}b#;l-qJ&?!YQ zmtX+|FESJ8;!>-vW9hiowbHV9TrsggP`5*mg#`_jUQ803n_asd{-Y-6PP^}rQ9Br$ zDFw+qkS@h5`;?RCV5C)$-V3fMfak`b8Yfm8{C(I zwwdTm86u5?Or^cyC|bP>Ey4Hl-l;c&I*0)}&}(6fpgquF-!8XKL-9vv-PI>du0n0! z()h!mXC+)V;7Z8lqi}hNRPF-`E1pD)O3KEhP(8Z%n4!jImLQU7PjaO)%XnY#xIb`g^&WS-4(j_Ce#lb(K&iyw zq>l>fBpnOQ(;tn2TfHw*@7-_kY!|oMKsxtMx2fF3e6_SI)E2rmdQTf+%ikG*^HDHl zM9yP|qQSn{I=$Tz*yWkWW3r&*GanVGNU|ogV@=uXNa0t4lzfm%kIj{7#@4k^lh&0} z^;`dgLQzy&E|y5c67nD9upZ}eo)z+*<}-fCq1~qz#Zy`Fd4ea!YKpF3*gp-EL_d9I znY(HXo;G^-U_E@0C-pX7+rSQQfepyl1XX((hIoHg{#s+ydysFhF271$I}EU_#{ zHC#QiZS+J8p0L5QtM_d3+w6eALuNoThd5ng|LH%ZPP<$ zdF{l4(X-JK*jEqFkz~!#mSKf>PAjkKca^pbr3qEo%pz`%Q zs(Tc6LN@0qO~BH%s{1Fj!?yZ&cHM}rZp>XbHLY_l8G^eVtJlLve=^QSnijA0ffLK@ zS?$y+vCIPP5tT-ZNiR&upeHjVnL-Vbt0J%~h@7gV0>#Tb#p7&g0!b7@6u#u>U~ZWG zr$+yg!L!ro+ZJ><5hOk;Qw)zF(b;9ZW>?G1d86mZ=shg$_M)<28&wQQ+y{)Zs_{94 zYt8K0hW((T+y9tW37!|+BMWjX&Dl!*bA|+)$&Ak8-_KKMMpm`16ELtIsT%P;E|Ngf zFoeP%@{3iy z{yhlH=-&}_xsjOybe04pu`pyg%VcYwj{F0gxW|VkmqO$aTVheUdTh4Qw`p*0nOwV# zj@_KfZfrUqHg`{G(q}AbJe31|4o%`>vqXyi`KqaXFtmB0otSybl*MEeA#r)}Sw+g8 zvB~Z5==zcK=w@Q?YIq|8x$Rz!bgy4Q-rANgjiF=ct_I(3bLfy~9)Sjf!WSabs2~X! zL(G5!lSY6e8lM@1BS+)1V~KevT+ZG41R8vOW`(KNwqOo!8G|rg_ey)cD2fP8k%AO9 ziY#N8rYzHEde0#wR&4d7v&DA}I+2q=FH;QrEz`St_jcXnn#FS{>F_;gR>x%VW68Y4 zd_gRQg(4N9GkIvTsBB>2j<>g)=N9kEE1vQ}ZgD)Bl}Kf)`=?xoSL54f!|SI5tEZg{ z2hE|~=DCCRZQrMNmiN=sd>n>Toj&yCXk*p8E-i3XLQ;tCi@kW z^PCQ!Jc3yDoGFOSrh`;6NXvdDP%4I;?TZKInO)1wf!OMUodYIY2C<tx1&kLXd){%n~Tn1ATyXKaxsch zS~j!<4?bXI>!N;Y_I_S5)FcdTY!+S7{m!;~F|u|#w0<_UeLcK$)4z4yyLn^Xy6s%O zvdo>dEuCA}uP2Uwt$H^N#SBdd(h^O|W$PPj$Hojcd+obX-S}k9$Y@0$bdK@LfpLbu z`6){X@Dz|vy-zEq8@rlkw_v=QXCZ(9hAPHV_O710&i+l(HHjh? zBJnwBJT;zNDC@Ge&&~}jueZ+3wa+e?y)$)_E|VwJITdB5hs>jx9rgoZw zXH}ys6iqisg{X=EfriLp$K=Vdd1Ynq)^)I-9Nj*zdh344RYa5M5ZRb-k9b#d8jNHutxiWe#yT{EqrrOvrE zi+@4yoYp%-diQL-bJh}EsU8pFWIB*u2tyl{$$rEtijDe1{Ek z*tdS(vvjPT3O%3+z?%$2S~hrrBS@;uzNNO%M#t=qC9r02zt?-0^xhSnd#Po9U+-JX z(RD}X2%+P_jyxt;oTsxw{vkG@)r*41i)1Fq6h-H&Xr{@gxr>&CE7Qy=#C8v!lJKm% z2A#qe^!rry)mqQKdTP6Ja;MI92(eX;y-!y*flLm(Hvm~2kW9xGs@YvL@T>^Nx6Z4F z-5E0NQ+nwWn&<^nDrtKQlkMHs1>~)N;|j85UAurH>{*F)FQ0WUpIVp0t)U(DJKqbQ zA})vZj3s`;5V1`?Z8JOVv-__;#nIuVm;my2pIHNW(|Hacbx?bB^H@Ax1&CZERfx_P3x|W{Q>z;H zfyQy5p4_Xl?ZJbX&a=mCnRqIwhNRtNDUrGIAA}}e&jM`6!PsVGaOu!66@tU!T7*yQ z{I2ux!^r0O|HBrB4O;ig2~=ap{BBclUEDJ&>KaiF+hlzcM(=Xx{BbLk+04P6n+10b zGkf~rzAmr}?;~25&b6LxVXu$fWGk#6;aO~&@#T8=mT_jk+Ofv#bg)|NoHi$~!>bxw zHBN`2CJlij<>(^KG@7d)WHgT!HIJ81EtlKZDqVXT_mReNsGi!baqjDbM{oshmyOvr z&h56-T5Zg(pkiVlUgUt$%~RX{<;eQ6egDQ6{$*%OHU=p_)|z}h(+{i}CX z4i4+eargTJ_#D`ZbS)qDtRDAoo_4(7?_CRbzCUf9JvC1sHclTHrr}lGetmGSZhFtW z5N=<)ZeO`-nhQ72o;FP%x6PdPEMFUf`_1o9E%UGw2)D1?w7iE#b!nVAGtZtkPKV8N zXRuYM^X|ZCTHj`UaK{9@i}`ci%z3r{ c65eG04^*k6S@ypEXaE2J07*qoM6N<$f{v~+=Kufz literal 0 HcmV?d00001 diff --git a/deploy/tvm/imgs_words_en/word_116.png b/deploy/tvm/imgs_words_en/word_116.png new file mode 100644 index 0000000000000000000000000000000000000000..fd000ff60b0a7a87c8c16eb1409aa0548228e3f9 GIT binary patch literal 74135 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�}bF4*@Oy3CHa5NB!fD2gDqM1;rc>jy(|+dv8F}IeYTC{|_{!Wp;12Z-)Q? N002ovPDHLkV1m!NmvR6A literal 0 HcmV?d00001 diff --git a/deploy/tvm/include/crt_config.h b/deploy/tvm/include/crt_config.h new file mode 100644 index 00000000..4b9ccca0 --- /dev/null +++ b/deploy/tvm/include/crt_config.h @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 TVM_RUNTIME_CRT_CONFIG_H_ +#define TVM_RUNTIME_CRT_CONFIG_H_ + +/*! Log level of the CRT runtime */ +#define TVM_CRT_LOG_LEVEL TVM_CRT_LOG_LEVEL_DEBUG + +#endif // TVM_RUNTIME_CRT_CONFIG_H_ diff --git a/deploy/tvm/include/tvm_runtime.h b/deploy/tvm/include/tvm_runtime.h new file mode 100644 index 00000000..2b59d934 --- /dev/null +++ b/deploy/tvm/include/tvm_runtime.h @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +void __attribute__((noreturn)) TVMPlatformAbort(tvm_crt_error_t error_code) { + printf("TVMPlatformAbort: %d\n", error_code); + printf("EXITTHESIM\n"); + exit(-1); +} + +tvm_crt_error_t TVMPlatformMemoryAllocate(size_t num_bytes, DLDevice dev, void** out_ptr) { + return kTvmErrorFunctionCallNotImplemented; +} + +tvm_crt_error_t TVMPlatformMemoryFree(void* ptr, DLDevice dev) { + return kTvmErrorFunctionCallNotImplemented; +} + +void TVMLogf(const char* msg, ...) { + va_list args; + va_start(args, msg); + vfprintf(stdout, msg, args); + va_end(args); +} + +TVM_DLL int TVMFuncRegisterGlobal(const char* name, TVMFunctionHandle f, int override) { return 0; } + +#ifdef __cplusplus +} +#endif diff --git a/deploy/tvm/requirements.txt b/deploy/tvm/requirements.txt new file mode 100644 index 00000000..1bf86ed1 --- /dev/null +++ b/deploy/tvm/requirements.txt @@ -0,0 +1,3 @@ +paddlepaddle +numpy +opencv-python \ No newline at end of file diff --git a/deploy/tvm/run_demo.sh b/deploy/tvm/run_demo.sh new file mode 100755 index 00000000..dd8e8f16 --- /dev/null +++ b/deploy/tvm/run_demo.sh @@ -0,0 +1,152 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +set -e +set -u +set -o pipefail + +# Show usage +function show_usage() { + cat <&2 + show_usage >&2 + exit 1 + fi + ;; + + --ethosu_platform_path) + if [ $# -gt 1 ] + then + export ETHOSU_PLATFORM_PATH="$2" + shift 2 + else + echo 'ERROR: --ethosu_platform_path requires a non-empty argument' >&2 + show_usage >&2 + exit 1 + fi + ;; + + --fvp_path) + if [ $# -gt 1 ] + then + export PATH="$2/models/Linux64_GCC-6.4:$PATH" + shift 2 + else + echo 'ERROR: --fvp_path requires a non-empty argument' >&2 + show_usage >&2 + exit 1 + fi + ;; + + --cmake_path) + if [ $# -gt 1 ] + then + export CMAKE="$2" + shift 2 + else + echo 'ERROR: --cmake_path requires a non-empty argument' >&2 + show_usage >&2 + exit 1 + fi + ;; + + -*|--*) + echo "Error: Unknown flag: $1" >&2 + show_usage >&2 + exit 1 + ;; + esac +done + + +# Directories +script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" + + +# Make build directory +rm -rf build +make cleanall +mkdir -p build +cd build + +wget https://paddleocr.bj.bcebos.com/tvm/ocr_en.tar +tar -xf ocr_en.tar + +# Compile model for Arm(R) Cortex(R)-M55 CPU and CMSIS-NN +# An alternative to using "python3 -m tvm.driver.tvmc" is to call +# "tvmc" directly once TVM has been pip installed. +python3 -m tvm.driver.tvmc compile --target=cmsis-nn,c \ + --target-cmsis-nn-mcpu=cortex-m55 \ + --target-c-mcpu=cortex-m55 \ + --runtime=crt \ + --executor=aot \ + --executor-aot-interface-api=c \ + --executor-aot-unpacked-api=1 \ + --pass-config tir.usmp.enable=1 \ + --pass-config tir.usmp.algorithm=hill_climb \ + --pass-config tir.disable_storage_rewrite=1 \ + --pass-config tir.disable_vectorize=1 ocr_en/inference.pdmodel \ + --output-format=mlf \ + --model-format=paddle \ + --module-name=rec \ + --input-shapes x:[1,3,32,320] \ + --output=rec.tar +tar -xf rec.tar + +# Create C header files +cd .. +python3 ./convert_image.py imgs_words_en/word_116.png + +# Build demo executable +cd ${script_dir} +echo ${script_dir} +make + +# Run demo executable on the FVP +FVP_Corstone_SSE-300_Ethos-U55 -C cpu0.CFGDTCMSZ=15 \ +-C cpu0.CFGITCMSZ=15 -C mps3_board.uart0.out_file=\"-\" -C mps3_board.uart0.shutdown_tag=\"EXITTHESIM\" \ +-C mps3_board.visualisation.disable-visualisation=1 -C mps3_board.telnetterminal0.start_telnet=0 \ +-C mps3_board.telnetterminal1.start_telnet=0 -C mps3_board.telnetterminal2.start_telnet=0 -C mps3_board.telnetterminal5.start_telnet=0 \ +./build/demo \ No newline at end of file diff --git a/deploy/tvm/src/demo_bare_metal.c b/deploy/tvm/src/demo_bare_metal.c new file mode 100644 index 00000000..3f5f1bc4 --- /dev/null +++ b/deploy/tvm/src/demo_bare_metal.c @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 +#include + +#include "uart.h" + +// Header files generated by convert_image.py +#include "inputs.h" +#include "outputs.h" + + +int main(int argc, char** argv) { + char dict[]={"#0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./ "}; + int char_dict_nums = 97; + uart_init(); + printf("Starting ocr rec inference\n"); + struct tvmgen_rec_outputs rec_outputs = { + .output = output, + }; + struct tvmgen_rec_inputs rec_inputs = { + .x = input, + }; + + tvmgen_rec_run(&rec_inputs, &rec_outputs); + + // post process + int char_nums = output_len / char_dict_nums; + + int last_index = 0; + float score = 0.f; + int count = 0; + + printf("text: "); + for (int i = 0; i < char_nums; i++) { + int argmax_idx = 0; + float max_value = 0.0f; + for (int j = 0; j < char_dict_nums; j++){ + if (output[i * char_dict_nums + j] > max_value){ + max_value = output[i * char_dict_nums + j]; + argmax_idx = j; + } + } + if (argmax_idx > 0 && (!(i > 0 && argmax_idx == last_index))) { + score += max_value; + count += 1; + // printf("%d,%f,%c\n", argmax_idx, max_value, dict[argmax_idx]); + printf("%c", dict[argmax_idx]); + } + last_index = argmax_idx; + } + score /= count; + printf(", score: %f\n", score); + + // The FVP will shut down when it receives "EXITTHESIM" on the UART + printf("EXITTHESIM\n"); + while (1 == 1) + ; + return 0; +} -- GitLab