Skip to content

Commit 24f180e

Browse files
committed
treewide: Add documentation for hello_ei sample and Edge Impulse
- Add README for edge_impulse/hello_ei sample. - Make changes in doc/integrations/edge_impulse.rst related to change of form of deployment EI models (use of EI SDK module). - Add section about usage of EI west extension commands. Jira: NCSDK-37082 Signed-off-by: Bartosz Meus <bartosz.meus@nordicsemi.no>
1 parent d8eccdd commit 24f180e

11 files changed

Lines changed: 247 additions & 20 deletions

File tree

doc/integrations/edge_impulse.rst

Lines changed: 93 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Edge Impulse integration
88
:depth: 2
99

1010
`Edge Impulse`_ is a development platform that can be used to enable `embedded machine learning`_ on |NCS| devices.
11-
You can use this platform to collect data from sensors, train machine learning model, and then deploy it to your Nordic Semiconductor's device.
11+
You can use this platform to collect data from sensors, train a machine learning model, and then deploy it to your Nordic Semiconductor's device.
1212

1313
Integration prerequisites
1414
*************************
@@ -19,16 +19,25 @@ Before you start the |EAI| integration with Edge Impulse, make sure that the fol
1919
* Setup of the required Development Kit (DK).
2020
* Creation of an `Edge Impulse studio account <Edge Impulse studio signup_>`_ and an Edge Impulse project.
2121

22+
Solution architecture
23+
*********************
24+
25+
The usage of `Edge Impulse`_ SDK is demonstrated by the :ref:`hello_ei_sample`.
26+
2227
Integration overview
2328
********************
2429

2530
Before integrating the Edge Impulse machine learning model into an |EAI| application, you must prepare and deploy the machine learning model for your embedded device.
2631
This model is prepared using the `Edge Impulse studio`_ external web tool.
2732
It relies on sensor data that can be provided by different sources, for example data forwarder.
28-
Check the :ref:`ei_data_forwarder_sample` sample for a demonstration of how you can send sensor data to Edge Impulse studio using `Edge Impulse's data forwarder`_.
2933

30-
The machine learning model is distributed as a single :file:`zip` archive that includes C++ library sources.
31-
This file is used by the |NCS| build system to build the Edge Impulse library.
34+
.. note::
35+
You can use one of the development boards supported directly by Edge Impulse or your mobile phone to collect the data.
36+
You can also modify the :ref:`ei_data_forwarder_sample` sample and use it to forward data from a sensor that is connected to any board available in the |NCS|.
37+
38+
The machine learning model is distributed as a single :file:`zip` archive that includes C/C++ machine learning model sources.
39+
These files have to be included to an |EAI| application.
40+
Apart from that, the application must also enable the `Edge Impulse`_ SDK (see: :ref:`ug_edge_impulse_building`).
3241

3342
Integration steps
3443
*****************
@@ -45,46 +54,110 @@ Complete the following steps to generate the archive and add it to the build sys
4554
Preparing the machine learning model
4655
====================================
4756

48-
To prepare the machine learning model, use `Edge Impulse studio`_ and follow one of the tutorials described in `Edge Impulse getting started guide`_.
49-
For example, you can try the `Continuous motion recognition tutorial`_.
50-
This tutorial will guide you through the following steps:
57+
1. Prepare your own machine learning model.
5158

52-
1. Collecting data from sensors and uploading the data to Edge Impulse studio.
59+
To prepare a machine learning model, use `Edge Impulse studio`_ and follow one of the tutorials described in `Edge Impulse getting started guide`_.
60+
For example, you can try the `Continuous motion recognition tutorial`_.
61+
This tutorial will guide you through the following steps:
5362

54-
.. note::
55-
You can use one of the development boards supported directly by Edge Impulse or your mobile phone to collect the data.
56-
You can also modify the :ref:`ei_data_forwarder_sample` application and use it to forward data from a sensor that is connected to any board available in the |NCS|.
63+
* Collecting data from sensors and uploading the data to Edge Impulse studio.
64+
65+
* Designing your machine learning model (an *impulse*).
66+
67+
#. Deploy your machine learning model to use it on an embedded device.
68+
69+
You can obtain a library in two ways:
70+
71+
.. tabs::
72+
73+
.. group-tab:: Using |EIS| web interface
74+
75+
Go to the :guilabel:`Deployment` tab and select **Zephyr library** to generate a :file:`zip` file that contains source files defining the |EI| ML model.
76+
The download of the :file:`zip` archive will start automatically.
77+
78+
.. figure:: ./images/ei_deploy.png
79+
:scale: 50 %
80+
:alt: Model deployment in |EIS| dashboard
81+
82+
Model deployment in |EIS| dashboard
83+
84+
.. note::
85+
There are different forms of deployment available, which can also be compatible with |NCS| applications, but this instruction focuses on presenting the Zephyr library form of deployment.
86+
87+
.. group-tab:: Using |EI| west extensions
88+
89+
|EI| provides west command extensions which can be used to build and deploy the machine learning model from |EIS| using the command line instead of the web interface.
90+
The commands are already configured in the |EAI| west manifest and ready to use.
91+
There are two commands available:
92+
93+
* ``west ei-build`` - builds the machine learning model in |EIS|,
94+
* ``west ei-deploy`` - deploys a model in the form of a zip file and downloads it from |EIS|.
5795

58-
#. Designing your machine learning model (an *impulse*).
59-
#. Deploying the machine learning model to use it on an embedded device.
60-
As part of this step, you must select the :guilabel:`C++ library` to generate the required :file:`zip` file that contains the source files for building the Edge Impulse library in |EAI|.
96+
Follow these steps to use the commands:
97+
98+
1. Find two parameters that are required by the commands:
99+
100+
* **Project ID** - You can find it in the **Project info** panel under :guilabel:`Dashboard`.
101+
102+
.. figure:: ./images/ei_project_id.png
103+
:scale: 50 %
104+
:alt: Project ID in |EIS| dashboard
105+
106+
Project ID in |EIS| dashboard
107+
108+
* **API key** - You can find it under the :guilabel:`Keys` tab in the |EI| project dashboard.
109+
110+
.. figure:: ./images/ei_api_key.png
111+
:scale: 50 %
112+
:alt: API key under the Keys tab in |EIS|
113+
114+
API key under the Keys tab in |EIS|
115+
116+
#. Build the machine learning model by running the following command:
117+
118+
.. code-block:: console
119+
120+
west ei-build -p <PROJECT_ID> -k <API_KEY>
121+
122+
#. Deploy the machine learning model by running the following command:
123+
124+
.. code-block:: console
125+
126+
west ei-deploy -p <PROJECT_ID> -k <API_KEY>
127+
128+
As a result, file :file:`ei_model.zip` is downloaded to the current working directory.
129+
130+
More details about usage of these commands are described in `Automated Deployment with West Commands`_.
61131

62132
.. _ug_edge_impulse_adding_building:
63133

64134
.. rst-class:: numbered-step
65135

66-
Building the machine learning model in |EAI|
67-
============================================
136+
Building an application with machine learning model
137+
===================================================
68138

69-
After preparing the :file:`zip` archive, you can use the |NCS| build system to build the C++ library with the machine learning model.
70-
Complete the following steps to configure the building process:
139+
You have to complete the following configuration steps to be able to build your application including the deployed |EI| machine learning model:
71140

72141
1. Make sure that the following Kconfig options are **enabled**:
73142

74143
* ``CONFIG_CPP``
75144
* ``CONFIG_STD_CPP11``
76145
* ``CONFIG_REQUIRES_FULL_LIBCPP``
146+
* ``CONFIG_EDGE_IMPULSE_SDK``
77147

78148
.. note::
79149
The ``CONFIG_FPU`` Kconfig option is implied by default if floating point unit (FPU) is supported by the hardware.
80150
Using FPU speeds up calculations.
81151

82152
#. Make sure that the ``CONFIG_FP16`` Kconfig option is **disabled**.
83-
The Edge Impulse library is not compatible with half-precision floating point support introduced in Zephyr.
153+
The |EI| library is not compatible with half-precision floating point support introduced in Zephyr.
154+
155+
.. _ug_edge_impulse_building:
84156

85157
Applications and samples
86158
************************
87159

88160
The following samples demonstrate the Edge Impulse integration in the |EAI|:
89161

90-
* :ref:`ei_data_forwarder_sample` sample - demonstrates how you can send sensor data to Edge Impulse studio using `Edge Impulse's data forwarder`_.
162+
* :ref:`ei_data_forwarder_sample` sample - demonstrates how you can send sensor data to |EIS| using `Edge Impulse's data forwarder`_.
163+
* :ref:`hello_ei_sample` sample - demonstrates the deployment of models in |EI| and usage of the inference engine provided by |EI| SDK.
174 KB
Loading
248 KB
Loading
208 KB
Loading

doc/links.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
.. _`Building an application`: https://docs.nordicsemi.com/bundle/ncs-3.2.0/page/nrf/app_dev/config_and_build/building.html#building
5050
.. _`Programming`: https://docs.nordicsemi.com/bundle/ncs-3.2.0/page/nrf/app_dev/programming.html#programming
5151
.. _`Testing and optimization`: https://docs.nordicsemi.com/bundle/ncs-3.2.0/page/nrf/test_and_optimize.html#testing
52+
.. _`Providing CMake options`: https://docs.nordicsemi.com/bundle/ncs-3.2.0/page/nrf/app_dev/config_and_build/cmake/index.html#providing_cmake_options
5253

5354
.. _`Simulated sensor driver`: https://docs.nordicsemi.com/bundle/ncs-3.2.0/page/nrf/drivers/sensor_sim.html
5455

@@ -68,6 +69,8 @@
6869
.. _`nRF Connect SDK simulated sensor machine learning model`: https://studio.edgeimpulse.com/public/18121/latest
6970
.. _`nRF Connect SDK hardware accelerometer machine learning model`: https://studio.edgeimpulse.com/public/33129/latest
7071
.. _`Nordic Semi nRF54L15 DK page`: https://docs.edgeimpulse.com/docs/nordic-semi-nrf54L15-dk
72+
.. _`Edge Impulse Zephyr Module Deployment`: https://docs.edgeimpulse.com/hardware/deployments/run-zephyr-module
73+
.. _`Automated Deployment with West Commands`: https://docs.edgeimpulse.com/hardware/deployments/run-zephyr-module#automated-deployment-with-west-commands-early-access-preview
7174

7275
.. ### Source: github.com
7376

doc/samples.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ The samples demonstrate typical workflows using the nRF Edge AI components such
2121
* DSP - Demonstrates using the nRF Edge AI Digital Signal Processing (DSP) primitives for signal processing.
2222
* NN - Demonstrates using the nRF Edge AI Neural Network (NN) engine for running its standalone models.
2323

24+
There are also additional samples demonstrating the integration of `Edge Impulse`_ with |EAI|:
25+
26+
* |EI|: Data forwarder - Demonstrates using `Edge Impulse's data forwarder`_.
27+
* |EI|: Hello Edge Impulse - Demonstrates deployment of models in |EI| and usage of the inference engine provided by |EI| SDK.
28+
2429
.. toctree::
2530
:maxdepth: 2
2631

doc/samples/edge_impulse.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ This section lists the available |EAI| samples presenting integration with `Edge
1010
:caption: Subpages
1111

1212
/../samples/edge_impulse/data_forwarder/README.rst
13+
/../samples/edge_impulse/hello_ei/README.rst

doc/shortcuts.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
.. |EAI| replace:: Edge AI Add-on
33
.. |nRFVSC| replace:: nRF Connect for VS Code extension
44
.. |EI| replace:: Edge Impulse
5+
.. |EIS| replace:: Edge Impulse Studio
56

67
.. ### Configuration and testing shortcuts
78

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
.. _hello_ei_sample:
2+
3+
Edge Impulse: Hello Edge Impulse
4+
################################
5+
6+
.. contents::
7+
:local:
8+
:depth: 2
9+
10+
The Hello Edge Impulse sample demonstrates usage of `Edge Impulse`_ SDK and custom machine learning model when :ref:`integrating Edge Impulse with the nRF Connect SDK <edge_impulse_integration>`.
11+
12+
Requirements
13+
************
14+
15+
The sample supports the following development kits:
16+
17+
.. table-from-sample-yaml::
18+
19+
Overview
20+
********
21+
22+
The sample:
23+
24+
1. Provides input data to the `Edge Impulse`_ model.
25+
#. Starts predictions using the machine learning model.
26+
#. Displays the prediction results and time measurements to the user.
27+
28+
By default, the sample uses a pre-trained machine learning model and 2 input data series representing a sine wave and a triangle wave with some noise added.
29+
30+
Configuration
31+
*************
32+
33+
|config|
34+
35+
The sample can be configured using the following Kconfig options:
36+
37+
.. options-from-kconfig::
38+
:show-type:
39+
40+
Using your own machine learning model
41+
=====================================
42+
43+
To run the sample using a custom machine learning model, you must complete the following setup:
44+
45+
1. :ref:`Train and deploy your own machine learning model <ug_edge_impulse_adding_preparing>`.
46+
Use a **Zephyr library** form of deployment described in the instructions.
47+
48+
#. Select the Edge Impulse model.
49+
50+
Set the ``CONFIG_EDGE_IMPULSE_PATH`` to an absolute or relative path to a file in the local filesystem.
51+
The file must be a :file:`zip` archive generated by |EIS| containing the source files defining the Edge Impulse ML model.
52+
The relative path is tracked from the application source directory (``APPLICATION_SOURCE_DIR``).
53+
CMake variables that are part of the path are expanded.
54+
55+
#. Define input data for the machine learning model in :file:`samples/edge_impulse/hello_ei/src/include/input_data.h`.
56+
#. Check the example input data in your |EIS| project:
57+
58+
a. Go to the :guilabel:`Live classification` tab.
59+
#. In the **Classify existing test sample** panel, select one of the test samples.
60+
#. Click :guilabel:`Load sample` to display the raw data preview.
61+
62+
.. figure:: ./doc/images/ei_load_test_sample.png
63+
:scale: 50 %
64+
:alt: Loading test sample input data in |EIS|
65+
66+
Loading test sample input data in |EIS|
67+
68+
The classification results will be displayed, with raw data preview.
69+
70+
.. figure:: ./doc/images/ei_raw_features.png
71+
:scale: 50 %
72+
:alt: Raw data preview in |EIS|
73+
74+
Raw data preview in |EIS|
75+
76+
#. Copy information from the **Raw features** list into an array defined in the :file:`input_data.h` file.
77+
78+
.. note::
79+
If you provide more input data than a single input window can hold, the prediction will be triggered multiple times.
80+
The input window will be shifted by one input frame between subsequent predictions.
81+
The prediction will be retriggered until there is no more input data available.
82+
83+
Building and running
84+
********************
85+
86+
.. |sample path| replace:: :file:`samples/edge_impulse/hello_ei`
87+
88+
Testing
89+
=======
90+
91+
After programming the sample to your development kit, test it by performing the following steps:
92+
93+
1. |connect_terminal_kit|
94+
#. Reset the kit.
95+
#. Observe that output similar to the following is logged on UART:
96+
97+
.. code-block:: console
98+
99+
*** Booting nRF Connect SDK v3.2.0-5dcc6bd39b0f ***
100+
*** Using Zephyr OS v4.2.99-a57ad913cf4e ***
101+
I: === Model info ===
102+
I: Input frame size: 3
103+
I: Input window size: 312
104+
I: Input frequency: 52
105+
I: Label count: 3
106+
I: Has anomaly: yes
107+
I: #########################
108+
I: Running inference on sine wave input data
109+
I: #########################
110+
I: === Inference result ===
111+
I: idle => 0.00000
112+
I: sine => 0.99603
113+
I: triangle => 0.00397
114+
I: anomaly: -0.12298
115+
I: === Inference time profiling ===
116+
I: Full inference completed in 6564 us
117+
I: Classification completed in 766 us
118+
I: DSP operations completed in 5562 us
119+
I: Anomaly detection completed in 63 us
120+
I: #########################
121+
I: === Inference result ===
122+
I: idle => 0.00000
123+
I: sine => 0.99648
124+
I: triangle => 0.00352
125+
I: anomaly: -0.12898
126+
I: === Inference time profiling ===
127+
I: Full inference completed in 6560 us
128+
I: Classification completed in 762 us
129+
I: DSP operations completed in 5562 us
130+
I: Anomaly detection completed in 61 us
131+
...
132+
133+
The observed classification results depend on machine learning model and input data.
134+
135+
Dependencies
136+
************
137+
138+
This sample uses the following Zephyr libraries:
139+
140+
* Logging
141+
142+
This sample uses the following external components:
143+
144+
* `Edge Impulse`_ SDK
100 KB
Loading

0 commit comments

Comments
 (0)