Changes in 22.02
    * Support for 22.02 Ethos-U component and dependencies (core-driver, core-platform, Vela 3.3.0, CMSIS, TensorFlow Lite Micro).
    * Added Object Detection use case.
    * Replace DSCNN with MicroNet for KWS and KWS_ASR use cases.
    * Increase minimum requirements of CMake to 3.15.6, armclang to 6.16 and Python to 3.8
    * Initial restructuring of repository sources.
    * Documentation updates.
    * Various minor bug fixes.

Changes in 21.11
    * Support for 21.11 Ethos-U component and dependencies (core-software, core-driver, Vela 3.2.0, CMSIS, TensorFlow Lite).
    * Added dynamic load support for FVP for inference runner use-case.
    * Added support for different memory modes: Shared_Sram, Dedicated_Sram and Sram_Only.
    * Added Noise Reduction use case.
    * Updated support for Arm GNU Embedded Toolchain 10.3-2021.07 and Arm Compiler 6.17.
    * Documentation updates.
    * Changes to support AN552 design - the new Arm® Corstone™-300 implementation.

Changes in 21.08
    * Support for 21.05 Ethos-U component (core-software, core-driver, Vela 3.0.0).
    * TensorFlow submodule changed to https://github.com/tensorflow/tflite-micro (tested with TensorFlow Lite Micro commit hash: f510d38d0eaa3195ce3af66e3f32648740f08afb).
    * Image classification model changed (from uint8 to int8 datatype).
    * Documentation updates, added support to Corstone-300 + Ethos-U65.
    * Various scripts improvements.
    * Added Visual Wake Word use case.

Changes in 21.05
    * Added script to download and optimize default models.
    * Added script to run default build flow.
    * Added a model for Anomaly Detection use case.
    * Added support for build with Arm GNU Embedded Toolchain (10.2.1).
    * Deprecated support for target subsystem SSE-200.

Changes in 21.03
    * Simple platform support added.
    * Model conditioning examples added.
    * Documentation updated.
    * Build changed to use sources of the dependency libraries.
    * Tests for native platform added.
    * Anomaly detection use-case added.

Changes in 20.11
    * SSE-200 and SSE-300 system support was added.
    * Support for simple fixed virtual platform for Ethos-U55 and Cortex-M55 removed.
    * Build cmake parameters changed: TARGET_SUBSYSTEM was added, TARGET_PLATFORM accepted values were changed.
    * Models with multiple output tensors support was added.
    * Generic inference runner use-case added.
    * ASR triggered by KWS added in the same use case (kws_asr). This also shows how to re-use tensor arena with two models using the same memory pool.

Changes in 20.09 release:
    * Support for TensorFlow Lite Micro version > 2.3.0 (tested with TensorFlow Lite Micro 2.4.0 commit hash: 5bbb8a2bd1def6865b1510175a3da5fd12387e10)
    * Added speech recognition use case example.
    * Updated Ethos-U55 Fastmodel version to r0p2-00eac0-rc4

Changes in 20.08 release:
    * Added keyword spotting use case example.
    * Added person detection use case example.
Known issues:
    * telnet connection to FastModel environment may hang after some period of inactivity.

Changes in 20.05 release:
    * FastModel environment was built with FastModel Tools v11.10.22.
    * Mps3 FPGA build support was added.
    * Configurable timing-adaptor.
    * Added Active and Idle cycle counts for NPU and CPU profiling report.
    * Source code structure and build scripts refactored to support multiple ML use-cases.
    * Used EAC Ethos-U55 software model and drivers.
    * Windows support for build scripts.
Known issues:
    * telnet connection to FastModel environment may hang after some period of inactivity.
