# APIs Source: https://docs.edgeimpulse.com/apis Edge Impulse provides several APIs to interact with the platform programmatically. These APIs allow you to automate tasks, integrate with other systems, and build custom applications on top of Edge Impulse's capabilities. Collectively, these APIs are referred to as the Edge Impulse API and you may see the term used interchangeably, specifically when referencing the Studio API. *** ## Studio API The Studio API exposes most of the Studio functionality, enabling you to manage your projects, datasets, and models programmatically. With the Studio API, you can automate tasks such as uploading data, training models, and deploying your applications. ## Ingestion API The Ingestion API allows you to send new device data to Edge Impulse. It provides endpoints for uploading training and testing samples for different types of data, including sensor data, images, and audio files. ## Remote Management API The Remote Management API is a part of the remote management service that Edge Impulse provides. It allows you to control your remote edge devices from Studio, for example to acquire new data. # Ingestion API Source: https://docs.edgeimpulse.com/apis/ingestion The Ingestion API is used to send new device data to Edge Impulse. It's available on both HTTP and HTTPS endpoints and requires an API key to authenticate. The API is available at: ``` http://ingestion.edgeimpulse.com ``` ``` https://ingestion.edgeimpulse.com ``` ## Supported file types With the Ingestion API, you can upload the following types of files: | Data type | Extension | Acquisition format | Annotation formats | | --------- | ---------------- | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Sensor | `.json`, `.cbor` | [JSON CBOR](/tools/specifications/data-acquisition/json-cbor) | [labels](/tools/specifications/data-annotation/ei-labels), [structured labels](/tools/specifications/data-annotation/ei-structured-labels) | | Sensor | `.csv` | [CSV](/tools/specifications/data-acquisition/csv) | [labels](/tools/specifications/data-annotation/ei-labels), [structured labels](/tools/specifications/data-annotation/ei-structured-labels) | | Sensor | `.parquet` | [Parquet](https://parquet.apache.org/docs/file-format/) | [labels](/tools/specifications/data-annotation/ei-labels), [structured labels](/tools/specifications/data-annotation/ei-structured-labels) | | Audio | `.wav` | - | [labels](/tools/specifications/data-annotation/ei-labels), [structured labels](/tools/specifications/data-annotation/ei-structured-labels) | | Image | `.jpg`, `.png` | - | [labels](/tools/specifications/data-annotation/ei-labels), [object detection](/tools/specifications/data-annotation/object-detection) | | Video\* | `.mp4`, `.avi` | - | [labels](/tools/specifications/data-annotation/ei-labels) | | Labels | `.labels` | - | [labels](/tools/specifications/data-annotation/ei-labels), [structured labels](/tools/specifications/data-annotation/ei-structured-labels), [object detection](/tools/specifications/data-annotation/object-detection#edge-impulse-object-detection-format) | *\*Video files can be split into individual frames after uploading to Studio.* ## Endpoints ### Files endpoint These are the endpoints available for the Ingestion API: * `POST /api/training/files` - for adding data samples to the training set * `POST /api/validation/files` - for adding data samples to the validation set * `POST /api/testing/files` - for adding data samples to the test set * `POST /api/post-processing/files` - for adding data samples to the post-processing set * `POST /api/split/files` - for adding samples automatically split across the training, validation, and test sets Notes: * The maximum number of files you can upload in a single request is 1000 * The maximum size of a single file is 100 MB * The validation endpoint is only available if the explicit validation set [advanced setting](/studio/projects/data-acquisition/dataset/advanced-settings) is enabled in your project * The split endpoint splits the files into training, validation, and test sets based on the split percentages defined in your project * If you have the 'Live classification' page open in your browser while uploading to the testing endpoint, the file will automatically be classified against the current impulse. The minimal request to the `api/training/files` endpoint is the following: ``` POST https://ingestion.edgeimpulse.com/api/training/files X-Api-Key: ei_6040df080906d06f090e05013b7090580b707a0b050eb04d00350504070a2040 Content-Length: 442 Content-Type: multipart/form-data; boundary=999e13bfdfc8bcc05b97f4784410806e b'--999e13bfdfc8bcc05b97f4784410806e\r\nContent-Disposition: form-data; name="data"; filename="test.cbor"\r\nContent-Type: application/cbor\r\n\r\n\xa3gpayload\xa5kdevice_nameq11:22:33:44:55:66kdevice_typelNORDIC_NRF91kinterval_ms\xfb@4\x00\x00\x00\x00\x00\x00gsensors\x83\xa2dnamedaccXeunitsdm/s2\xa2dnamedaccYeunitsdm/s2\xa2dnamedaccZeunitsdm/s2fvalues\x82\x83\xfb?\xc4\xd3\xb6\xc0\x00\x00\x00\xfb\xbf\xe9\xbaE\x00\x00\x00\x00\xfb@#\xa8\xd0`\x00\x00\x00\x83\xfb?\xb1&\xd8\xc0\x00\x00\x00\xfb\xbf\xe8\xcf\x0b`\x00\x00\x00\xfb@#\xd0\x04\xa0\x00\x00\x00iprotected\xa2calgdnonecverbv1isignatureb00\r\n--999e13bfdfc8bcc05b97f4784410806e--\r\n' ``` The request body is presented using Python notation for binary strings for readability purposes. Normally it is a stream of bytes. ### Data endpoint (legacy) Because the `files` endpoints expect `Content-Type` to be `multipart/form-data`, there are also available legacy endpoints that require simpler requests: * `POST /api/training/data` * `POST /api/testing/data` * `POST /api/anomaly/data` The minimal request to the `api/training/data` endpoint is the following: ``` POST https://ingestion.edgeimpulse.com/api/training/data X-Api-Key: ei_6040df080906d06f090e05013b7090580b707a0b050eb04d00350504070a2040 X-File-Name: test.cbor Content-Type: application/cbor Content-Length: 265 b'\xa3gpayload\xa5kdevice_nameq11:22:33:44:55:66kdevice_typelNORDIC_NRF91kinterval_ms\xfb@4\x00\x00\x00\x00\x00\x00gsensors\x83\xa2dnamedaccXeunitsdm/s2\xa2dnamedaccYeunitsdm/s2\xa2dnamedaccZeunitsdm/s2fvalues\x82\x83\xfb?\xc4\xd3\xb6\xc0\x00\x00\x00\xfb\xbf\xe9\xbaE\x00\x00\x00\x00\xfb@#\xa8\xd0`\x00\x00\x00\x83\xfb?\xb1&\xd8\xc0\x00\x00\x00\xfb\xbf\xe8\xcf\x0b`\x00\x00\x00\xfb@#\xd0\x04\xa0\x00\x00\x00iprotected\xa2calgdnonecverbv1isignatureb00' ``` The request body is presented using Python notation for binary strings for readability purposes. Normally it is a stream of bytes. ### Header Parameters * `x-api-key` - API Key (required). * `x-label` - Label (optional). If this header is not provided a label is automatically inferred from the filename through the following regex: `^[a-zA-Z0-9\s-_]+` - For example: idle.01 will yield the label idle. If you don't want to assign the label nor derive it from the file name, provide an `x-no-label` header with the value `1`. * `x-disallow-duplicates` - When set, the server checks the hash of the message against your current dataset (optional). We'd recommend setting this header but haven't enabled it by default for backward compatibility. * `x-add-date-id`: 1 - to add a date ID to the filename. For example: if you upload with filename test.wav the file name will be test - set this option and we'll add a unique ID to the end (this is what we use on the daemon to create unique names). * `x-metadata` - JSON-encoded string of key/value pairs to attach as [metadata](/studio/projects/data-acquisition/dataset/metadata) to the uploaded sample(s) (optional). For example: `{"site":"Paris","source":"field-trial-2"}`. Metadata can be used to control train/validation splits, drive data pipeline synchronisation, and slice model performance by attribute. * `Content-type` - format of data used. Can be `application/cbor`, `application/json`, or `multipart/form-data`. ### Responses All responses are sent with content type `text/plain`. The following response codes may be returned: * `200` - Stored the file, file name is in the body. * `400` - Invalid message, e.g. fields are missing, or are invalid. See body for more information. * `401` - Missing `x-api-key` header, or invalid API key. * `421` - Missing header, see body for more information. * `500` - Internal server error, see body for more information. ## Examples ```bash curl theme={"system"} curl -X POST \ -H "x-api-key: ei_238fae..." \ -H "x-label: car" \ -H "x-metadata: {\"site\":\"Paris\"}" \ -H "Content-Type: multipart/form-data" \ -F "data=@one.png" \ -F "data=@two.png" \ https://ingestion.edgeimpulse.com/api/training/files ``` ```python python theme={"system"} # Install requests via: `pip3 install requests` import requests import os api_key = 'ei_121...' # Add the files you want to upload to Edge Impulse files = [ 'one.png', 'two.png', ] # # Replace the label with your own. label = 'car' # Upload the file to Edge Impulse using the API, and print the response. res = requests.post(url='https://ingestion.edgeimpulse.com/api/training/files', headers={ 'x-label': label, 'x-api-key': api_key, }, # Creating the data payload for the request. files=(('data', (os.path.basename(i), open( i, 'rb'), 'image/png')) for i in files) ) if (res.status_code == 200): print('Uploaded file(s) to Edge Impulse\n', res.status_code, res.content) else: print('Failed to upload file(s) to Edge Impulse\n', res.status_code, res.content) ``` ```javascript javascript theme={"system"} import fetch, { FormData, fileFromSync } from 'node-fetch'; const form = new FormData(); form.append('data', fileFromSync('one.png')); form.append('data', fileFromSync('two.png')); fetch('https://ingestion.edgeimpulse.com/api/training/files', { method: 'POST', headers: { 'x-api-key': 'ei_238fae...', 'x-label': 'car', 'Content-Type': 'multipart/form-data' }, body: form }); ``` ### Raw requests On the embedded devices, usually, there are no high-level libraries available to perform HTTP requests. In this case, you can use the following example to prepare an HTTP request to the Ingestion API: The ingestion service accepts raw requests with data formatted as JSON or CBOR. We will use the following JSON structure as an example sample: ```json theme={"system"} { "payload": { "device_name": "11:22:33:44:55:66", "device_type": "NORDIC_NRF91", "interval_ms": 20.0, "sensors": [ { "name": "accX", "units": "m/s2" }, { "name": "accY", "units": "m/s2" }, { "name": "accZ", "units": "m/s2" } ], "values": [ [ 0.1627109944820404, -0.803987979888916, 9.82971477508545 ], [ 0.06699900329113007, -0.7752739787101746, 9.906285285949707 ] ] }, "protected": { "alg": "none", "ver": "v1" }, "signature": "00" } ``` # Remote Management API Source: https://docs.edgeimpulse.com/apis/remote-management The Remote Management API is used to allow devices to connect to Edge Impulse Studio. It is a part of the remote management service. For more information, please refer to the [WebSocket](/tools/protocols/remote-management/websocket) protocol documentation. ## Additional resources * [Remote management service WebSocket protocol](/tools/protocols/remote-management/websocket) # Studio API Source: https://docs.edgeimpulse.com/apis/studio The Edge Impulse API exposes programmatic access to most functionality in the studio. You can use the API to edit the labels of many samples at once, train models, or create new impulses. In addition, you can subscribe to events, such as when a new file was processed by the ingestion service. You authenticate with the API using an API Key or with a username/password, see [API Authentication Types](/apis/studio#api-authentication-types). The API is available at: ``` https://studio.edgeimpulse.com/v1 ``` The API is described in [OpenAPI format](https://swagger.io/specification/), which can be used to generate clients in many languages. The OpenAPI definition file is located [here](https://studio.edgeimpulse.com/openapi.yml). ## API authentication types
Security SchemeTypeInputName
ApiKeyAuthenticationapiKeyheaderx-api-key
JWTAuthenticationapiKeycookiejwt
JWTHttpHeaderAuthenticationapiKeyheaderx-jwt-token
### API key An Edge Impulse API key can be obtained through your Edge Impulse Studio project's dashboard. At the top of the page, click on the **Keys** button to see your project's available API keys, and to generate new keys. ### JWT token A JWT token can be acquired via the Edge Impulse API [Get JWT token](/apis/studio/login/get-jwt-token) request with your Edge Impulse username and password. **Example** ```bash theme={"system"} curl --request POST \ --url https://studio.edgeimpulse.com/v1/api-login \ --header 'content-type: application/json' \ --data-raw '{"username": "edge-user-01", "password": "reprehenderit ea"}' ``` ## Test API requests If you want to test your API requests directly from this documentation, you can use the provided widget: And set your `x-api-key` or `x-jwt-token` header or your `jwt` cookie: ## Jobs Jobs are long-running tasks that are executed asynchronously. Jobs are identified by their job ID, in the form of `job-1569583053767`, which is returned when starting a job. Subsequent job updates are published over the WebSocket API. Jobs started through the API are subject to the same usage limits (such as compute time used) as through the studio UI. ### Updates There are two events that are published regarding jobs: * `job-data-{jobId}` - status update on the job, e.g. progress when training a neural network. Provides a single argument: `{ data: 'string with status' }`. * `job-finished-{jobId}` - indicator that the job finished. Provides a single argument: `{ success: true }` which indicates whether the job was executed successfully. ### Canceling a job You can also cancel a job through the websocket by sending a `job-cancel` event. Pass in one parameter (the job ID). # Classify an image Source: https://docs.edgeimpulse.com/apis/studio/classify/classify-an-image /.assets/openapi.yaml post /api/{projectId}/classify/image Test out a trained impulse (using a posted image). # Classify job result Source: https://docs.edgeimpulse.com/apis/studio/classify/classify-job-result /.assets/openapi.yaml get /api/{projectId}/classify/all/result Get classify job result, containing the result for the complete testing dataset. # Classify sample Source: https://docs.edgeimpulse.com/apis/studio/classify/classify-sample /.assets/openapi.yaml post /api/{projectId}/classify/v2/{sampleId} Classify a complete file against the current impulse. This will move the sliding window (dependent on the sliding window length and the sliding window increase parameters in the impulse) over the complete file, and classify for every window that is extracted. Depending on the size of your file, whether your sample is resampled, and whether the result is cached you'll get either the result or a job back. If you receive a job, then wait for the completion of the job, and then call this function again to receive the results. The unoptimized (float32) model is used by default, and classification with an optimized (int8) model can be slower. # Classify sample by learn block Source: https://docs.edgeimpulse.com/apis/studio/classify/classify-sample-by-learn-block /.assets/openapi.yaml get /api/{projectId}/classify/anomaly-gmm/{blockId}/{sampleId} This API is deprecated, use classifySampleByLearnBlockV2 (`/v1/api/{projectId}/classify/anomaly-gmm/v2/{blockId}/{sampleId}`) instead. Classify a complete file against the specified learn block. This will move the sliding window (dependent on the sliding window length and the sliding window increase parameters in the impulse) over the complete file, and classify for every window that is extracted. # Classify sample by learn block Source: https://docs.edgeimpulse.com/apis/studio/classify/classify-sample-by-learn-block-1 /.assets/openapi.yaml post /api/{projectId}/classify/anomaly-gmm/v2/{blockId}/{sampleId} Classify a complete file against the specified learn block. This will move the sliding window (dependent on the sliding window length and the sliding window increase parameters in the impulse) over the complete file, and classify for every window that is extracted. Depending on the size of your file, whether your sample is resampled, and whether the result is cached you'll get either the result or a job back. If you receive a job, then wait for the completion of the job, and then call this function again to receive the results. The unoptimized (float32) model is used by default, and classification with an optimized (int8) model can be slower. # Classify sample (deprecated) Source: https://docs.edgeimpulse.com/apis/studio/classify/classify-sample-deprecated /.assets/openapi.yaml get /api/{projectId}/classify/{sampleId} This API is deprecated, use classifySampleV2 instead (`/v1/api/{projectId}/classify/v2/{sampleId}`). Classify a complete file against the current impulse. This will move the sliding window (dependent on the sliding window length and the sliding window increase parameters in the impulse) over the complete file, and classify for every window that is extracted. # Classify sample for the given set of variants Source: https://docs.edgeimpulse.com/apis/studio/classify/classify-sample-for-the-given-set-of-variants /.assets/openapi.yaml post /api/{projectId}/classify/v2/{sampleId}/variants Classify a complete file against the current impulse, for all given variants. Depending on the size of your file and whether the sample is resampled, you may get a job ID in the response. # Get a window of raw sample features from cache, after a live classification job has completed. Source: https://docs.edgeimpulse.com/apis/studio/classify/get-a-window-of-raw-sample-features-from-cache-after-a-live-classification-job-has-completed /.assets/openapi.yaml get /api/{projectId}/classify/v2/{sampleId}/raw-data/{windowIndex} Get raw sample features for a particular window. This is only available after a live classification job has completed and raw features have been cached. # Single page of a classify job result Source: https://docs.edgeimpulse.com/apis/studio/classify/single-page-of-a-classify-job-result /.assets/openapi.yaml get /api/{projectId}/classify/all/result/page Get classify job result, containing the predictions for a given page. # Build deployment (public) Source: https://docs.edgeimpulse.com/apis/studio/deployment/build-deployment-public /.assets/openapi.yaml post /api/{projectId}/deployment/public/build Create a deployment job for a _public_ project. You can only create deployments for "wasm" and "wasm-browser-simd" deployment types. If a deployment already exists, jobId is null. If a deployment did not exist, or a job is created, jobId is set to an integer, and you can get updates via `getPublicDeploymentStatus`. When this step is complete use `downloadHistoricDeployment` to download the artefacts using deploymentVersion. Updates are _NOT_ streamed over the websocket API (for security reasons); but can be obtained via `getPublicDeploymentStatus`. # Check evaluate job result (cache) Source: https://docs.edgeimpulse.com/apis/studio/deployment/check-evaluate-job-result-cache /.assets/openapi.yaml get /api/{projectId}/deployment/evaluate/cache Get evaluate job result, containing detailed performance statistics for every possible variant of the impulse. This only checks cache, and throws an error if there is no data in cache. # Deployment targets Source: https://docs.edgeimpulse.com/apis/studio/deployment/deployment-targets /.assets/openapi.yaml get /api/deployment/targets List all deployment targets # Deployment targets Source: https://docs.edgeimpulse.com/apis/studio/deployment/deployment-targets-1 /.assets/openapi.yaml get /api/{projectId}/deployment/targets List deployment targets for a project # Deployment targets (data sources) Source: https://docs.edgeimpulse.com/apis/studio/deployment/deployment-targets-data-sources /.assets/openapi.yaml get /api/{projectId}/deployment/targets/data-sources List deployment targets for a project from data sources page (it shows some things like all Linux deploys, and hides 'fake' deploy targets like mobile phone / computer) # Download Source: https://docs.edgeimpulse.com/apis/studio/deployment/download /.assets/openapi.yaml get /api/{projectId}/deployment/download DEPRECATED, use downloadHistoricDeployment instead. Download the build artefacts for a project. # Download historic deployment Source: https://docs.edgeimpulse.com/apis/studio/deployment/download-historic-deployment /.assets/openapi.yaml get /api/{projectId}/deployment/history/{deploymentVersion}/download Download a previously built deployment (use listDeploymentHistory to see all deployments). # Evaluate job result Source: https://docs.edgeimpulse.com/apis/studio/deployment/evaluate-job-result /.assets/openapi.yaml get /api/{projectId}/deployment/evaluate Get evaluate job result, containing detailed performance statistics for every possible variant of the impulse. # Find Syntiant posterior parameters Source: https://docs.edgeimpulse.com/apis/studio/deployment/find-syntiant-posterior-parameters /.assets/openapi.yaml post /api/{projectId}/jobs/find-syntiant-posterior Automatically find the current posterior parameters for the Syntiant deployment target # Get deployment info Source: https://docs.edgeimpulse.com/apis/studio/deployment/get-deployment-info /.assets/openapi.yaml get /api/{projectId}/deployment Gives information on whether a deployment was already built for a type # Get historic deployment Source: https://docs.edgeimpulse.com/apis/studio/deployment/get-historic-deployment /.assets/openapi.yaml get /api/{projectId}/deployment/history/{deploymentVersion} Get info about a previously built deployment. # Get information on the last deployment build Source: https://docs.edgeimpulse.com/apis/studio/deployment/get-information-on-the-last-deployment-build /.assets/openapi.yaml get /api/{projectId}/deployment/last Get information on the result of the last successful deployment job, including info on the build e.g. whether it is still valid. # Get status of build job (public) Source: https://docs.edgeimpulse.com/apis/studio/deployment/get-status-of-build-job-public /.assets/openapi.yaml get /api/{projectId}/deployment/public/jobs/{jobId}/status Get the status of a deployment job created through buildPublicDeploymentJob. # Get Syntiant posterior parameters Source: https://docs.edgeimpulse.com/apis/studio/deployment/get-syntiant-posterior-parameters /.assets/openapi.yaml get /api/{projectId}/deployment/syntiant/posterior Get the current posterior parameters for the Syntiant deployment target # List deployment history Source: https://docs.edgeimpulse.com/apis/studio/deployment/list-deployment-history /.assets/openapi.yaml get /api/{projectId}/deployment/history Lists all successfully built deployments. # Set Syntiant posterior parameters Source: https://docs.edgeimpulse.com/apis/studio/deployment/set-syntiant-posterior-parameters /.assets/openapi.yaml post /api/{projectId}/deployment/syntiant/posterior Set the current posterior parameters for the Syntiant deployment target # Create device Source: https://docs.edgeimpulse.com/apis/studio/devices/create-device /.assets/openapi.yaml post /api/{projectId}/devices/create Create a new device. If you set `ifNotExists` to `false` and the device already exists, the `deviceType` will be overwritten. # Delete device Source: https://docs.edgeimpulse.com/apis/studio/devices/delete-device /.assets/openapi.yaml delete /api/{projectId}/device/{deviceId} Delete a device. When this device sends a new message to ingestion or connects to remote management the device will be recreated. # Get device Source: https://docs.edgeimpulse.com/apis/studio/devices/get-device /.assets/openapi.yaml get /api/{projectId}/device/{deviceId} Retrieves a single device # Get impulse records Source: https://docs.edgeimpulse.com/apis/studio/devices/get-impulse-records /.assets/openapi.yaml post /api/{projectId}/device/{deviceId}/get-impulse-records Retrieve impulse records from the device. # Keep debug stream alive Source: https://docs.edgeimpulse.com/apis/studio/devices/keep-debug-stream-alive /.assets/openapi.yaml post /api/{projectId}/device/{deviceId}/debug-stream/keep-alive If you have opened a debug stream, ping this interface every 10 seconds to let us know to keep the debug stream open. # Lists devices Source: https://docs.edgeimpulse.com/apis/studio/devices/lists-devices /.assets/openapi.yaml get /api/{projectId}/devices List all devices for this project. Devices get included here if they connect to the remote management API or if they have sent data to the ingestion API and had the `device_id` field set. # Rename device Source: https://docs.edgeimpulse.com/apis/studio/devices/rename-device /.assets/openapi.yaml post /api/{projectId}/devices/{deviceId}/rename Set the current name for a device. # Start inference debug stream Source: https://docs.edgeimpulse.com/apis/studio/devices/start-inference-debug-stream /.assets/openapi.yaml post /api/{projectId}/device/{deviceId}/debug-stream/inference/start Start an inference debug stream for this device with inference results (and images if a camera is attached). Updates are streamed through the websocket API. A keep-alive token is returned, you'll need to ping the API (with keepDeviceDebugStreamAlive) every 10 seconds (so we know when the client is disconnected). # Start sampling Source: https://docs.edgeimpulse.com/apis/studio/devices/start-sampling /.assets/openapi.yaml post /api/{projectId}/device/{deviceId}/start-sampling Start sampling on a device. This function returns immediately. Updates are streamed through the websocket API. # Start snapshot debug stream Source: https://docs.edgeimpulse.com/apis/studio/devices/start-snapshot-debug-stream /.assets/openapi.yaml post /api/{projectId}/device/{deviceId}/debug-stream/snapshot/start Start a snapshot debug stream for this device with a current camera view. Updates are streamed through the websocket API. A keep-alive token is returned, you'll need to ping the API (with keepDeviceDebugStreamAlive) every 10 seconds (so we know when the client is disconnected). # Stop debug stream Source: https://docs.edgeimpulse.com/apis/studio/devices/stop-debug-stream /.assets/openapi.yaml post /api/{projectId}/device/{deviceId}/debug-stream/stop If you have opened a debug stream, close it. # Trigger model update request Source: https://docs.edgeimpulse.com/apis/studio/devices/trigger-model-update-request /.assets/openapi.yaml post /api/{projectId}/devices/{deviceId}/request-model-update Trigger a model update request, this only works for devices connected to remote management server in inference mode. # Clear DSP block Source: https://docs.edgeimpulse.com/apis/studio/dsp/clear-dsp-block /.assets/openapi.yaml post /api/{projectId}/dsp/{dspId}/clear Clear generated features for a DSP block (used in tests). # Download DSP data Source: https://docs.edgeimpulse.com/apis/studio/dsp/download-dsp-data /.assets/openapi.yaml get /api/{projectId}/dsp-data/{dspId}/x/{category} Download output from a DSP block over all data in the selected category, already sliced in windows. In Numpy binary format. # Download DSP labels Source: https://docs.edgeimpulse.com/apis/studio/dsp/download-dsp-labels /.assets/openapi.yaml get /api/{projectId}/dsp-data/{dspId}/y/{category} Download labels for a DSP block over all data in the selected category, already sliced in windows. # Feature importance Source: https://docs.edgeimpulse.com/apis/studio/dsp/feature-importance /.assets/openapi.yaml get /api/{projectId}/dsp/{dspId}/features/importance Retrieve the feature importance for a DSP block (only available for blocks where dimensionalityReduction is not enabled) # Feature labels Source: https://docs.edgeimpulse.com/apis/studio/dsp/feature-labels /.assets/openapi.yaml get /api/{projectId}/dsp/{dspId}/features/labels Retrieve the names of the features the DSP block generates # Features for sample Source: https://docs.edgeimpulse.com/apis/studio/dsp/features-for-sample /.assets/openapi.yaml get /api/{projectId}/dsp/{dspId}/features/get-graph/classification/{sampleId} Runs the DSP block against a sample. This will move the sliding window (dependent on the sliding window length and the sliding window increase parameters in the impulse) over the complete file, and run the DSP function for every window that is extracted. # Get config Source: https://docs.edgeimpulse.com/apis/studio/dsp/get-config /.assets/openapi.yaml get /api/{projectId}/dsp/{dspId} Retrieve the configuration parameters for the DSP block. Use the impulse functions to retrieve all DSP blocks. # Get DSP block performance for all latency devices Source: https://docs.edgeimpulse.com/apis/studio/dsp/get-dsp-block-performance-for-all-latency-devices /.assets/openapi.yaml get /api/{projectId}/dsp/{dspId}/performance Get estimated performance (latency and RAM) for the DSP block, for all supported project latency devices. # Get metadata Source: https://docs.edgeimpulse.com/apis/studio/dsp/get-metadata /.assets/openapi.yaml get /api/{projectId}/dsp/{dspId}/metadata Retrieve the metadata from a generated DSP block. # Get processed sample (from features array) Source: https://docs.edgeimpulse.com/apis/studio/dsp/get-processed-sample-from-features-array /.assets/openapi.yaml post /api/{projectId}/dsp/{dspId}/run Takes in a features array and runs it through the DSP block. This data should have the same frequency as set in the input block in your impulse. # Get processed sample (slice) Source: https://docs.edgeimpulse.com/apis/studio/dsp/get-processed-sample-slice /.assets/openapi.yaml post /api/{projectId}/dsp/{dspId}/raw-data/{sampleId}/slice/run Get slice of sample data, and run it through the DSP block. This only the axes selected by the DSP block. E.g. if you have selected only accX and accY as inputs for the DSP block, but the raw sample also contains accZ, accZ is filtered out. # Get processed sample (slice) Source: https://docs.edgeimpulse.com/apis/studio/dsp/get-processed-sample-slice-1 /.assets/openapi.yaml get /api/{projectId}/dsp/{dspId}/raw-data/{sampleId}/slice/run/readonly Get slice of sample data, and run it through the DSP block. This only the axes selected by the DSP block. E.g. if you have selected only accX and accY as inputs for the DSP block, but the raw sample also contains accZ, accZ is filtered out. # Get raw sample Source: https://docs.edgeimpulse.com/apis/studio/dsp/get-raw-sample /.assets/openapi.yaml get /api/{projectId}/dsp/{dspId}/raw-data/{sampleId} Get raw sample data, but with only the axes selected by the DSP block. E.g. if you have selected only accX and accY as inputs for the DSP block, but the raw sample also contains accZ, accZ is filtered out. If you pass dspId = 0 this will return a raw graph without any processing. # Get raw sample (slice) Source: https://docs.edgeimpulse.com/apis/studio/dsp/get-raw-sample-slice /.assets/openapi.yaml get /api/{projectId}/dsp/{dspId}/raw-data/{sampleId}/slice Get slice of raw sample data, but with only the axes selected by the DSP block. E.g. if you have selected only accX and accY as inputs for the DSP block, but the raw sample also contains accZ, accZ is filtered out. # Get results from DSP autotuner Source: https://docs.edgeimpulse.com/apis/studio/dsp/get-results-from-dsp-autotuner /.assets/openapi.yaml get /api/{projectId}/dsp/{dspId}/get-autotuner-results Get a set of parameters, found as a result of running the DSP autotuner. # Profile custom DSP block Source: https://docs.edgeimpulse.com/apis/studio/dsp/profile-custom-dsp-block /.assets/openapi.yaml post /api/{projectId}/dsp/{dspId}/profile Returns performance characteristics for a custom DSP block (needs `hasTfliteImplementation`). Updates are streamed over the websocket API (or can be retrieved through the /stdout endpoint). Use getProfileTfliteJobResult to get the results when the job is completed. # Sample of trained features Source: https://docs.edgeimpulse.com/apis/studio/dsp/sample-of-trained-features /.assets/openapi.yaml get /api/{projectId}/dsp/{dspId}/features/get-graph/{category} Get a sample of trained features, this extracts a number of samples and their labels. Used to visualize the current training set. # Set config Source: https://docs.edgeimpulse.com/apis/studio/dsp/set-config /.assets/openapi.yaml post /api/{projectId}/dsp/{dspId} Set configuration parameters for the DSP block. Only values set in the body will be overwritten. # Validate email for account sign-up Source: https://docs.edgeimpulse.com/apis/studio/emailverification/validate-email-for-account-sign-up /.assets/openapi.yaml post /api/emails/validate Validate whether an email is valid for sign up. Using an email that fails this check can result in the associated account missing communications and features that are distributed through email. # Download export Source: https://docs.edgeimpulse.com/apis/studio/export/download-export /.assets/openapi.yaml get /api/{projectId}/export/download Download the data export. This'll redirect you to a signed S3 URL. # Get URL of export Source: https://docs.edgeimpulse.com/apis/studio/export/get-url-of-export /.assets/openapi.yaml get /api/{projectId}/export/get-url Get the URL to the exported artefacts for an export job of a project. # Clone impulse (complete) Source: https://docs.edgeimpulse.com/apis/studio/impulse/clone-impulse-complete /.assets/openapi.yaml post /api/{projectId}/impulse/{impulseId}/clone/complete Clones the complete impulse (incl. config and data) of an existing impulse. # Clone impulse (structure) Source: https://docs.edgeimpulse.com/apis/studio/impulse/clone-impulse-structure /.assets/openapi.yaml post /api/{projectId}/impulse/{impulseId}/clone/structure Clones the complete structure (incl. config) of an impulse. Does not copy data. # Create impulse Source: https://docs.edgeimpulse.com/apis/studio/impulse/create-impulse /.assets/openapi.yaml post /api/{projectId}/impulse Sets the impulse for this project. If you specify `impulseId` then that impulse is created/updated, otherwise the default impulse is created/updated. # Create new empty impulse Source: https://docs.edgeimpulse.com/apis/studio/impulse/create-new-empty-impulse /.assets/openapi.yaml post /api/{projectId}/impulse/new Create a new empty impulse, and return the ID. # Delete impulse Source: https://docs.edgeimpulse.com/apis/studio/impulse/delete-impulse /.assets/openapi.yaml delete /api/{projectId}/impulse Clears the impulse and all associated blocks for this project. If you specify `impulseId` then that impulse is cleared, otherwise the default impulse is cleared. # Download all impulses (incl. metrics), as JSON or CSV. Source: https://docs.edgeimpulse.com/apis/studio/impulse/download-all-impulses-incl-metrics-as-json-or-csv /.assets/openapi.yaml get /api/{projectId}/download-impulses-detailed Download all impulse for a project, including accuracy and performance metrics, as JSON or CSV. # Get all impulses Source: https://docs.edgeimpulse.com/apis/studio/impulse/get-all-impulses /.assets/openapi.yaml get /api/{projectId}/impulses Retrieve all impulse for a project # Get all impulses (incl. metrics) Source: https://docs.edgeimpulse.com/apis/studio/impulse/get-all-impulses-incl-metrics /.assets/openapi.yaml get /api/{projectId}/impulses-detailed Retrieve all impulse for a project, including accuracy and performance metrics. # Get all transfer learning models Source: https://docs.edgeimpulse.com/apis/studio/impulse/get-all-transfer-learning-models /.assets/openapi.yaml get /api/{projectId}/transfer-learning-models Retrieve all transfer learning models across all categories # Get impulse Source: https://docs.edgeimpulse.com/apis/studio/impulse/get-impulse /.assets/openapi.yaml get /api/{projectId}/impulse Retrieve the impulse for this project. If you specify `impulseId` then that impulse is returned, otherwise the default impulse is returned. # Get impulse blocks Source: https://docs.edgeimpulse.com/apis/studio/impulse/get-impulse-blocks /.assets/openapi.yaml get /api/{projectId}/impulse/blocks Lists all possible blocks that can be used in the impulse # Get impulse including disabled blocks Source: https://docs.edgeimpulse.com/apis/studio/impulse/get-impulse-including-disabled-blocks /.assets/openapi.yaml get /api/{projectId}/impulse/all Retrieve the impulse for this project including disabled blocks. If you specify `impulseId` then that impulse is returned, otherwise the default impulse is returned. # Get new block ID Source: https://docs.edgeimpulse.com/apis/studio/impulse/get-new-block-id /.assets/openapi.yaml post /api/{projectId}/impulse/get-new-block-id Returns an unused block ID. Use this function to determine new block IDs when you construct an impulse; so you won't accidentally re-use block IDs. # Regenerate model testing summary Source: https://docs.edgeimpulse.com/apis/studio/impulse/regenerate-model-testing-summary /.assets/openapi.yaml post /api/{projectId}/impulse/{impulseId}/regenerate-model-testing-summary Regenerate model testing results (without re-running feature generation). Use this if thresholds changed (e.g. via setImpulseThresholds), but no job was kicked off automatically. # Set thresholds Source: https://docs.edgeimpulse.com/apis/studio/impulse/set-thresholds /.assets/openapi.yaml post /api/{projectId}/impulse/{impulseId}/set-thresholds Set thresholds (e.g. min. confidence rating, or min. anomaly score) for an impulse. # Update impulse Source: https://docs.edgeimpulse.com/apis/studio/impulse/update-impulse /.assets/openapi.yaml post /api/{projectId}/impulse/update Update the impulse for this project. If you specify `impulseId` then that impulse is created/updated, otherwise the default impulse is created/updated. # Verify custom DSP block Source: https://docs.edgeimpulse.com/apis/studio/impulse/verify-custom-dsp-block /.assets/openapi.yaml post /api/{projectId}/verify-dsp-block/url Verify the validity of a custom DSP block # Get TensorBoard session status Source: https://docs.edgeimpulse.com/apis/studio/integrations/get-tensorboard-session-status /.assets/openapi.yaml get /api/{projectId}/integrations/tensorboard/{resourceId} Get the status of a TensorBoard session # Start TensorBoard integration Source: https://docs.edgeimpulse.com/apis/studio/integrations/start-tensorboard-integration /.assets/openapi.yaml post /api/{projectId}/integrations/tensorboard/start Start a TensorBoard session for the requested learn blocks # Add keywords and noise Source: https://docs.edgeimpulse.com/apis/studio/jobs/add-keywords-and-noise /.assets/openapi.yaml post /api/{projectId}/jobs/keywords-noise Add keywords and noise data to a project (for getting started guide) # Autotune DSP parameters Source: https://docs.edgeimpulse.com/apis/studio/jobs/autotune-dsp-parameters /.assets/openapi.yaml post /api/{projectId}/jobs/autotune-dsp Autotune DSP block parameters. Updates are streamed over the websocket API. # Build on-device model Source: https://docs.edgeimpulse.com/apis/studio/jobs/build-on-device-model /.assets/openapi.yaml post /api/{projectId}/jobs/build-ondevice-model Generate code to run the impulse on an embedded device. When this step is complete use `downloadHistoricDeployment` to download the artefacts. Updates are streamed over the websocket API. # Build organizational on-device model Source: https://docs.edgeimpulse.com/apis/studio/jobs/build-organizational-on-device-model /.assets/openapi.yaml post /api/{projectId}/jobs/build-ondevice-model/organization Generate code to run the impulse on an embedded device using an organizational deployment block. When this step is complete use `downloadHistoricDeployment` to download the artefacts. Updates are streamed over the websocket API. # Cancel job Source: https://docs.edgeimpulse.com/apis/studio/jobs/cancel-job /.assets/openapi.yaml post /api/{projectId}/jobs/{jobId}/cancel Cancel a running job. # Classify Source: https://docs.edgeimpulse.com/apis/studio/jobs/classify /.assets/openapi.yaml post /api/{projectId}/jobs/classify Classifies all items in the testing dataset against the current impulse. Updates are streamed over the websocket API. # Create AI Actions job Source: https://docs.edgeimpulse.com/apis/studio/jobs/create-ai-actions-job /.assets/openapi.yaml post /api/{projectId}/jobs/ai-actions/{actionId} Run an AI Actions job over a subset of data. This will instruct the block to apply the changes directly to your dataset. To preview, use "createPreviewAIActionsJob". To set the config use `updateAIAction`. # Create preview AI Actions job Source: https://docs.edgeimpulse.com/apis/studio/jobs/create-preview-ai-actions-job /.assets/openapi.yaml post /api/{projectId}/jobs/ai-actions/{actionId}/preview Do a dry-run of an AI Actions job over a subset of data. This will instruct the block to propose changes to data items (via "setSampleProposedChanges") rather than apply the changes directly. # Create synthetic data Source: https://docs.edgeimpulse.com/apis/studio/jobs/create-synthetic-data /.assets/openapi.yaml post /api/{projectId}/jobs/synthetic-data Generate new synthetic data # Deploy pretrained model Source: https://docs.edgeimpulse.com/apis/studio/jobs/deploy-pretrained-model /.assets/openapi.yaml post /api/{projectId}/jobs/deploy-pretrained-model Takes in a TFLite file and builds the model and SDK. Updates are streamed over the websocket API (or can be retrieved through the /stdout endpoint). Use getProfileTfliteJobResult to get the results when the job is completed. # Download logs Source: https://docs.edgeimpulse.com/apis/studio/jobs/download-logs /.assets/openapi.yaml get /api/{projectId}/jobs/{jobId}/stdout/download Download the logs for a job (as a text file). # Evaluate Source: https://docs.edgeimpulse.com/apis/studio/jobs/evaluate /.assets/openapi.yaml post /api/{projectId}/jobs/evaluate Evaluates every variant of the current impulse. Updates are streamed over the websocket API. # Export data as WAV Source: https://docs.edgeimpulse.com/apis/studio/jobs/export-data-as-wav /.assets/openapi.yaml post /api/{projectId}/jobs/export/wav Export all the data in the project in WAV format. Updates are streamed over the websocket API. # Export Keras block Source: https://docs.edgeimpulse.com/apis/studio/jobs/export-keras-block /.assets/openapi.yaml post /api/{projectId}/jobs/train/keras/{learnId}/export Export the training pipeline of a Keras block. Updates are streamed over the websocket API. # Export Keras block data Source: https://docs.edgeimpulse.com/apis/studio/jobs/export-keras-block-data /.assets/openapi.yaml post /api/{projectId}/jobs/train/keras/{learnId}/data Export the data of a Keras block (already split in train/validate data). Updates are streamed over the websocket API. # Export original data Source: https://docs.edgeimpulse.com/apis/studio/jobs/export-original-data /.assets/openapi.yaml post /api/{projectId}/jobs/export/original Export all the data in the project as it was uploaded to Edge Impulse. Updates are streamed over the websocket API. # Generate data explorer features Source: https://docs.edgeimpulse.com/apis/studio/jobs/generate-data-explorer-features /.assets/openapi.yaml post /api/{projectId}/jobs/data-explorer-features Generate features for the data explorer # Generate features Source: https://docs.edgeimpulse.com/apis/studio/jobs/generate-features /.assets/openapi.yaml post /api/{projectId}/jobs/generate-features Take the raw training set and generate features from them. Updates are streamed over the websocket API. # Get impulse migration logs Source: https://docs.edgeimpulse.com/apis/studio/jobs/get-impulse-migration-logs /.assets/openapi.yaml get /api/{projectId}/jobs/impulse-migration/stdout Get the logs for the multi-impulse migration job in this project. This is a separate route so public projects can access it. If no multi-impulse migration jobs are present, an error will be thrown. # Get impulse migration status Source: https://docs.edgeimpulse.com/apis/studio/jobs/get-impulse-migration-status /.assets/openapi.yaml get /api/{projectId}/jobs/impulse-migration/status Get the status for the multi-impulse migration job in this project. This is a separate route so public projects can access it. If no multi-impulse migration jobs are present, an error will be thrown. # Get job status Source: https://docs.edgeimpulse.com/apis/studio/jobs/get-job-status /.assets/openapi.yaml get /api/{projectId}/jobs/{jobId}/status Get the status for a job. # Get logs Source: https://docs.edgeimpulse.com/apis/studio/jobs/get-logs /.assets/openapi.yaml get /api/{projectId}/jobs/{jobId}/stdout Get the logs for a job. # Get TFLite profile result (GET) Source: https://docs.edgeimpulse.com/apis/studio/jobs/get-tflite-profile-result-get /.assets/openapi.yaml get /api/{projectId}/jobs/profile-tflite/{jobId}/result Get the results from a job started from startProfileTfliteJob (via a GET request). # Get TFLite profile result (POST) Source: https://docs.edgeimpulse.com/apis/studio/jobs/get-tflite-profile-result-post /.assets/openapi.yaml post /api/{projectId}/jobs/profile-tflite/{jobId}/result Get the results from a job started from startProfileTfliteJob (via a POST request). # Import data from another project Source: https://docs.edgeimpulse.com/apis/studio/jobs/import-data-from-another-project /.assets/openapi.yaml post /api/{projectId}/jobs/import-data-from-project Adds all data from an existing project into this project. This function is only available through a JWT token; and you can only add data from projects that you're a collaborator on. # Job summary Source: https://docs.edgeimpulse.com/apis/studio/jobs/job-summary /.assets/openapi.yaml get /api/{projectId}/jobs/summary Get a summary of jobs, grouped by key. Used to report to users how much compute they've used. # List active jobs Source: https://docs.edgeimpulse.com/apis/studio/jobs/list-active-jobs /.assets/openapi.yaml get /api/{projectId}/jobs Get all active jobs for this project # List all jobs Source: https://docs.edgeimpulse.com/apis/studio/jobs/list-all-jobs /.assets/openapi.yaml get /api/{projectId}/jobs/all Get all jobs for this project # List finished jobs Source: https://docs.edgeimpulse.com/apis/studio/jobs/list-finished-jobs /.assets/openapi.yaml get /api/{projectId}/jobs/history Get all finished jobs for this project # Make a version public Source: https://docs.edgeimpulse.com/apis/studio/jobs/make-a-version-public /.assets/openapi.yaml post /api/{projectId}/jobs/versions/{versionId}/make-public Make a version of a project public. This makes all data and state available (read-only) on a public URL, and allows users to clone this project. # Optimize model Source: https://docs.edgeimpulse.com/apis/studio/jobs/optimize-model /.assets/openapi.yaml post /api/{projectId}/jobs/optimize Evaluates optimal model architecture # Performance Calibration Source: https://docs.edgeimpulse.com/apis/studio/jobs/performance-calibration /.assets/openapi.yaml post /api/{projectId}/jobs/performance-calibration Simulates real world usage and returns performance metrics. # Post-processing Source: https://docs.edgeimpulse.com/apis/studio/jobs/post-processing /.assets/openapi.yaml post /api/{projectId}/jobs/post-processing Begins post processing job # Profile TFLite model Source: https://docs.edgeimpulse.com/apis/studio/jobs/profile-tflite-model /.assets/openapi.yaml post /api/{projectId}/jobs/profile-tflite Takes in a TFLite model and returns the latency, RAM and ROM used for this model. Updates are streamed over the websocket API (or can be retrieved through the /stdout endpoint). Use getProfileTfliteJobResult to get the results when the job is completed. # Restore project to public version Source: https://docs.edgeimpulse.com/apis/studio/jobs/restore-project-to-public-version /.assets/openapi.yaml post /api/{projectId}/jobs/restore/from-public Restore a project to a certain public version. This can only applied to a project without data, and will overwrite your impulse and all settings. # Restore project to version Source: https://docs.edgeimpulse.com/apis/studio/jobs/restore-project-to-version /.assets/openapi.yaml post /api/{projectId}/jobs/restore Restore a project to a certain version. This can only applied to a project without data, and will overwrite your impulse and all settings. # Retrain Source: https://docs.edgeimpulse.com/apis/studio/jobs/retrain /.assets/openapi.yaml post /api/{projectId}/jobs/retrain Retrains the current impulse with the last known parameters. Updates are streamed over the websocket API. # Retry impulse migration Source: https://docs.edgeimpulse.com/apis/studio/jobs/retry-impulse-migration /.assets/openapi.yaml post /api/{projectId}/jobs/retry-migrate-impulse If an impulse migration previously failed, use this function to retry the job. # Sets EON tuner primary model Source: https://docs.edgeimpulse.com/apis/studio/jobs/sets-eon-tuner-primary-model /.assets/openapi.yaml post /api/{projectId}/jobs/set-tuner-primary-job Sets EON tuner primary model # Train model (Anomaly) Source: https://docs.edgeimpulse.com/apis/studio/jobs/train-model-anomaly /.assets/openapi.yaml post /api/{projectId}/jobs/train/anomaly/{learnId} Take the output from a DSP block and train an anomaly detection model using K-means or GMM. Updates are streamed over the websocket API. # Train model (Keras) Source: https://docs.edgeimpulse.com/apis/studio/jobs/train-model-keras /.assets/openapi.yaml post /api/{projectId}/jobs/train/keras/{learnId} Take the output from a DSP block and train a neural network using Keras. Updates are streamed over the websocket API. # Update job Source: https://docs.edgeimpulse.com/apis/studio/jobs/update-job /.assets/openapi.yaml post /api/{projectId}/jobs/{jobId}/update Update a job. # Version project Source: https://docs.edgeimpulse.com/apis/studio/jobs/version-project /.assets/openapi.yaml post /api/{projectId}/jobs/version Create a new version of the project. This stores all data and configuration offsite. If you have access to the enterprise version of Edge Impulse you can store your data in your own storage buckets (only through JWT token authentication). # Anomaly GMM metadata Source: https://docs.edgeimpulse.com/apis/studio/learn/anomaly-gmm-metadata /.assets/openapi.yaml get /api/{projectId}/training/anomaly/{learnId}/gmm/metadata Get raw model metadata of the Gaussian mixture model (GMM) for a trained anomaly block. Use the impulse blocks to find the learnId. # Anomaly information Source: https://docs.edgeimpulse.com/apis/studio/learn/anomaly-information /.assets/openapi.yaml get /api/{projectId}/training/anomaly/{learnId} Get information about an anomaly block, such as its dependencies. Use the impulse blocks to find the learnId. # Anomaly metadata Source: https://docs.edgeimpulse.com/apis/studio/learn/anomaly-metadata /.assets/openapi.yaml get /api/{projectId}/training/anomaly/{learnId}/metadata Get metadata about a trained anomaly block. Use the impulse blocks to find the learnId. # Anomaly settings Source: https://docs.edgeimpulse.com/apis/studio/learn/anomaly-settings /.assets/openapi.yaml post /api/{projectId}/training/anomaly/{learnId} Configure the anomaly block, such as its minimum confidence score. Use the impulse blocks to find the learnId. # Download data Source: https://docs.edgeimpulse.com/apis/studio/learn/download-data /.assets/openapi.yaml get /api/{projectId}/training/{learnId}/x Download the processed data for this learning block. This is data already processed by the signal processing blocks. # Download Keras data export Source: https://docs.edgeimpulse.com/apis/studio/learn/download-keras-data-export /.assets/openapi.yaml get /api/{projectId}/training/keras/{learnId}/download-data Download the data of an exported Keras block - needs to be exported via 'exportKerasBlockData' first # Download Keras export Source: https://docs.edgeimpulse.com/apis/studio/learn/download-keras-export /.assets/openapi.yaml get /api/{projectId}/training/keras/{learnId}/download-export Download an exported Keras block - needs to be exported via 'exportKerasBlock' first # Download labels Source: https://docs.edgeimpulse.com/apis/studio/learn/download-labels /.assets/openapi.yaml get /api/{projectId}/training/{learnId}/y Download the labels for this learning block. This is data already processed by the signal processing blocks. Not all blocks support this function. If so, a GenericApiResponse is returned with an error message. # Download pretrained model Source: https://docs.edgeimpulse.com/apis/studio/learn/download-pretrained-model /.assets/openapi.yaml get /api/{projectId}/pretrained-model/download/{pretrainedModelDownloadType} Download a pretrained model file # Download trained model Source: https://docs.edgeimpulse.com/apis/studio/learn/download-trained-model /.assets/openapi.yaml get /api/{projectId}/learn-data/{learnId}/model/{modelDownloadId} Download a trained model for a learning block. Depending on the block this can be a TensorFlow model, or the cluster centroids. # Get data explorer features Source: https://docs.edgeimpulse.com/apis/studio/learn/get-data-explorer-features /.assets/openapi.yaml get /api/{projectId}/training/keras/{learnId}/data-explorer/features t-SNE2 output of the raw dataset using embeddings from this Keras block # Get pretrained model Source: https://docs.edgeimpulse.com/apis/studio/learn/get-pretrained-model /.assets/openapi.yaml get /api/{projectId}/pretrained-model Receive info back about the earlier uploaded pretrained model (via `uploadPretrainedModel`) input/output tensors. If you want to deploy a pretrained model from the API, see `startDeployPretrainedModelJob`. # Keras information Source: https://docs.edgeimpulse.com/apis/studio/learn/keras-information /.assets/openapi.yaml get /api/{projectId}/training/keras/{learnId} Get information about a Keras block, such as its dependencies. Use the impulse blocks to find the learnId. # Keras metadata Source: https://docs.edgeimpulse.com/apis/studio/learn/keras-metadata /.assets/openapi.yaml get /api/{projectId}/training/keras/{learnId}/metadata Get metadata about a trained Keras block. Use the impulse blocks to find the learnId. # Keras settings Source: https://docs.edgeimpulse.com/apis/studio/learn/keras-settings /.assets/openapi.yaml post /api/{projectId}/training/keras/{learnId} Configure the Keras block, such as its minimum confidence score. Use the impulse blocks to find the learnId. # Profile pretrained model Source: https://docs.edgeimpulse.com/apis/studio/learn/profile-pretrained-model /.assets/openapi.yaml post /api/{projectId}/pretrained-model/profile Returns the latency, RAM and ROM used for the pretrained model - upload first via `uploadPretrainedModel`. This is using the project's selected latency device. Updates are streamed over the websocket API (or can be retrieved through the /stdout endpoint). Use getProfileTfliteJobResult to get the results when the job is completed. # Save parameters for pretrained model Source: https://docs.edgeimpulse.com/apis/studio/learn/save-parameters-for-pretrained-model /.assets/openapi.yaml post /api/{projectId}/pretrained-model/save Save input / model configuration for a pretrained model. This overrides the current impulse. If you want to deploy a pretrained model from the API, see `startDeployPretrainedModelJob`. # Start a profile job for a Keras learn block Source: https://docs.edgeimpulse.com/apis/studio/learn/start-a-profile-job-for-a-keras-learn-block /.assets/openapi.yaml post /api/{projectId}/training/keras/{learnId}/profile Starts an asynchronous profiling job, if there's no profiling information for the currently selected latency device. Afterwards, re-fetch model metadata to get the profiling job IDs. # Start a profile job for an anomaly learn block Source: https://docs.edgeimpulse.com/apis/studio/learn/start-a-profile-job-for-an-anomaly-learn-block /.assets/openapi.yaml post /api/{projectId}/training/anomaly/{learnId}/profile Starts an asynchronous profiling job, if there's no profiling information for the currently selected latency device. Afterwards, re-fetch model metadata to get the profiling job IDs. # Test pretrained model Source: https://docs.edgeimpulse.com/apis/studio/learn/test-pretrained-model /.assets/openapi.yaml post /api/{projectId}/pretrained-model/test Test out a pretrained model (using raw features) - upload first via `uploadPretrainedModel`. If you want to deploy a pretrained model from the API, see `startDeployPretrainedModelJob`. # Test pretrained model using image data Source: https://docs.edgeimpulse.com/apis/studio/learn/test-pretrained-model-using-image-data /.assets/openapi.yaml post /api/{projectId}/pretrained-model/test-image Test out a pretrained model (using image data) - upload first via `uploadPretrainedModel`. If you want to deploy a pretrained model from the API, see `startDeployPretrainedModelJob`. This will transform raw image data (e.g. RGB to grayscale, resize) before classifying. To classify raw features, see `testPretrainedModel`. # Trained features Source: https://docs.edgeimpulse.com/apis/studio/learn/trained-features /.assets/openapi.yaml get /api/{projectId}/training/anomaly/{learnId}/features/get-graph Get a sample of trained features, this extracts a number of samples and their features. # Trained features for sample Source: https://docs.edgeimpulse.com/apis/studio/learn/trained-features-for-sample /.assets/openapi.yaml get /api/{projectId}/training/anomaly/{learnId}/features/get-graph/classification/{sampleId} Get trained features for a single sample. This runs both the DSP prerequisites and the anomaly classifier. # Upload a pretrained model Source: https://docs.edgeimpulse.com/apis/studio/learn/upload-a-pretrained-model /.assets/openapi.yaml post /api/{projectId}/pretrained-model/upload Upload a pretrained model and receive info back about the input/output tensors. If you want to deploy a pretrained model from the API, see `startDeployPretrainedModelJob`. # Get JWT token Source: https://docs.edgeimpulse.com/apis/studio/login/get-jwt-token /.assets/openapi.yaml post /api-login Get a JWT token to authenticate with the API. # Get SSO settings for a user or email domain Source: https://docs.edgeimpulse.com/apis/studio/login/get-sso-settings-for-a-user-or-email-domain /.assets/openapi.yaml get /api-sso/{usernameOrEmail} Get the list of identity providers enabled for a user or a given email domain. # Complete EON tuner run Source: https://docs.edgeimpulse.com/apis/studio/optimization/complete-eon-tuner-run /.assets/openapi.yaml post /api/{projectId}/optimize/{jobId}/complete-search Complete EON tuner run and mark it as succesful # Create trial Source: https://docs.edgeimpulse.com/apis/studio/optimization/create-trial /.assets/openapi.yaml post /api/{projectId}/optimize/{jobId}/create-trial Create trial # Delete EON tuner state Source: https://docs.edgeimpulse.com/apis/studio/optimization/delete-eon-tuner-state /.assets/openapi.yaml delete /api/{projectId}/optimize/state Completely clears the EON tuner state for this project. # End EON tuner trial Source: https://docs.edgeimpulse.com/apis/studio/optimization/end-eon-tuner-trial /.assets/openapi.yaml get /api/{projectId}/optimize//{jobId}/trial/{trialId}/end-trial End an EON trial early. This can for example be used to implement early stopping. # Get all available learn blocks Source: https://docs.edgeimpulse.com/apis/studio/optimization/get-all-available-learn-blocks /.assets/openapi.yaml get /api/{projectId}/optimize/all-learn-blocks Get all available learn blocks # Get config Source: https://docs.edgeimpulse.com/apis/studio/optimization/get-config /.assets/openapi.yaml get /api/{projectId}/optimize/config Get config # Get impulse blocks Source: https://docs.edgeimpulse.com/apis/studio/optimization/get-impulse-blocks /.assets/openapi.yaml get /api/{projectId}/optimize/all-blocks Lists all possible blocks that can be used in the impulse, including any additional information required by the EON tuner that the getImpulseBlocks endpoint does not return # Get trial logs Source: https://docs.edgeimpulse.com/apis/studio/optimization/get-trial-logs /.assets/openapi.yaml get /api/{projectId}/optimize/trial/{trialId}/stdout Get the logs for a trial. # Get window settings Source: https://docs.edgeimpulse.com/apis/studio/optimization/get-window-settings /.assets/openapi.yaml get /api/{projectId}/optimize/window-settings Get window settings # List all tuner runs Source: https://docs.edgeimpulse.com/apis/studio/optimization/list-all-tuner-runs /.assets/openapi.yaml get /api/{projectId}/optimize/runs List all the tuner runs for a project. # Retrieves available transfer learning models Source: https://docs.edgeimpulse.com/apis/studio/optimization/retrieves-available-transfer-learning-models /.assets/openapi.yaml get /api/{projectId}/optimize/transfer-learning-models Retrieves available transfer learning models # Retrieves DSP block parameters Source: https://docs.edgeimpulse.com/apis/studio/optimization/retrieves-dsp-block-parameters /.assets/openapi.yaml get /api/{projectId}/optimize/dsp-parameters Retrieves DSP block parameters # Retrieves EON tuner state for a run. Source: https://docs.edgeimpulse.com/apis/studio/optimization/retrieves-eon-tuner-state-for-a-run /.assets/openapi.yaml get /api/{projectId}/optimize/{tunerCoordinatorJobId}/state Retrieves the EON tuner state for a specific run. # Retrieves the EON tuner state Source: https://docs.edgeimpulse.com/apis/studio/optimization/retrieves-the-eon-tuner-state /.assets/openapi.yaml get /api/{projectId}/optimize/state Retrieves the EON tuner state # Search space Source: https://docs.edgeimpulse.com/apis/studio/optimization/search-space /.assets/openapi.yaml get /api/{projectId}/optimize/space Search space # Update config Source: https://docs.edgeimpulse.com/apis/studio/optimization/update-config /.assets/openapi.yaml post /api/{projectId}/optimize/config Update config # Update EON tuner state Source: https://docs.edgeimpulse.com/apis/studio/optimization/update-eon-tuner-state /.assets/openapi.yaml post /api/{projectId}/optimize/{tunerCoordinatorJobId} Updates the EON tuner state for a specific run. # Add deploy block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/add-deploy-block /.assets/openapi.yaml post /api/organizations/{organizationId}/deploy Adds a deploy block. # Add dsp block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/add-dsp-block /.assets/openapi.yaml post /api/organizations/{organizationId}/dsp Adds a dsp block. # Add secret Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/add-secret /.assets/openapi.yaml post /api/organizations/{organizationId}/secrets Adds a secret. # Add transfer learning block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/add-transfer-learning-block /.assets/openapi.yaml post /api/organizations/{organizationId}/transfer-learning Adds a transfer learning block. # Add transformation block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/add-transformation-block /.assets/openapi.yaml post /api/organizations/{organizationId}/transformation Adds a transformation block. # Delete deploy block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/delete-deploy-block /.assets/openapi.yaml delete /api/organizations/{organizationId}/deploy/{deployId} Deletes a deploy block. # Delete dsp block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/delete-dsp-block /.assets/openapi.yaml delete /api/organizations/{organizationId}/dsp/{dspId} Deletes a dsp block. # Delete secret Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/delete-secret /.assets/openapi.yaml delete /api/organizations/{organizationId}/secrets/{secretId} Deletes a secret # Delete transfer learning block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/delete-transfer-learning-block /.assets/openapi.yaml delete /api/organizations/{organizationId}/transfer-learning/{transferLearningId} Deletes a transfer learning block. # Delete transformation block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/delete-transformation-block /.assets/openapi.yaml delete /api/organizations/{organizationId}/transformation/{transformationId} Deletes a transformation block. # Export deploy block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/export-deploy-block /.assets/openapi.yaml post /api/organizations/{organizationId}/deploy/{deployId}/export Download the source code for this block. # Export dsp block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/export-dsp-block /.assets/openapi.yaml post /api/organizations/{organizationId}/dsp/{dspId}/export Download the source code for this block. # Export transfer learning block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/export-transfer-learning-block /.assets/openapi.yaml post /api/organizations/{organizationId}/transfer-learning/{transferLearningId}/export Download the source code for this block. # Export transformation block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/export-transformation-block /.assets/openapi.yaml post /api/organizations/{organizationId}/transformation/{transformationId}/export Download the source code for this block. # Get deploy block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/get-deploy-block /.assets/openapi.yaml get /api/organizations/{organizationId}/deploy/{deployId} Gets a deploy block. # Get deploy blocks Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/get-deploy-blocks /.assets/openapi.yaml get /api/organizations/{organizationId}/deploy Retrieve all deploy blocks. # Get dsp block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/get-dsp-block /.assets/openapi.yaml get /api/organizations/{organizationId}/dsp/{dspId} Gets a dsp block. # Get dsp blocks Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/get-dsp-blocks /.assets/openapi.yaml get /api/organizations/{organizationId}/dsp Retrieve all dsp blocks. # Get public transformation block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/get-public-transformation-block /.assets/openapi.yaml get /api/organizations/{organizationId}/transformation/public/{transformationId} Retrieve a transformation blocks published by other organizations, available for all organizations. # Get secrets Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/get-secrets /.assets/openapi.yaml get /api/organizations/{organizationId}/secrets Retrieve all secrets. # Get transfer learning block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/get-transfer-learning-block /.assets/openapi.yaml get /api/organizations/{organizationId}/transfer-learning/{transferLearningId} Gets a transfer learning block. # Get transfer learning blocks Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/get-transfer-learning-blocks /.assets/openapi.yaml get /api/organizations/{organizationId}/transfer-learning Retrieve all transfer learning blocks. # Get transformation block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/get-transformation-block /.assets/openapi.yaml get /api/organizations/{organizationId}/transformation/{transformationId} Get a transformation block. # Get transformation blocks Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/get-transformation-blocks /.assets/openapi.yaml get /api/organizations/{organizationId}/transformation Retrieve all transformation blocks. # List public transformation blocks Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/list-public-transformation-blocks /.assets/openapi.yaml get /api/organizations/{organizationId}/transformation/public Retrieve all transformation blocks published by other organizations, available for all organizations. # Retry connection to dsp block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/retry-connection-to-dsp-block /.assets/openapi.yaml post /api/organizations/{organizationId}/dsp/{dspId}/retry Retry launch a dsp block. # Update deploy block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/update-deploy-block /.assets/openapi.yaml post /api/organizations/{organizationId}/deploy/{deployId} Updates a deploy block. Only values in the body will be updated. # Update dsp block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/update-dsp-block /.assets/openapi.yaml post /api/organizations/{organizationId}/dsp/{dspId} Updates a dsp block. Only values in the body will be updated. # Update transfer learning block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/update-transfer-learning-block /.assets/openapi.yaml post /api/organizations/{organizationId}/transfer-learning/{transferLearningId} Updates a transfer learning block. Only values in the body will be updated. # Update transformation block Source: https://docs.edgeimpulse.com/apis/studio/organizationblocks/update-transformation-block /.assets/openapi.yaml post /api/organizations/{organizationId}/transformation/{transformationId} Updates a transformation block. Only values in the body will be updated. # Add a collaborator to a project within an organisation Source: https://docs.edgeimpulse.com/apis/studio/organizationcreateproject/add-a-collaborator-to-a-project-within-an-organisation /.assets/openapi.yaml post /api/organizations/{organizationId}/add-project-collaborator Add a new collaborator to a project owned by an organisation. # Clear failed transform jobs Source: https://docs.edgeimpulse.com/apis/studio/organizationcreateproject/clear-failed-transform-jobs /.assets/openapi.yaml post /api/organizations/{organizationId}/create-project/{createProjectId}/transform/clear Clear all failed transform job from a create project job. Only jobs that have failed will be cleared. # Create new empty project Source: https://docs.edgeimpulse.com/apis/studio/organizationcreateproject/create-new-empty-project /.assets/openapi.yaml post /api/organizations/{organizationId}/new-project Create a new empty project within an organization. # Create pre-signed S3 upload link for a custom block archive Source: https://docs.edgeimpulse.com/apis/studio/organizationcreateproject/create-pre-signed-s3-upload-link-for-a-custom-block-archive /.assets/openapi.yaml post /api/organizations/{organizationId}/custom-block/upload-link Creates a signed link to securely upload a custom block archive directly to S3. # Delete create project file Source: https://docs.edgeimpulse.com/apis/studio/organizationcreateproject/delete-create-project-file /.assets/openapi.yaml delete /api/organizations/{organizationId}/create-project/{createProjectId}/files/{createProjectFileId} Remove a file from a create project job. Only files for which no jobs are running can be deleted. # Delete transformation job Source: https://docs.edgeimpulse.com/apis/studio/organizationcreateproject/delete-transformation-job /.assets/openapi.yaml delete /api/organizations/{organizationId}/create-project/{createProjectId} Remove a transformation job. This will stop all running jobs. # Finalize custom block upload Source: https://docs.edgeimpulse.com/apis/studio/organizationcreateproject/finalize-custom-block-upload /.assets/openapi.yaml post /api/organizations/{organizationId}/custom-block/finalize Verifies a staged custom block archive and starts a custom block build job. # Get transformation job status Source: https://docs.edgeimpulse.com/apis/studio/organizationcreateproject/get-transformation-job-status /.assets/openapi.yaml get /api/organizations/{organizationId}/create-project/{createProjectId} Get the current status of a transformation job job. # List transformation jobs Source: https://docs.edgeimpulse.com/apis/studio/organizationcreateproject/list-transformation-jobs /.assets/openapi.yaml get /api/organizations/{organizationId}/create-project Get list of transformation jobs. # Retry failed transform jobs Source: https://docs.edgeimpulse.com/apis/studio/organizationcreateproject/retry-failed-transform-jobs /.assets/openapi.yaml post /api/organizations/{organizationId}/create-project/{createProjectId}/transform/retry Retry all failed transform job from a transformation job. Only jobs that have failed will be retried. # Retry transformation file Source: https://docs.edgeimpulse.com/apis/studio/organizationcreateproject/retry-transformation-file /.assets/openapi.yaml post /api/organizations/{organizationId}/create-project/{createProjectId}/files/{createProjectFileId}/retry Retry a transformation action on a file from a transformation job. Only files that have failed can be retried. # Retry transformation upload job Source: https://docs.edgeimpulse.com/apis/studio/organizationcreateproject/retry-transformation-upload-job /.assets/openapi.yaml post /api/organizations/{organizationId}/create-project/{createProjectId}/upload/retry Retry the upload job from a transformation job. Only jobs that have failed can be retried. # Start transformation job Source: https://docs.edgeimpulse.com/apis/studio/organizationcreateproject/start-transformation-job /.assets/openapi.yaml post /api/organizations/{organizationId}/create-project Start a transformation job to fetch data from the organization and put it in a project, or transform into new data. # Update transformation job Source: https://docs.edgeimpulse.com/apis/studio/organizationcreateproject/update-transformation-job /.assets/openapi.yaml post /api/organizations/{organizationId}/create-project/{createProjectId} Update the properties of a transformation job. # Upload a custom block Source: https://docs.edgeimpulse.com/apis/studio/organizationcreateproject/upload-a-custom-block /.assets/openapi.yaml post /api/organizations/{organizationId}/custom-block Upload a zip file containing a custom transformation or deployment block. # Add a storage bucket Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/add-a-storage-bucket /.assets/openapi.yaml post /api/organizations/{organizationId}/buckets Add a storage bucket. # Add data items from bucket Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/add-data-items-from-bucket /.assets/openapi.yaml post /api/organizations/{organizationId}/data/add-folder Bulk adds data items that already exist in a storage bucket. The bucket path specified should contain folders. Each folder is added as a data item in Edge Impulse. # Add dataset Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/add-dataset /.assets/openapi.yaml post /api/organizations/{organizationId}/dataset Add a new research dataset # Add files Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/add-files /.assets/openapi.yaml post /api/organizations/{organizationId}/data/{dataId}/add Add a new file to an existing data item. # Add new data Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/add-new-data /.assets/openapi.yaml post /api/organizations/{organizationId}/data/add Add a new data item. You can add a maximum of 10000 files directly through this API. Use `addOrganizationDataFile` to add additional files. # Bulk update metadata Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/bulk-update-metadata /.assets/openapi.yaml post /api/organizations/{organizationId}/data/bulk-metadata Bulk update the metadata of many data items in one go. This requires you to submit a CSV file with headers, one of which the columns should be named 'name'. The other columns are used as metadata keys. # Change dataset Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/change-dataset /.assets/openapi.yaml post /api/organizations/{organizationId}/data/change-dataset Change the dataset for selected data items. # Clear checklist for data Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/clear-checklist-for-data /.assets/openapi.yaml post /api/organizations/{organizationId}/data/clear-checklist Clear all checklist flags for selected data items. # Create pre-signed S3 upload link Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/create-pre-signed-s3-upload-link /.assets/openapi.yaml post /api/organizations/{organizationId}/dataset/{dataset}/upload-link Creates a signed link to securely upload data to s3 bucket directly from the client. # Create storage bucket Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/create-storage-bucket /.assets/openapi.yaml post /api/organizations/{organizationId}/buckets/create Create a new storage bucket in the Edge Impulse infra. This API is only available through JWT token authentication. # Delete data Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/delete-data /.assets/openapi.yaml post /api/organizations/{organizationId}/data/delete Delete all data for selected data items. This removes all data in the underlying data bucket. # Delete data Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/delete-data-1 /.assets/openapi.yaml delete /api/organizations/{organizationId}/data/{dataId} Delete a data item. This will remove items the items from the underlying storage if your dataset has "bucketPath" set. # Delete file Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/delete-file /.assets/openapi.yaml delete /api/organizations/{organizationId}/data/{dataId}/download Delete a single file from a data item. # Delete file from dataset Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/delete-file-from-dataset /.assets/openapi.yaml post /api/organizations/{organizationId}/dataset/{dataset}/files/delete Delete a file from a dataset # Download data Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/download-data /.assets/openapi.yaml get /api/organizations/{organizationId}/data/download Download all data for selected data items. This function does not query the underlying bucket. # Download data Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/download-data-1 /.assets/openapi.yaml get /api/organizations/{organizationId}/data/{dataId}/download Download all data for this data item. # Download file Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/download-file /.assets/openapi.yaml get /api/organizations/{organizationId}/data/{dataId}/files/download Download a single file from a data item. # Download file from dataset Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/download-file-from-dataset /.assets/openapi.yaml post /api/organizations/{organizationId}/dataset/{dataset}/files/download Download a file from a dataset. Will return a signed URL to the bucket. # Download folder from dataset Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/download-folder-from-dataset /.assets/openapi.yaml get /api/organizations/{organizationId}/dataset/{dataset}/files/download-folder Download all files in the given folder in a dataset, ignoring any subdirectories. # Get data metadata Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/get-data-metadata /.assets/openapi.yaml get /api/organizations/{organizationId}/data/{dataId} Get a data item. This will HEAD the underlying bucket to retrieve the last file information. # Get dataset Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/get-dataset /.assets/openapi.yaml get /api/organizations/{organizationId}/dataset/{dataset} Get information about a dataset # Get storage bucket Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/get-storage-bucket /.assets/openapi.yaml get /api/organizations/{organizationId}/buckets/{bucketId} Get storage bucket details. # Get transformation jobs for data item Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/get-transformation-jobs-for-data-item /.assets/openapi.yaml get /api/organizations/{organizationId}/data/{dataId}/transformation-jobs Get all transformation jobs that ran for a data item. If limit / offset is not provided then max. 20 results are returned. # Hide dataset Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/hide-dataset /.assets/openapi.yaml post /api/organizations/{organizationId}/dataset/{dataset}/hide Hide a dataset (does not remove underlying data) # List data Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/list-data /.assets/openapi.yaml get /api/organizations/{organizationId}/data Lists all data items. This can be filtered by the ?filter parameter. # List files Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/list-files /.assets/openapi.yaml get /api/organizations/{organizationId}/data/files Lists all files included by the filter. # List files in dataset Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/list-files-in-dataset /.assets/openapi.yaml post /api/organizations/{organizationId}/dataset/{dataset}/files List all files and directories in specified prefix. # List storage buckets Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/list-storage-buckets /.assets/openapi.yaml get /api/organizations/{organizationId}/buckets Retrieve all configured storage buckets. This does not list the secret key. # Preview file Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/preview-file /.assets/openapi.yaml get /api/organizations/{organizationId}/data/{dataId}/files/preview Preview a single file from a data item (same as downloadOrganizationDataFile but w/ content-disposition inline and could be truncated). # Preview files in a default dataset Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/preview-files-in-a-default-dataset /.assets/openapi.yaml post /api/organizations/{organizationId}/dataset/{dataset}/files/preview Preview files and directories in a default dataset for the given prefix, with support for wildcards. This is an internal API used when starting a transformation job. # Refresh data Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/refresh-data /.assets/openapi.yaml post /api/organizations/{organizationId}/data/refresh Update all data items. HEADs all underlying buckets to retrieve the last file information. Use this API after uploading data directly to S3. If your dataset has bucketId and bucketPath set then this will also remove items that have been removed from S3. # Remove storage bucket Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/remove-storage-bucket /.assets/openapi.yaml delete /api/organizations/{organizationId}/buckets/{bucketId} Remove a storage bucket and associated datasets. This will render any data in this storage bucket unreachable. # Rename file from dataset Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/rename-file-from-dataset /.assets/openapi.yaml post /api/organizations/{organizationId}/dataset/{dataset}/files/rename Rename a file in a dataset # Update data metadata Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/update-data-metadata /.assets/openapi.yaml post /api/organizations/{organizationId}/data/{dataId} Update the data item metadata. # Update dataset Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/update-dataset /.assets/openapi.yaml post /api/organizations/{organizationId}/dataset/{dataset} Set information about a dataset # Update storage bucket Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/update-storage-bucket /.assets/openapi.yaml post /api/organizations/{organizationId}/buckets/{bucketId} Updates storage bucket details. This only updates fields that were set in the request body. Before updating the bucket details, it is required to verify the connection using the POST /api/organizations/{organizationId}/buckets/verify endpoint. The verification process: 1. Call the verify endpoint with the new bucket details. 2. Poll the verify endpoint until it responds with `connectionStatus: connected`. 3. If the endpoint responds with `connectionStatus: error`, the verification has failed. Only proceed with updating the bucket details after receiving a `connected` status. The polling interval and timeout should be determined based on your application's requirements. # Verify bucket connectivity Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/verify-bucket-connectivity /.assets/openapi.yaml post /api/organizations/{organizationId}/buckets/verify Verify connectivity to a storage bucket and optionally list its contents. This endpoint allows you to: 1. Check if the provided bucket credentials are valid and the bucket is accessible. 2. Optionally list files in the bucket up to a specified limit. 3. Validate the bucket configuration before adding it to the organization. The request can include details such as the bucket name, region, credentials, and listing options. The response provides information about the bucket's accessibility and, if requested, a list of files in the bucket. Important note on verification process: - For S3-compatible storage backends: Verification is expected to be immediate. - For Azure buckets: Verification takes longer. Users are required to poll this endpoint until the connectionStatus changes from 'connecting' to 'connected'. When dealing with Azure buckets, implement a polling mechanism to check the status periodically until it's confirmed as connected. # Verify dataset Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/verify-dataset /.assets/openapi.yaml post /api/organizations/{organizationId}/dataset/{dataset}/verify Verify whether we can reach a dataset (and return some random files, used for data sources) # Verify existing bucket connectivity Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/verify-existing-bucket-connectivity /.assets/openapi.yaml post /api/organizations/{organizationId}/buckets/{bucketId}/verify Verify whether we can reach a bucket before adding it. # View file from dataset Source: https://docs.edgeimpulse.com/apis/studio/organizationdata/view-file-from-dataset /.assets/openapi.yaml get /api/organizations/{organizationId}/dataset/{dataset}/files/view View a file that's located in a dataset (requires JWT auth). File might be converted (e.g. Parquet) or truncated (e.g. CSV). # Add a data campaign Source: https://docs.edgeimpulse.com/apis/studio/organizationdatacampaigns/add-a-data-campaign /.assets/openapi.yaml post /api/organizations/{organizationId}/campaigns Add a new data campaign to a data campaign dashboard # Add data campaign dashboard Source: https://docs.edgeimpulse.com/apis/studio/organizationdatacampaigns/add-data-campaign-dashboard /.assets/openapi.yaml post /api/organizations/{organizationId}/campaign-dashboards Add a new data campaign dashboard # Delete data campaign Source: https://docs.edgeimpulse.com/apis/studio/organizationdatacampaigns/delete-data-campaign /.assets/openapi.yaml delete /api/organizations/{organizationId}/campaigns/{campaignId} Delete a data campaign # Delete data campaign dashboard Source: https://docs.edgeimpulse.com/apis/studio/organizationdatacampaigns/delete-data-campaign-dashboard /.assets/openapi.yaml delete /api/organizations/{organizationId}/campaign-dashboard/{campaignDashboardId} Delete a data campaign dashboard # Get data campaign Source: https://docs.edgeimpulse.com/apis/studio/organizationdatacampaigns/get-data-campaign /.assets/openapi.yaml get /api/organizations/{organizationId}/campaigns/{campaignId} Get a data campaign # Get data campaign dashboard Source: https://docs.edgeimpulse.com/apis/studio/organizationdatacampaigns/get-data-campaign-dashboard /.assets/openapi.yaml get /api/organizations/{organizationId}/campaign-dashboard/{campaignDashboardId} Get a data campaign dashboard # Get data campaign dashboards Source: https://docs.edgeimpulse.com/apis/studio/organizationdatacampaigns/get-data-campaign-dashboards /.assets/openapi.yaml get /api/organizations/{organizationId}/campaign-dashboards List all data campaign dashboards # Get data campaigns Source: https://docs.edgeimpulse.com/apis/studio/organizationdatacampaigns/get-data-campaigns /.assets/openapi.yaml get /api/organizations/{organizationId}/campaign-dashboard/{campaignDashboardId}/campaigns Get a list of all data campaigns for a dashboard # Get diff for data campaign Source: https://docs.edgeimpulse.com/apis/studio/organizationdatacampaigns/get-diff-for-data-campaign /.assets/openapi.yaml post /api/organizations/{organizationId}/campaigns/{campaignId}/diff Get which items have changed for a data campaign. You post the data points and we'll return which data items are different in the past day. # Update data campaign Source: https://docs.edgeimpulse.com/apis/studio/organizationdatacampaigns/update-data-campaign /.assets/openapi.yaml post /api/organizations/{organizationId}/campaigns/{campaignId} Update a data campaign # Update data campaign dashboard Source: https://docs.edgeimpulse.com/apis/studio/organizationdatacampaigns/update-data-campaign-dashboard /.assets/openapi.yaml post /api/organizations/{organizationId}/campaign-dashboard/{campaignDashboardId} Update a data campaign dashboard # Cancel job Source: https://docs.edgeimpulse.com/apis/studio/organizationjobs/cancel-job /.assets/openapi.yaml post /api/organizations/{organizationId}/jobs/{jobId}/cancel Cancel a running job. # Download logs Source: https://docs.edgeimpulse.com/apis/studio/organizationjobs/download-logs /.assets/openapi.yaml get /api/organizations/{organizationId}/jobs/{jobId}/stdout/download Download the logs for a job (as a text file). # Get job status Source: https://docs.edgeimpulse.com/apis/studio/organizationjobs/get-job-status /.assets/openapi.yaml get /api/organizations/{organizationId}/jobs/{jobId}/status Get the status for a job. # Get logs Source: https://docs.edgeimpulse.com/apis/studio/organizationjobs/get-logs /.assets/openapi.yaml get /api/organizations/{organizationId}/jobs/{jobId}/stdout Get the logs for a job. # Get socket token for an organization Source: https://docs.edgeimpulse.com/apis/studio/organizationjobs/get-socket-token-for-an-organization /.assets/openapi.yaml get /api/organizations/{organizationId}/socket-token Get a token to authenticate with the web socket interface. # List active jobs Source: https://docs.edgeimpulse.com/apis/studio/organizationjobs/list-active-jobs /.assets/openapi.yaml get /api/organizations/{organizationId}/jobs Get all active jobs for this organization # List all jobs Source: https://docs.edgeimpulse.com/apis/studio/organizationjobs/list-all-jobs /.assets/openapi.yaml get /api/organizations/{organizationId}/jobs/all Get all jobs for this organization # List finished jobs Source: https://docs.edgeimpulse.com/apis/studio/organizationjobs/list-finished-jobs /.assets/openapi.yaml get /api/organizations/{organizationId}/jobs/history Get all finished jobs for this organization # Create pipeline Source: https://docs.edgeimpulse.com/apis/studio/organizationpipelines/create-pipeline /.assets/openapi.yaml post /api/organizations/{organizationId}/pipelines Create an organizational pipelines # Delete pipeline Source: https://docs.edgeimpulse.com/apis/studio/organizationpipelines/delete-pipeline /.assets/openapi.yaml delete /api/organizations/{organizationId}/pipelines/{pipelineId} Delete an organizational pipelines # Get pipeline Source: https://docs.edgeimpulse.com/apis/studio/organizationpipelines/get-pipeline /.assets/openapi.yaml get /api/organizations/{organizationId}/pipelines/{pipelineId} Retrieve an organizational pipelines # List archived pipelines Source: https://docs.edgeimpulse.com/apis/studio/organizationpipelines/list-archived-pipelines /.assets/openapi.yaml get /api/organizations/{organizationId}/pipelines/archived Retrieve all archived organizational pipelines # List pipelines Source: https://docs.edgeimpulse.com/apis/studio/organizationpipelines/list-pipelines /.assets/openapi.yaml get /api/organizations/{organizationId}/pipelines Retrieve all organizational pipelines # Run pipeline Source: https://docs.edgeimpulse.com/apis/studio/organizationpipelines/run-pipeline /.assets/openapi.yaml post /api/organizations/{organizationId}/pipelines/{pipelineId}/run Run an organizational pipeline # Stop a running pipeline Source: https://docs.edgeimpulse.com/apis/studio/organizationpipelines/stop-a-running-pipeline /.assets/openapi.yaml post /api/organizations/{organizationId}/pipelines/{pipelineId}/stop Stops the pipeline, and marks it as failed. # Update pipeline Source: https://docs.edgeimpulse.com/apis/studio/organizationpipelines/update-pipeline /.assets/openapi.yaml post /api/organizations/{organizationId}/pipelines/{pipelineId} Update an organizational pipelines # Create upload portal Source: https://docs.edgeimpulse.com/apis/studio/organizationportals/create-upload-portal /.assets/openapi.yaml post /api/organizations/{organizationId}/portals/create Creates a new upload portal for the organization. # Delete upload portal Source: https://docs.edgeimpulse.com/apis/studio/organizationportals/delete-upload-portal /.assets/openapi.yaml delete /api/organizations/{organizationId}/portals/{portalId}/delete Deletes an upload portal for the organization. # List upload portals Source: https://docs.edgeimpulse.com/apis/studio/organizationportals/list-upload-portals /.assets/openapi.yaml get /api/organizations/{organizationId}/portals Retrieve all configured upload portals. # Retrieve upload portal information Source: https://docs.edgeimpulse.com/apis/studio/organizationportals/retrieve-upload-portal-information /.assets/openapi.yaml get /api/organizations/{organizationId}/portals/{portalId} Retrieve a single upload portals identified by ID. # Rotate upload portal token Source: https://docs.edgeimpulse.com/apis/studio/organizationportals/rotate-upload-portal-token /.assets/openapi.yaml delete /api/organizations/{organizationId}/portals/{portalId}/rotate-token Rotates the token for an upload portal. # Update upload portal Source: https://docs.edgeimpulse.com/apis/studio/organizationportals/update-upload-portal /.assets/openapi.yaml put /api/organizations/{organizationId}/portals/{portalId}/update Updates an upload portal for the organization. # Verify upload portal information Source: https://docs.edgeimpulse.com/apis/studio/organizationportals/verify-upload-portal-information /.assets/openapi.yaml get /api/organizations/{organizationId}/portals/{portalId}/verify Retrieve a subset of files from the portal, to be used in the data source wizard. # Add API key Source: https://docs.edgeimpulse.com/apis/studio/organizations/add-api-key /.assets/openapi.yaml post /api/organizations/{organizationId}/apikeys Add an API key. # Add member Source: https://docs.edgeimpulse.com/apis/studio/organizations/add-member /.assets/openapi.yaml post /api/organizations/{organizationId}/members/add Add a member to an organization. # Admin endpoint Source: https://docs.edgeimpulse.com/apis/studio/organizations/admin-endpoint /.assets/openapi.yaml get /api/organizations/{organizationId}/test-admin Test endpoint that can only be reached with admin rights. # Create multi-project deployment Source: https://docs.edgeimpulse.com/apis/studio/organizations/create-multi-project-deployment /.assets/openapi.yaml post /api/organizations/{organizationId}/multi-project-deployment/start WIP # Delete a user Source: https://docs.edgeimpulse.com/apis/studio/organizations/delete-a-user /.assets/openapi.yaml delete /api/organizations/{organizationId}/whitelabel/users/{userId} White label admin only API to delete a user. # Download multi-project deployment Source: https://docs.edgeimpulse.com/apis/studio/organizations/download-multi-project-deployment /.assets/openapi.yaml get /api/organizations/{organizationId}/multi-project-deployment/jobs/{jobId}/download WIP # Download organization data export Source: https://docs.edgeimpulse.com/apis/studio/organizations/download-organization-data-export /.assets/openapi.yaml get /api/organizations/{organizationId}/exports/{exportId}/download Download a data export for an organization. # Get all organization data exports Source: https://docs.edgeimpulse.com/apis/studio/organizations/get-all-organization-data-exports /.assets/openapi.yaml get /api/organizations/{organizationId}/exports Get all data exports for an organization. # Get API keys Source: https://docs.edgeimpulse.com/apis/studio/organizations/get-api-keys /.assets/openapi.yaml get /api/organizations/{organizationId}/apikeys Retrieve all API keys. This does **not** return the full API key, but only a portion (for security purposes). # Get organization data export Source: https://docs.edgeimpulse.com/apis/studio/organizations/get-organization-data-export /.assets/openapi.yaml get /api/organizations/{organizationId}/exports/{exportId} Get a data export for an organization. # Get projects Source: https://docs.edgeimpulse.com/apis/studio/organizations/get-projects /.assets/openapi.yaml get /api/organizations/{organizationId}/projects Retrieve all projects for the organization. # Invite member Source: https://docs.edgeimpulse.com/apis/studio/organizations/invite-member /.assets/openapi.yaml post /api/organizations/{organizationId}/members/invite Invite a member to an organization. # List active organizations Source: https://docs.edgeimpulse.com/apis/studio/organizations/list-active-organizations /.assets/openapi.yaml get /api/organizations Retrieve list of organizations that a user is a part of. If authenticating using JWT token this lists all the organizations the user has access to, if authenticating using an API key, this only lists that organization. # Organization information Source: https://docs.edgeimpulse.com/apis/studio/organizations/organization-information /.assets/openapi.yaml get /api/organizations/{organizationId} List all information about this organization. # Organization metrics Source: https://docs.edgeimpulse.com/apis/studio/organizations/organization-metrics /.assets/openapi.yaml get /api/organizations/{organizationId}/metrics Get general metrics for this organization. # Remove member Source: https://docs.edgeimpulse.com/apis/studio/organizations/remove-member /.assets/openapi.yaml post /api/organizations/{organizationId}/members/remove Remove a member from an organization. Note that you cannot invoke this function if only a single member is present to the organization. # Remove organization Source: https://docs.edgeimpulse.com/apis/studio/organizations/remove-organization /.assets/openapi.yaml delete /api/organizations/{organizationId} Remove the current organization, and all data associated with it. This is irrevocable! # Request HR block license Source: https://docs.edgeimpulse.com/apis/studio/organizations/request-hr-block-license /.assets/openapi.yaml post /api/organizations/{organizationId}/request-hr-block-license Request a license required for the deployment of an impulse containing the Edge Impulse HR block. # Request organization limits increase Source: https://docs.edgeimpulse.com/apis/studio/organizations/request-organization-limits-increase /.assets/openapi.yaml post /api/organizations/{organizationId}/limits-request Request an increase in the limits for this organization. Available limits are: users, projects, compute, storage. # Request trial extension Source: https://docs.edgeimpulse.com/apis/studio/organizations/request-trial-extension /.assets/openapi.yaml post /api/organizations/{organizationId}/trial/request-extension Request an extension for an enterprise trial. # Resend invitation Source: https://docs.edgeimpulse.com/apis/studio/organizations/resend-invitation /.assets/openapi.yaml post /api/organizations/{organizationId}/members/{memberId}/resend-invite Resend an invitation to a member in an organization. # Revoke API key Source: https://docs.edgeimpulse.com/apis/studio/organizations/revoke-api-key /.assets/openapi.yaml delete /api/organizations/{organizationId}/apikeys/{apiKeyId} Revoke an API key. # Set member datasets Source: https://docs.edgeimpulse.com/apis/studio/organizations/set-member-datasets /.assets/openapi.yaml post /api/organizations/{organizationId}/members/{memberId}/datasets Set the datasets a guest member has access to in an organization. # Set member role Source: https://docs.edgeimpulse.com/apis/studio/organizations/set-member-role /.assets/openapi.yaml post /api/organizations/{organizationId}/members/{memberId}/role Change the role of a member in an organization. # Update organization Source: https://docs.edgeimpulse.com/apis/studio/organizations/update-organization /.assets/openapi.yaml post /api/organizations/{organizationId} Update organization properties such as name and logo. # Upload image for readme Source: https://docs.edgeimpulse.com/apis/studio/organizations/upload-image-for-readme /.assets/openapi.yaml post /api/organizations/{organizationId}/readme/upload-image Uploads an image to the user CDN and returns the path. # Upload organization header image Source: https://docs.edgeimpulse.com/apis/studio/organizations/upload-organization-header-image /.assets/openapi.yaml post /api/organizations/{organizationId}/header Uploads and updates the organization header image # Upload organization logo Source: https://docs.edgeimpulse.com/apis/studio/organizations/upload-organization-logo /.assets/openapi.yaml post /api/organizations/{organizationId}/logo Uploads and updates the organization logo # White Label Admin - Add a development board to a whitelabel Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--add-a-development-board-to-a-whitelabel /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/development-boards White label admin only API to add a development board. # White Label Admin - Add organization API key Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--add-organization-api-key /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId}/apiKeys White label admin only API to add an API key to an organization. Add a temporary API key that can be used to make Organizations API (/api/organizations/{organizationId}/) requests on behalf of the organization. These API keys are not visible to the organization itself and have a customizable TTL defaulting to 1 minute. # White Label Admin - Add Project API key Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--add-project-api-key /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/projects/{projectId}/apiKeys White label admin only API to add an API key to a project. Add a temporary API key that can be used to make Projects API (/api/projects/{projectId}/) requests on behalf of the project admin. These API keys are not visible to the project itself and have a customizable TTL defaulting to 1 minute. # White Label Admin - Add user to a project Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--add-user-to-a-project /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/projects/{projectId}/members DEPRECATED. White label admin only API to add a user to a project. If no user is provided, the current user is used. # White Label Admin - Add user to an organization Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--add-user-to-an-organization /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId}/members DEPRECATED. White label admin only API to add a user to an organization. If no user is provided, the current user is used. # White Label Admin - Create a new organization data export Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--create-a-new-organization-data-export /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId}/exports Create a new data export for an organization. A job is created to process the export request and the job details are returned in the response. This is an API only available to white label admins. # White Label Admin - Create a new organization project Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--create-a-new-organization-project /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId}/projects White label admin only API to create a new project for an organization. # White Label Admin - Create a new project within white label context. Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--create-a-new-project-within-white-label-context /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/projects Create a new free tier project. This is an API only available to white label admins. # White Label Admin - Create new organization within white label context Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--create-new-organization-within-white-label-context /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/organizations Create a new organization. This is an API only available to white label admins # White Label Admin - Creates a new usage report Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--creates-a-new-usage-report /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId}/usage/reports Create a new usage report for an organization. A job is created to process the report request and the job details are returned in the response. This is an API only available to white label admins. # White Label Admin - Delete a project Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--delete-a-project /.assets/openapi.yaml delete /api/organizations/{organizationId}/whitelabel/projects/{projectId} White label admin only API to delete a project. # White Label Admin - Delete an organization Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--delete-an-organization /.assets/openapi.yaml delete /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId} White label admin only API to delete an organization. # White Label Admin - Delete organization data export Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--delete-organization-data-export /.assets/openapi.yaml delete /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId}/exports/{exportId} Delete a data export for an organization. This is an API only available to white label admins. # White Label Admin - Delete usage report Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--delete-usage-report /.assets/openapi.yaml delete /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId}/usage/reports/{reportId} Delete a usage report for an organization. This is an API only available to white label admins. # White Label Admin - Download usage report Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--download-usage-report /.assets/openapi.yaml get /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId}/usage/reports/{reportId}/download Download a usage report for an organization. This is an API only available to white label admins. # White Label Admin - Get a white label project Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--get-a-white-label-project /.assets/openapi.yaml get /api/organizations/{organizationId}/whitelabel/projects/{projectId} White label admin only API to get project information. # White Label Admin - Get a white label user Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--get-a-white-label-user /.assets/openapi.yaml get /api/organizations/{organizationId}/whitelabel/users/{userId} White label admin only API to get information about a user. # White Label Admin - Get all organization data exports Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--get-all-organization-data-exports /.assets/openapi.yaml get /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId}/exports Get all data exports for an organization. This is an API only available to white label admins. # White Label Admin - Get all organizations within a white label Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--get-all-organizations-within-a-white-label /.assets/openapi.yaml get /api/organizations/{organizationId}/whitelabel/organizations White label admin only API to get the list of all organizations. # White Label Admin - Get all usage reports Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--get-all-usage-reports /.assets/openapi.yaml get /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId}/usage/reports Get all usage reports for an organization. This is an API only available to white label admins. # White Label Admin - Get all white label projects Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--get-all-white-label-projects /.assets/openapi.yaml get /api/organizations/{organizationId}/whitelabel/projects White label admin only API to get the list of all projects. # White Label Admin - Get all white label users Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--get-all-white-label-users /.assets/openapi.yaml get /api/organizations/{organizationId}/whitelabel/users White label admin only API to get the list of all registered users. # White Label Admin - Get global white label metrics Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--get-global-white-label-metrics /.assets/openapi.yaml get /api/organizations/{organizationId}/whitelabel/metrics White label admin only API to get global metrics. # White Label Admin - Get organization compute time usage Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--get-organization-compute-time-usage /.assets/openapi.yaml get /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId}/usage/computeTime Get compute time usage for an organization over a period of time. This is an API only available to white label admins # White Label Admin - Get organization data export Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--get-organization-data-export /.assets/openapi.yaml get /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId}/exports/{exportId} Get a data export for an organization. This is an API only available to white label admins. # White Label Admin - Get organization information Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--get-organization-information /.assets/openapi.yaml get /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId} White label admin only API to list all information about an organization. # White Label Admin - Get organization jobs Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--get-organization-jobs /.assets/openapi.yaml get /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId}/jobs White label admin only API to get the list of all jobs for a organization. # White Label Admin - Get project jobs Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--get-project-jobs /.assets/openapi.yaml get /api/organizations/{organizationId}/whitelabel/projects/{projectId}/jobs White label admin only API to get the list of all jobs for a project. # White Label Admin - Get usage report Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--get-usage-report /.assets/openapi.yaml get /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId}/usage/reports/{reportId} Get a usage report for an organization. This is an API only available to white label admins. # White Label Admin - Get user jobs Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--get-user-jobs /.assets/openapi.yaml get /api/organizations/{organizationId}/whitelabel/users/{userId}/jobs White label admin only API to get the list of all project jobs for a user. # White Label Admin - Get white label information Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--get-white-label-information /.assets/openapi.yaml get /api/organizations/{organizationId}/whitelabel White label admin only API to get the white label information. # White Label Admin - Get white label user metrics Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--get-white-label-user-metrics /.assets/openapi.yaml get /api/organizations/{organizationId}/whitelabel/users/{userId}/metrics White label admin only API to get marketing metrics about a user. # White Label Admin - Remove a development board from a whitelabel Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--remove-a-development-board-from-a-whitelabel /.assets/openapi.yaml delete /api/organizations/{organizationId}/whitelabel/development-boards/{developmentBoardId} White label admin only API to remove a development board. # White Label Admin - Remove user from a project Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--remove-user-from-a-project /.assets/openapi.yaml delete /api/organizations/{organizationId}/whitelabel/projects/{projectId}/members/{userId} DEPRECATED. White label admin only API to remove a user from a project. # White Label Admin - Remove user from an organization Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--remove-user-from-an-organization /.assets/openapi.yaml delete /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId}/members/{userId} DEPRECATED. White label admin only API to remove a user from an organization. # White Label Admin - Restore an organization Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--restore-an-organization /.assets/openapi.yaml get /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId}/restore White label admin only API to restore a deleted organization. All organization projects sharing the same deletion date as that of the organization will also be restored. If this is a trial organization that was never upgraded to a paid plan then the organization will be restored to its original trial state. # White Label Admin - Update a development board in a whitelabel Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--update-a-development-board-in-a-whitelabel /.assets/openapi.yaml put /api/organizations/{organizationId}/whitelabel/development-boards/{developmentBoardId} White label admin only API to update a development board. # White Label Admin - Update default deployment target Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--update-default-deployment-target /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/deploymentTargets/default White label admin only API to update the default deployment target for this white label. # White Label Admin - Update deployment targets Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--update-deployment-targets /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/deploymentTargets White label admin only API to update some or all of the deployment targets enabled for this white label. # White Label Admin - Update learning blocks Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--update-learning-blocks /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/learningBlocks White label admin only API to update some or all of the learning blocks enabled for this white label. # White Label Admin - Update organization Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--update-organization /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId} White label admin only API to update organization properties such as name and logo. # White Label Admin - Update organization data export Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--update-organization-data-export /.assets/openapi.yaml put /api/organizations/{organizationId}/whitelabel/organizations/{innerOrganizationId}/exports/{exportId} Update a data export for an organization. This is an API only available to white label admins. # White Label Admin - Update the image of a whitelabel development board Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--update-the-image-of-a-whitelabel-development-board /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/development-boards/{developmentBoardId}/image White label admin only API to update the image of a development board. # White Label Admin - Update the order of deployment options in the deployment view Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--update-the-order-of-deployment-options-in-the-deployment-view /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/deploymentOptionsOrder White label admin only API to customize the order of deployment options in the deployment view for this white label. # White Label Admin - Update theme colors Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--update-theme-colors /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/theme/colors White label admin only API to update some or all theme colors. # White Label Admin - Update theme device logo Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--update-theme-device-logo /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/theme/deviceLogo White label admin only API to update the white label theme device logo. # White Label Admin - Update theme favicon Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--update-theme-favicon /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/theme/favicon White label admin only API to update the theme favicon. # White Label Admin - Update theme logo Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--update-theme-logo /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/theme/logo White label admin only API to update the white label theme logo. # White Label Admin - Update white label information Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--update-white-label-information /.assets/openapi.yaml put /api/organizations/{organizationId}/whitelabel White label admin only API to update the white label information. # White Label Admin - Update white label project Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--update-white-label-project /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/projects/{projectId} White label admin only API to update project properties. # White Label Admin - Update white label user Source: https://docs.edgeimpulse.com/apis/studio/organizations/white-label-admin--update-white-label-user /.assets/openapi.yaml post /api/organizations/{organizationId}/whitelabel/users/{userId} White label admin only API to update user properties. # Clear performance calibration parameters Source: https://docs.edgeimpulse.com/apis/studio/performancecalibration/clear-performance-calibration-parameters /.assets/openapi.yaml delete /api/{projectId}/performance-calibration/parameters Clears the current performance calibration parameters # Clear Performance Calibration state Source: https://docs.edgeimpulse.com/apis/studio/performancecalibration/clear-performance-calibration-state /.assets/openapi.yaml post /api/{projectId}/performance-calibration/clear Deletes all state related to performance calibration (used in tests for example). # Get ground truth Source: https://docs.edgeimpulse.com/apis/studio/performancecalibration/get-ground-truth /.assets/openapi.yaml get /api/{projectId}/performance-calibration/ground-truth Get performance calibration ground truth data # Get parameter sets Source: https://docs.edgeimpulse.com/apis/studio/performancecalibration/get-parameter-sets /.assets/openapi.yaml get /api/{projectId}/performance-calibration/parameter-sets Get performance calibration parameter sets # Get parameters Source: https://docs.edgeimpulse.com/apis/studio/performancecalibration/get-parameters /.assets/openapi.yaml get /api/{projectId}/performance-calibration/parameters Get performance calibration stored parameters # Get raw result Source: https://docs.edgeimpulse.com/apis/studio/performancecalibration/get-raw-result /.assets/openapi.yaml get /api/{projectId}/performance-calibration/raw-result Get performance calibration raw result # Get status Source: https://docs.edgeimpulse.com/apis/studio/performancecalibration/get-status /.assets/openapi.yaml get /api/{projectId}/performance-calibration/status Get performance calibration status # Get WAV file Source: https://docs.edgeimpulse.com/apis/studio/performancecalibration/get-wav-file /.assets/openapi.yaml get /api/{projectId}/performance-calibration/wav Get the synthetic sample as a WAV file # Save performance calibration parameters Source: https://docs.edgeimpulse.com/apis/studio/performancecalibration/save-performance-calibration-parameters /.assets/openapi.yaml post /api/{projectId}/performance-calibration/parameters Set the current performance calibration parameters # Upload Performance Calibration Audio files Source: https://docs.edgeimpulse.com/apis/studio/performancecalibration/upload-performance-calibration-audio-files /.assets/openapi.yaml post /api/{projectId}/performance-calibration/files Upload a zip files with a wav file and its Label metadata to run performance calibration on it. # Check post-processing results for sample Source: https://docs.edgeimpulse.com/apis/studio/postprocessing/check-post-processing-results-for-sample /.assets/openapi.yaml post /api/{projectId}/post-processing/{postProcessingId}/samples/{sampleId} Retrieve post-processing results for a specific sample, e.g. whether it has generated features already. # Classify sample with post-processing Source: https://docs.edgeimpulse.com/apis/studio/postprocessing/classify-sample-with-post-processing /.assets/openapi.yaml post /api/{projectId}/post-processing/{postProcessingId}/samples/{sampleId}/classify Classify a sample using post-processing parameters. Sample should be in the post-processing dataset. # Get post-processing block config Source: https://docs.edgeimpulse.com/apis/studio/postprocessing/get-post-processing-block-config /.assets/openapi.yaml get /api/{projectId}/post-processing/{postProcessingId} Retrieve the configuration parameters for a post-processing block. Use the impulse functions to retrieve all post-processing blocks. # Set post-processing block config Source: https://docs.edgeimpulse.com/apis/studio/postprocessing/set-post-processing-block-config /.assets/openapi.yaml post /api/{projectId}/post-processing/{postProcessingId} Set configuration parameters for a post-processing block. Only values set in the body will be overwritten. # Add API key Source: https://docs.edgeimpulse.com/apis/studio/projects/add-api-key /.assets/openapi.yaml post /api/{projectId}/apikeys Add an API key. If you set `developmentKey` to `true` this flag will be removed from the current development API key. For OAuth-based third-party integrations, prefer `/api/{projectId}/apikeys/ingestiononly`. # Add collaborator Source: https://docs.edgeimpulse.com/apis/studio/projects/add-collaborator /.assets/openapi.yaml post /api/{projectId}/collaborators/add Add a collaborator to a project. # Add HMAC key Source: https://docs.edgeimpulse.com/apis/studio/projects/add-hmac-key /.assets/openapi.yaml post /api/{projectId}/hmackeys Add an HMAC key. If you set `developmentKey` to `true` this flag will be removed from the current development HMAC key. # Add ingestion-only API key Source: https://docs.edgeimpulse.com/apis/studio/projects/add-ingestion-only-api-key /.assets/openapi.yaml post /api/{projectId}/apikeys/ingestiononly Add an ingestion-only API key. # Clear AI Actions proposed changes Source: https://docs.edgeimpulse.com/apis/studio/projects/clear-ai-actions-proposed-changes /.assets/openapi.yaml get /api/{projectId}/ai-actions/{actionId}/clear-proposed-changes Remove all proposed changes for an AI Actions job. # Create AI Action Source: https://docs.edgeimpulse.com/apis/studio/projects/create-ai-action /.assets/openapi.yaml post /api/{projectId}/ai-actions/create Create a new AI Action. # Create new project Source: https://docs.edgeimpulse.com/apis/studio/projects/create-new-project /.assets/openapi.yaml post /api/projects/create Create a new project. By default this endpoint creates and returns a project API key. When authenticated via OAuth, API key creation and API key return in the response are disabled. # Delete AI Actions config Source: https://docs.edgeimpulse.com/apis/studio/projects/delete-ai-actions-config /.assets/openapi.yaml delete /api/{projectId}/ai-actions/{actionId} Deletes an AI Actions. # Delete CSV Wizard config Source: https://docs.edgeimpulse.com/apis/studio/projects/delete-csv-wizard-config /.assets/openapi.yaml post /api/{projectId}/csv-wizard/delete-config Clear the current CSV wizard config; subsequent CSVs will be uploaded as-is, without additional parsing. # Delete versions Source: https://docs.edgeimpulse.com/apis/studio/projects/delete-versions /.assets/openapi.yaml delete /api/{projectId}/versions/{versionId} Delete a version. This does not delete the version from cold storage. # Development boards Source: https://docs.edgeimpulse.com/apis/studio/projects/development-boards /.assets/openapi.yaml get /api/{projectId}/development-boards List all development boards for a project # Dismiss a notification Source: https://docs.edgeimpulse.com/apis/studio/projects/dismiss-a-notification /.assets/openapi.yaml post /api/{projectId}/dismiss-notification Dismiss a notification # Download CSV Wizard config Source: https://docs.edgeimpulse.com/apis/studio/projects/download-csv-wizard-config /.assets/openapi.yaml get /api/{projectId}/csv-wizard/download-config Returns a JSON file with the current CSV wizard config. If there is no config this will throw a 5xx error. # Download CSV Wizard uploaded file Source: https://docs.edgeimpulse.com/apis/studio/projects/download-csv-wizard-uploaded-file /.assets/openapi.yaml get /api/{projectId}/csv-wizard/uploaded-file/download Returns the file that was uploaded when the CSV wizard was configured. If there is no config this will throw a 5xx error. # Get a list of all model variants available for this project Source: https://docs.edgeimpulse.com/apis/studio/projects/get-a-list-of-all-model-variants-available-for-this-project /.assets/openapi.yaml get /api/{projectId}/model-variants Get a list of model variants applicable to all trained learn blocks in this project. # Get AI Actions config Source: https://docs.edgeimpulse.com/apis/studio/projects/get-ai-actions-config /.assets/openapi.yaml get /api/{projectId}/ai-actions/{actionId} Get an AI Actions config # Get API keys Source: https://docs.edgeimpulse.com/apis/studio/projects/get-api-keys /.assets/openapi.yaml get /api/{projectId}/apikeys Retrieve all API keys. This does **not** return the full API key, but only a portion (for security purposes). The development key will be returned in full, as it'll be set in devices and is thus not private. # Get CSV Wizard uploaded file info Source: https://docs.edgeimpulse.com/apis/studio/projects/get-csv-wizard-uploaded-file-info /.assets/openapi.yaml get /api/{projectId}/csv-wizard/uploaded-file Returns whether the file that was uploaded when the CSV wizard was configured is available. # Get data axes summary Source: https://docs.edgeimpulse.com/apis/studio/projects/get-data-axes-summary /.assets/openapi.yaml get /api/{projectId}/data-axes Get a list of axes that are present in the training data. # Get data summary Source: https://docs.edgeimpulse.com/apis/studio/projects/get-data-summary /.assets/openapi.yaml get /api/{projectId}/data-summary Get summary of all data present in the training set. This returns the number of data items, the total length of all data, and the labels. This is similar to `dataSummary` in `ProjectInfoResponse` but allows you to exclude disabled items or items that are still processing. # Get development keys Source: https://docs.edgeimpulse.com/apis/studio/projects/get-development-keys /.assets/openapi.yaml get /api/{projectId}/devkeys Retrieve the development API and HMAC keys for a project. These keys are specifically marked to be used during development. These keys can be `undefined` if no development keys are set. Only available through JWT token authentication, if you authenticate with an API key then all keys will return undefined (this is changed behavior since 28 January 2026). # Get downloads Source: https://docs.edgeimpulse.com/apis/studio/projects/get-downloads /.assets/openapi.yaml get /api/{projectId}/downloads Retrieve the downloads for a project. # Get HMAC development key Source: https://docs.edgeimpulse.com/apis/studio/projects/get-hmac-development-key /.assets/openapi.yaml get /api/{projectId}/devkeys/hmac Retrieve the HMAC development key for a project. This key are specifically marked to be used during development. This key can be `undefined` if no development keys are set. # Get HMAC keys Source: https://docs.edgeimpulse.com/apis/studio/projects/get-hmac-keys /.assets/openapi.yaml get /api/{projectId}/hmackeys Retrieve all HMAC keys. # Get info about current API key Source: https://docs.edgeimpulse.com/apis/studio/projects/get-info-about-current-api-key /.assets/openapi.yaml get /api/projects/api-key-info Only available when authenticating with a project API key. Returns the current role and project ID that you're authenticated with. # Get new AI Actions config Source: https://docs.edgeimpulse.com/apis/studio/projects/get-new-ai-actions-config /.assets/openapi.yaml get /api/{projectId}/ai-actions/new Get the AI Actions config for a new action # Get socket token Source: https://docs.edgeimpulse.com/apis/studio/projects/get-socket-token /.assets/openapi.yaml get /api/{projectId}/socket-token Get a token to authenticate with the web socket interface. # Get synthetic data config Source: https://docs.edgeimpulse.com/apis/studio/projects/get-synthetic-data-config /.assets/openapi.yaml get /api/{projectId}/synthetic-data Get the last used synthetic data config # Get target constraints Source: https://docs.edgeimpulse.com/apis/studio/projects/get-target-constraints /.assets/openapi.yaml get /api/{projectId}/target-constraints Retrieve target constraints for a project. The constraints object captures hardware attributes of your target device, along with an application budget to allow guidance on performance and resource usage # Get the interval (in ms) of the training data Source: https://docs.edgeimpulse.com/apis/studio/projects/get-the-interval-in-ms-of-the-training-data /.assets/openapi.yaml get /api/{projectId}/data-interval Get the interval of the training data; if multiple intervals are present, the interval of the longest data item is returned. This only takes data in your _training_ set into account. # Last modification Source: https://docs.edgeimpulse.com/apis/studio/projects/last-modification /.assets/openapi.yaml get /api/{projectId}/last-modification Get the last modification date for a project (will be upped when data is modified, or when an impulse is trained) # Launch getting started wizard Source: https://docs.edgeimpulse.com/apis/studio/projects/launch-getting-started-wizard /.assets/openapi.yaml post /api/{projectId}/launch-getting-started This clears out *all data in your project*, and is irrevocable. This function is only available through a JWT token, and is not available to all users. # List active projects Source: https://docs.edgeimpulse.com/apis/studio/projects/list-active-projects /.assets/openapi.yaml get /api/projects Retrieve list of active projects. If authenticating using JWT token this lists all the projects the user has access to, if authenticating using an API key, this only lists that project. # List AI Actions Source: https://docs.edgeimpulse.com/apis/studio/projects/list-ai-actions /.assets/openapi.yaml get /api/{projectId}/ai-actions Get all AI actions. # List emails Source: https://docs.edgeimpulse.com/apis/studio/projects/list-emails /.assets/openapi.yaml get /api/{projectId}/emails Get a list of all emails sent by Edge Impulse regarding this project. # List public project types Source: https://docs.edgeimpulse.com/apis/studio/projects/list-public-project-types /.assets/openapi.yaml get /api/projects/types Retrieve the list of available public project types. You don't need any authentication for this method. # List public projects Source: https://docs.edgeimpulse.com/apis/studio/projects/list-public-projects /.assets/openapi.yaml get /api/projects/public Retrieve the list of all public projects. You don't need any authentication for this method. # List public versions Source: https://docs.edgeimpulse.com/apis/studio/projects/list-public-versions /.assets/openapi.yaml get /api/{projectId}/versions/public Get all public versions for this project. You don't need any authentication for this function. # List versions Source: https://docs.edgeimpulse.com/apis/studio/projects/list-versions /.assets/openapi.yaml get /api/{projectId}/versions Get all versions for this project. # Make version private Source: https://docs.edgeimpulse.com/apis/studio/projects/make-version-private /.assets/openapi.yaml post /api/{projectId}/versions/{versionId}/make-private Make a public version private. # Preview samples for AI Actions Source: https://docs.edgeimpulse.com/apis/studio/projects/preview-samples-for-ai-actions /.assets/openapi.yaml post /api/{projectId}/ai-actions/{actionId}/preview-samples Get a number of random samples to show in the AI Actions screen. If `saveConfig` is passed in, then a valid actionId is required in the URL. If you don't need to save the config (e.g. when creating a new action), you can use -1. # Project information Source: https://docs.edgeimpulse.com/apis/studio/projects/project-information /.assets/openapi.yaml get /api/{projectId} List all information about this project. # Public project information Source: https://docs.edgeimpulse.com/apis/studio/projects/public-project-information /.assets/openapi.yaml get /api/{projectId}/public-info List a summary about this project - available for public projects. # Remove collaborator Source: https://docs.edgeimpulse.com/apis/studio/projects/remove-collaborator /.assets/openapi.yaml post /api/{projectId}/collaborators/remove Remove a collaborator to a project. Note that you cannot invoke this function if only a single collaborator is present. # Remove HMAC key Source: https://docs.edgeimpulse.com/apis/studio/projects/remove-hmac-key /.assets/openapi.yaml delete /api/{projectId}/hmackeys/{hmacId} Revoke an HMAC key. Note that if you revoke the development key some services (such as automatic provisioning of devices through the serial daemon) will no longer work. # Remove project Source: https://docs.edgeimpulse.com/apis/studio/projects/remove-project /.assets/openapi.yaml delete /api/{projectId} Remove the current project, and all data associated with it. This is irrevocable! # Revoke API key Source: https://docs.edgeimpulse.com/apis/studio/projects/revoke-api-key /.assets/openapi.yaml delete /api/{projectId}/apikeys/{apiKeyId} Revoke an API key. Note that if you revoke the development API key some services (such as automatic provisioning of devices through the serial daemon) will no longer work. # Revoke ingestion-only API key Source: https://docs.edgeimpulse.com/apis/studio/projects/revoke-ingestion-only-api-key /.assets/openapi.yaml delete /api/{projectId}/apikeys/ingestiononly/{apiKeyId} Revoke an ingestion-only API key. If the ID belongs to a key with a different role, this endpoint returns an error payload (`success: false`). # Save AI Actions config Source: https://docs.edgeimpulse.com/apis/studio/projects/save-ai-actions-config /.assets/openapi.yaml post /api/{projectId}/ai-actions/{actionId} Store an AI Actions config. Use `createAIActionsJob` to run the job. Post the full AI Action here w/ all parameters. # Set AI Actions order Source: https://docs.edgeimpulse.com/apis/studio/projects/set-ai-actions-order /.assets/openapi.yaml post /api/{projectId}/ai-actions/order Change the order of AI actions. Post the new order of all AI Actions by ID. You need to specify _all_ AI Actions here. If not, an error will be thrown. # Set compute time limit Source: https://docs.edgeimpulse.com/apis/studio/projects/set-compute-time-limit /.assets/openapi.yaml post /api/{projectId}/compute-time-limit Change the job compute time limit for the project. This function is only available through a JWT token, and is not available to all users. # Set DSP file size limit Source: https://docs.edgeimpulse.com/apis/studio/projects/set-dsp-file-size-limit /.assets/openapi.yaml post /api/{projectId}/dsp-file-size-limit Change the DSP file size limit for the project. This function is only available through a JWT token, and is not available to all users. # Set target constraints Source: https://docs.edgeimpulse.com/apis/studio/projects/set-target-constraints /.assets/openapi.yaml post /api/{projectId}/target-constraints Set target constraints for a project. Use the constraints object to capture hardware attributes of your target device, along with an application budget to allow guidance on performance and resource usage # Store CSV Wizard uploaded file Source: https://docs.edgeimpulse.com/apis/studio/projects/store-csv-wizard-uploaded-file /.assets/openapi.yaml post /api/{projectId}/csv-wizard/uploaded-file Asynchronously called in the CSV Wizard to store the file that the CSV wizard was based on. # Transfer ownership (organization) Source: https://docs.edgeimpulse.com/apis/studio/projects/transfer-ownership-organization /.assets/openapi.yaml post /api/{projectId}/collaborators/transfer-ownership-org Transfer ownership of a project to another organization. # Transfer ownership (user) Source: https://docs.edgeimpulse.com/apis/studio/projects/transfer-ownership-user /.assets/openapi.yaml post /api/{projectId}/collaborators/transfer-ownership Transfer ownership of a project to another user. # Update project Source: https://docs.edgeimpulse.com/apis/studio/projects/update-project /.assets/openapi.yaml post /api/{projectId} Update project properties such as name and logo. # Update tags Source: https://docs.edgeimpulse.com/apis/studio/projects/update-tags /.assets/openapi.yaml post /api/{projectId}/tags Update the list of project tags. # Update version Source: https://docs.edgeimpulse.com/apis/studio/projects/update-version /.assets/openapi.yaml post /api/{projectId}/versions/{versionId} Updates a version, this only updates fields that were set in the body. # Upload image for readme Source: https://docs.edgeimpulse.com/apis/studio/projects/upload-image-for-readme /.assets/openapi.yaml post /api/{projectId}/readme/upload-image Uploads an image to the user CDN and returns the path. # Add metadata (multiple samples) Source: https://docs.edgeimpulse.com/apis/studio/raw-data/add-metadata-multiple-samples /.assets/openapi.yaml post /api/{projectId}/raw-data/batch/add-metadata Add specific metadata for multiple samples. # Auto-label an image Source: https://docs.edgeimpulse.com/apis/studio/raw-data/auto-label-an-image /.assets/openapi.yaml post /api/{projectId}/raw-data/{sampleId}/autolabel Classify an image using another neural network. # Check data explorer features Source: https://docs.edgeimpulse.com/apis/studio/raw-data/check-data-explorer-features /.assets/openapi.yaml get /api/{projectId}/raw-data/data-explorer/has-features t-SNE2 output of the raw dataset # Check if data diversity metrics exist Source: https://docs.edgeimpulse.com/apis/studio/raw-data/check-if-data-diversity-metrics-exist /.assets/openapi.yaml get /api/{projectId}/raw-data/data-quality/diversity/exists Determine if data diversity metrics have been calculated. To calculate these metrics, use the `calculateDataQualityMetrics` endpoint. # Check if label noise metrics exist Source: https://docs.edgeimpulse.com/apis/studio/raw-data/check-if-label-noise-metrics-exist /.assets/openapi.yaml get /api/{projectId}/raw-data/data-quality/label-noise/exists Determine if label noise metrics have been calculated. To calculate these metrics, use the `calculateDataQualityMetrics` endpoint. # Clear all metadata (multiple samples) Source: https://docs.edgeimpulse.com/apis/studio/raw-data/clear-all-metadata-multiple-samples /.assets/openapi.yaml post /api/{projectId}/raw-data/batch/clear-metadata Clears all metadata for multiple samples. # Clear all object detection labels Source: https://docs.edgeimpulse.com/apis/studio/raw-data/clear-all-object-detection-labels /.assets/openapi.yaml post /api/{projectId}/raw-data/clear-all-object-detection-labels Clears all object detection labels for this dataset, and places all images back in the labeling queue. # Clear data explorer Source: https://docs.edgeimpulse.com/apis/studio/raw-data/clear-data-explorer /.assets/openapi.yaml post /api/{projectId}/raw-data/data-explorer/clear Remove the current data explorer state # Clear metadata by key (multiple samples) Source: https://docs.edgeimpulse.com/apis/studio/raw-data/clear-metadata-by-key-multiple-samples /.assets/openapi.yaml post /api/{projectId}/raw-data/batch/clear-metadata-by-key Clears a specific metadata field (by key) for multiple samples. # Count samples Source: https://docs.edgeimpulse.com/apis/studio/raw-data/count-samples /.assets/openapi.yaml get /api/{projectId}/raw-data/count Count all raw data by category. # Crop sample Source: https://docs.edgeimpulse.com/apis/studio/raw-data/crop-sample /.assets/openapi.yaml post /api/{projectId}/raw-data/{sampleId}/crop Crop a sample to within a new range. cropStart/cropEnd are relative to the selected datastream. If you have multiple datastreams and OptionalDatastreamIndexParameter is not passed in, the first datastream is used. # Disable multiple samples Source: https://docs.edgeimpulse.com/apis/studio/raw-data/disable-multiple-samples /.assets/openapi.yaml post /api/{projectId}/raw-data/batch/disable-samples Disables samples, ensuring that they are excluded from the dataset. Depending on the number of affected samples this will either execute immediately or return the ID of a job that will perform this action in batches. # Disable sample Source: https://docs.edgeimpulse.com/apis/studio/raw-data/disable-sample /.assets/openapi.yaml post /api/{projectId}/raw-data/{sampleId}/disable Disable a sample, ensuring that it is excluded from the dataset. # Download file Source: https://docs.edgeimpulse.com/apis/studio/raw-data/download-file /.assets/openapi.yaml get /api/{projectId}/raw-data/{sampleId}/raw Download a sample in it's original format as uploaded to the ingestion service. # Edit bounding boxes for multiple samples Source: https://docs.edgeimpulse.com/apis/studio/raw-data/edit-bounding-boxes-for-multiple-samples /.assets/openapi.yaml post /api/{projectId}/raw-data/batch/edit-bounding-boxes Relabels (or removes) bounding boxes for multiple samples. Depending on the number of affected samples this will either execute immediately or return the ID of a job that will perform this action in batches. # Edit label Source: https://docs.edgeimpulse.com/apis/studio/raw-data/edit-label /.assets/openapi.yaml post /api/{projectId}/raw-data/{sampleId}/edit-label Sets the label (also known as class) of the sample. Use the same label for similar types of data, as they are used during training. # Edit labels for multiple samples Source: https://docs.edgeimpulse.com/apis/studio/raw-data/edit-labels-for-multiple-samples /.assets/openapi.yaml post /api/{projectId}/raw-data/batch/edit-labels Sets the label (also known as class) of multiple samples. If you want to relabel bounding boxes, use "batchEditBoundingBoxes" instead. Depending on the number of affected samples this will either execute immediately or return the ID of a job that will perform this action in batches. # Enable multiple samples Source: https://docs.edgeimpulse.com/apis/studio/raw-data/enable-multiple-samples /.assets/openapi.yaml post /api/{projectId}/raw-data/batch/enable-samples Enables samples, ensuring that they are not excluded from the dataset. Depending on the number of affected samples this will either execute immediately or return the ID of a job that will perform this action in batches. # Enable sample Source: https://docs.edgeimpulse.com/apis/studio/raw-data/enable-sample /.assets/openapi.yaml post /api/{projectId}/raw-data/{sampleId}/enable Enable a sample, ensuring that it is not excluded from the dataset. # Find segments Source: https://docs.edgeimpulse.com/apis/studio/raw-data/find-segments /.assets/openapi.yaml post /api/{projectId}/raw-data/{sampleId}/find-segments Find start and end times for all non-noise events in a sample. If you have multiple datastreams and OptionalDatastreamIndexParameter is not passed in, the first datastream is used. # Get AI Actions proposed changes Source: https://docs.edgeimpulse.com/apis/studio/raw-data/get-ai-actions-proposed-changes /.assets/openapi.yaml get /api/{projectId}/raw-data/ai-actions-preview/{jobId}/proposed-changes Get proposed changes from an AI Actions job. # Get data explorer features Source: https://docs.edgeimpulse.com/apis/studio/raw-data/get-data-explorer-features /.assets/openapi.yaml get /api/{projectId}/raw-data/data-explorer/features t-SNE2 output of the raw dataset # Get data explorer predictions Source: https://docs.edgeimpulse.com/apis/studio/raw-data/get-data-explorer-predictions /.assets/openapi.yaml get /api/{projectId}/raw-data/data-explorer/predictions Predictions for every data explorer point (only available when using current impulse to populate data explorer) # Get data explorer settings Source: https://docs.edgeimpulse.com/apis/studio/raw-data/get-data-explorer-settings /.assets/openapi.yaml get /api/{projectId}/raw-data/data-explorer/settings Get data explorer configuration, like the type of data, and the input / dsp block to use. # Get dataset ratio Source: https://docs.edgeimpulse.com/apis/studio/raw-data/get-dataset-ratio /.assets/openapi.yaml get /api/{projectId}/raw-data/ratio Retrieve number of samples in train and test set. # Get diversity metrics data Source: https://docs.edgeimpulse.com/apis/studio/raw-data/get-diversity-metrics-data /.assets/openapi.yaml get /api/{projectId}/raw-data/data-quality/diversity Obtain metrics that describe the similarity and diversity of a dataset. To calculate these metrics, use the `calculateDataQualityMetrics` endpoint. # Get image file Source: https://docs.edgeimpulse.com/apis/studio/raw-data/get-image-file /.assets/openapi.yaml get /api/{projectId}/raw-data/{sampleId}/image Get a sample as an image file. This only applies to samples with RGBA data. # Get label noise data Source: https://docs.edgeimpulse.com/apis/studio/raw-data/get-label-noise-data /.assets/openapi.yaml get /api/{projectId}/raw-data/data-quality/label-noise Obtain metrics that describe potential label noise issues in the dataset. To calculate these metrics, use the `calculateDataQualityMetrics` endpoint. # Get project dataset metadata Source: https://docs.edgeimpulse.com/apis/studio/raw-data/get-project-dataset-metadata /.assets/openapi.yaml get /api/{projectId}/raw-data/project-metadata Get the raw data metadata for this project # Get project sample metadata Source: https://docs.edgeimpulse.com/apis/studio/raw-data/get-project-sample-metadata /.assets/openapi.yaml get /api/{projectId}/raw-data/metadata Get metadata for all samples in a project. # Get project sample metadata filter options Source: https://docs.edgeimpulse.com/apis/studio/raw-data/get-project-sample-metadata-filter-options /.assets/openapi.yaml get /api/{projectId}/raw-data/metadata-filter-options Get a list of unique key value pairs across all samples in a project that can be applied as filters to the /api/{projectId}/raw-data endpoint # Get sample Source: https://docs.edgeimpulse.com/apis/studio/raw-data/get-sample /.assets/openapi.yaml get /api/{projectId}/raw-data/{sampleId} Get a sample. # Get sample slice Source: https://docs.edgeimpulse.com/apis/studio/raw-data/get-sample-slice /.assets/openapi.yaml get /api/{projectId}/raw-data/{sampleId}/slice Get a slice of a sample. If you have multiple datastreams and OptionalDatastreamIndexParameter is not passed in, the first datastream is returned. sliceStart / sliceEnd are relative to the datastream. # Get split preview results Source: https://docs.edgeimpulse.com/apis/studio/raw-data/get-split-preview-results /.assets/openapi.yaml get /api/{projectId}/get-split-preview-results Returns the results of a previously requested split preview job. This endpoint is used to retrieve the results after a split preview job has been started. # Get the original downsampled data Source: https://docs.edgeimpulse.com/apis/studio/raw-data/get-the-original-downsampled-data /.assets/openapi.yaml get /api/{projectId}/raw-data/{sampleId}/original Get the original, uncropped, downsampled data. If you have multiple datastreams and OptionalDatastreamIndexParameter is not passed in, the first datastream is returned. The ZoomStart/ZoomEnd parameters should be relative to the selected datastream. # Get video file Source: https://docs.edgeimpulse.com/apis/studio/raw-data/get-video-file /.assets/openapi.yaml get /api/{projectId}/raw-data/{sampleId}/video Get a sample as an video file. This only applies to samples with video data. # Get WAV file Source: https://docs.edgeimpulse.com/apis/studio/raw-data/get-wav-file /.assets/openapi.yaml get /api/{projectId}/raw-data/{sampleId}/wav Get a sample as a WAV file. This only applies to samples with an audio axis. # List data with "imported from" metadata key Source: https://docs.edgeimpulse.com/apis/studio/raw-data/list-data-with-"imported-from"-metadata-key /.assets/openapi.yaml get /api/{projectId}/raw-data/imported-from Lists all data with an 'imported from' metadata key. Used to check in a data source which items are already in a project. # List samples Source: https://docs.edgeimpulse.com/apis/studio/raw-data/list-samples /.assets/openapi.yaml get /api/{projectId}/raw-data Retrieve all raw data by category. # Move multiple samples Source: https://docs.edgeimpulse.com/apis/studio/raw-data/move-multiple-samples /.assets/openapi.yaml post /api/{projectId}/raw-data/batch/moveSamples Move multiple samples to another category (e.g. from test to training). Depending on the number of affected samples this will either execute immediately or return the ID of a job that will perform this action in batches. # Move sample Source: https://docs.edgeimpulse.com/apis/studio/raw-data/move-sample /.assets/openapi.yaml post /api/{projectId}/raw-data/{sampleId}/move Move a sample to another category (e.g. from test to training). # Move sample to labeling queue Source: https://docs.edgeimpulse.com/apis/studio/raw-data/move-sample-to-labeling-queue /.assets/openapi.yaml post /api/{projectId}/raw-data/{sampleId}/to-labeling-queue Clears the bounding box labels and moves item back to labeling queue # Object detection label queue Source: https://docs.edgeimpulse.com/apis/studio/raw-data/object-detection-label-queue /.assets/openapi.yaml get /api/{projectId}/raw-data/label-object-detection-queue Get all unlabeled items from the object detection queue. # Object detection label queue count Source: https://docs.edgeimpulse.com/apis/studio/raw-data/object-detection-label-queue-count /.assets/openapi.yaml get /api/{projectId}/raw-data/label-object-detection-queue/count Get count for unlabeled items from the object detection queue. # Propose changes Source: https://docs.edgeimpulse.com/apis/studio/raw-data/propose-changes /.assets/openapi.yaml post /api/{projectId}/raw-data/{sampleId}/propose-changes Queue up changes to an object as part of the AI Actions flow. This overwrites any previous proposed changes. # Put samples back into the object detection labeling queue Source: https://docs.edgeimpulse.com/apis/studio/raw-data/put-samples-back-into-the-object-detection-labeling-queue /.assets/openapi.yaml post /api/{projectId}/raw-data/batch/back-to-labeling Batch operation to put multiple samples back into the object detection labeling queue. Depending on the number of affected samples this will either execute immediately or return the ID of a job that will perform this action in batches. # Rebalance dataset Source: https://docs.edgeimpulse.com/apis/studio/raw-data/rebalance-dataset /.assets/openapi.yaml post /api/{projectId}/rebalance This API is deprecated, use rebalanceDatasetV2 instead (`/v1/api/{projectId}/v2/rebalance`). Rebalances the dataset over training / testing categories. This resets the category for all data and splits it 80%/20% between training and testing. This is a deterministic process based on the hash of the name of the data. # Rebalance dataset Source: https://docs.edgeimpulse.com/apis/studio/raw-data/rebalance-dataset-1 /.assets/openapi.yaml post /api/{projectId}/v2/rebalance Rebalances the dataset over training / testing categories. This resets the category for all data and splits it 80%/20% between training and testing. This is a deterministic process based on the hash of the name of the data. Returns immediately on small datasets, or starts a job on larger datasets. To get the dataset ratio (as returned by the v1 endpoint), use getDatasetRatio. For richer, more powerful dataset splitting with configurable ratios, stratification, and grouping, use splitDataset (`/v1/api/{projectId}/split`). # Remove all samples Source: https://docs.edgeimpulse.com/apis/studio/raw-data/remove-all-samples /.assets/openapi.yaml post /api/{projectId}/raw-data/delete-all Deletes all samples for this project over all categories. This also invalidates all DSP and learn blocks. Note that this does not delete the data from cold storage. # Remove all samples by category Source: https://docs.edgeimpulse.com/apis/studio/raw-data/remove-all-samples-by-category /.assets/openapi.yaml post /api/{projectId}/raw-data/delete-all/{category} Deletes all samples for this project over a single category. Note that this does not delete the data from cold storage. # Remove multiple samples Source: https://docs.edgeimpulse.com/apis/studio/raw-data/remove-multiple-samples /.assets/openapi.yaml post /api/{projectId}/raw-data/batch/delete Deletes samples. Note that this does not delete the data from cold storage. Depending on the number of affected samples this will either execute immediately or return the ID of a job that will perform this action in batches. # Remove sample Source: https://docs.edgeimpulse.com/apis/studio/raw-data/remove-sample /.assets/openapi.yaml delete /api/{projectId}/raw-data/{sampleId} Deletes the sample. Note that this does not delete the data from cold storage. # Rename sample Source: https://docs.edgeimpulse.com/apis/studio/raw-data/rename-sample /.assets/openapi.yaml post /api/{projectId}/raw-data/{sampleId}/rename Sets the file name of the sample. This name does not need to be unique, but it's highly recommended to do so. # Retry processing Source: https://docs.edgeimpulse.com/apis/studio/raw-data/retry-processing /.assets/openapi.yaml post /api/{projectId}/raw-data/{sampleId}/retry-processing If a sample failed processing, retry the processing operation. # Segment sample Source: https://docs.edgeimpulse.com/apis/studio/raw-data/segment-sample /.assets/openapi.yaml post /api/{projectId}/raw-data/{sampleId}/segment Slice a sample into multiple segments. The original file will be marked as deleted, but you can crop any created segment to retrieve the original file. # Set bounding boxes Source: https://docs.edgeimpulse.com/apis/studio/raw-data/set-bounding-boxes /.assets/openapi.yaml post /api/{projectId}/raw-data/{sampleId}/bounding-boxes Set the bounding boxes for a sample # Set data explorer settings Source: https://docs.edgeimpulse.com/apis/studio/raw-data/set-data-explorer-settings /.assets/openapi.yaml post /api/{projectId}/raw-data/data-explorer/settings Set data explorer configuration, like the type of data, and the input / dsp block to use. # Set sample metadata Source: https://docs.edgeimpulse.com/apis/studio/raw-data/set-sample-metadata /.assets/openapi.yaml post /api/{projectId}/raw-data/{sampleId}/metadata Adds or updates the metadata associated to a sample. # Set sample video dimensions Source: https://docs.edgeimpulse.com/apis/studio/raw-data/set-sample-video-dimensions /.assets/openapi.yaml post /api/{projectId}/raw-data/{sampleId}/video-dimensions Update the video dimensions for a sample. This is only available for video files that do not have dimensions set yet. # Split dataset Source: https://docs.edgeimpulse.com/apis/studio/raw-data/split-dataset /.assets/openapi.yaml post /api/{projectId}/split Performs a deterministic, in-place split of the project's dataset into "training", "testing", and optional "validation" sets. Split balancing can use the label, one or more metadata keys, or both as a composite grouping signal. Related samples can also be kept together across splits by metadata key. This is a deterministic process based on the hash of the name of the data. Returns immediately on small datasets, or starts a job on larger datasets. For example: { "trainingSplitRatio": 0.8, "testingSplitRatio": 0.1, "validationSplitRatio": 0.1, "excludeDisabledSamples": false, "stratifyBy": { "label": true, "metadataKeys": ["site", "scanner"] }, "keepTogetherMetadataKeys": ["capture_group"] } With these options, label/site/scanner are used to balance the split, while samples sharing the same capture_group value stay in the same split bucket. # Split dataset preview Source: https://docs.edgeimpulse.com/apis/studio/raw-data/split-dataset-preview /.assets/openapi.yaml post /api/{projectId}/split-preview Returns a preview of how the project's dataset would be split if the current split options were applied. For each group (composite of label and/or metadata keys, or keep-together group), shows the number and percentage of samples that would be assigned to each split. This does not update the dataset, only provides a summary. Returns immediately on small datasets, or starts a job on larger datasets. # Split sample into frames Source: https://docs.edgeimpulse.com/apis/studio/raw-data/split-sample-into-frames /.assets/openapi.yaml post /api/{projectId}/raw-data/{sampleId}/split Split a video sample into individual frames. Depending on the length of the video sample this will either execute immediately or return the ID of a job that will perform this action. # Store the last segment length Source: https://docs.edgeimpulse.com/apis/studio/raw-data/store-the-last-segment-length /.assets/openapi.yaml post /api/{projectId}/raw-data/store-segment-length When segmenting a sample into smaller segments, store the segment length to ensure uniform segment lengths. # Track objects Source: https://docs.edgeimpulse.com/apis/studio/raw-data/track-objects /.assets/openapi.yaml post /api/{projectId}/raw-data/track-objects Track objects between two samples. Source sample should have bounding boxes set. # Update structured labels Source: https://docs.edgeimpulse.com/apis/studio/raw-data/update-structured-labels /.assets/openapi.yaml post /api/{projectId}/raw-data/{sampleId}/structured-labels Set structured labels for a sample. If a sample has structured labels the `label` column is ignored, and the sample is allowed to have multiple labels. An array of { startIndex, endIndex, label } needs to be passed in with labels for the complete sample (see `valuesCount` to get the upper bound). endIndex is _inclusive_. If you pass in an incorrect array (e.g. missing values) you'll get an error back. # Create pre-signed S3 upload link Source: https://docs.edgeimpulse.com/apis/studio/uploadportal/create-pre-signed-s3-upload-link /.assets/openapi.yaml post /api/portals/{portalId}/upload-link Creates a signed link to securely upload data to s3 bucket directly from the client. # Delete file from portal Source: https://docs.edgeimpulse.com/apis/studio/uploadportal/delete-file-from-portal /.assets/openapi.yaml post /api/portals/{portalId}/files/delete Delete a file from an upload portal (requires JWT auth). # Download file from portal Source: https://docs.edgeimpulse.com/apis/studio/uploadportal/download-file-from-portal /.assets/openapi.yaml post /api/portals/{portalId}/files/download Download a file from an upload portal (requires JWT auth). Will return a signed URL to the bucket. # List files in portal Source: https://docs.edgeimpulse.com/apis/studio/uploadportal/list-files-in-portal /.assets/openapi.yaml post /api/portals/{portalId}/files List all files and directories in specified prefix. # Portal info Source: https://docs.edgeimpulse.com/apis/studio/uploadportal/portal-info /.assets/openapi.yaml get /api/portals/{portalId} Get information about a portal # Rename file from portal Source: https://docs.edgeimpulse.com/apis/studio/uploadportal/rename-file-from-portal /.assets/openapi.yaml post /api/portals/{portalId}/files/rename Rename a file on an upload portal (requires JWT auth). # View file from portal Source: https://docs.edgeimpulse.com/apis/studio/uploadportal/view-file-from-portal /.assets/openapi.yaml get /api/portals/{portalId}/files/view View a file that's located in an upload portal (requires JWT auth). File might be converted (e.g. Parquet) or truncated (e.g. CSV). # Accept End-User License Agreement Source: https://docs.edgeimpulse.com/apis/studio/user/accept-end-user-license-agreement /.assets/openapi.yaml post /api/user/accept-eula To access some models or tooling, you might need to first accept an End-User License Agreement. The full list of available EULAs are listed via `GetUserResponse`. # Accept Terms of Service Source: https://docs.edgeimpulse.com/apis/studio/user/accept-terms-of-service /.assets/openapi.yaml post /api/user/accept-tos Accept Terms of Service. # Activate current user Source: https://docs.edgeimpulse.com/apis/studio/user/activate-current-user /.assets/openapi.yaml post /api/user/activate Activate the current user account (requires an activation code). This function is only available through a JWT token. # Activate user Source: https://docs.edgeimpulse.com/apis/studio/user/activate-user /.assets/openapi.yaml post /api/users/{userId}/activate Activate a user account (requires an activation code). This function is only available through a JWT token. # Activate user by third party activation code Source: https://docs.edgeimpulse.com/apis/studio/user/activate-user-by-third-party-activation-code /.assets/openapi.yaml post /api/user/activate-by-third-party-activation-code Activate a user that was created by a third party. This function is only available through a JWT token. # Cancel subscription Source: https://docs.edgeimpulse.com/apis/studio/user/cancel-subscription /.assets/openapi.yaml post /api/user/subscription/cancel Cancel the current subscription. # Change password Source: https://docs.edgeimpulse.com/apis/studio/user/change-password /.assets/openapi.yaml post /api/users/{userId}/change-password Change the password for a user account. This function is only available through a JWT token. # Change password current user Source: https://docs.edgeimpulse.com/apis/studio/user/change-password-current-user /.assets/openapi.yaml post /api/user/change-password Change the password for the current user account. This function is only available through a JWT token. # Convert current evaluation user Source: https://docs.edgeimpulse.com/apis/studio/user/convert-current-evaluation-user /.assets/openapi.yaml post /api/user/convert Convert current evaluation user account to regular account. # Create developer profile Source: https://docs.edgeimpulse.com/apis/studio/user/create-developer-profile /.assets/openapi.yaml post /api/user/create-developer-profile Create a developer profile for the current active user. # Create enterprise trial user Source: https://docs.edgeimpulse.com/apis/studio/user/create-enterprise-trial-user /.assets/openapi.yaml post /api-user-create-enterprise-trial Creates an enterprise trial user and a new trial organization, and redirects the user to the new organization. This API is internal (it requires some signed fields), sign up at https://studio.edgeimpulse.com/signup instead. # Create Professional Tier user Source: https://docs.edgeimpulse.com/apis/studio/user/create-professional-tier-user /.assets/openapi.yaml post /api-create-pro-user Create a new user for the Professional Plan and a new project. Note that the Professional plan will not be enabled until the payment is successful. This API is internal (it requires some signed fields), sign up at https://studio.edgeimpulse.com/signup instead. # Create user Source: https://docs.edgeimpulse.com/apis/studio/user/create-user /.assets/openapi.yaml post /api-user-create Create a new user and project. This API is no longer publicly available. Sign up at https://studio.edgeimpulse.com/signup instead. # Delete current user Source: https://docs.edgeimpulse.com/apis/studio/user/delete-current-user /.assets/openapi.yaml delete /api/user Delete a user. This function is only available through a JWT token, and can only remove the current user. # Delete photo Source: https://docs.edgeimpulse.com/apis/studio/user/delete-photo /.assets/openapi.yaml delete /api/user/photo Delete user profile photo. This function is only available through a JWT token. # Delete user Source: https://docs.edgeimpulse.com/apis/studio/user/delete-user /.assets/openapi.yaml delete /api/users/{userId} Delete a user. This function is only available through a JWT token, and can only remove the current user. # Dismiss a notification Source: https://docs.edgeimpulse.com/apis/studio/user/dismiss-a-notification /.assets/openapi.yaml post /api/user/dismiss-notification Dismiss a notification # Generate a new TOTP MFA key Source: https://docs.edgeimpulse.com/apis/studio/user/generate-a-new-totp-mfa-key /.assets/openapi.yaml post /api/user/mfa/totp/create-key Creates a new MFA key, only allowed if the user has no MFA configured. TOTP tokens use SHA-1 algorithm. # Get buckets Source: https://docs.edgeimpulse.com/apis/studio/user/get-buckets /.assets/openapi.yaml get /api/users/{userId}/buckets List all organizational storage buckets that a user has access to. This function is only available through a JWT token. # Get buckets current user Source: https://docs.edgeimpulse.com/apis/studio/user/get-buckets-current-user /.assets/openapi.yaml get /api/users/buckets List all organizational storage buckets that the current user has access to. This function is only available through a JWT token. # Get current user Source: https://docs.edgeimpulse.com/apis/studio/user/get-current-user /.assets/openapi.yaml get /api/user Get information about the current user. This function is only available through a JWT token. # Get current user projects Source: https://docs.edgeimpulse.com/apis/studio/user/get-current-user-projects /.assets/openapi.yaml get /api/user/projects Get projects for the current user. This returns all projects regardless of whitelabel. This function is only available through a JWT token. # Get enterprise trials Source: https://docs.edgeimpulse.com/apis/studio/user/get-enterprise-trials /.assets/openapi.yaml get /api/users/{userId}/trials Get a list of all enterprise trials for a user. This function is only available through a JWT token. # Get organizations Source: https://docs.edgeimpulse.com/apis/studio/user/get-organizations /.assets/openapi.yaml get /api/user/organizations List all organizations that the current user is a member of. This function is only available through a JWT token. # Get organizations Source: https://docs.edgeimpulse.com/apis/studio/user/get-organizations-1 /.assets/openapi.yaml get /api/users/{userId}/organizations List all organizations for a user. This function is only available through a JWT token. # Get user Source: https://docs.edgeimpulse.com/apis/studio/user/get-user /.assets/openapi.yaml get /api/users/{userId} Get information about a user. This function is only available through a JWT token. # Get user billable compute metrics Source: https://docs.edgeimpulse.com/apis/studio/user/get-user-billable-compute-metrics /.assets/openapi.yaml get /api/user/subscription/metrics Get billable compute metrics for a user. This function is only available to users with an active subscription. # Get user by third party activation code Source: https://docs.edgeimpulse.com/apis/studio/user/get-user-by-third-party-activation-code /.assets/openapi.yaml post /api/user/by-third-party-activation-code Get information about a user through an activation code. This function is only available through a JWT token. # Get user registration state Source: https://docs.edgeimpulse.com/apis/studio/user/get-user-registration-state /.assets/openapi.yaml get /api-user-need-to-set-password/{usernameOrEmail} Tells whether a user is registered and whether it needs to set its password. # List emails Source: https://docs.edgeimpulse.com/apis/studio/user/list-emails /.assets/openapi.yaml get /api/user/emails Get a list of all emails sent by Edge Impulse to the current user. This function is only available through a JWT token, and is not available for all users. # List emails Source: https://docs.edgeimpulse.com/apis/studio/user/list-emails-1 /.assets/openapi.yaml get /api/users/{userId}/emails Get a list of all emails sent by Edge Impulse to a user. This function is only available through a JWT token, and is not available for all users. # Remove TOTP MFA key Source: https://docs.edgeimpulse.com/apis/studio/user/remove-totp-mfa-key /.assets/openapi.yaml post /api/user/mfa/totp/clear Disable MFA on this account using an TOTP token. # Request activation code Source: https://docs.edgeimpulse.com/apis/studio/user/request-activation-code /.assets/openapi.yaml post /api/user/request-activation Request a new activation code for the current user. This function is only available through a JWT token. # Request activation code Source: https://docs.edgeimpulse.com/apis/studio/user/request-activation-code-1 /.assets/openapi.yaml post /api/users/{userId}/request-activation Request a new activation code. This function is only available through a JWT token. # Request reset password Source: https://docs.edgeimpulse.com/apis/studio/user/request-reset-password /.assets/openapi.yaml post /api-user-request-reset-password Request a password reset link for a user. # Reset password Source: https://docs.edgeimpulse.com/apis/studio/user/reset-password /.assets/openapi.yaml post /api-user-reset-password Reset the password for a user. # Send feedback Source: https://docs.edgeimpulse.com/apis/studio/user/send-feedback /.assets/openapi.yaml post /api/users/{userId}/feedback Send feedback to Edge Impulse or get in touch with sales. # Send upgrade request Source: https://docs.edgeimpulse.com/apis/studio/user/send-upgrade-request /.assets/openapi.yaml post /api/users/{userId}/upgrade Send an upgrade to Enterprise request to Edge Impulse. # Set password for SSO user Source: https://docs.edgeimpulse.com/apis/studio/user/set-password-for-sso-user /.assets/openapi.yaml post /api/users/{userId}/set-password Set the password for a new SSO user. This function is only available through an SSO access token. # Set TOTP MFA key Source: https://docs.edgeimpulse.com/apis/studio/user/set-totp-mfa-key /.assets/openapi.yaml post /api/user/mfa/totp/set-key Enable MFA on this account using an TOTP token. First create a new key via `userGenerateNewTotpMfaKey`. # Start enterprise trial Source: https://docs.edgeimpulse.com/apis/studio/user/start-enterprise-trial /.assets/openapi.yaml post /api/user/trial Create an enterprise trial for the current user. Users can only go through a trial once. # Undo subscription cancellation Source: https://docs.edgeimpulse.com/apis/studio/user/undo-subscription-cancellation /.assets/openapi.yaml post /api/user/subscription/undo-cancel Stop a pending cancellation. If you schedule a subscription to be canceled, and the subscription hasn't yet reached the end of the billing period, you can stop the cancellation. After a subscription has been canceled, you can't reactivate it. # Update current user Source: https://docs.edgeimpulse.com/apis/studio/user/update-current-user /.assets/openapi.yaml post /api/user Update user properties such as name. This function is only available through a JWT token. # Update user Source: https://docs.edgeimpulse.com/apis/studio/user/update-user /.assets/openapi.yaml post /api/users/{userId} Update user properties such as name. This function is only available through a JWT token. # Upgrade subscription Source: https://docs.edgeimpulse.com/apis/studio/user/upgrade-subscription /.assets/openapi.yaml post /api/user/subscription/upgrade Upgrade the current subscription. # Upload photo Source: https://docs.edgeimpulse.com/apis/studio/user/upload-photo /.assets/openapi.yaml post /api/user/photo Upload a photo for the current user. This function is only available through a JWT token. # Upload photo Source: https://docs.edgeimpulse.com/apis/studio/user/upload-photo-1 /.assets/openapi.yaml post /api/users/{userId}/photo Upload a photo for a user. This function is only available through a JWT token, and is not available for all users. # Verify reset password code Source: https://docs.edgeimpulse.com/apis/studio/user/verify-reset-password-code /.assets/openapi.yaml post /api-user-verify-reset-password-code Verify whether the reset password code for the user is valid. # Get impulse blocks Source: https://docs.edgeimpulse.com/apis/studio/whitelabels/get-impulse-blocks /.assets/openapi.yaml get /api/whitelabel/{whitelabelIdentifier}/impulse/blocks Lists all possible DSP and ML blocks available for this white label. # Get white label domain Source: https://docs.edgeimpulse.com/apis/studio/whitelabels/get-white-label-domain /.assets/openapi.yaml get /api/whitelabel/{whitelabelIdentifier}/domain Get a white label domain given its unique identifier. # Update deployment targets Source: https://docs.edgeimpulse.com/apis/studio/whitelabels/update-deployment-targets /.assets/openapi.yaml post /api/whitelabel/{whitelabelIdentifier}/deploymentTargets Update some or all of the deployment targets enabled for this white label. # Datasets Source: https://docs.edgeimpulse.com/datasets This datasets collection contains publicly available datasets collected, generated or curated by Edge Impulse or its partners. Each of these datasets highlights a specific use case or machine learning task, helping you understand the types of data commonly encountered in projects like object detection, audio classification, and visual anomaly detection. While not intended for production models, they serve as valuable resources for learning, experimentation, and prototyping. Whether you're a developer, researcher, or student, these datasets are here to support your exploration of edge AI by offering real-world scenarios and insights into data preparation and model development. *** ## Image ### Image Classification *** *** **Data items:** 264 *** **Labels:** anomaly, rot-powder, rot-water *** *** **Data items:** 246 *** **Labels:** cotton stem, epidermis onion, housefly leg, unknown, wood stem ### Object Detection *** *** **Data items:** 130 *** **Labels:** empty, full *** *** **Data items:** 101 *** **Labels:** Can *** *** **Data items:** 670 *** **Labels:** blue, green, red, yellow *** *** **Data items:** 85 *** **Labels:** left, right *** *** **Data items:** 85 *** **Labels:** dice *** *** **Data items:** 85 *** **Labels:** blue, green, orange, purple, red, yellow ### Visual Anomaly Detection *** *** **Data items:** 149 *** **Labels:** anomaly, no anomaly *** *** **Data items:** 195 *** **Labels:** anomaly, no anomaly *** *** **Data items:** 204 *** **Labels:** good, rusty *** *** **Data items:** 464 *** **Labels:** anomaly, no anomaly *** *** **Data items:** 195 *** **Labels:** anomaly, no anomaly ### Visual Regression *** *** **Data items:** 747 *** **Labels:** -1, 0, 0.4, 0.5, 0.7, 0.75, 1, 1.2, 1.25, 1.5, 2 ## Audio ### Audio Classification *** *** **Data items:** 18 (0h 15m 40s) *** **Labels:** faucet, noise *** *** **Data items:** 2062 (0h 34m 22s) *** **Labels:** helloworld, noise, unknown ## Time-series ### Motion and Vibration Classification *** *** **Data items:** 11 (0h 9m 32s) *** **Labels:** extract, grind, idle, pump *** *** **Data items:** 101 (0h 15m 16s) *** **Labels:** anomaly, idle, snake, updown, wave ### Sensor Fusion Classification *** *** **Data items:** 36 (0h 5m 55s) *** **Labels:** , extract, grind, idle, pump # Faucet vs noise Source: https://docs.edgeimpulse.com/datasets/audio/faucet-vs-noise A labeled audio dataset of faucet water sounds vs. background noise for training audio classification models on embedded devices. **Task:** Audio Classification **License:** [BSD 3-Clause Clear](https://spdx.org/licenses/BSD-3-Clause-Clear.html) ## Description This dataset has been collected by Edge Impulse teams to recognize the sound of water running from a faucet, even in the presence of other background noise. You can also follow [our tutorial](/tutorials/end-to-end/sound-recognition) learn how to collect audio data from microphones, use signal processing to extract the most important information, and train a deep neural network that can tell you whether the sound of running water can be heard in a given clip of audio. Finally, you'll deploy the system to an embedded device and evaluate how well it works. ### Compatible Blocks * **Feature extraction**: [Audio (MFE)](/studio/projects/processing-blocks/blocks/audio-mfe), [Spectrogram](/studio/projects/processing-blocks/blocks/spectrogram), [Raw Data](/studio/projects/processing-blocks/blocks/raw-data) * **Learning block**: [Classification](/studio/projects/learning-blocks/blocks/classification) *Not sure what to choose? Try out this dataset with the [EON Tuner](/studio/projects/eon-tuner).* ### Dataset Details * **Total Data Items:** 18 * **Total Data Length:** 0h 15m 40s * **Axis Summary:** audio * **Labeling Method:** single label * **Train/Test Split:** 88.89% / 11.11% | | **Training Set** | **Testing Set** | | --------------------- | ---------------- | --------------- | | **Total Data Items** | 16 | 2 | | **Labels** | faucet, noise | faucet, noise | | **Total Data Length** | 0h 13m 40s | 0h 2m 0s | ## Usage The dataset can be added to a project in two ways: cloning the dataset public project or downloading the dataset and importing it into another project. * **Clone the [public project](https://studio.edgeimpulse.com/public/497635/latest)** To clone and use this project, visit the [Edge Impulse Studio link](https://studio.edgeimpulse.com/public/497635/latest), click on the **Clone** button on the top-right corner and follow the cloning instructions. * **Download and import** * [Download link](https://cdn.edgeimpulse.com/datasets/Audio+Classification+-+Faucet+vs+noise.zip) This dataset uses the Edge Impulse Exporter Format (`info.labels`). See [Edge Impulse labels](/tools/specifications/data-annotation/ei-labels) for more info. Edge Impulse also supports different [data acquisition formats](/tools/specifications/data-acquisition/json-cbor) and [dataset annotation formats](/tools/specifications/data-annotation/ei-labels) that you can import into your project to build your edge AI models: * [Studio uploader](/studio/projects/data-acquisition/dataset/uploader) * [CLI uploader](/tools/clis/edge-impulse-cli/uploader) * [CSV Wizard](/studio/projects/data-acquisition/csv-wizard) * [Python SDK](/tutorials/tools/sdks/studio/python/upload-download-data) * [Ingestion API](/apis/ingestion) * [Import from S3 buckets](/studio/projects/data-acquisition/data-sources) * [Upload portals](/studio/organizations/upload-portals) ## Citation If you use this dataset in your research paper, please cite it using the following BibTeX: ``` @misc{edgeimpulse_dataset_497635, title = {Audio Classification - Faucet vs noise}, author = {Edge Impulse}, year = {2024}, url = {https://studio.edgeimpulse.com/public/497635/latest}, note = {BSD 3-Clause Clear} } ``` # Keyword Spotting Source: https://docs.edgeimpulse.com/datasets/audio/keyword-spotting A labeled audio dataset for training keyword spotting models to detect the 'Hello World' phrase on embedded devices. **Task:** Audio Classification **License:** [BSD 3-Clause Clear](https://spdx.org/licenses/BSD-3-Clause-Clear.html) ## Description Have you ever wanted to make your own "Ok, Google" or "Alexa" keyword spotting model? The `helloworld` class has been collected by Edge Impulse teams, the added `noise` samples come from the [Microsoft Scalable Noisy Speech Dataset](https://github.com/microsoft/MS-SNSD) and the `unknown` samples are based on a subset of data in the [Google Speech Commands Dataset](https://research.google/blog/launching-the-speech-commands-dataset/). This dataset can be used to build an Edge AI project detecting the "Hello World" keyword phrase. You can also follow [our tutorial](/tutorials/end-to-end/keyword-spotting) to guide you through building your keyword spotting model, from data collection to deployment on embedded devices. ### Compatible Blocks * **Feature extraction**: [Audio (MFCC)](/studio/projects/processing-blocks/blocks/audio-mfcc), [Audio (MFE)](/studio/projects/processing-blocks/blocks/audio-mfe), [Spectrogram](/studio/projects/processing-blocks/blocks/spectrogram), [Raw Data](/studio/projects/processing-blocks/blocks/raw-data) * **Learning block**: [Classification](/studio/projects/learning-blocks/blocks/classification), [Transfer Learning (Keyword Spotting)](/studio/projects/learning-blocks/blocks/transfer-learning-keyword) *Not sure what to choose? Try out this dataset with the [EON Tuner](/studio/projects/eon-tuner).* ### Dataset Details * **Total Data Items:** 2062 * **Total Data Length:** 0h 34m 22s * **Axis Summary:** audio * **Labeling Method:** single label * **Train/Test Split:** 79.97% / 20.03% | | **Training Set** | **Testing Set** | | --------------------- | -------------------------- | -------------------------- | | **Total Data Items** | 1649 | 413 | | **Labels** | helloworld, noise, unknown | helloworld, noise, unknown | | **Total Data Length** | 0h 27m 29s | 0h 6m 53s | ## Usage The dataset can be added to a project in two ways: cloning the dataset public project or downloading the dataset and importing it into another project. * **Clone the [public project](https://studio.edgeimpulse.com/public/499022/latest)** To clone and use this project, visit the [Edge Impulse Studio link](https://studio.edgeimpulse.com/public/499022/latest), click on the **Clone** button on the top-right corner and follow the cloning instructions. * **Download and import** * [Download link](https://cdn.edgeimpulse.com/datasets/Audio+Classification+-+Keyword+Spotting.zip) This dataset uses the Edge Impulse Exporter Format (`info.labels`). See [Edge Impulse labels](/tools/specifications/data-annotation/ei-labels) for more info. Edge Impulse also supports different [data acquisition formats](/tools/specifications/data-acquisition/json-cbor) and [dataset annotation formats](/tools/specifications/data-annotation/ei-labels) that you can import into your project to build your edge AI models: * [Studio uploader](/studio/projects/data-acquisition/dataset/uploader) * [CLI uploader](/tools/clis/edge-impulse-cli/uploader) * [CSV Wizard](/studio/projects/data-acquisition/csv-wizard) * [Python SDK](/tutorials/tools/sdks/studio/python/upload-download-data) * [Ingestion API](/apis/ingestion) * [Import from S3 buckets](/studio/projects/data-acquisition/data-sources) * [Upload portals](/studio/organizations/upload-portals) ## Citation If you use this dataset in your research paper, please cite it using the following BibTeX: ``` @misc{edgeimpulse_dataset_499022, title = {Audio Classification - Keyword Spotting}, author = {Edge Impulse}, year = {2024}, url = {https://studio.edgeimpulse.com/public/499022/latest}, note = {BSD 3-Clause Clear} } ``` # Bottles rack Source: https://docs.edgeimpulse.com/datasets/image/bottles-rack A labeled image dataset of bottle racks for training object detection models to identify filled and empty bottle slots. **Task:** Object Detection **License:** [BSD 3-Clause Clear](https://spdx.org/licenses/BSD-3-Clause-Clear.html) ## Description This dataset has been collected by Edge Impulse teams and contains images of bottle racks on different backgrounds and different orientations. It can be used to count the number of beers in the rack. The two labels - empty or full - is used to distinguish if the beer has a cap or not. ### Compatible Blocks * **Feature extraction**: [Image](/studio/projects/processing-blocks/blocks/image) * **Learning block**: [Object Detection](/studio/projects/learning-blocks/blocks/object-detection) *Not sure what to choose? Try out this dataset with the [EON Tuner](/studio/projects/eon-tuner).* ### Dataset Details * **Total Data Items:** 130 * **Labeling Method:** object detection * **Train/Test Split:** 74.62% / 25.38% | | **Training Set** | **Testing Set** | | -------------------- | ---------------- | --------------- | | **Total Data Items** | 97 | 33 | | **Labels** | empty, full | empty, full | ## Usage The dataset can be added to a project in two ways: cloning the dataset public project or downloading the dataset and importing it into another project. * **Clone the [public project](https://studio.edgeimpulse.com/public/497424/latest)** To clone and use this project, visit the [Edge Impulse Studio link](https://studio.edgeimpulse.com/public/497424/latest), click on the **Clone** button on the top-right corner and follow the cloning instructions. * **Download and import** * [Download link](https://cdn.edgeimpulse.com/datasets/Object+Detection+-+Bottles+rack.zip) This dataset uses the Edge Impulse Exporter Format (`info.labels`). See [Edge Impulse labels](/tools/specifications/data-annotation/ei-labels) for more info. Edge Impulse also supports different [data acquisition formats](/tools/specifications/data-acquisition/json-cbor) and [dataset annotation formats](/tools/specifications/data-annotation/ei-labels) that you can import into your project to build your edge AI models: * [Studio uploader](/studio/projects/data-acquisition/dataset/uploader) * [CLI uploader](/tools/clis/edge-impulse-cli/uploader) * [CSV Wizard](/studio/projects/data-acquisition/csv-wizard) * [Python SDK](/tutorials/tools/sdks/studio/python/upload-download-data) * [Ingestion API](/apis/ingestion) * [Import from S3 buckets](/studio/projects/data-acquisition/data-sources) * [Upload portals](/studio/organizations/upload-portals) ## Citation If you use this dataset in your research paper, please cite it using the following BibTeX: ``` @misc{edgeimpulse_dataset_497424, title = {Object Detection - Bottles rack}, author = {Edge Impulse}, year = {2024}, url = {https://studio.edgeimpulse.com/public/497424/latest}, note = {BSD 3-Clause Clear} } ``` # Cans on conveyor belt Source: https://docs.edgeimpulse.com/datasets/image/cans-on-conveyor-belt A synthetically generated image dataset of cans on a conveyor belt for training object detection models using NVIDIA Omniverse. **Task:** Object Detection **License:** [BSD 3-Clause Clear](https://spdx.org/licenses/BSD-3-Clause-Clear.html) ## Description This dataset has been synthetically generated by Edge Impulse teams using [NVIDIA Omniverse](/tutorials/integrations/nvidia-omniverse) and [Edge Impulse Omniverse Extension](https://github.com/edgeimpulse/edge-impulse-omniverse-ext). You can also have a look at [this tutorial](/projects/expert-network/nvidia-omniverse-replicator) created by Edge Impulse expert George Igwegbe to create a synthetic dataset using NVIDIA Omniverse Replicator. ### Compatible Blocks * **Feature extraction**: [Image](/studio/projects/processing-blocks/blocks/image) * **Learning block**: [Object Detection](/studio/projects/learning-blocks/blocks/object-detection) *Not sure what to choose? Try out this dataset with the [EON Tuner](/studio/projects/eon-tuner).* ### Dataset Details * **Total Data Items:** 101 * **Labeling Method:** object detection * **Train/Test Split:** 78.22% / 21.78% | | **Training Set** | **Testing Set** | | -------------------- | ---------------- | --------------- | | **Total Data Items** | 79 | 22 | | **Labels** | Can | Can | ## Usage The dataset can be added to a project in two ways: cloning the dataset public project or downloading the dataset and importing it into another project. * **Clone the [public project](https://studio.edgeimpulse.com/public/497676/latest)** To clone and use this project, visit the [Edge Impulse Studio link](https://studio.edgeimpulse.com/public/497676/latest), click on the **Clone** button on the top-right corner and follow the cloning instructions. * **Download and import** * [Download link](https://cdn.edgeimpulse.com/datasets/Object+Detection+-+Cans+on+conveyor+belt.zip) This dataset uses the Edge Impulse Exporter Format (`info.labels`). See [Edge Impulse labels](/tools/specifications/data-annotation/ei-labels) for more info. Edge Impulse also supports different [data acquisition formats](/tools/specifications/data-acquisition/json-cbor) and [dataset annotation formats](/tools/specifications/data-annotation/ei-labels) that you can import into your project to build your edge AI models: * [Studio uploader](/studio/projects/data-acquisition/dataset/uploader) * [CLI uploader](/tools/clis/edge-impulse-cli/uploader) * [CSV Wizard](/studio/projects/data-acquisition/csv-wizard) * [Python SDK](/tutorials/tools/sdks/studio/python/upload-download-data) * [Ingestion API](/apis/ingestion) * [Import from S3 buckets](/studio/projects/data-acquisition/data-sources) * [Upload portals](/studio/organizations/upload-portals) ## Citation If you use this dataset in your research paper, please cite it using the following BibTeX: ``` @misc{edgeimpulse_dataset_497676, title = {Object Detection - Cans on conveyor belt}, author = {Edge Impulse}, year = {2024}, url = {https://studio.edgeimpulse.com/public/497676/latest}, note = {BSD 3-Clause Clear} } ``` # Capsule Source: https://docs.edgeimpulse.com/datasets/image/capsule A labeled image dataset of pharmaceutical capsules for training visual anomaly detection models to identify defects. **Task:** Visual Anomaly Detection **License:** [BSD 3-Clause Clear](https://spdx.org/licenses/BSD-3-Clause-Clear.html) ## Description This dataset has been collected by Edge Impulse teams and contains a single red-white capsule, centered in the frame, with a similar size and a uniform background. The training dataset only contains "nominal" (no anomaly) images whereas the testing dataset contains both nominal and anomalous images. ### Compatible Blocks * **Feature extraction**: [Image](/studio/projects/processing-blocks/blocks/image) * **Learning block**: [Visual Anomaly Detection (FOMO-AD)](/studio/projects/learning-blocks/blocks/visual-anomaly-detection-fomo-ad) *Not sure what to choose? Try out this dataset with the [EON Tuner](/studio/projects/eon-tuner).* ### Dataset Details * **Total Data Items:** 149 * **Labeling Method:** single label * **Train/Test Split:** 64.43% / 35.57% | | **Training Set** | **Testing Set** | | -------------------- | ---------------- | ------------------- | | **Total Data Items** | 96 | 53 | | **Labels** | no anomaly | anomaly, no anomaly | ## Usage The dataset can be added to a project in two ways: cloning the dataset public project or downloading the dataset and importing it into another project. * **Clone the [public project](https://studio.edgeimpulse.com/public/497433/latest)** To clone and use this project, visit the [Edge Impulse Studio link](https://studio.edgeimpulse.com/public/497433/latest), click on the **Clone** button on the top-right corner and follow the cloning instructions. * **Download and import** * [Download link](https://cdn.edgeimpulse.com/datasets/Visual+Anomaly+Detection+-+Capsule.zip) This dataset uses the Edge Impulse Exporter Format (`info.labels`). See [Edge Impulse labels](/tools/specifications/data-annotation/ei-labels) for more info. Edge Impulse also supports different [data acquisition formats](/tools/specifications/data-acquisition/json-cbor) and [dataset annotation formats](/tools/specifications/data-annotation/ei-labels) that you can import into your project to build your edge AI models: * [Studio uploader](/studio/projects/data-acquisition/dataset/uploader) * [CLI uploader](/tools/clis/edge-impulse-cli/uploader) * [CSV Wizard](/studio/projects/data-acquisition/csv-wizard) * [Python SDK](/tutorials/tools/sdks/studio/python/upload-download-data) * [Ingestion API](/apis/ingestion) * [Import from S3 buckets](/studio/projects/data-acquisition/data-sources) * [Upload portals](/studio/organizations/upload-portals) ## Citation If you use this dataset in your research paper, please cite it using the following BibTeX: ``` @misc{edgeimpulse_dataset_497433, title = {Visual Anomaly Detection - Capsule}, author = {Edge Impulse}, year = {2024}, url = {https://studio.edgeimpulse.com/public/497433/latest}, note = {BSD 3-Clause Clear} } ``` # Cubes on conveyor belt (colors) Source: https://docs.edgeimpulse.com/datasets/image/cubes-on-conveyor-belt-colors A labeled image dataset of colored cubes on a conveyor belt, used to design and demonstrate the FOMO object detection architecture. **Task:** Object Detection **License:** [BSD 3-Clause Clear](https://spdx.org/licenses/BSD-3-Clause-Clear.html) ## Description This dataset has been collected by Edge Impulse team and used extensively to design the FOMO (Faster Objects, More Objects) object detection architecture. See the [FOMO](/studio/projects/learning-blocks/blocks/object-detection/fomo) documentation or the announcement [blog post](https://www.edgeimpulse.com/blog/announcing-fomo-faster-objects-more-objects/). ### Compatible Blocks * **Feature extraction**: [Image](/studio/projects/processing-blocks/blocks/image) * **Learning block**: [Object Detection](/studio/projects/learning-blocks/blocks/object-detection) *Not sure what to choose? Try out this dataset with the [EON Tuner](/studio/projects/eon-tuner).* ### Dataset Details * **Total Data Items:** 670 * **Labeling Method:** object detection * **Train/Test Split:** 79.70% / 20.30% | | **Training Set** | **Testing Set** | | -------------------- | ------------------------ | ------------------------ | | **Total Data Items** | 534 | 136 | | **Labels** | blue, green, red, yellow | blue, green, red, yellow | ## Usage The dataset can be added to a project in two ways: cloning the dataset public project or downloading the dataset and importing it into another project. * **Clone the [public project](https://studio.edgeimpulse.com/public/497627/latest)** To clone and use this project, visit the [Edge Impulse Studio link](https://studio.edgeimpulse.com/public/497627/latest), click on the **Clone** button on the top-right corner and follow the cloning instructions. * **Download and import** * [Download link](https://cdn.edgeimpulse.com/datasets/Object+Detection+-+Cubes+colors+on+conveyor+belt.zip) This dataset uses the Edge Impulse Exporter Format (`info.labels`). See [Edge Impulse labels](/tools/specifications/data-annotation/ei-labels) for more info. Edge Impulse also supports different [data acquisition formats](/tools/specifications/data-acquisition/json-cbor) and [dataset annotation formats](/tools/specifications/data-annotation/ei-labels) that you can import into your project to build your edge AI models: * [Studio uploader](/studio/projects/data-acquisition/dataset/uploader) * [CLI uploader](/tools/clis/edge-impulse-cli/uploader) * [CSV Wizard](/studio/projects/data-acquisition/csv-wizard) * [Python SDK](/tutorials/tools/sdks/studio/python/upload-download-data) * [Ingestion API](/apis/ingestion) * [Import from S3 buckets](/studio/projects/data-acquisition/data-sources) * [Upload portals](/studio/organizations/upload-portals) ## Citation If you use this dataset in your research paper, please cite it using the following BibTeX: ``` @misc{edgeimpulse_dataset_497627, title = {Object Detection - Cubes colors on conveyor belt}, author = {Edge Impulse}, year = {2024}, url = {https://studio.edgeimpulse.com/public/497627/latest}, note = {BSD 3-Clause Clear} } ``` # Cubes on conveyor belt (self attention) Source: https://docs.edgeimpulse.com/datasets/image/cubes-on-conveyor-belt-self-attention A labeled image dataset of conveyor belt cubes for spatial-aware object detection using a micro transformer with FOMO self-attention. **Task:** Object Detection **License:** [BSD 3-Clause Clear](https://spdx.org/licenses/BSD-3-Clause-Clear.html) ## Description This dataset, collected by Edge Impulse team, is a variant of the [Cubes on conveyor belt (colors)](/datasets/image/cubes-on-conveyor-belt-colors) dataset. It has been used to perform spatial aware object detection using a micro transformer. Have a look at this blog post for more information: [FOMO Self-Attention](https://www.edgeimpulse.com/blog/fomo-self-attention/) ### Compatible Blocks * **Feature extraction**: [Image](/studio/projects/processing-blocks/blocks/image) * **Learning block**: [FOMO](/studio/projects/learning-blocks/blocks/object-detection/fomo) (modified in Expert mode) *Not sure what to choose? Try out this dataset with the [EON Tuner](/studio/projects/eon-tuner).* ### Dataset Details * **Total Data Items:** 85 * **Labeling Method:** object detection * **Train/Test Split:** 97.65% / 2.35% | | **Training Set** | **Testing Set** | | -------------------- | ---------------- | --------------- | | **Total Data Items** | 83 | 2 | | **Labels** | left, right | left, right | ## Usage The dataset can be added to a project in two ways: cloning the dataset public project or downloading the dataset and importing it into another project. * **Clone the [public project](https://studio.edgeimpulse.com/public/497628/latest)** To clone and use this project, visit the [Edge Impulse Studio link](https://studio.edgeimpulse.com/public/497628/latest), click on the **Clone** button on the top-right corner and follow the cloning instructions. * **Download and import** * [Download link](https://cdn.edgeimpulse.com/datasets/Object+Detection+-+Self+Attention+-+Cubes+on+conveyor+belt.zip) This dataset uses the Edge Impulse Exporter Format (`info.labels`). See [Edge Impulse labels](/tools/specifications/data-annotation/ei-labels) for more info. Edge Impulse also supports different [data acquisition formats](/tools/specifications/data-acquisition/json-cbor) and [dataset annotation formats](/tools/specifications/data-annotation/ei-labels) that you can import into your project to build your edge AI models: * [Studio uploader](/studio/projects/data-acquisition/dataset/uploader) * [CLI uploader](/tools/clis/edge-impulse-cli/uploader) * [CSV Wizard](/studio/projects/data-acquisition/csv-wizard) * [Python SDK](/tutorials/tools/sdks/studio/python/upload-download-data) * [Ingestion API](/apis/ingestion) * [Import from S3 buckets](/studio/projects/data-acquisition/data-sources) * [Upload portals](/studio/organizations/upload-portals) ## Citation If you use this dataset in your research paper, please cite it using the following BibTeX: ``` @misc{edgeimpulse_dataset_497628, title = {Object Detection - Self Attention - Cubes on conveyor belt}, author = {Edge Impulse}, year = {2024}, url = {https://studio.edgeimpulse.com/public/497628/latest}, note = {BSD 3-Clause Clear} } ``` # DHT11 Source: https://docs.edgeimpulse.com/datasets/image/dht11 A labeled image dataset of DHT11 sensors for training visual anomaly detection models to identify damaged or mis-wired components. **Task:** Visual Anomaly Detection **License:** [BSD 3-Clause Clear](https://spdx.org/licenses/BSD-3-Clause-Clear.html) ## Description This dataset has been collected by Edge Impulse teams and contains a single DHT11 sensor, centered in the frame, with a similar size and a uniform background. The training dataset only contains "nominal" (no anomaly) images whereas the testing dataset contains both nominal and anomalous images. The DHT11 have been used to teach IoT classes in the past and have been manipulated by students extensively. When not wiring the pins properly, it can cause an overheat which often lead to the plastic melting. Some other anomalous images are missing wiring pins. ### Compatible Blocks * **Feature extraction**: [Image](/studio/projects/processing-blocks/blocks/image) * **Learning block**: [Visual Anomaly Detection (FOMO-AD)](/studio/projects/learning-blocks/blocks/visual-anomaly-detection-fomo-ad) *Not sure what to choose? Try out this dataset with the [EON Tuner](/studio/projects/eon-tuner).* ### Dataset Details * **Total Data Items:** 195 * **Labeling Method:** single label * **Train/Test Split:** 69.74% / 30.26% | | **Training Set** | **Testing Set** | | -------------------- | ---------------- | ------------------- | | **Total Data Items** | 136 | 59 | | **Labels** | no anomaly | anomaly, no anomaly | ## Usage The dataset can be added to a project in two ways: cloning the dataset public project or downloading the dataset and importing it into another project. * **Clone the [public project](https://studio.edgeimpulse.com/public/497422/latest)** To clone and use this project, visit the [Edge Impulse Studio link](https://studio.edgeimpulse.com/public/497422/latest), click on the **Clone** button on the top-right corner and follow the cloning instructions. * **Download and import** * [Download link](https://cdn.edgeimpulse.com/datasets/Visual+Anomaly+Detection+-+DHT11.zip) This dataset uses the Edge Impulse Exporter Format (`info.labels`). See [Edge Impulse labels](/tools/specifications/data-annotation/ei-labels) for more info. Edge Impulse also supports different [data acquisition formats](/tools/specifications/data-acquisition/json-cbor) and [dataset annotation formats](/tools/specifications/data-annotation/ei-labels) that you can import into your project to build your edge AI models: * [Studio uploader](/studio/projects/data-acquisition/dataset/uploader) * [CLI uploader](/tools/clis/edge-impulse-cli/uploader) * [CSV Wizard](/studio/projects/data-acquisition/csv-wizard) * [Python SDK](/tutorials/tools/sdks/studio/python/upload-download-data) * [Ingestion API](/apis/ingestion) * [Import from S3 buckets](/studio/projects/data-acquisition/data-sources) * [Upload portals](/studio/organizations/upload-portals) ## Citation If you use this dataset in your research paper, please cite it using the following BibTeX: ``` @misc{edgeimpulse_dataset_497422, title = {Visual Anomaly Detection - DHT11}, author = {Edge Impulse}, year = {2024}, url = {https://studio.edgeimpulse.com/public/497422/latest}, note = {BSD 3-Clause Clear} } ``` # Dice Source: https://docs.edgeimpulse.com/datasets/image/dice A labeled image dataset of dice on a white background for training object detection models to count and locate objects in a frame. **Task:** Object Detection **License:** [BSD 3-Clause Clear](https://spdx.org/licenses/BSD-3-Clause-Clear.html) ## Description This dataset has been collected by Edge Impulse teams and contains images of dice on a white background. It can be used to count the number of items in the frame. ### Compatible Blocks * **Feature extraction**: [Image](/studio/projects/processing-blocks/blocks/image) * **Learning block**: [Object Detection](/studio/projects/learning-blocks/blocks/object-detection) *Not sure what to choose? Try out this dataset with the [EON Tuner](/studio/projects/eon-tuner).* ### Dataset Details * **Total Data Items:** 85 * **Labeling Method:** object detection * **Train/Test Split:** 80.00% / 20.00% | | **Training Set** | **Testing Set** | | -------------------- | ---------------- | --------------- | | **Total Data Items** | 68 | 17 | | **Labels** | dice | dice | ## Usage The dataset can be added to a project in two ways: cloning the dataset public project or downloading the dataset and importing it into another project. * **Clone the [public project](https://studio.edgeimpulse.com/public/497423/latest)** To clone and use this project, visit the [Edge Impulse Studio link](https://studio.edgeimpulse.com/public/497423/latest), click on the **Clone** button on the top-right corner and follow the cloning instructions. * **Download and import** * [Download link](https://cdn.edgeimpulse.com/datasets/Object+Detection+-+Dice.zip) This dataset uses the Edge Impulse Exporter Format (`info.labels`). See [Edge Impulse labels](/tools/specifications/data-annotation/ei-labels) for more info. Edge Impulse also supports different [data acquisition formats](/tools/specifications/data-acquisition/json-cbor) and [dataset annotation formats](/tools/specifications/data-annotation/ei-labels) that you can import into your project to build your edge AI models: * [Studio uploader](/studio/projects/data-acquisition/dataset/uploader) * [CLI uploader](/tools/clis/edge-impulse-cli/uploader) * [CSV Wizard](/studio/projects/data-acquisition/csv-wizard) * [Python SDK](/tutorials/tools/sdks/studio/python/upload-download-data) * [Ingestion API](/apis/ingestion) * [Import from S3 buckets](/studio/projects/data-acquisition/data-sources) * [Upload portals](/studio/organizations/upload-portals) ## Citation If you use this dataset in your research paper, please cite it using the following BibTeX: ``` @misc{edgeimpulse_dataset_497423, title = {Object Detection - Dice}, author = {Edge Impulse}, year = {2024}, url = {https://studio.edgeimpulse.com/public/497423/latest}, note = {BSD 3-Clause Clear} } ``` # Dice colors Source: https://docs.edgeimpulse.com/datasets/image/dice-colors A labeled image dataset of colored dice on a white background for training object detection models to classify dice by color. **Task:** Object Detection **License:** [BSD 3-Clause Clear](https://spdx.org/licenses/BSD-3-Clause-Clear.html) ## Description This dataset has been collected by Edge Impulse teams and is a variant of the "Object Detection - Dice" dataset. It images of dice on a white background labeled by color. ### Compatible Blocks * **Feature extraction**: [Image](/studio/projects/processing-blocks/blocks/image) * **Learning block**: [Object Detection](/studio/projects/learning-blocks/blocks/object-detection) *Not sure what to choose? Try out this dataset with the [EON Tuner](/studio/projects/eon-tuner).* ### Dataset Details * **Total Data Items:** 85 * **Labeling Method:** object detection * **Train/Test Split:** 80.00% / 20.00% | | **Training Set** | **Testing Set** | | -------------------- | ---------------------------------------- | ---------------------------------------- | | **Total Data Items** | 68 | 17 | | **Labels** | blue, green, orange, purple, red, yellow | blue, green, orange, purple, red, yellow | ## Usage The dataset can be added to a project in two ways: cloning the dataset public project or downloading the dataset and importing it into another project. * **Clone the [public project](https://studio.edgeimpulse.com/public/497418/latest)** To clone and use this project, visit the [Edge Impulse Studio link](https://studio.edgeimpulse.com/public/497418/latest), click on the **Clone** button on the top-right corner and follow the cloning instructions. * **Download and import** * [Download link](https://cdn.edgeimpulse.com/datasets/Object+Detection+-+Dice+colors.zip) This dataset uses the Edge Impulse Exporter Format (`info.labels`). See [Edge Impulse labels](/tools/specifications/data-annotation/ei-labels) for more info. Edge Impulse also supports different [data acquisition formats](/tools/specifications/data-acquisition/json-cbor) and [dataset annotation formats](/tools/specifications/data-annotation/ei-labels) that you can import into your project to build your edge AI models: * [Studio uploader](/studio/projects/data-acquisition/dataset/uploader) * [CLI uploader](/tools/clis/edge-impulse-cli/uploader) * [CSV Wizard](/studio/projects/data-acquisition/csv-wizard) * [Python SDK](/tutorials/tools/sdks/studio/python/upload-download-data) * [Ingestion API](/apis/ingestion) * [Import from S3 buckets](/studio/projects/data-acquisition/data-sources) * [Upload portals](/studio/organizations/upload-portals) ## Citation If you use this dataset in your research paper, please cite it using the following BibTeX: ``` @misc{edgeimpulse_dataset_497418, title = {Object Detection - Dice colors}, author = {Edge Impulse}, year = {2024}, url = {https://studio.edgeimpulse.com/public/497418/latest}, note = {BSD 3-Clause Clear} } ``` # Fire extinguisher head thread Source: https://docs.edgeimpulse.com/datasets/image/fire-extinguisher-head-thread A labeled image dataset of fire extinguisher head threads for visual anomaly detection in industrial quality inspection. **Task:** Visual Anomaly Detection **License:** [BSD 3-Clause Clear](https://spdx.org/licenses/BSD-3-Clause-Clear.html) ## Description This dataset has been collected by Edge Impulse teams and contains a single fire extinguisher head thread, centered in the frame, with a similar size and a variable background. The training dataset only contains "good" (no anomaly) images whereas the testing dataset contains both nominal and anomalous images. ### Compatible Blocks * **Feature extraction**: [Image](/studio/projects/processing-blocks/blocks/image) * **Learning block**: [Visual Anomaly Detection (FOMO-AD)](/studio/projects/learning-blocks/blocks/visual-anomaly-detection-fomo-ad) *Not sure what to choose? Try out this dataset with the [EON Tuner](/studio/projects/eon-tuner).* ### Dataset Details * **Total Data Items:** 204 * **Labeling Method:** single label * **Train/Test Split:** 58.82% / 41.18% | | **Training Set** | **Testing Set** | | -------------------- | ---------------- | --------------- | | **Total Data Items** | 120 | 84 | | **Labels** | good | good, rusty | ## Usage The dataset can be added to a project in two ways: cloning the dataset public project or downloading the dataset and importing it into another project. * **Clone the [public project](https://studio.edgeimpulse.com/public/497408/latest)** To clone and use this project, visit the [Edge Impulse Studio link](https://studio.edgeimpulse.com/public/497408/latest), click on the **Clone** button on the top-right corner and follow the cloning instructions. * **Download and import** * [Download link](https://cdn.edgeimpulse.com/datasets/Visual+Anomaly+Detection+-+Fire+extinguisher+head+thread.zip) This dataset uses the Edge Impulse Exporter Format (`info.labels`). See [Edge Impulse labels](/tools/specifications/data-annotation/ei-labels) for more info. Edge Impulse also supports different [data acquisition formats](/tools/specifications/data-acquisition/json-cbor) and [dataset annotation formats](/tools/specifications/data-annotation/ei-labels) that you can import into your project to build your edge AI models: * [Studio uploader](/studio/projects/data-acquisition/dataset/uploader) * [CLI uploader](/tools/clis/edge-impulse-cli/uploader) * [CSV Wizard](/studio/projects/data-acquisition/csv-wizard) * [Python SDK](/tutorials/tools/sdks/studio/python/upload-download-data) * [Ingestion API](/apis/ingestion) * [Import from S3 buckets](/studio/projects/data-acquisition/data-sources) * [Upload portals](/studio/organizations/upload-portals) ## Citation If you use this dataset in your research paper, please cite it using the following BibTeX: ``` @misc{edgeimpulse_dataset_497408, title = {Visual Anomaly Detection - Fire extinguisher head thread}, author = {Edge Impulse}, year = {2024}, url = {https://studio.edgeimpulse.com/public/497408/latest}, note = {BSD 3-Clause Clear} } ``` # Fire extinguisher safety pin Source: https://docs.edgeimpulse.com/datasets/image/fire-extinguisher-safety-pin A labeled image dataset of fire extinguisher safety pins for training image classification and visual anomaly detection models. **Task:** Image Classification **License:** [BSD 3-Clause Clear](https://spdx.org/licenses/BSD-3-Clause-Clear.html) ## Description This dataset contains images of fire extinguisher safety pins. This dataset can be used to combine image classification and visual anomaly detection. Label information: * `rot-powder`: Pin for ROT powder fire extinguisher - Yellow - manufacturer reference: 06210409F * `rot-water`: Pin for ROT water spray fire extinguisher - Blue - manufacturer reference: 06210410F * `anomaly`: Other fire extinguisher safety pins ### Compatible Blocks * **Feature extraction**: [Image](/studio/projects/processing-blocks/blocks/image) * **Learning block**: [Transfer Learning (Images)](/studio/projects/learning-blocks/blocks/transfer-learning-images), [Classification](/studio/projects/learning-blocks/blocks/classification) *Not sure what to choose? Try out this dataset with the [EON Tuner](/studio/projects/eon-tuner).* ### Dataset Details * **Total Data Items:** 264 * **Labeling Method:** single label * **Train/Test Split:** 79.92% / 20.08% | | **Training Set** | **Testing Set** | | -------------------- | ------------------------------ | ------------------------------ | | **Total Data Items** | 211 | 53 | | **Labels** | anomaly, rot-powder, rot-water | anomaly, rot-powder, rot-water | ## Usage The dataset can be added to a project in two ways: cloning the dataset public project or downloading the dataset and importing it into another project. * **Clone the [public project](https://studio.edgeimpulse.com/public/497409/latest)** To clone and use this project, visit the [Edge Impulse Studio link](https://studio.edgeimpulse.com/public/497409/latest), click on the **Clone** button on the top-right corner and follow the cloning instructions. * **Download and import** * [Download link](https://cdn.edgeimpulse.com/datasets/Image+Classification+-+Fire+extinguisher+safety+pin.zip) This dataset uses the Edge Impulse Exporter Format (`info.labels`). See [Edge Impulse labels](/tools/specifications/data-annotation/ei-labels) for more info. Edge Impulse also supports different [data acquisition formats](/tools/specifications/data-acquisition/json-cbor) and [dataset annotation formats](/tools/specifications/data-annotation/ei-labels) that you can import into your project to build your edge AI models: * [Studio uploader](/studio/projects/data-acquisition/dataset/uploader) * [CLI uploader](/tools/clis/edge-impulse-cli/uploader) * [CSV Wizard](/studio/projects/data-acquisition/csv-wizard) * [Python SDK](/tutorials/tools/sdks/studio/python/upload-download-data) * [Ingestion API](/apis/ingestion) * [Import from S3 buckets](/studio/projects/data-acquisition/data-sources) * [Upload portals](/studio/organizations/upload-portals) ## Citation If you use this dataset in your research paper, please cite it using the following BibTeX: ``` @misc{edgeimpulse_dataset_497409, title = {Image Classification - Fire extinguisher safety pin}, author = {Edge Impulse}, year = {2024}, url = {https://studio.edgeimpulse.com/public/497409/latest}, note = {BSD 3-Clause Clear} } ``` # Flat washers Source: https://docs.edgeimpulse.com/datasets/image/flat-washers A labeled image dataset of flat washers on varying backgrounds for training visual anomaly detection models. **Task:** Visual Anomaly Detection **License:** [BSD 3-Clause Clear](https://spdx.org/licenses/BSD-3-Clause-Clear.html) ## Description This dataset has been collected by Edge Impulse teams and contains a single flat washer, randomly located in the frame. The dataset has been collected using two different backgrounds - a white background and textured dark-grey background. The training dataset only contains "nominal" (no anomaly) images whereas the testing dataset contains both nominal and anomalous images. ### Compatible Blocks * **Feature extraction**: [Image](/studio/projects/processing-blocks/blocks/image) * **Learning block**: [Visual Anomaly Detection (FOMO-AD)](/studio/projects/learning-blocks/blocks/visual-anomaly-detection-fomo-ad) *Not sure what to choose? Try out this dataset with the [EON Tuner](/studio/projects/eon-tuner).* ### Dataset Details * **Total Data Items:** 464 * **Labeling Method:** single label * **Train/Test Split:** 58.84% / 41.16% | | **Training Set** | **Testing Set** | | -------------------- | ---------------- | ------------------- | | **Total Data Items** | 273 | 191 | | **Labels** | no anomaly | anomaly, no anomaly | ## Usage The dataset can be added to a project in two ways: cloning the dataset public project or downloading the dataset and importing it into another project. * **Clone the [public project](https://studio.edgeimpulse.com/public/497653/latest)** To clone and use this project, visit the [Edge Impulse Studio link](https://studio.edgeimpulse.com/public/497653/latest), click on the **Clone** button on the top-right corner and follow the cloning instructions. * **Download and import** * [Download link](https://cdn.edgeimpulse.com/datasets/Visual+Anomaly+Detection+-+Flat+washers.zip) This dataset uses the Edge Impulse Exporter Format (`info.labels`). See [Edge Impulse labels](/tools/specifications/data-annotation/ei-labels) for more info. Edge Impulse also supports different [data acquisition formats](/tools/specifications/data-acquisition/json-cbor) and [dataset annotation formats](/tools/specifications/data-annotation/ei-labels) that you can import into your project to build your edge AI models: * [Studio uploader](/studio/projects/data-acquisition/dataset/uploader) * [CLI uploader](/tools/clis/edge-impulse-cli/uploader) * [CSV Wizard](/studio/projects/data-acquisition/csv-wizard) * [Python SDK](/tutorials/tools/sdks/studio/python/upload-download-data) * [Ingestion API](/apis/ingestion) * [Import from S3 buckets](/studio/projects/data-acquisition/data-sources) * [Upload portals](/studio/organizations/upload-portals) ## Citation If you use this dataset in your research paper, please cite it using the following BibTeX: ``` @misc{edgeimpulse_dataset_497653, title = {Visual Anomaly Detection - Flat washers}, author = {Edge Impulse}, year = {2024}, url = {https://studio.edgeimpulse.com/public/497653/latest}, note = {BSD 3-Clause Clear} } ``` # Microscope Source: https://docs.edgeimpulse.com/datasets/image/microscope A labeled image dataset captured through a smartphone microscope for training image classification models. **Task:** Image Classification **License:** [BSD 3-Clause Clear](https://spdx.org/licenses/BSD-3-Clause-Clear.html) ## Description This dataset has been collected by Edge Impulse teams and contains images taken from a smartphone using the NATIONAL GEOGRAPHIC 40x-1280x Microscope. ### Compatible Blocks * **Feature extraction**: [Image](/studio/projects/processing-blocks/blocks/image) * **Learning block**: [Transfer Learning (Images)](/studio/projects/learning-blocks/blocks/transfer-learning-images), [Classification](/studio/projects/learning-blocks/blocks/classification) *Not sure what to choose? Try out this dataset with the [EON Tuner](/studio/projects/eon-tuner).* ### Dataset Details * **Total Data Items:** 246 * **Labeling Method:** single label * **Train/Test Split:** 81.30% / 18.70% | | **Training Set** | **Testing Set** | | -------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | | **Total Data Items** | 200 | 46 | | **Labels** | cotton stem, epidermis onion, housefly leg, unknown, wood stem | cotton stem, epidermis onion, housefly leg, unknown, wood stem | ## Usage The dataset can be added to a project in two ways: cloning the dataset public project or downloading the dataset and importing it into another project. * **Clone the [public project](https://studio.edgeimpulse.com/public/497431/latest)** To clone and use this project, visit the [Edge Impulse Studio link](https://studio.edgeimpulse.com/public/497431/latest), click on the **Clone** button on the top-right corner and follow the cloning instructions. * **Download and import** * [Download link](https://cdn.edgeimpulse.com/datasets/Image+Classification+-+Microscope.zip) This dataset uses the Edge Impulse Exporter Format (`info.labels`). See [Edge Impulse labels](/tools/specifications/data-annotation/ei-labels) for more info. Edge Impulse also supports different [data acquisition formats](/tools/specifications/data-acquisition/json-cbor) and [dataset annotation formats](/tools/specifications/data-annotation/ei-labels) that you can import into your project to build your edge AI models: * [Studio uploader](/studio/projects/data-acquisition/dataset/uploader) * [CLI uploader](/tools/clis/edge-impulse-cli/uploader) * [CSV Wizard](/studio/projects/data-acquisition/csv-wizard) * [Python SDK](/tutorials/tools/sdks/studio/python/upload-download-data) * [Ingestion API](/apis/ingestion) * [Import from S3 buckets](/studio/projects/data-acquisition/data-sources) * [Upload portals](/studio/organizations/upload-portals) ## Citation If you use this dataset in your research paper, please cite it using the following BibTeX: ``` @misc{edgeimpulse_dataset_497431, title = {Image Classification - Microscope}, author = {Edge Impulse}, year = {2024}, url = {https://studio.edgeimpulse.com/public/497431/latest}, note = {BSD 3-Clause Clear} } ``` # Thermostatic valves Source: https://docs.edgeimpulse.com/datasets/image/thermostatic-valves A labeled image dataset of thermostatic valves for training visual anomaly detection models in industrial quality inspection. **Task:** Visual Anomaly Detection **License:** [BSD 3-Clause Clear](https://spdx.org/licenses/BSD-3-Clause-Clear.html) ## Description This dataset has been collected by Edge Impulse teams and contains a single thermostatic valves, centered in the frame, with a similar size and a uniform background. The training dataset only contains "nominal" (no anomaly) images whereas the testing dataset contains both nominal and anomalous images. ### Compatible Blocks * **Feature extraction**: [Image](/studio/projects/processing-blocks/blocks/image) * **Learning block**: [Visual Anomaly Detection (FOMO-AD)](/studio/projects/learning-blocks/blocks/visual-anomaly-detection-fomo-ad) *Not sure what to choose? Try out this dataset with the [EON Tuner](/studio/projects/eon-tuner).* ### Dataset Details * **Total Data Items:** 195 * **Labeling Method:** single label * **Train/Test Split:** 62.05% / 37.95% | | **Training Set** | **Testing Set** | | -------------------- | ---------------- | ------------------- | | **Total Data Items** | 121 | 74 | | **Labels** | no anomaly | anomaly, no anomaly | ## Usage The dataset can be added to a project in two ways: cloning the dataset public project or downloading the dataset and importing it into another project. * **Clone the [public project](https://studio.edgeimpulse.com/public/497420/latest)** To clone and use this project, visit the [Edge Impulse Studio link](https://studio.edgeimpulse.com/public/497420/latest), click on the **Clone** button on the top-right corner and follow the cloning instructions. * **Download and import** * [Download link](https://cdn.edgeimpulse.com/datasets/Visual+Anomaly+Detection+-+Thermostatic+valves.zip) This dataset uses the Edge Impulse Exporter Format (`info.labels`). See [Edge Impulse labels](/tools/specifications/data-annotation/ei-labels) for more info. Edge Impulse also supports different [data acquisition formats](/tools/specifications/data-acquisition/json-cbor) and [dataset annotation formats](/tools/specifications/data-annotation/ei-labels) that you can import into your project to build your edge AI models: * [Studio uploader](/studio/projects/data-acquisition/dataset/uploader) * [CLI uploader](/tools/clis/edge-impulse-cli/uploader) * [CSV Wizard](/studio/projects/data-acquisition/csv-wizard) * [Python SDK](/tutorials/tools/sdks/studio/python/upload-download-data) * [Ingestion API](/apis/ingestion) * [Import from S3 buckets](/studio/projects/data-acquisition/data-sources) * [Upload portals](/studio/organizations/upload-portals) ## Citation If you use this dataset in your research paper, please cite it using the following BibTeX: ``` @misc{edgeimpulse_dataset_497420, title = {Visual Anomaly Detection - Thermostatic valves}, author = {Edge Impulse}, year = {2024}, url = {https://studio.edgeimpulse.com/public/497420/latest}, note = {BSD 3-Clause Clear} } ``` # Vial tubes Source: https://docs.edgeimpulse.com/datasets/image/vial-tubes A labeled image dataset for training visual regression models to predict liquid fill levels in vial tubes. **Task:** Visual Regression **License:** [BSD 3-Clause Clear](https://spdx.org/licenses/BSD-3-Clause-Clear.html) ## Description This dataset has been generated by Edge Impulse teams and contains images of vial tubes filled at different levels with a green liquid. The images in the training set have been captured using 5 different backgrounds. The images in the testing set have been captured using 9 different backgrounds. The `background` information is available in the metadata of the data samples. ### Compatible Blocks * **Feature extraction**: [Image](/studio/projects/processing-blocks/blocks/image) * **Learning block**: [Regression](/studio/projects/learning-blocks/blocks/regression) *Not sure what to choose? Try out this dataset with the [EON Tuner](/studio/projects/eon-tuner).* ### Dataset Details * **Total Data Items:** 747 * **Labeling Method:** single label * **Train/Test Split:** 66.67% / 33.33% | | **Training Set** | **Testing Set** | | -------------------- | --------------------------------- | ------------------------------------------------ | | **Total Data Items** | 498 | 249 | | **Labels** | -1, 0, 0.5, 0.75, 1, 1.25, 1.5, 2 | -1, 0, 0.4, 0.5, 0.7, 0.75, 1, 1.2, 1.25, 1.5, 2 | ## Usage ### Clone the project in Edge Impulse Studio (recommended) The fastest way to get started is to clone the public project directly into your Edge Impulse account. This gives you immediate access to the full dataset, a pre-configured impulse, and a trained model — ready to explore or retrain. Click **Clone** in the top-right corner of the project page and follow the instructions. A free Edge Impulse account is required. ### Download and import To import the raw dataset into an existing project, download it below. A free [Edge Impulse account](https://studio.edgeimpulse.com/signup) is required to train models. * [Download dataset](https://cdn.edgeimpulse.com/datasets/Visual+Regression+-+Vial+tubes.zip) This dataset uses the Edge Impulse Exporter Format (`info.labels`). See [Edge Impulse labels](/tools/specifications/data-annotation/ei-labels) for more info. Available import methods: * [Studio uploader](/studio/projects/data-acquisition/dataset/uploader) * [CLI uploader](/tools/clis/edge-impulse-cli/uploader) * [CSV Wizard](/studio/projects/data-acquisition/csv-wizard) * [Python SDK](/tutorials/tools/sdks/studio/python/upload-download-data) * [Ingestion API](/apis/ingestion) * [Import from S3 buckets](/studio/projects/data-acquisition/data-sources) * [Upload portals](/studio/organizations/upload-portals) ## Citation If you use this dataset in your research paper, please cite it using the following BibTeX: ``` @misc{edgeimpulse_dataset_571331, title = {Visual Regression - Vial tubes}, author = {Edge Impulse}, year = {2024}, url = {https://studio.edgeimpulse.com/public/571331/latest}, note = {BSD 3-Clause Clear} } ``` # Coffee machine stages (sensor fusion) Source: https://docs.edgeimpulse.com/datasets/time-series/coffee-machine-stages-sensor-fusion A multi-sensor time-series dataset of coffee machine operation stages for demonstrating sensor fusion classification with neural network embeddings. **Task:** Sensor Fusion Classification **License:** [BSD 3-Clause Clear](https://spdx.org/licenses/BSD-3-Clause-Clear.html) ## Description This dataset has been collected by Edge Impulse team to demonstrate how to perform Sensor Fusion Classification leveraging Neural Networks Embeddings. *Sensor fusion refers to the process of combining data from different types of sensors to give more information to the neural network. To extract meaningful information from this data, you can use the same DSP block, multiples DSP blocks, or use neural networks embeddings.* You can have a look at this [tutorial](/tutorials/topics/feature-extraction/use-embeddings-sensor-fusion) for more information to see how to use this dataset. This dataset combines audio data and accelerometer data. ### Recommended Impulse * **Feature extraction**: Audio Embeddings ([Spectrogram](/studio/projects/processing-blocks/blocks/spectrogram) + Convolution Neural Network Embeddings) + [Spectral Analysis](/studio/projects/processing-blocks/blocks/spectral-analysis) (accelerometer) * **Learning block**: [Classification](/studio/projects/learning-blocks/blocks/classification) using a fully-connected network ### Dataset Details * **Total Data Items:** 36 * **Labeling Method:** single label * **Train/Test Split:** 91.67% / 8.33% | | **Training Set** | **Testing Set** | | -------------------- | -------------------------- | --------------- | | **Total Data Items** | 33 | 3 | | **Labels** | extract, grind, idle, pump | | ## Usage The dataset can be added to a project in two ways: cloning the dataset public project or downloading the dataset and importing it into another project. * **Clone the [public project](https://studio.edgeimpulse.com/public/497832/latest)** To clone and use this project, visit the [Edge Impulse Studio link](https://studio.edgeimpulse.com/public/497832/latest), click on the **Clone** button on the top-right corner and follow the cloning instructions. * **Download and import** * [Download link](https://cdn.edgeimpulse.com/datasets/Sensor+Fusion+Classification+-+Coffee+machine+stages.zip) This dataset uses the Edge Impulse Exporter Format (`info.labels`). See [Edge Impulse labels](/tools/specifications/data-annotation/ei-labels) for more info. Edge Impulse also supports different [data acquisition formats](/tools/specifications/data-acquisition/json-cbor) and [dataset annotation formats](/tools/specifications/data-annotation/ei-labels) that you can import into your project to build your edge AI models: * [Studio uploader](/studio/projects/data-acquisition/dataset/uploader) * [CLI uploader](/tools/clis/edge-impulse-cli/uploader) * [CSV Wizard](/studio/projects/data-acquisition/csv-wizard) * [Python SDK](/tutorials/tools/sdks/studio/python/upload-download-data) * [Ingestion API](/apis/ingestion) * [Import from S3 buckets](/studio/projects/data-acquisition/data-sources) * [Upload portals](/studio/organizations/upload-portals) ## Citation If you use this dataset in your research paper, please cite it using the following BibTeX: ``` @misc{edgeimpulse_dataset_497832, title = {Sensor Fusion Classification - Coffee machine stages}, author = {Edge Impulse}, year = {2024}, url = {https://studio.edgeimpulse.com/public/497832/latest}, note = {BSD 3-Clause Clear} } ``` # Coffee machine stages (vibration) Source: https://docs.edgeimpulse.com/datasets/time-series/coffee-machine-stages-vibration A vibration time-series dataset of coffee machine operation stages for training motion and vibration classification models. **Task:** Motion and Vibration Classification **License:** [BSD 3-Clause Clear](https://spdx.org/licenses/BSD-3-Clause-Clear.html) ## Description ### Dataset Details * **Total Data Items:** 11 * **Labeling Method:** single label * **Train/Test Split:** 72.73% / 27.27% | | **Training Set** | **Testing Set** | | -------------------- | -------------------------- | -------------------------- | | **Total Data Items** | 8 | 3 | | **Labels** | extract, grind, idle, pump | extract, grind, idle, pump | ## Usage The dataset can be added to a project in two ways: cloning the dataset public project or downloading the dataset and importing it into another project. * **Clone the [public project](https://studio.edgeimpulse.com/public/497429/latest)** To clone and use this project, visit the [Edge Impulse Studio link](https://studio.edgeimpulse.com/public/497429/latest), click on the **Clone** button on the top-right corner and follow the cloning instructions. * **Download and import** * [Download link](https://cdn.edgeimpulse.com/datasets/Vibration+Classification+-+Coffee+machine+stages.zip) This dataset uses the Edge Impulse Exporter Format (`info.labels`). See [Edge Impulse labels](/tools/specifications/data-annotation/ei-labels) for more info. Edge Impulse also supports different [data acquisition formats](/tools/specifications/data-acquisition/json-cbor) and [dataset annotation formats](/tools/specifications/data-annotation/ei-labels) that you can import into your project to build your edge AI models: * [Studio uploader](/studio/projects/data-acquisition/dataset/uploader) * [CLI uploader](/tools/clis/edge-impulse-cli/uploader) * [CSV Wizard](/studio/projects/data-acquisition/csv-wizard) * [Python SDK](/tutorials/tools/sdks/studio/python/upload-download-data) * [Ingestion API](/apis/ingestion) * [Import from S3 buckets](/studio/projects/data-acquisition/data-sources) * [Upload portals](/studio/organizations/upload-portals) ## Citation If you use this dataset in your research paper, please cite it using the following BibTeX: ``` @misc{edgeimpulse_dataset_497429, title = {Vibration Classification - Coffee machine stages}, author = {Edge Impulse}, year = {2024}, url = {https://studio.edgeimpulse.com/public/497429/latest}, note = {BSD 3-Clause Clear} } ``` # Continuous motion recognition Source: https://docs.edgeimpulse.com/datasets/time-series/continuous-motion-recognition A labeled accelerometer dataset of continuous gestures (idle, snake, up-down, wave) for training motion recognition models. **Task:** Motion and Vibration Classification **License:** [BSD 3-Clause Clear](https://spdx.org/licenses/BSD-3-Clause-Clear.html) ## Description This is a prebuilt dataset, collected by Edge Impulse teams, for a gesture recognition system based on continuous motion, for the [Continuous Motion Recognition tutorial](/tutorials/end-to-end/motion-recognition). It contains 15 minutes of data sampled from a MEMS accelerometer at 62.5Hz over the following four classes: * Idle - board sits idly on your desk. There might be some movement detected, e.g. from typing while the board is present. * Snake - board moves over the desk as a snake. * Updown - board moves up and down in a continuous motion. * Wave - board moves left and right like you're waving to someone.

### Compatible Blocks * **Feature extraction**: [Spectral Features](/studio/projects/processing-blocks/blocks/spectral-analysis) (FFTs or Wavelets) * **Learning block**: [Classification](/studio/projects/learning-blocks/blocks/classification) + optionally [Anomaly Detection (K-Means)](/studio/projects/learning-blocks/blocks/anomaly-detection-k-means) or [Anomaly Detection (GMM)](/studio/projects/learning-blocks/blocks/anomaly-detection-gmm) *Not sure what to choose? Try out this dataset with the [EON Tuner](/studio/projects/eon-tuner).* ### Dataset Details * **Total Data Items:** 101 * **Labeling Method:** single label * **Train/Test Split:** 84.16% / 15.84% | | **Training Set** | **Testing Set** | | -------------------- | ------------------------- | ---------------------------------- | | **Total Data Items** | 85 | 16 | | **Labels** | idle, snake, updown, wave | anomaly, idle, snake, updown, wave | ## Usage The dataset can be added to a project in two ways: cloning the dataset public project or downloading the dataset and importing it into another project. * **Clone the [public project](https://studio.edgeimpulse.com/public/497631/latest)** To clone and use this project, visit the [Edge Impulse Studio link](https://studio.edgeimpulse.com/public/497631/latest), click on the **Clone** button on the top-right corner and follow the cloning instructions. * **Download and import** * [Download link](https://cdn.edgeimpulse.com/datasets/Motion+Classification+-+Continuous+motion+recognition.zip) This dataset uses the Edge Impulse Exporter Format (`info.labels`). See [Edge Impulse labels](/tools/specifications/data-annotation/ei-labels) for more info. Edge Impulse also supports different [data acquisition formats](/tools/specifications/data-acquisition/json-cbor) and [dataset annotation formats](/tools/specifications/data-annotation/ei-labels) that you can import into your project to build your edge AI models: * [Studio uploader](/studio/projects/data-acquisition/dataset/uploader) * [CLI uploader](/tools/clis/edge-impulse-cli/uploader) * [CSV Wizard](/studio/projects/data-acquisition/csv-wizard) * [Python SDK](/tutorials/tools/sdks/studio/python/upload-download-data) * [Ingestion API](/apis/ingestion) * [Import from S3 buckets](/studio/projects/data-acquisition/data-sources) * [Upload portals](/studio/organizations/upload-portals) ## Citation If you use this dataset in your research paper, please cite it using the following BibTeX: ``` @misc{edgeimpulse_dataset_497631, title = {Motion Classification - Continuous motion recognition}, author = {Edge Impulse}, year = {2024}, url = {https://studio.edgeimpulse.com/public/497631/latest}, note = {BSD 3-Clause Clear} } ``` # Hardware Source: https://docs.edgeimpulse.com/hardware **We support any edge AI hardware that can run C++, and more!** You will find on this page a list of edge AI hardware targets that are either maintained by Edge Impulse or by our partners. During the integration and when possible, we leverage and integrate the hardware capabilities (optimized floating point units (FPU), DSP and Neural Network accelerations, GPU or other AI accelerators). *** For the MCU-based hardware, depending on the integration we provide several or all of the following options: * **A default Edge Impulse firmware**, ready to be flashed on the hardware. The firmware capabilities depends on the integration (see also [Edge Impulse firmwares](/hardware/deployments/run-ei-fw)).: * **Data collection:** Enables to [connect the hardware](/studio/projects/devices) to Edge Impulse Studio to simplify your getting started journey and ease the [data collection](/studio/projects/data-acquisition#collect-data) from some or all the sensors available. * **Inferencing example:** This includes the data sampling, extracting features using the signal processing blocks and run the inference using learning blocks. * **[Serial protocol](/tools/protocols/remote-management/serial) and/or [remote management protocol](/tools/protocols/remote-management/websocket)**. * **The open-source code for the firmware**, which comes with documentation on how to build and compile the Edge Impulse firmware. * **Examples on how to integrate your Impulse with your custom firmware**, either using the [C++ inferencing SDK](/hardware/deployments/run-cpp-overview) or using libraries or components tailored for your hardware development environments. In our [Github repository](https://github.com/orgs/edgeimpulse/repositories?q=example-standalone-inferencing), search for the `example-standalone-inferencing-%target%` * **Integrated deployment options** to directly export a ready-to-flash Edge Impulse firmware packaged with your Impulse (including both the signal processing and the machine learning model). * **Profiling (estimation of memory, flash and latency)** available in Edge Impulse Studio and in the [Edge Impulse Python SDK](/tools/libraries/sdks/studio/python). * **Extensive hardware testing**, to make sure any improvements and changes in Edge Impulse will not break the current integration. #### Not on the list? If you are using a different hardware target or custom PCB? No problem! You can upload data to Edge Impulse in a variety of ways, such as using the [Data forwarder](/tools/clis/edge-impulse-cli/data-forwarder), the [Edge Impulse for Linux](/tools/libraries/sdks/inference/linux) SDK, or by [uploading files directly](/studio/projects/data-acquisition/dataset/uploader) (e.g. CSV, JPG, WAV). From there, your trained model can be deployed as a [C++ library](/hardware/deployments/run-cpp-overview). It can require some effort, but most build systems (for computers, smartphones, and microcontrollers) will work with our C++ library. This, of course, requires that your build system has a C++ compiler and that there is enough flash/RAM on your device to run the library/model. And although we leverage hardware acceleration when possible on the hardware listed in this section, **keep in mind that our [EON Compiler](/studio/projects/deployment/eon-compiler) will optimize your preprocessing and your ai models for any targets compared to traditional compiler options.** Also, if you feel like porting the official Edge Impulse firmware to your own board, use this [porting guide](/hardware/porting-guide). For the Linux-based hardware, depending on the integration we provide several or all of the following options: * **The [Edge Impulse Linux CLI](/tools/clis/edge-impulse-cli)**: It contains tools that let you collect data from any microphone or camera, download the `.eim` (Edge Impulse Models) or run a test application to classify your data, available on your terminal or through a web interface. * **Deployment options**: * [Linux `.eim`](/studio/projects/deployment#deploy-as-a-linux-eim-binary), Edge Impulse for Linux models are delivered in `.eim` format. This is an executable that contains your signal processing and ML code, compiled with optimizations for your processor, GPU or other AI accelerators. * [Docker container](/studio/projects/deployment#deploy-using-a-docker-container), for environments supporting containerized workloads, facilitating deployment on gateways or in the cloud with full hardware acceleration for most Linux targets. * **Linux Inferencing SDKs**: To build your own applications, or collect data from new sensors, you can use the high-level language SDKs. These use full hardware acceleration, and let you integrate your Edge Impulse models in a few lines of code * **Profiling (estimation of memory, flash and latency)**, available in Edge Impulse Studio and in the [Edge Impulse Python SDK](/tools/libraries/sdks/studio/python). #### Not on the list? Different development board? Probably no problem! You can use the [Linux x86\_64 getting started guide](/hardware/devices/linux-x86_64) to set up the Edge Impulse for Linux CLI tool or use the [Docker](/hardware/deployments/run-docker), and you can run your impulse on any x86\_64, ARMv7 or AARCH64 Linux target. And although we leverage hardware acceleration when possible on the hardware listed in this section, **keep in mind that our [EON Compiler](/studio/projects/deployment/eon-compiler) will optimize your preprocessing and your ai models for any targets compared to traditional compiler options.** You can upload data to Edge Impulse in a variety of ways, such as using the [Data forwarder](/tools/clis/edge-impulse-cli/data-forwarder), the [Edge Impulse for Linux](/tools/libraries/sdks/inference/linux) SDK, or by [uploading files directly](/studio/projects/data-acquisition/dataset/uploader) (e.g. CSV, JPG, WAV). The hardware targets listed in this section are the perfect way to start building machine learning solutions on real embedded hardware. Edge Impulse's Solution Engineers and Embedded Engineers have a strong expertise with these hardware targets and can help on your integration. Feel free to [contact us](https://edgeimpulse.com/pricing). ## Devices * [Advantech ICAM-540](/hardware/devices/advantech-icam-540) (Linux | Industrial AI Camera with NVIDIA Orin NX) * [CODICO Qualcomm Dragonwing™ Triple Vision Industrial AI Camera](/hardware/devices/jmo-triple-vision-camera) (Linux | Industrial AI Box with 3 Camera Inputs) * [BrickML](/hardware/devices/brickml) (MCU | Industry Reference Design using RA6M5) * [Onlogic FR101](/hardware/devices/onlogic-fr101) (QCS6490 | 2x Kryo 360 Gold @ 2.0 GHz + 6x Kryo 360 Silver @ 1.7 GHz + Hexagon 685) * [OnLogic ML100G](/hardware/devices/onlogic-ml100g) (x86) * [Seeed reComputer Jetson](/hardware/devices/seeed-recomputer-jetson) (AARCH64 | Cortex-A47 1.43 GHz + NVIDIA Maxwell 128 CUDA cores) * [Seeed SenseCAP A1101](/hardware/devices/seeed-sensecap-a1101) (MCU | LoRaWAN Vision AI Sensor using Himax) * [macOS](/hardware/devices/macos) (x86, M1, M2) * [Linux x86\_64](/hardware/devices/linux-x86_64) (x86\_64) * [Mobile phone](/hardware/devices/mobile-phone) ## Boards ### MCU * [Ambiq Apollo4 evaluation boards](/hardware/boards/ambiq-apollo4) (Cortex-M4F 192MHz) * [Arducam Pico4ML TinyML Dev Kit](/hardware/boards/arducam-pico4ml-tinyml-dev-kit) (RP2040 | Cortex-M0+ 200MHz) * [Arduino Nano 33 BLE Sense](/hardware/boards/arduino-nano-33-ble-sense) (nRF52840 | Cortex-M4F 64MHz) * [Arduino Nicla Sense ME](/hardware/boards/arduino-nicla-sense-me) (nRF52832 | Cortex-M4 64MHz) * [Arduino Nicla Vision](/hardware/boards/arduino-nicla-vision) (STM32H747AII6 | Cortex-M7 480MHz) * [Arduino Portenta H7](/hardware/boards/arduino-portenta-h7) (STM32H747XI | Cortex-M7 480MHz) * [Blues Wireless Swan](/hardware/boards/blues-wireless-swan) (STM32L4+ | Cortex-M4 120MHz) * [Espressif ESP-EYE](/hardware/boards/espressif-esp32) (ESP32 | Xtensa LX6 240MHz) * [Himax WE-I Plus](/hardware/boards/himax-we-i-plus) (HX6537-A | ARC DSP 400MHz) * [Infineon CY8CKIT-062-BLE Pioneer Kit](/hardware/boards/infineon-cy8ckit-062-ble) (PSoC63 | Cortex-M4F 150MHz) * [Infineon CY8CKIT-062S2 Pioneer Kit](/hardware/boards/infineon-cy8ckit-062s2) (PSoC62 | Cortex-M4F 150MHz) * [Nordic Semi nRF52840 DK](/hardware/boards/nordic-semi-nrf52840-dk) (nRF52840 | Cortex-M4F 64MHz) * [Nordic Semi nRF5340 DK](/hardware/boards/nordic-semi-nrf5340-dk) (nRF5340 | Cortex-M33 128MHz) * [Nordic Semi nRF54L15 DK](/hardware/boards/nordic-semi-nrf54L15-dk) (nRF54L15 | Cortex-M33 128MHz) * [Nordic Semi nRF7002 DK](/hardware/boards/nordic-semi-nrf7002-dk) (nRF7002 | Cortex-M33 128MHz) * [Nordic Semi nRF9160 DK](/hardware/boards/nordic-semi-nrf9160-dk) (nRF9160 | Cortex-M33 64MHz) * [Nordic Semi nRF9161 DK](/hardware/boards/nordic-semi-nrf9161-dk) (nRF9160 | Cortex-M33 64MHz) * [Nordic Semi nRF9151 DK](/hardware/boards/nordic-semi-nrf9151-dk) (nRF9160 | Cortex-M33 64MHz) * [Nordic Semi Thingy:53](/hardware/boards/nordic-semi-thingy53) (nRF5340 | Cortex-M33 128MHz) * [Nordic Semi Thingy:91](/hardware/boards/nordic-semi-thingy91) (nRF9160 | Cortex-M33 64MHz) * [Open MV Cam H7 Plus](/hardware/boards/openmv-cam-h7-plus) (STM32H743II | Cortex-M7 480MHz) * [Particle Photon 2](/hardware/boards/particle-photon-2) (RTL8721DM | Cortex-M33 200MHz) * [Particle Boron](/hardware/boards/particle-boron) (nRF52840 | Cortex-M4 64MHz) * [RAKwireless WisBlock](/hardware/boards/rakwireless-wisblock) (RP2040 | Cortex-M0+ 200MHz, Xtensa LX6 240MHz, ESP32, nRF52840 | Cortex-M4F 64MHz) * [Raspberry Pi Pico](/hardware/boards/raspberry-pi-pico) (RP2040 | Cortex-M0+ 200MHz, RP2350 | Cortex-M33 150MHz) * [Renesas CK-RA6M5 Cloud Kit](/hardware/boards/renesas-ck-ra6m5) (RA6M5 | Cortex-M33 200MHz) * [Renesas EK-RA8D1](/hardware/boards/renesas-ek-ra8d1) (RA8D1 | Cortex-M85 480MHz) * [Seeed Grove - Vision AI Module](/hardware/boards/seeed-grove-vision-ai) (HX6537-A | ARC DSP 400MHz) * [Seeed Wio Terminal](/hardware/boards/seeed-wio-terminal) (HX6537-A | ARC DSP 400MHz) * [Seeed XIAO nRF52840 Sense](/hardware/boards/seeed-xiao-nrf52840-sense) (nRF52840 | Cortex-M4F 64MHz) * [Seeed XIAO ESP32 S3 Sense](/hardware/boards/seeed-xiao-esp32s3-sense) (ESP32S3 | Xtensa LX7 240MHz) * [SiLabs Thunderboard Sense 2](/hardware/boards/silabs-thunderboard-sense-2) (EFR32MG12 | Cortex-M4 40MHz) * [Sony's Spresense](/hardware/boards/sony-spresense) (CXD5602 | Cortex-M4F 156MHz) * [ST B-L475E-IOT01A](/hardware/boards/st-b-l475e-iot01a) (STM32L4 | Cortex-M4 120MHz) * [TI CC1352P Launchpad](/hardware/boards/ti-launchxl) (CC1352P | Cortex-M4F 48MHz) ### MCU + AI Accelerators * [Alif Ensemble series kits](/hardware/boards/alif-ensemble) (Cortex-M55 + Ethos-U55 (multiple cores)) * [Ambiq Apollo5 evaluation boards](/hardware/boards/ambiq-apollo5) (Cortex-M55 250MHz) * [Arduino Nicla Voice](/hardware/boards/arduino-nicla-voice) (Cortex-M4 + NDP120) * [Avnet RASynBoard](/hardware/boards/avnet-rasynboard) (RA6 + NDP120) * [Nordic Semi nRF54LM20 DK](/hardware/boards/nordic-semi-nrf54LM20-dk) (nRF54LM20 | Cortex-M33 + Nordic Axon NPU) * [SiLabs xG24 Dev Kit](/hardware/boards/silabs-xg24-devkit) (Cortex-M33 78MHz + SiLabs MVP) * [STMicroelectronics STM32N6570-DK](/hardware/boards/stm32n6570-dk) (Cortex-M55 + ST Neural-ART Accelerator) * [Synaptics Katana EVK](/hardware/boards/synaptics-katana) (KA10000) * [Syntiant Tiny ML Board](/hardware/boards/syntiant-tinyml-board) (NDP101) * [Seeed Grove Vision AI Module](/hardware/boards/seeed-grove-vision-ai) * [Seeed Grove Vision AI Module V2 (WiseEye2)](/hardware/boards/seeed-grove-vision-ai-module-v2-wise-eye-2) * [Himax WiseEye2 ISM Module/Devboard](/hardware/boards/himax-ism-wise-eye-2) ### CPU * [Arduino® UNO™ Q](/hardware/boards/arduino-uno-q) (ARMv8 | Quad Cortex-A53 2.0GHz) * [Raspberry Pi 4](/hardware/boards/raspberry-pi-4) (ARMv7 | Cortex-A72 1.5GHz) * [Raspberry Pi 5](/hardware/boards/raspberry-pi-5) (Cortex-A76 2.4 GHz) * [Texas Instruments SK-AM62](/hardware/boards/ti-sk-am62) (AM62x | Cortex-A53 1.4GHz) * [Microchip SAMA7G54](/hardware/boards/microchip-sama7) (SAMA7G54 | Cortex-A7) * [Renesas RZ/G2L](/hardware/boards/renesas-rz-g2l) (RZ/G2L | Cortex-A55 1.2GHz) ### CPU + AI Accelerators * [AVNET RZBoard V2L](/hardware/boards/avenet-rz-v2l) (RZ/V2L | Cortex-A55 1.2GHz + DRPAI) * [BrainChip AKD1000](/hardware/boards/brainchip-akd1000) (x86\_64 or AARCH64 + AKD1000) * [i.MX 8M Plus EVK](/hardware/boards/nxp-imx8-evk) (i.MX 8M Plus | Cortex-A53 1.8GHz + NPU) * [Innodisk EXEC-Q911](/hardware/boards/innodisk-exec-q911) (QCS9075 | 4x Kryo @ 2.5 GHz + 4x Kryo @ 1.9 GHz + Hexagon + Adreno GPU) * [Digi ConnectCore 93 Development Kit](/hardware/boards/digi-ccimx93-dvk) (i.MX 93 | Cortex-A55 1.7GHz + NPU) * [MemryX MX3](/hardware/boards/memryx-mx3) (x84\_64 | MX3 5 TFLOPs) * [MistyWest MistySOM RZ/V2L](/hardware/boards/mistywest-rz-v2l) (RZ/V2L | Cortex-A55 1.2GHz + DRPAI) * [Qualcomm Dragonwing™ IQ-8275 Evaluation Kit (EVK)](/hardware/boards/qualcomm-iq8275-evk) (QCS8275 | 2x Kryo Prime @ 2.35 GHz + 2x Kryo Gold @ 2.1 GHz + 4x Kryo Silver @ 1.95 GHz + Hexagon NPU + Adreno 623 GPU) * [Qualcomm Dragonwing™ IQ-9075 Evaluation Kit (EVK)](/hardware/boards/qualcomm-iq9075-evk) (QCS9075 | 8x Kryo Gold Prime @ 2.36 GHz + Hexagon NPU + Adreno 663 GPU) * [Qualcomm Dragonwing™ RB3 Gen 2 Dev Kit](/hardware/boards/qualcomm-rb3-gen-2-dev-kit) (QCS6490 | 2x Kryo 360 Gold @ 2.0 GHz + 6x Kryo 360 Silver @ 1.7 GHz + Hexagon 685) * [Quectel PI-SG565D](/hardware/boards/quectel-pi-sg565d) (QCS6490 | 2x Kryo 360 Gold @ 2.0 GHz + 6x Kryo 360 Silver @ 1.7 GHz + Hexagon 685) * [Advantech AOM 2721 SOM](/hardware/boards/advantech-aom2721-osm) (QCS6490 | Kryo 360 Gold @ 2.7 GHz + 3x Kryo 360 Gold @ 2.4 GHz + 4x Kryo 360 Silver @ 1.9 GHz + Andreo VPU 633) * [Renesas RZ/V2L](/hardware/boards/renesas-rz-v2l) (RZ/V2L | Cortex-A55 1.2GHz + DRPAI) * [Renesas RZ/V2H](/hardware/boards/renesas-rz-v2h) (RZ/V2H | Cortex-A55 1.8GHz + Dual Cortex-R8 + TVM/DRP) * [Texas Instruments SK-TDA4VM](/hardware/boards/ti-sk-tda4vm) (TDA4VM | Cortex-A72 + C7x 8TFLOPs) * [Texas Instruments SK-AM62A-LP](/hardware/boards/ti-sk-am62a-lp) (AM62A | Cortex-A53 + AI Accelerator 2 TFLOPs) * [Texas Instruments SK-AM68A](/hardware/boards/ti-sk-am68a) (AM68x | Cortex-A72 + AI Accelerator 8 TFLOPs) * [Thundercomm Rubik Pi 3](/hardware/boards/thundercomm-rubikpi3) (QCS6490 | 2x Kryo 360 Gold @ 2.0 GHz + 6x Kryo 360 Silver @ 1.7 GHz + Hexagon 685) * [Tria Vision AI Kit](hardware/boards/tria-vision-ai-kit-6490) (QCS6490 | 2x Kryo 360 Gold @ 2.0 GHz + 6x Kryo 360 Silver @ 1.7 GHz + Hexagon 685) ### GPU * [NVIDIA Jetson Orin and Nano](/hardware/boards/nvidia-jetson) (Nano: AARCH64 | Cortex-A57 + NVIDIA Maxwell 128 CUDA cores) # Advantech AOM-2721 OSM Source: https://docs.edgeimpulse.com/hardware/boards/advantech-aom2721-osm The Advantech AOM-2721 is an Open Standard Module (OSM), specifically a Computer-on-Module, that uses the OSM 1.1 form factor. It's designed to be a compact and integrated computing platform, particularly suited for embedded applications and edge AI. Key features of the AOM-2721: * Powered by Qualcomm QCS6490/QCS5430 SoC * 1 Kryo Gold plus up to 2.7 GHz * 3 Kryo Gold at 2.4 GHz * 4 Kryo Sliver at 1.9 GHz * Andreo VPU 633 4K30 encode/Decode * Andreo GPU 643, OpenGL ES3.2/OpenCL 2.0 * 12 TOPs NPU for AI applications * Onboard LPDDR5 8GB, 8533MT/s * 1x MIPI-DSI x4, 1x DP and 1x eDP1.4 for Displays * 1x USB3.2 Gen1, 1x USB2.0, 2x PCIe Gen3.0 x1, 1x PCIe Gen3.0 x2, 2x I2S, 4x * 4wire UART, 3x SPI,39x GPIO, 4x I2C, 2x MIPI-CSI x4 ## Setting Up Your Advantech AOM-2721 OSM ### 0. Preface The AOM-2721 OSM is typically the primary module in a complete system. In this documentation, we will use the Advantech AOM-2721 Dev Kit as the sample AOM-2721 OSM. For example, this picture below showing micro switches on the AOM-2721 Dev Kit that are used during the flashing process should be common to any AOM-2721 OSM compatible device: In the following setup instructions, the AOM-2721 Dev Kit will be the actual device shown in the pictures. Other devices, based upon the AOM-2721 OSM may look slightly different. ### 1. (OPTIONAL) Flashing your AOM-2721 OSM Your actual device containing the AOM-2721 OSM may already ship with a running yocto-based image flashed into it. If so, you can optionally proceed to step 3). If you want to flash your device, you will need to follow the instructions located [here](https://ess-wiki.advantech.com.tw/view/AOM-2721_Yocto_user_guide#.E5.BF.AB.E9.80.9F.E5.85.A5.E9.96.80.C2.A0.28Quick_Start.29) Official Yocto images created by Advantech for the AOM-2721 OSM can be found [here](https://ess-wiki.advantech.com.tw/view/AIM-Linux/BSP/Qualcomm/Linux_Yocto_OS_Release_note/LE1.3/Internal) Once flashed, proceed to step 3) below. ### 2. (OPTIONAL) Building your own Yocto image for your AOM-2721 OSM Some may want to actually fully build their own Yocto image for their AOM-2721 OSM. In this case, please refer to the following instructions located [here](https://ess-wiki.advantech.com.tw/view/AIM-Linux/BSP/Qualcomm/RISC_QCS_Yocto_LE1.3_AOM2721#7._Build_YOCTO_Image_by_build.C2.A0script) to setup a Yocto build host and build a compatible Yocto image for your AOM-2721. ### 2. Starting up your AOM-2721 OSM and connecting to the Internet 1. Install the [Edge Impulse CLI](/tools/clis/edge-impulse-cli) on your computer. 2. Connect power to the back of the AOM-2721 OSM. 3. Connect the COM1 serial port to your host computer's USB port via a SERIAL-TO-USB converter: 4. Open a serial connection between your host computer and the board. You can do this directly using the Edge Impulse CLI by running the following command from your command prompt or terminal: ```bash theme={"system"} edge-impulse-run-impulse --raw ``` 5. Press the power button and the device should begin to boot up. 6. After 30-60 seconds you should see a login prompt in your serial terminal. Log in with: * Username: `root` * Password `oelinux123` 7. Next, set up a network connection, either: 1. Connect an Ethernet cable. 2. Or, if you want to connect over WiFi: * Qualcomm Linux \<1.3: [edit the wpa\_supplicant.conf](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-253/ubuntu_host.html#sub\$set_up_wifi). * Qualcomm Linux 1.3: [use nmcli](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-253/set_up_the_device.html#panel-0-vwj1bnr1tab\$using-wi-fi). After connecting the board to the internet, reboot it. This will refresh the system clock (through the NTP), resolving an issue with invalid certificates when installing the Edge Impulse CLI. 8. If you want to continue setting up over ssh (so you can unplug the device from your computer), find your IP address via: ```bash theme={"system"} $ ifconfig | grep "inet addr:" | grep -v "127.0.0.1" inet addr:192.168.1.38 Bcast:192.168.1.255 Mask:255.255.255.0 ``` Then log in via ssh (password: `oelinux123`): ```bash theme={"system"} $ ssh root@192.168.1.38 ``` ### 3. Installing the Edge Impulse Linux CLI On the AOM-2721 OSM, install the Edge Impulse CLI and other dependencies via: ```bash theme={"system"} $ wget https://cdn.edgeimpulse.com/firmware/linux/setup-edge-impulse-qc-linux.sh $ sh setup-edge-impulse-qc-linux.sh ``` ### 4. Connecting to Edge Impulse With all dependencies set up, run: ```bash theme={"system"} $ edge-impulse-linux ``` This will start a wizard which asks you to log in and choose an Edge Impulse project. If you want to switch projects, or use a different camera (e.g. a USB camera) run the command with the `--clean` argument. ### 5. Verifying that your device is connected That's all! Your device is now connected to Edge Impulse. To verify this, go to [your Edge Impulse project](https://studio.edgeimpulse.com/studio/profile/projects), and click **Devices**. The device will be listed there. ## Next steps: building a machine learning model With everything set up you can now build your first machine learning model with these tutorials: * [Responding to your voice](/tutorials/end-to-end/keyword-spotting) * [Recognize sounds from audio](/tutorials/end-to-end/sound-recognition) * [Adding sight to your sensors](/tutorials/end-to-end/image-classification) * [Object detection](/tutorials/end-to-end/object-detection-bounding-boxes) * [Visual anomaly detection with FOMO-AD](/studio/projects/learning-blocks/blocks/visual-anomaly-detection-fomo-ad) Looking to connect different sensors? Our [Linux SDK](/tools/libraries/sdks/inference/linux) lets you easily send data from any sensor and any programming language (with examples in Node.js, Python, Go and C++) into Edge Impulse. ## Profiling your models To profile your models for the Advantech AOM-2721 OSM: * Make sure to select the Qualcomm Dragonwing™ AOM-2721 OSM as your target device. You can change the target at the top of the page near your user's logo. * Head to your [Learning block](/studio/projects/learning-blocks) page in Edge Impulse Studio. * Click on the **Calculate performance** button. To provide the on-device performance, we use [Qualcomm® AI Hub](https://aihub.qualcomm.com/) in the background (see the image below) which run the compiled model on a physical device to gather metrics such as the mapping of model layers to compute units, inference latency, and peak memory usage. See more on Qualcomm® AI Hub [documentation](https://app.aihub.qualcomm.com/docs/) page. ## Deploying back to device ### Using the Edge Impulse Linux CLI To run your impulse locally on the AOM-2721 OSM, open a terminal and run: ```bash theme={"system"} $ edge-impulse-linux-runner ``` This will automatically compile your model with full hardware acceleration, download the model to your AOM-2721 OSM, and then start classifying (use `--clean` to switch projects). Alternatively, you can select the **Linux (AARCH64 with Qualcomm QNN)** option in the **Deployment** page. This will download an `.eim` model that you can run on your board with the following command: ```bash theme={"system"} edge-impulse-linux-runner --model-file downloaded-model.eim ``` ### Using the Edge Impulse Linux Inferencing SDKs Our [Linux SDK](/tools/libraries/sdks/inference/linux) has examples on how to integrate the `.eim` model with your favourite programming language. You can download either the quantized version and the float32 versions but Qualcomm NN accelerator only supports quantized models. If you select the float32 version, the model will run on CPU. ### Using the IM SDK GStreamer option When selecting this option, you will obtain a `.zip` folder. We provide instructions in the `README.md` file included in the compressed folder. See more information on [Qualcomm IM SDK GStreamer pipeline](/hardware/deployments/run-qualcomm-im-sdk-gstreamer). ### Image model? If you have an image model then you can get a peek of what your device sees by being on the same network as your device, and finding the 'Want to see a feed of the camera and live classification in your browser' message in the console. Open the URL in a browser and both the camera feed and the classification are shown: # Alif Ensemble series kits Source: https://docs.edgeimpulse.com/hardware/boards/alif-ensemble The [Ensemble](https://alifsemi.com/ensemble/) series of fusion processors from [Alif Semiconductor](https://alifsemi.com/) use ARM's low power Cortex-M55 CPUs with dedicated Ethos-U55 microNPUs to run embedded ML workloads quickly and efficiently. The devices feature both 'High Power' cores designed for large model architectures, as well as 'High Efficiency' cores designed for low power continuous monitoring. The development kit and the application kit are both fully supported by Edge Impulse. The Ensemble kits feature multiple core types, dual MEMS microphones, accelerometers, and a MIPI camera interface. To get started with the Alif Ensemble processors and Edge Impulse you'll need either the [Alif Ensemble AppKit](https://alifsemi.com/support/kits/ensemble-e7appkit/) or the [Alif Ensemble DevKit](https://alifsemi.com/support/kits/ensemble-e7devkit/). ## Deployment options A C++ library with inferencing for devices with an Ethos-U55-128 NPU, High End Embedded with shared SRAM. For example: Alif E7 RTSS-HE. A C++ library with inferencing for devices with an Ethos-U55-256 NPU, High End Embedded with shared SRAM. For example: Alif E7 RTSS-HP. A binary containing both the Edge Impulse data acquisition client and your full impulse. A binary containing both the Edge Impulse data acquisition client and your full impulse. A binary containing both the Edge Impulse data acquisition client and your full impulse. A binary containing both the Edge Impulse data acquisition client and your full impulse. A binary containing both the Edge Impulse data acquisition client and your full impulse. A binary containing both the Edge Impulse data acquisition client and your full impulse. A C++ library in Open CMSIS pack format with for devices with an Ethos-U55-128 NPU, High End Embedded with shared SRAM. For example: Alif E7 RTSS-HE. A C++ library in Open CMSIS pack format with for devices with an Ethos-U55-256 NPU, High End Embedded with shared SRAM. For example: Alif E7 RTSS-HP. ## Installing dependencies To set this device up in Edge Impulse, you will need to install the following software: 1. [Edge Impulse CLI](/tools/clis/edge-impulse-cli/installation). 2. The latest `Alif Security Toolkit`: * Navigate to the [Alif Semiconductor Kit documentation page](https://alifsemi.com/support/kits/ensemble-e7appkit/) (you will need to register to create an account with Alif, or log in to your existing Alif account). and download the latest App Security Toolkit (tested with version 0.56.0) for windows or linux. * Extract the archive, and read through the included `Security Toolkit Quick Start Guide` to finalize the installation * IMPORTANT: Set an environmental variable called `SETOOLS_ROOT`to the Security Toolkit root path. This is used by Edge Impulse scripts when flashing the Alif development kits. [Example instructions for Linux, Windows, MacOS](https://web.archive.org/web/20250211150743/https://gcore.com/learning/environment-variables/). 3. (Optional) [Docker Desktop](https://www.docker.com/products/docker-desktop/): * If you are using MacOS, we recommended installing [Docker Desktop](https://www.docker.com/products/docker-desktop/) in order to use the Alif Security Toolkit for programming. ## Connecting to Edge Impulse Once you have installed it's time to connect the development board to Edge Impulse. ### Configuring your hardware To interface the Alif Ensemble AppKit or Development Kit, you'll need to connect your device to the USB port label `PRG USB`. ### Flashing the default firmware to the device You can program and use serial port of the device if you adjust jumper J15 to connect pins 1-3 and 2-4. There will be two serial ports enumerated. The first port is used for programming, the second for serial communication. Inspect `isp_config_data.cfg` in the Security Toolkit directory to ensure the COM port is set correctly to the device attached to your computer. There will be two serial ports enumerated. The first port is used for programming, the second for serial communication. After configuring the hardware, the next step is to flash the default Edge Impulse Firmware. This will allow us to collect data directly from your Ensemble device. To update the firmware: 1. [Download the latest Edge Impulse firmware binary](https://cdn.edgeimpulse.com/firmware/alif-e7-gen2.zip) and unzip the file. 2. Open a terminal in the unzipped folder and run the following commands. Use the `HE`, `HP`, or `HP_SRAM` parameter that matches the deployment chosen from the Edge Impulse project. That is, if you Deployed for HP\_SRAM please use the `HP_SRAM` parameters. #### MacOS or Linux ``` flash.sh ``` #### Windows ``` flash_win.bat ``` ### Running the Edge Impulse CLI To use the device serial port, set the jumper accordingly: for the **DevKit** use J26, and for the **AppKit** use J15, connecting pins 1-3 and 2-4. Now, the Ensemble device can connect to the `Edge Impulse CLI` installed earlier. To test the CLI for the first time, either: Create a new project from the [Edge Impulse project dashboard](https://studio.edgeimpulse.com/studio/profile/projects) OR Clone an existing Edge Impulse public project, like this [Face Detection Demo](https://studio.edgeimpulse.com/public/87291/latest). Click the link and then press `Clone` at the top right of the public project. Then, from a command prompt or terminal on your computer, run: ``` edge-impulse-daemon ``` **Device choice** You may see two `FTDI` or `CYPRESS` serial ports enumerated for devices. If so, select the second entry in the list, which generally is the serial data connection to the Ensemble device. Ensure that the jumpers are correctly oriented for serial communication. This will start a wizard which will ask you to log in and choose an Edge Impulse project. You should see your new or cloned project listed on the command line. Use the arrow keys and hit `Enter` to select your project. ### Verifying that the device is connected That's all! Your device is now connected to Edge Impulse. To verify this, go to ## Next steps: building a machine learning model With everything set up you can now build your first machine learning model with these tutorials. This will walk you through the process of collecting data and training a new ML model: * [Image classification - Image Classification Tutorial](/tutorials/end-to-end/image-classification) * [Object Detection End-to-End Tutorial](/tutorials/end-to-end/object-detection-bounding-boxes) * [Object detection with centroids (FOMO)](/tutorials/end-to-end/object-detection-centroids) * [Building a continuous motion recognition system](/tutorials/end-to-end/motion-recognition) * [Recognizing sounds from audio](/tutorials/end-to-end/sound-recognition) * [Keyword spotting](/tutorials/end-to-end/keyword-spotting) Alternatively, you can test on-device inference with a demo model included in the base firmware binary. To do this, you may run the following command from your terminal: ``` edge-impulse-run-impulse --debug ``` Then, once you've tested out training and deployment with the Edge Impulse Firmware, learn how to integrate impulses with your own custom Ensemble based application: * [Run on Alif Ensemble Series devices](/hardware/deployments/run-cpp-alif-ensemble) # Ambiq Apollo4 evaluation boards Source: https://docs.edgeimpulse.com/hardware/boards/ambiq-apollo4 Ambiq®, the leader in low-power System-on-Chip (SoC) solutions, has once again raised the bar with the [Apollo4 Family of SoCs](https://ambiq.com/apollo4/). With the lowest dynamic and sleep mode power on the market, the Apollo4 allows designers of next-generation edge AI devices to take their innovative products to the next level. Built upon Ambiq’s proprietary Subthreshold Power-Optimized Technology (SPOT®) platform, the Apollo4 Family of SoCs is a complete hardware and software solution that enables the battery-powered endpoint devices of tomorrow to achieve a higher level of intelligence without sacrificing battery life. Edge Impulse support is available on the [Apollo4 Plus](https://ambiq.com/apollo4-plus/), [Apollo4 Blue Plus](https://ambiq.com/apollo4-blue-plus/), [Apollo4 Lite](https://ambiq.com/apollo4-lite/), and [Apollo4 Blue Lite](https://ambiq.com/apollo4-blue-lite/). See below for how to get started on the Apollo4 Plus and Apollo4 Blue Plus SoCs. The Apollo4 Plus is built on the 32-bit Arm® Cortex®-M4 core with Floating Point Unit (FPU). With up to 2 MB of NVM and 2.75 MB of SRAM, the Apollo4 Plus has more than enough compute and storage to handle complex algorithms and neural networks while displaying vibrant, crystal clear, and smooth graphics. If additional memory is required, an external memory is supported through Ambiq’s multi-bit SPI and eMMC interfaces. The Apollo4 Plus is purpose-built to serve as both an application processor and a co-processor for battery-powered endpoint devices, including predictive health and maintenance sensors, smart home devices, livestock trackers, wrist-based wearables, smart rings, smart voice devices, and more. The Apollo4 Plus is available now in BGA packaging. The Apollo4 Blue Plus incorporates an optional BLE 5.4 radio. ## Deployment options **Edge Impulse firmware** There is a firmware deployment option in Studio for the Apollo4 Blue Plus EVB. For the other Apollo4 boards, you will need to modify and recompile the firmware found in the Edge Impulse [firmware-ambiq-apollo4](https://github.com/edgeimpulse/firmware-ambiq-apollo4) GitHub repo. A binary containing both the Edge Impulse data acquisition client and your full impulse. ## Installing dependencies To set this device up in Edge Impulse, you will need to install the following software: 1. [Edge Impulse CLI](/tools/clis/edge-impulse-cli/installation) 2. [Segger JLink](https://www.segger.com/downloads/jlink/) **Problems installing the CLI?** See the [Installation and troubleshooting](/tools/clis/edge-impulse-cli/installation) guide. ### Connecting the Apollo4 Audio Add-on Board (Models with Audio Input Only) This step is only needed when using models requiring microphone input, such as the example below. Skip this section if you are testing other models that do not need audio input. Remove the pin header protectors on the Apollo4 Plus EVB (AMAP4PEVB) or Apollo4 Blue Plus KXR EVB (AMAP4BPXEVB), and carefully plug the Apollo4 Audio Add-onBoard (AMA4AUD) into the development board. Pay special attention to the highspeed connector with film tape, which must be removed before connecting the boards. Place the digital and analog microphone modules onto the shield, as shown in the image below, and connect cables to both type-C connectors on the evaluation board. ### Connecting an ArduCam Mega 5MP SPI This step is only needed when using models requiring camera input. Skip this section if you are testing other models that do not need camera input. The [ArduCam Mega 5MP SPI](https://www.arducam.com/product/presale-mega-5mp-color-rolling-shutter-camera-module-with-autofocus-lens-for-any-microcontroller/) connects to the Apollo4 Plus EVB and Apollo4 Blue Plus KXR EVB pins as shown in the table below: | Camera Pin | EVB Pin | | ---------- | ----------- | | GND | Any EVB GND | | 5V/VDD | Any EVB 5V | | SCK | Pin 8 | | MISO | Pin 10 | | MOSI | Pin 9 | | CS | Pin 11 | **The wiring harness provided with the camera can be sensitive, so pin jumpers or another wiring harness may help** ### Flashing pre-built firmware Pre-built image with only audio support and "Hello World" detector example [here](https://cdn.edgeimpulse.com/build-system/ambiq-apollo4.zip) Pre-built image with full video and audio data collection and FOMO Face detector example [here](https://cdn.edgeimpulse.com/build-system/firmware-ambiq-apollo4plus.041124.zip) Get started by extracting the archive and choose the appropriate script for your system architecture to flash the firmware: ## Connecting to Edge Impulse ### Using the daemon From a command prompt or terminal, run: ``` edge-impulse-daemon ``` This will start a wizard which will ask you to log in and choose an Edge Impulse project. If you want to switch projects run the command with `--clean`. Alternatively, you can access the project API Key as shown below by navigating to the **Dashboard** section on the left pane of your Studio project and select the **Keys** tab, then click the copy/paste icon next to the API Key to copy the entire text to your clipboard, then run: ``` edge-impulse-daemon --api-key [paste your key here] ``` ### Connecting to Studio Run the `edge-impulse-daemon` and connect to your project, you will be prompted to name your device: That's all! Your device is now connected to Edge Impulse. To verify this, go to [your Edge Impulse project](https://studio.edgeimpulse.com/studio/profile/projects), and click **Devices**. The device will be listed here. ### Collecting data #### Audio With the device connected to Studio, you can use it to collect audio data up to 5 seconds in length for training and testing your model. Navigate to the Data acquisition tab and start collecting samples: Daemon output during sampling:
##### Video Sampling images: Three supported sizes 96x96, 128x128, 160x160: ## Next steps: building a machine learning model With everything set up you can now build your first machine learning model with these tutorials: * [Recognizing sounds from audio](/tutorials/end-to-end/sound-recognition) * [Keyword spotting](/tutorials/end-to-end/keyword-spotting) * [Detecting objects with FOMO](/tutorials/end-to-end/object-detection-centroids) If you flashed the pre-built binary with FOMO Face Detection example from above then just connect your board and run `edge-impulse-run-impulse` to see an output similar to this: ### Example project Start by going to [your Studio projects](https://studio.edgeimpulse.com/studio/profile/projects) then create a new project and navigate to the `Create impulse` section of `Impulse design`, at which point you will be prompted to select your target, choose the Apollo4 Plus: Then add the DSP block: Then the keyword spotting learn block: And finally save the impulse: #### Processing Now select the DSP block: And go to `Generate features`: Click the button and wait for the job to finish, when it does you'll see something like this: #### Training Select the learning block: Then click `Save & train` and you'll eventually see an output like this: #### Testing Go to the `Model testing` section and enable int8 testing: And run the test: #### Deploying Navigate to the `Deployment` section and choose the **Apollo4 Blue Plus**: Now click `Build` and wait for the job to finish, when it does a zip archive will be downloaded to your computer: #### Flashing See the previous section on flashing the board. #### Running the impulse You can run your impulse by using `edge-impulse-run-impulse`: ## Troubleshooting If you have problems with the flashing script make sure you are using USB cables with data and not just power-only cables. Reach out to us on the [forum](https://forum.edgeimpulse.com/) and have fun making machine learning models on the [Apollo4 Family of SoCs](https://ambiq.com/apollo4/) from Ambiq! # Ambiq Apollo5 evaluation boards Source: https://docs.edgeimpulse.com/hardware/boards/ambiq-apollo5 Introducing [Apollo510 System-on-Chip (SoC)](https://ambiq.com/apollo510/), a cutting-edge solution engineered to revolutionize the landscape of ultra-low-power performance in conventional edge and AI applications. Leveraging Ambiq's advanced Subthreshold Power Optimized Technology (SPOT®), Apollo510 delivers exceptional energy efficiency, operating on minimal power while providing unparalleled performance. Equipped with an Arm® Cortex®-M55 application processor running at up to 250MHz, this SoC enables efficient and high-performance computing, empowering developers to design innovative devices with ease. Apollo510 incorporates advanced security features in secureSPOT® 3.0 with TrustZone® technology, such as secure boot and secure firmware updates, ensuring the integrity and confidentiality of data transmitted and processed by connected devices, making it an ideal choice for secure deployment in bodyworn and ambient AI applications. Designed to meet the evolving needs of conventional edge and AI devices, the Apollo510 represents a significant leap forward in energy efficiency, performance, and security. With its unparalleled combination of ultra-low power operation, high-performance computing capabilities, and robust security features, this wireless SoC is designed to drive innovation and enable the next generation of smart and connected devices. **Features** * Up to 250 MHz Arm Cortex-M55 application processor with turboSPOT® and Helium™ technology * Enhanced memory performance with 64KB I-Cache and 64KB D-Cache, 3.75MB of system RAM, and 4MB of embedded non-volatile memory for code/data * Ultra-low power ADC and stereo digital microphone PDM interfaces for truly always-on voice * High-fidelity telco-quality audio * High-speed USB 2.0 * Wide range of integrated sensor interfaces including ADC, SPI, I²C, and UART ## Deployment options A binary containing both the Edge Impulse data acquisition client and your full impulse. ## Installing dependencies To set this device up in Edge Impulse, you will need to install the following software: 1. [Edge Impulse CLI](/tools/clis/edge-impulse-cli/installation) 2. [Segger JLink](https://www.segger.com/downloads/jlink/) **Problems installing the CLI?** See the [Installation and troubleshooting](/tools/clis/edge-impulse-cli/installation) guide. ### Connecting the Apollo 5 Audio Add-on Board (Models with Audio Input Only) This step is only needed when using models requiring microphone input, such as the example below. Skip this section if you are testing other models that do not need audio input. Connect the microphone board to the Apollo510-EVB as shown below. ### Connecting an ArduCam Mega 5MP SPI This step is only needed when using models requiring camera input. Skip this section if you are testing other models that do not need camera input. The [ArduCam Mega 5MP SPI](https://www.arducam.com/product/presale-mega-5mp-color-rolling-shutter-camera-module-with-autofocus-lens-for-any-microcontroller/) connects to the Apollo510-EVB pins as shown in the table below: | Camera Pin | EVB Pin | | ---------- | ----------- | | GND | Any EVB GND | | 5V/VDD | Any EVB 5V | | SCK | Pin 47 | | MISO | Pin 49 | | MOSI | Pin 48 | | CS | Pin 60 | **The wiring harness provided with the camera can be sensitive, so pin jumpers or another wiring harness may help** ### Flashing pre-built firmware Pre-built image with only audio support and "Hello World" detector example [here](https://cdn.edgeimpulse.com/build-system/firmware-ambiq-apollo510-audio.zip) Get started by extracting the archive and choose the appropriate script for your system architecture to flash the firmware: ## Connecting to Edge Impulse ### Using the daemon From a command prompt or terminal, run: ``` edge-impulse-daemon ``` This will start a wizard which will ask you to log in and choose an Edge Impulse project. If you want to switch projects run the command with `--clean`. Alternatively, you can access the project API Key as shown below by navigating to the **Dashboard** section on the left pane of your Studio project and select the **Keys** tab, then click the copy/paste icon next to the API Key to copy the entire text to your clipboard, then run: ``` edge-impulse-daemon --api-key [paste your key here] ``` ### Connecting to Studio Run the `edge-impulse-daemon` and connect to your project, you will be prompted to name your device: That's all! Your device is now connected to Edge Impulse. To verify this, go to [your Edge Impulse project](https://studio.edgeimpulse.com/studio/profile/projects), and click **Devices**. The device will be listed here. ### Collecting data #### Audio With the device connected to Studio, you can use it to collect audio data up to 5 seconds in length for training and testing your model. Navigate to the Data acquisition tab and start collecting samples: Daemon output during sampling:
##### Video Sampling images: Three supported sizes 96x96, 128x128, 160x160: ## Next steps: building a machine learning model With everything set up you can now build your first machine learning model with these tutorials: * [Recognizing sounds from audio](/tutorials/end-to-end/sound-recognition) * [Keyword spotting](/tutorials/end-to-end/keyword-spotting) * [Detecting objects with FOMO](/tutorials/end-to-end/object-detection-centroids) ### Example project Start by going to [your Studio projects](https://studio.edgeimpulse.com/studio/profile/projects) then create a new project and navigate to the `Create impulse` section of `Impulse design`, at which point you will be prompted to select your target, choose the Apollo5: Then add the DSP block: Then the keyword spotting learn block: And finally save the impulse: #### Processing Now select the DSP block: And go to `Generate features`: Click the button and wait for the job to finish, when it does you'll see something like this: #### Training Select the learning block: Then click `Save & train` and you'll eventually see an output like this: #### Testing Go to the `Model testing` section and enable int8 testing: And run the test: #### Deploying Navigate to the `Deployment` section and choose the **Apollo 5**: Now click `Build` and wait for the job to finish, when it does a zip archive will be downloaded to your computer. #### Flashing See the previous section on flashing the board. #### Running the impulse You can run your impulse by using `edge-impulse-run-impulse`: ## Troubleshooting If you have problems with the flashing script make sure you are using USB cables with data and not just power-only cables. Reach out to us on the [forum](https://forum.edgeimpulse.com/) and have fun making machine learning models on the [Apollo510-EVB](https://ambiq.com/apollo510/) from Ambiq! # Arducam Pico4ML TinyML Dev Kit Source: https://docs.edgeimpulse.com/hardware/boards/arducam-pico4ml-tinyml-dev-kit **Community board** This is a community board by Arducam, and it's not maintained by Edge Impulse. For support head to the [Arducam support page](https://www.arducam.com/contact-arducam/). The Arducam Pico4ML TinyML Dev Kit is a development board from Arducam with a RP2040 microcontroller, QVGA camera, bluetooth module (depending on your version), LCD screen, onboard microphone, accelerometer, gyroscope, and compass. Arducam has created in depth tutorials on how to get started using the Pico4ML Dev Kit with Edge Impulse, including how to collect new data and how to train and deploy your Edge Impulse models to the Pico4ML. The Arducam Pico4ML TinyML Dev Kit has two versions, [the version with BLE](https://www.arducam.com/product/arducam-pico4ml-tinyml-dev-kit-rp2040-board-w-qvga-camera-lcd-screen-onboard-audio-b0330/) and [the version without BLE](https://www.arducam.com/product/rp2040-based-arducam-pico4ml-dev-board-for-machine-vision/). ### Connecting to Edge Impulse To set up your Arducam Pico4ML TinyML Dev Kit, follow this guide: [Arducam: How to use Edge Impulse to train machine learning models for Raspberry Pico](https://www.arducam.com/docs/pico/arducam-pico4mltinymldevkit/how-to-use-edge-impulse-to-train-machine-learning-models-for-raspberry-pico/). ### Next steps: building a machine learning model With everything set up you can now build your first machine learning model with the [Edge Impulse continuous motion recognition tutorial](/tutorials/end-to-end/motion-recognition). Or you can follow Arducam's tutorial on [How to build a Magic Wand with Edge Impulse for Arducam Pico4ML-BLE](https://www.arducam.com/docs/pico/arducam-pico4mltinymldevkit/how-to-build-a-magic-wand-with-edge-impulse-on-arducam-pico4ml-ble/). Looking to connect different sensors? The [Data forwarder](/tools/clis/edge-impulse-cli/data-forwarder) lets you easily send data from any sensor into Edge Impulse. ### Deploying back to device With the impulse designed, trained and verified you can deploy this model back to your Arducam Pico4ML TinyML Dev Kit. This makes the model run without an internet connection, minimizes latency, and runs with minimum power consumption. Edge Impulse can package the complete impulse - including the signal processing code, neural network weights, and classification code - up into a single library that you can run on your development board. See the end of the Arducam's [How to use Edge Impulse to train machine learning models for Raspberry Pico](https://docs.arducam.com/Arduino-SPI-camera/Legacy-SPI-camera/Pico/Arducam-Pico4ML-TinyML/train-machine-learning-models/#deploy-model) tutorial for more information on deploying your model onto the device. # Arduino Nano 33 BLE Sense Source: https://docs.edgeimpulse.com/hardware/boards/arduino-nano-33-ble-sense The Arduino Nano 33 BLE Sense is a tiny development board with a Cortex-M4 microcontroller, motion sensors, a microphone and BLE - and it's fully supported by Edge Impulse. You'll be able to sample raw data, build models, and deploy trained machine learning models directly from the studio. You can also use the [Arduino Tiny Machine Learning Kit](https://store-usa.arduino.cc/products/arduino-tiny-machine-learning-kit?selectedStore=us) to run image classification models on the edge with the Arduino Nano and attached OV7675 camera module (or [connect the hardware together via jumper wire and a breadboard](/hardware/boards/arduino-nano-33-ble-sense#connecting-an-off-the-shelf-ov7675-camera-module) if purchased separately). **Different Arduino Nano 33 BLE Sense Versions** Arduino has two different versions (known as "revisions") of the Arduino Nano 33 BLE Sense. Both use the nRF52840 as the processor, but the sensors are different. While the Edge Impulse firmware works with both versions, you need to be careful about choosing the correct version when working with the Arduino IDE. You can tell which version of the Arduino Nano 33 BLE Sense you have by looking at the underside of the board. The first version will simply have *NANO 33 BLE SENSE* written in the silkscreen. The second version will have *NANO 33 BLE SENSE REV2*. The Edge Impulse firmware for this development board is open source and hosted on GitHub: [edgeimpulse/firmware-arduino-nano-33-ble-sense](https://github.com/edgeimpulse/firmware-arduino-nano-33-ble-sense). ### Installing dependencies To set this device up in Edge Impulse, you will need to install the following software: 1. [Edge Impulse CLI](/tools/clis/edge-impulse-cli/installation). 2. [Arduino CLI](https://arduino.github.io/arduino-cli/latest/). * Here's an [instruction video for Windows](https://youtu.be/1jMWsFER-Bc). * The [Arduino website](https://arduino.github.io/arduino-cli/installation/) has instructions for macOS and Linux. 3. On Linux: * GNU Screen: install for example via `sudo apt install screen`. **Problems installing the CLI?** See the [Installation and troubleshooting](/tools/clis/edge-impulse-cli/installation) guide. ### Connecting to Edge Impulse With all the software in place it's time to connect the development board to Edge Impulse.
## Further Discussions By applying object detection models trained on captured coop images in tracking unhatched eggs and detecting the poultry feeder status automatically, we can: 🐤🥚 mitigate strenuous workload while logging the daily produced eggs and applying a regular feeding schedule, 🐤🥚 maintain a high poultry health status, 🐤🥚 maximize egg quality and quantity, 🐤🥚 determine a potential contagious poultry disease or malnutrition. ## References \[^1] Soltanmoradi MG, Seidavi A, Dadashbeiki M, Laudadio V, Centoducati G, Tufarelli V., *Influence of Feeding Frequency and Timetable on Egg Parameters and Reproductive Performance in Broiler Breeder Hens*, Avian Biology Research, vol. 7, no. 3, Aug. 2014, pp. 153–159, *[https://journals.sagepub.com/doi/10.3184/175815514X14025828753279](https://journals.sagepub.com/doi/10.3184/175815514X14025828753279)* # Recognizing Punch Cards with LattePanda IOTA and Edge Impulse Source: https://docs.edgeimpulse.com/projects/expert-network/cv-punchcards-lattepanda Created By: Roni Bandini Public Project Link: [https://studio.edgeimpulse.com/studio/863714](https://studio.edgeimpulse.com/studio/863714) GitHub Repo: [https://github.com/ronibandini/PunchedCards](https://github.com/ronibandini/PunchedCards) ## Intro In 1804, Joseph Marie Jacquard demonstrated a mechanism to automate loom operation using a sequence of punched cards. Each card mechanically defined which warp threads were lifted for that pass, enabling programmable weaving patterns. This established the first industrial use of binary logic (hole or no hole) for machine control.

Punched cards evolved from this mechanical origin, into a standardized data storage medium for computing. While the Jacquard loom used physical needles to sense holes, later systems like the 1890 Hollerith tabulator introduced electrical sensing, using spring-loaded pins to complete circuits through the perforations. This technology eventually culminated in the IBM 80-column / 12-row format (standardized in 1928), where card readers detected electrical continuity via wire brushes, or in later decades, utilized optical sensors to read data at high speeds. As a tribute to this technology and to test the LattePanda IOTA mini PC, this project recognizes visually "punched" cards — printed and tagged here instead of punched — using a camera and machine learning. ## Hardware The [LattePanda IOTA](https://www.lattepanda.com/lattepanda-iota) is an x86 mini PC SBC designed by [DFRobot](http://dfrobot.com) with enough performance to run traditional robotics workloads and on-device AI inference. It features an Intel Processor N150 (4C/4T), 8GB or 16GB of LPDDR5 memory, 64GB or 128GB of eMMC storage, and an onboard RP2040 microcontroller for real time sensors and actuators. ## Parts Required * LattePanda IOTA * Active cooler * USB Webcam * USB Pendrive 16GB or more * Power supply ## Cards To simplify training, a single row with eight binary positions is used to represent characters. Instead of physical holes, printed circles represent binary "1" positions. Misalignment is intentional to give the model tolerances similar to physical punch cards. Example: * A 01000001 * B 01000010 ## Edge Impulse Model Creation Seven characters were chosen for this demo. Each character corresponds to ASCII BIN: ``` A 01000001 B 01000010 C 01000011 H 01001000 E 01000101 L 01001100 O 01001111 ``` A template was created in Photoshop as a PSD file, and 11 variants per character were exported as .PNG image files with the circles displaced in different directions. All the images were uploaded to a new Edge Impulse project using Data Acquisition, with one label per image and an 82/18 split between Training and Testing. An Impulse with a Classification Learning block and Grayscale color depth achieved perfect recognition, with only 50 training cycles and a 0.0005 learning rate: ## Setup and Deployment The LattePanda IOTA originally shipped with Windows pre-installed on the eMMC, but Ubuntu LTS was installed instead for this project. After flashing the Ubuntu image to a USB stick with balenaEtcher, the device was booted from USB by pressing `F7` and selecting the USB pen drive. After installation, the following commands prepare the needed environment in Ubuntu: #### Update
 ``` sudo apt update ``` #### Optional: enable ssh for remote console access
 ``` sudo apt install openssh-server -y
sudo systemctl enable ssh
sudo systemctl start ssh ``` #### Install Node
 ``` sudo apt install curl -y
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install nodejs -y ``` #### Install Edge Impulse
 ``` sudo npm install -g edge-impulse-linux –unsafe-perm
sudo npm install -g edge-impulse-cli –unsafe-perm ``` Now that everything is installed, you can execute: `edge-impulse-linux-runner` Log in, select the Edge Impulse project (if you have more than 1), and inference output begins immediately. For example: ``` classifyRes 1ms. { A: 0.9214, B: 0.4301, C: 0.2434, E: 0.1809, H: 0.1588, L: 0.0557, O: 0.0096 } ``` Values represent probabilities for each class. Live visualization is also available at port 4912 on the IP address of the LattePanda on your network. For example, `http://192.168.0.100:4912`. This is helpful if you need to adjust the web cam position or punch card position. ## Parsing Results in Python I have also included a Python script to execute the runner, capture the output, parse the result block and display the most probable character. After cloning the GitHub repo linked above, you can launch the runner with: `python3 runner.py` ## Final Notes The DFRobot LattePanda IOTA provided stable inference performance and a straightforward deployment path for Edge Impulse. While this project is a tribute to punched-card computing, the same principles apply to recognizing visual states in control panels, tags, physical tokens, or other symbolic markers captured by a camera. ## Project Links [https://studio.edgeimpulse.com/public/863714/live](https://studio.edgeimpulse.com/public/863714/live) [https://github.com/ronibandini/PunchedCards](https://github.com/ronibandini/PunchedCards) ## References [https://www.lattepanda.com/lattepanda-iota](https://www.lattepanda.com/lattepanda-iota) [https://www.ascii-code.com](https://www.ascii-code.com)
[https://artsandculture.google.com/story/punched-card-machines-the-national-museum-of-computing/bwWBrooyeGKPiA?hl=en](https://artsandculture.google.com/story/punched-card-machines-the-national-museum-of-computing/bwWBrooyeGKPiA?hl=en) 
[https://www.ibm.com/history/punched-card](https://www.ibm.com/history/punched-card) # Cyclist Blind Spot Detection - Himax WE-I Plus Source: https://docs.edgeimpulse.com/projects/expert-network/cyclist-blind-spot-detection-himax-we-i-plus Created By: Adam Taylor, Adam Fry Public Project Link: [https://studio.edgeimpulse.com/public/108632/latest](https://studio.edgeimpulse.com/public/108632/latest) ## Introduction Like many countries, the UK encourages people to cycle, with many cycle paths and cycle-to-work programs. Ideally for safety, the cycle paths are isolated from the main flow of traffic, and my home town of Harlow does pretty well at this. However, Harlow is new town, and as such these paths could be easily planned and built. In the larger cities and older towns such as London, cyclists have to share the road with other users. Sadly each year this leads to fatalities and injuries on the roads, one case which is especially troublesome is when cyclists are on the inside of large vehicles such as trucks, vans, buses etc. When the cyclist is on the inside of the vehicle and the the vehicle is turning left (or right in the most other countries) there exists the conditions for the driver to not see the cyclist and turn into their path. Unfortunately, this leads to many injuries and deaths. One of the major cause of these incidents is driver visibility. It is difficult for the driver to see down the side of the vehicle. There are attempts to prevent these events, one thing which is used in London on many large vehicles is a warning to Cyclists that they may be in the blind spot of the vehicle. Of course, it would be better for a system which would alert the driver that a cyclist was in their blind spot. This led to me thinking about how it could possibly be achieved, and retrofit into vehicles. Ideally the system would be low cost, small, capable of operating off a battery, and able to give a fast and timely warning to the driver. And, the system needs to be nearly self contained. My idea was to use a little camera, which would be able to raise an indication or alert to the driver that there was a cyclist in the blind spot. Ideally, this would be audible such that the driver could not fail to see it. For this reason I chose the Himax WE-I Plus camera from SparkFun. This device includes a simple grey-scale VGA camera, and has the ability to break out GPIO such that a buzzer or other warning could be generated. The USB connector can be used for powering the device, and it is small enough to be easily packaged and deployed. The best way to be able to detect cyclists is to capture an image and analyse if a Cyclist is present. This is a perfect job for machine learning, specifically object detection. As we want to deploy at the edge on a small, power-constrained microprocessor, it is an ideal use case for Edge Impulse and their Faster Objects, More Objects (FOMO) algorithm. ## What is FOMO Image classification, where we say if an item is present in a image, works well as long as there is only a single object in the image. Alternatively, object detection is able to provide the class, number of objects and positions in the image. This is what we need for cyclist detection as real world conditions mean there will be many objects in the image and there may be several cyclists also in the same image. It is crucial when this occurs we do detect the cyclist, for this reason we need a object detection algorithm. However, object detection algorithms are very computationally intensive and therefore struggle to be as responsive as necessary for this use case on a microcontroller. This is where the FOMO algorithm developed by Edge Impulse comes into play, it provides a simplified version of object detection. ## Dataset Like with all ML/AI projects, one of the largest challenges is in collecting a dataset. There is not a large, publicly available, dataset so we started to collect a small dataset to enable training and proof of concept. If the concept works we can create a larger dataset which addresses more conditions such as low light, weather, etc. The initial dataset used consisted of 100 images of cyclists in different conditions tagged from around the world. These images were collected from open source images available across the web. Once the dataset is collected we are able to create the Edge Impulse project. ## Edge Impulse Project The first thing do is log into your [Edge Impulse account](https://www.edgeimpulse.com) and create a new project. Once the project is created we need to get started working on it. I had a work experience student with me this week from the local high school. He helped me create the dataset and train the model, we were able to work collaboratively on the project due to Edge Impulse's new collaboration feature. On the project Dashboard, select "Add collaborator" and in the dialog add in either the username or email of the individual. Once they are added you can then easily work together on the project. This enabled Adam F. to work on uploading and labelling the dataset, while I attended meetings. Each of the images is uploaded and labeled with the location of the Cyclist. As you upload the images you will notice the labeling queue in the data acquisition page displays the number of items to be labeled. By clicking on the labelling queue you can label each image. Once the bounding box is drawn around the object, the next step is to enter the label. Using this view we can work through each of the images which needs to be labeled. The next step with the data labeled is to create the impulse. The first step is to add a processing block - Select "Image Processing" block. Then we can add the processing block. With the impulse created the next stage is to configure the image processing block. Change the color depth to Black and White. Select the "Generate Features" tab and click "Generate features". These are the features which will be taken forward for training in the processing block. The final stage is to train the model. Once the model is trained we will see a confusion matrix which shows the performance. The initial training was good but the F1 score (which is the a key indication of the result) was too low. While it looks good on individual images like below. When we test it on the entire validation set the accuracy score was very low, only 36%, which is not acceptable. We can get better performance than this. However, before we change the settings of the project, we will save a version of it. This will allow us to save the current state of the project, so we have a version we can revert to if necessary. With the version saved, the next step is to change some of the project settings. Investigating the project settings, the generated features are not closely clustered. We can change the setting on the resize, to resize with respect to the longest side. Regenerating the features shows a much closer clustering in the Feature Explorer. I also changed the number of training cycles, and the learning rate. This resulted in a better F1 score, though a slightly reduced accuracy compared to previously. This resulted in much better performance when tested against the validation set. To deploy the algorithm on the target hardware we select "Deploy" and choose the Himax WE-i Plus camera from the options. This will generate an application directly for the target device. To load the application onto the Himax WE-I Plus, extract the downloaded folder and run the batch file for your operating system, then follow the on-screen commands. Press the Reset button on the device when instructed. With the application flashed, we are able to run some tests using the camera against images, using live Classification. Both images were correctly identified as a cyclists. Second classification: The final step is run the application on the board, standalone. Testing this against a range of images shows cyclists detected. ## Wrap Up This project shows that tinyML can be used in a small microcontroller-based image processing system to detect cyclists. This approach can be further developed to produce a system which can be used to increase road safety. # AI-Assisted Monitoring of Dairy Manufacturing Conditions - Seeed XIAO ESP32C3 Source: https://docs.edgeimpulse.com/projects/expert-network/dairy-manufacturing-with-ai-seeed-xiao-esp32c3 Created By: Kutluhan Aktar Public Project Link: [https://studio.edgeimpulse.com/public/159184/latest](https://studio.edgeimpulse.com/public/159184/latest) ## Description As many of us know, yogurt is produced by bacterial fermentation of milk, which can be of cow, goat, ewe, sheep, etc. The fermentation process thickens the milk and provides a characteristic tangy flavor to yogurt. Considering organisms contained in yogurt stimulate the gut's friendly bacteria and suppress harmful bacteria looming in the digestive system, it is not surprising that yogurt is consumed worldwide as a healthy and nutritious food\[^1]. The bacteria utilized to produce yogurt are known as yogurt cultures (or starters). Fermentation of sugars in the milk by yogurt cultures yields lactic acid, which decomposes and coagulates proteins in the milk to give yogurt its texture and characteristic tangy flavor. Also, this process improves the digestibility of proteins in the milk and enhances the nutritional value of proteins. After the fermentation of the milk, yogurt culture could help the human intestinal tract to absorb the amino acids more efficiently\[^2]. Even though yogurt production and manufacturing look like a simple task, achieving precise yogurt texture (consistency) can be arduous and strenuous since various factors affect the fermentation process while processing yogurt, such as: * Temperature * Humidity * Pressure * Milk Temperature * Yogurt Culture (Starter) Amount (Weight) In this regard, most companies employ food (chemical) additives while mass-producing yogurt to maintain its freshness, taste, texture, and appearance. Depending on the production method, yogurt additives can include dilutents, water, artificial flavorings, rehashed starch, sugar, and gelatine. In recent years, due to the surge in food awareness and apposite health regulations, companies were coerced into changing their yogurt production methods or labeling them conspicuously on the packaging. Since people started to have a penchant for consuming more healthy and organic (natural) yogurt, it became a necessity to prepare prerequisites precisely for yogurt production without any additives. However, unfortunately, organic (natural) yogurt production besets some local dairies since following strict requirements can be expensive and demanding for small businesses trying to gain a foothold in the dairy industry. After perusing recent research papers on yogurt production, I decided to utilize temperature, humidity, pressure, milk temperature, and culture weight measurements denoting yogurt consistency before fermentation so as to create an easy-to-use and budget-friendly device in the hope of assisting dairies in reducing total cost and improving product quality. Even though the mentioned factors can provide insight into detecting yogurt consistency before fermentation, it is not possible to extrapolate and construe yogurt texture levels precisely by merely employing limited data without applying complex algorithms. Hence, I decided to build and train an artificial neural network model by utilizing the empirically assigned yogurt consistency classes to predict yogurt texture levels before fermentation based on temperature, humidity, pressure, milk temperature, and culture weight measurements. Since XIAO ESP32C3 is an ultra-small size IoT development board that can easily collect data and run my neural network model after being trained to predict yogurt consistency levels, I decided to employ XIAO ESP32C3 in this project. To collect the required measurements to train my model, I used a temperature & humidity sensor (Grove), an integrated pressure sensor kit (Grove), an I2C weight sensor kit (Gravity), and a DS18B20 waterproof temperature sensor. Since the XIAO expansion board provides various prototyping options and built-in peripherals, such as an SSD1306 OLED display and a MicroSD card module, I used the expansion board to make rigid connections between XIAO ESP32C3 and the sensors. Since the expansion board supports reading and writing information from/to files on an SD card, I stored the collected data in a CSV file on the SD card to create a data set. In this regard, I was able to save data records via XIAO ESP32C3 without requiring any additional procedures. After completing my data set, I built my artificial neural network model (ANN) with Edge Impulse to make predictions on yogurt consistency levels (classes). Since Edge Impulse is nearly compatible with all microcontrollers and development boards, I had not encountered any issues while uploading and running my model on XIAO ESP32C3. As labels, I utilized the empirically assigned yogurt texture classes for each data record while collecting yogurt processing data: * Thinner * Optimum * Curdling (Lumpy) After training and testing my neural network model, I deployed and uploaded the model on XIAO ESP32C3. Therefore, the device is capable of detecting precise yogurt consistency levels (classes) by running the model independently. Since I wanted to allow the user to get updates and control the device remotely, I decided to build a complementing Blynk application for this project: The Blynk dashboard displays the recent sensor readings transferred from XIAO ESP32C3, makes XIAO ESP32C3 run the neural network model, and shows the prediction result. Lastly, to make the device as sturdy and robust as possible while operating in a dairy, I designed a dairy-themed case with a sliding (removable) front cover (3D printable). So, this is my project in a nutshell 😃 In the following steps, you can find more detailed information on coding, logging data on the SD card, communicating with a Blynk application, building a neural network model with Edge Impulse, and running it on XIAO ESP32C3. 🎁🎨 Huge thanks to [Seeed Studio](https://www.seeedstudio.com/) for sponsoring these products: ⭐ XIAO ESP32C3 | [Inspect](https://www.seeedstudio.com/Seeed-XIAO-ESP32C3-p-5431.html) ⭐ XIAO Expansion Board | [Inspect](https://www.seeedstudio.com/Seeeduino-XIAO-Expansion-board-p-4746.html) ⭐ Grove - Temperature & Humidity Sensor | [Inspect](https://www.seeedstudio.com/Grove-Temp-Humi-Sensor-SHT40-p-5384.html) ⭐ Grove - Integrated Pressure Sensor Kit | [Inspect](https://www.seeedstudio.com/Grove-Integrated-Pressure-Sensor-Kit-MPX5700AP-p-4295.html) 🎁🎨 Huge thanks to [DFRobot](https://www.dfrobot.com/?tracking=60f546f8002be) for sponsoring a [Gravity: I2C 1Kg Weight Sensor Kit (HX711)](https://www.dfrobot.com/product-2289.html?tracking=60f546f8002be). 🎁🎨 Also, huge thanks to [Creality](https://store.creality.com/) for sending me a [Creality Sonic Pad](https://www.creality.com/products/creality-sonic-pad), a [Creality Sermoon V1 3D Printer](https://www.creality.com/products/creality-sermoon-v1-v1-pro-3d-printer), and a [Creality CR-200B 3D Printer](https://www.creality.com/products/cr-200b-3d-printer).






## Step 1: Designing and printing a dairy-themed case Since I focused on building a budget-friendly and easy-to-use device that collects yogurt processing data and informs the user of the predicted yogurt consistency level before fermentation, I decided to design a robust and sturdy case allowing the user to access the SD card after logging data and weigh yogurt culture (starter) easily. To avoid overexposure to dust and prevent loose wire connections, I added a sliding front cover with a handle to the case. Also, I decided to emboss yogurt and milk icons on the sliding front cover so as to complement the dairy theme gloriously. Since I needed to adjust the rubber tube length of the integrated pressure sensor, I added a hollow cylinder part to the main case to place the rubber tube. Then, I decided to fasten a small cow figure to the cylinder part because I thought it would make the case design align with the dairy theme. I designed the main case and its sliding front cover in Autodesk Fusion 360. You can download their STL files below.



For the cow figure (replica) affixed to the top of the cylinder part of the main case, I utilized this model from Thingiverse: * [Cow](https://www.thingiverse.com/thing:2619138) Then, I sliced all 3D models (STL files) in Ultimaker Cura.

Since I wanted to create a solid structure for the main case with the sliding front cover representing dairy products, I utilized these PLA filaments: * Beige * ePLA-Matte Milky White Finally, I printed all parts (models) with my Creality Sermoon V1 3D Printer and Creality CR-200B 3D Printer in combination with the Creality Sonic Pad. You can find more detailed information regarding the Sonic Pad in Step 1.1.
If you are a maker or hobbyist planning to print your 3D models to create more complex and detailed projects, I highly recommend the Sermoon V1. Since the Sermoon V1 is fully-enclosed, you can print high-resolution 3D models with PLA and ABS filaments. Also, it has a smart filament runout sensor and the resume printing option for power failures. Furthermore, the Sermoon V1 provides a flexible metal magnetic suction platform on the heated bed. So, you can remove your prints without any struggle. Also, you can feed and remove filaments automatically (one-touch) due to its unique sprite extruder (hot end) design supporting dual-gear feeding. Most importantly, you can level the bed automatically due to its user-friendly and assisted bed leveling function. :hash: Before the first use, remove unnecessary cable ties and apply grease to the rails.

:hash: Test the nozzle and hot bed temperatures. :hash: Go to *Print Setup ➡ Auto leveling* and adjust five predefined points automatically with the assisted leveling function.
:hash: Finally, place the filament into the integrated spool holder and feed the extruder with the filament.
:hash: Since the Sermoon V1 is not officially supported by Cura, download the latest [Creality Slicer](https://www.creality.com/pages/download-sermoon-v1v1-pro) version and copy the official printer settings provided by Creality, including *Start G-code* and *End G-code*, to a custom printer profile on Cura.



## Step 1.1: Improving print quality and speed with the Creality Sonic Pad Since I wanted to improve my print quality and speed with Klipper, I decided to upgrade my Creality CR-200B 3D Printer with the [Creality Sonic Pad](https://www.creality.com/products/creality-sonic-pad). Creality Sonic Pad is a beginner-friendly device to control almost any FDM 3D printer on the market with the Klipper firmware. Since the Sonic Pad uses precision-oriented algorithms, it provides remarkable results with higher printing speeds. The built-in input shaper function mitigates oscillation during high-speed printing and smooths ringing to maintain high model quality. Also, it supports G-code model preview. Although the Sonic Pad is pre-configured for some Creality printers, it does not support the CR-200B officially yet. Therefore, I needed to add the CR-200B as a user-defined printer to the Sonic Pad. Since the Sonic Pad needs unsupported printers to be flashed with the self-compiled Klipper firmware before connection, I flashed my CR-200B with the required Klipper firmware settings via *FluiddPI* by following [this YouTube tutorial](https://www.youtube.com/watch?v=gfZ9Lbyh8qU). If you do not know how to write a printer configuration file for Klipper, you can download the stock CR-200B configuration file from [here](https://github.com/ChewyJetpack/CR-200B-Klipper-Config/). :hash: After flashing the CR-200B with the Klipper firmware, copy the configuration file *(printer.cfg)* to a USB drive and connect the drive to the Sonic Pad. :hash: After setting up the Sonic Pad, select *Other models*. Then, load the *printer.cfg* file.
:hash: After connecting the Sonic Pad to the CR-200B successfully via a USB cable, the Sonic Pad starts the self-testing procedure, which allows the user to test printer functions and level the bed.

:hash: After completing setting up the printer, the Sonic Pad lets the user control all functions provided by the Klipper firmware.
:hash: In Cura, export the sliced model in the *ufp* format. After uploading *.ufp* files to the Sonic Pad via the USB drive, it converts them to sliced G-code files automatically. :hash: Also, the Sonic Pad can display model preview pictures generated by Cura with the *Create Thumbnail* script. ## Step 1.2: Assembling the case and making connections & adjustments ``` // Connections // XIAO ESP32C3 : // Grove - Temperature & Humidity Sensor // A4 --------------------------- SDA // A5 --------------------------- SCL // Grove - Integrated Pressure Sensor // A0 --------------------------- S // Gravity: I2C 1Kg Weight Sensor Kit - HX711 // A4 --------------------------- SDA // A5 --------------------------- SCL // DS18B20 Waterproof Temperature Sensor // D6 --------------------------- Data // SSD1306 OLED Display (128x64) // A4 --------------------------- SDA // A5 --------------------------- SCL // MicroSD Card Module (Built-in on the XIAO Expansion board) // D10 --------------------------- MOSI // D9 --------------------------- MISO // D8 --------------------------- CLK (SCK) // D2 --------------------------- CS (SS) // Button (Built-in on the XIAO Expansion board) // D1 --------------------------- + ``` First of all, I attached XIAO ESP32C3 to [the XIAO expansion board](https://wiki.seeedstudio.com/Seeeduino-XIAO-Expansion-Board/). Then, I connected [the temperature & humidity sensor (Grove)](https://wiki.seeedstudio.com/Grove-SHT4x/) and [the integrated pressure sensor kit (Grove)](https://wiki.seeedstudio.com/Grove-Integrated-Pressure-Sensor-Kit/) to the expansion board via Grove connection cables. Since [the I2C weight sensor kit (Gravity)](https://wiki.dfrobot.com/HX711_Weight_Sensor_Kit_SKU_KIT0176) does not include a compatible connection cable for a Grove port, I connected the weight sensor to the expansion board via a 4-pin male jumper to Grove 4-pin conversion cable. As shown in the schematic below, before connecting the DS18B20 waterproof temperature sensor to the expansion board, I attached a 4.7K resistor as a pull-up from the DATA line to the VCC line of the sensor to generate accurate temperature measurements. To display the collected data, I utilized the built-in SSD1306 OLED screen on the expansion board. To assign yogurt consistency levels empirically while saving data records to a CSV file on the SD card, I used the built-in MicroSD card module and button on the expansion board.
After printing all parts (models), I fastened all components except the expansion board to their corresponding slots on the main case via a hot glue gun. I attached the expansion board to the main case by utilizing M3 screws with hex nuts and placed the rubber tube of the integrated pressure sensor in the hollow cylinder part of the main case. Then, I placed the sliding front cover via the dents on the main case.








Finally, I affixed the small cow figure to the top of the cylinder part of the main case via the hot glue gun.
## Step 2: Creating a Blynk application and user interface for XIAO ESP32C3 Since I focused on building an accessible device, I decided to create a complementing Blynk application for allowing the user to display recent sensor readings, run the Edge Impulse neural network model, and get informed of the prediction result remotely. [The Blynk IoT Platform](https://docs.blynk.io/en/) provides a free cloud service to communicate with supported microcontrollers and development boards, such as ESP32C3. Also, Blynk lets the user design unique web and mobile applications with drag-and-drop editors. :hash: First of all, create an account on [Blynk](https://blynk.cloud/dashboard/login) and open Blynk.Console. :hash: Before designing the web application on Blynk.Console, install [the Blynk library](https://github.com/blynkkk/blynk-library/releases/tag/v1.1.0) on the Arduino IDE to send and receive data packets via the Blynk cloud: Go to *Sketch ➡ Include Library ➡ Manage Libraries…* and search for *Blynk*. :hash: Then, create a new device with the *Quickstart Template*, named XIAO ESP32C3. And, select the board type as *ESP32*.
:hash: After creating the device successfully, copy the *Template ID*, *Device Name*, and *Auth Token* variables required by the Blynk library. :hash: Open the *Web Dashboard* and click the *Edit* button to change the web application design. :hash: From the *Widget Box*, add the required widgets and assign each widget to a virtual pin as the datastream option. Since Blynk allows the user to adjust the unit, data range, and color scheme for each widget, I was able to create a unique web user interface for the device. * Temperature Gauge ➡ V4 * Humidity Gauge ➡ V12 * Pressure Gauge ➡ V6 * Milk Temperature Gauge ➡ V7 * Weight Gauge ➡ V8 * Switch Button ➡ V9 * Label ➡ V10



After completing designing the web user interface, I tested the virtual pin connection of each widget with XIAO ESP32C3.
## Step 3: Setting up XIAO ESP32C3 on the Arduino IDE Since the XIAO expansion board supports reading and writing information from/to files on an SD card, I decided to log the collected yogurt processing data in a CSV file on the SD card without applying any additional procedures. Also, I employed XIAO ESP32C3 to communicate with the Blynk application to run the neural network model remotely and transmit the collected data. However, before proceeding with the following steps, I needed to set up [XIAO ESP32C3](https://wiki.seeedstudio.com/XIAO_ESP32C3_Getting_Started/) on the Arduino IDE and install the required libraries for this project. :hash: To add the XIAO ESP32C3 board package to the Arduino IDE, navigate to *File ➡ Preferences* and paste the URL below under *Additional Boards Manager URLs*. *[https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package\\\_esp32\\\_dev\\\_index.json](https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package\\_esp32\\_dev\\_index.json)* :hash: Then, to install the required core, navigate to *Tools ➡ Board ➡ Boards Manager* and search for *esp32*. :hash: After installing the core, navigate to *Tools ➡ Board ➡ ESP32 Arduino* and select *XIAO\_ESP32C3*. Since the provided XIAO ESP32C3 core's assigned pin numbers are not compatible with the expansion board's MicroSD card module, it throws an error on the Arduino IDE while attempting to access the SD card. Therefore, I needed to change the assigned SS pin to 4 (GPIO4) in the *pins\_arduino.h* file. :hash: The *pins\_arduino.h* file location: *\esp32\hardware\esp32\2.0.5\variants\XIAO\_ESP32C3*. :hash: Finally, download the required libraries for the temperature & humidity sensor, the I2C weight sensor, the DS18B20 temperature sensor, and the SSD1306 OLED display: Sensirion arduino-core | [Download](https://github.com/Sensirion/arduino-core) arduino-i2c-sht4x | [Download](https://github.com/Sensirion/arduino-i2c-sht4x) DFRobot\_HX711\_I2C | [Download](https://github.com/DFRobot/DFRobot_HX711_I2C) OneWire | [Download](https://github.com/PaulStoffregen/OneWire) DallasTemperature | [Download](https://github.com/milesburton/Arduino-Temperature-Control-Library) Adafruit\_SSD1306 | [Download](https://github.com/adafruit/Adafruit_SSD1306) Adafruit-GFX-Library | [Download](https://github.com/adafruit/Adafruit-GFX-Library) ## Step 3.1: Displaying images on the SSD1306 OLED screen To display images (black and white) on the SSD1306 OLED screen successfully, I needed to create monochromatic bitmaps from PNG or JPG files and convert those bitmaps to data arrays. :hash: First of all, download the [LCD Assistant](http://en.radzio.dxp.pl/bitmap_converter/). :hash: Then, upload a monochromatic bitmap and select *Vertical* or *Horizontal* depending on the screen type. :hash: Convert the image (bitmap) and save the output (data array). :hash: Finally, add the data array to the code and print it on the screen. ``` static const unsigned char PROGMEM sd [] = { 0x0F, 0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0xFF, 0x1F, 0xFE, 0x7C, 0xFF, 0x1B, 0x36, 0x6C, 0x9B, 0x19, 0x26, 0x4C, 0x93, 0x19, 0x26, 0x4C, 0x93, 0x19, 0x26, 0x4C, 0x93, 0x19, 0x26, 0x4C, 0x93, 0x19, 0x26, 0x4C, 0x93, 0x19, 0x26, 0x4C, 0x93, 0x19, 0x26, 0x4C, 0x93, 0x1F, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xC7, 0xFF, 0xFF, 0xF9, 0x41, 0xFF, 0x1F, 0xF9, 0xDD, 0xFF, 0x1F, 0xFC, 0xDD, 0xFF, 0x1F, 0xFE, 0x5D, 0xFF, 0x1F, 0xF8, 0x43, 0xFF, 0x1F, 0xFD, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE }; ... display.clearDisplay(); display.drawBitmap(48, 0, sd, 32, 44, SSD1306_WHITE); display.display(); ```
## Step 4: Logging yogurt processing information in a CSV file on the SD card w/ XIAO ESP32C3 After setting up XIAO ESP32C3 and installing the required libraries, I programmed XIAO ESP32C3 to collect environmental factor measurements and the culture (starter) amount in order to save them to the given CSV file on the SD card. * Temperature (°C) * Humidity (%) * Pressure (kPa) * Milk Temperature (°C) * Starter Weight (g) Since I needed to assign yogurt consistency levels (classes) empirically as labels for each data record while collecting yogurt processing data to create a valid data set for the neural network model, I utilized the built-in button on the XIAO expansion board in two different modes (long press and short press) so as to choose among classes and save data records. After selecting a yogurt consistency level (class) by short-pressing the button, XIAO ESP32C3 appends the selected class and the recently collected data to the given CSV file on the SD card as a new row if the button is long-pressed. * Button (short-pressed) ➡ Select a class (Thinner, Optimum, Curdling) * Button (long-pressed) ➡ Save data to the SD card You can download the *AI\_yogurt\_processing\_data\_collect.ino* file to try and inspect the code for collecting yogurt processing data and for saving data records to the given CSV file on the SD card. ⭐ Include the required libraries. ``` #include <FS.h> #include <SPI.h> #include <SD.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <SensirionI2CSht4x.h> #include <DFRobot_HX711_I2C.h> #include <OneWire.h> #include <DallasTemperature.h> ``` ⭐ Initialize the *File* class and define the CSV file name on the SD card. ``` File myFile; // Define the CSV file name: const char* data_file = "/yogurt_data.csv"; ``` ⭐ Define the 0.96 Inch SSD1306 OLED display on the XIAO expansion board. ``` #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); ``` ⭐ Define the temperature & humidity sensor object (Grove), the I2C weight sensor object (Gravity), and the DS18B20 waterproof temperature sensor settings. ``` SensirionI2CSht4x sht4x; // Define the HX711 weight sensor. DFRobot_HX711_I2C MyScale; // Define the DS18B20 waterproof temperature sensor settings: #define ONE_WIRE_BUS D6 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature DS18B20(&oneWire); ``` ⭐ Define monochrome graphics. ⭐ Define the built-in button pin on the expansion board. ⭐ Then, define the button state and the duration variables to utilize the button in two different modes: long press and short press. ``` #define button D1 // Define the button state and the duration to utilize the integrated button in two different modes: long press and short press. int button_state = 0; #define DURATION 5000 ``` ⭐ Initialize the SSD1306 screen. ``` display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.display(); delay(1000); ``` ⭐ Initialize the DS18B20 temperature sensor. ``` DS18B20.begin(); ``` ⭐ Define the required settings to initialize the temperature & humidity sensor (Grove). ``` sht4x.begin(Wire); uint32_t serialNumber; error = sht4x.serialNumber(serialNumber); ``` ⭐ In the *err\_msg* function, display the error message on the SSD1306 OLED screen. ``` void err_msg(){ // Show the error message on the SSD1306 screen. display.clearDisplay(); display.drawBitmap(48, 0, _error, 32, 32, SSD1306_WHITE); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0,40); display.println("Check the serial monitor to see the error!"); display.display(); } ``` ⭐ Check the temperature & humidity sensor connection status and print the error message on the serial monitor, if any. ``` if(error){ Serial.print("Error: Grove - Temperature & Humidity Sensor not initialized!\n"); errorToString(error, errorMessage, 256); Serial.println(errorMessage); err_msg(); }else{ Serial.print("Grove - Temperature & Humidity Sensor successfully initialized: "); Serial.println(serialNumber); } ``` ⭐ Check the connection status between the I2C weight sensor and XIAO ESP32C3. ``` while (!MyScale.begin()) { Serial.println("Error: HX711 initialization is failed!"); err_msg(); delay(1000); } Serial.println("HX711 initialization is successful!"); ``` ⭐ Set the calibration weight (g) and threshold (g) to calibrate the weight sensor automatically. ⭐ Display the current calibration value on the serial monitor. ``` MyScale.setCalWeight(100); // Set the calibration threshold (g). MyScale.setThreshold(30); // Display the current calibration value. Serial.print("\nCalibration Value: "); Serial.println(MyScale.getCalibration()); MyScale.setCalibration(MyScale.getCalibration()); delay(1000); ``` ⭐ Check the connection status between XIAO ESP32C3 and the SD card. ``` if(!SD.begin()){ Serial.println("Error: SD card initialization failed!\n"); err_msg(); while (1); } Serial.println("SD card is detected successfully!\n"); ``` ⭐ In the *get\_temperature\_and\_humidity* function, obtain the measurements generated by the temperature & humidity sensor. ``` void get_temperature_and_humidity(){ // Obtain the measurements generated by the Grove - Temperature & Humidity Sensor. error = sht4x.measureHighPrecision(temperature, humidity); if(error){ Serial.print("Error trying to execute measureHighPrecision(): "); errorToString(error, errorMessage, 256); Serial.println(errorMessage); }else{ Serial.print("\nTemperature : "); Serial.print(temperature); Serial.println("°C"); Serial.print("Humidity : "); Serial.print(humidity); Serial.println("%"); } delay(500); } ``` ⭐ In the *get\_pressure* function, get the measurements generated by the integrated pressure sensor (Grove). ⭐ Then, convert the accumulation of raw data to accurate pressure estimation. ``` void get_pressure(){ // Obtain the measurements generated by the Grove - Integrated Pressure Sensor. rawValue = 0; // Convert the accumulation of raw data to the pressure estimation. for (int x = 0; x < 10; x++) rawValue = rawValue + analogRead(pressure_s_pin); pressure = (rawValue - offset) * 700.0 / (fullScale - offset); Serial.print("\nPressure : "); Serial.print(pressure); Serial.println(" kPa"); } ``` ⭐ In the *get\_weight* function, obtain the weight measurement generated by the I2C weight sensor. ⭐ Then, subtract the container weight from the total weight to get the net weight. ``` void get_weight(int calibration){ weight = MyScale.readWeight(); weight = weight - calibration; if(weight < 0.5) weight = 0; Serial.print("\nWeight: "); Serial.print(weight); Serial.println(" g"); delay(500); } ``` ⭐ In the *get\_milk\_temperature* function, obtain the temperature measurement generated by the DS18B20 temperature sensor. ``` void get_milk_temperature(){ // Obtain the temperature measurement generated by the DS18B20 Waterproof Temperature Sensor. DS18B20.requestTemperatures(); m_temperature = DS18B20.getTempCByIndex(0); Serial.print("\nMilk Temperature: "); Serial.print(m_temperature); Serial.println("°C"); } ``` ⭐ In the *home\_screen* function, display the collected data and the selected class on the SSD1306 OLED screen. ``` void home_screen(){ display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println("Temp => " + String(temperature) + " *C"); display.println("Humidity => " + String(humidity) + " %"); display.println("Pres. => " + String(pressure) + " kPa"); display.println(); display.println("M_Temp => " + String(m_temperature) + " *C"); display.println("Weight => " + String(weight) + " g"); display.println(); display.println("Selected Class => " + String(class_number)); display.display(); } ``` ⭐ In the *save\_data\_to\_SD\_Card* function: ⭐ Open the given CSV file on the SD card in the *APPEND* file mode. ⭐ If the given CSV file is opened successfully, create a data record from the recently collected data, including the selected yogurt consistency level (class), to be inserted as a new row. ⭐ Then, append the recently created data record and close the CSV file. ⭐ After appending the given data record successfully, notify the user by displaying this message on the SSD1306 OLED screen: *Data saved to the SD card!* ``` void save_data_to_SD_Card(fs::FS &fs, int consistency_level){ // Open the given CSV file on the SD card in the APPEND file mode. // FILE MODES: WRITE, READ, APPEND myFile = fs.open(data_file, FILE_APPEND); delay(1000); // If the given file is opened successfully: if(myFile){ Serial.print("\n\nWriting to "); Serial.print(data_file); Serial.println("..."); // Create the data record to be inserted as a new row: String data_record = String(temperature) + "," + String(humidity) + "," + String(pressure) + "," + String(m_temperature) + "," + String(weight) + ',' + String(consistency_level); // Append the data record: myFile.println(data_record); // Close the CSV file: myFile.close(); Serial.println("Data saved successfully!\n"); // Notify the user after appending the given data record successfully. display.clearDisplay(); display.drawBitmap(48, 0, sd, 32, 44, SSD1306_WHITE); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0,48); display.println("Data saved to the SD card!"); display.display(); }else{ // If XIAO ESP32C3 cannot open the given CSV file successfully: Serial.println("\nXIAO ESP32C3 cannot open the given CSV file successfully!\n"); err_msg(); } // Exit and clear: delay(4000); } ``` ⭐ Detect whether the built-in button is short-pressed or long-pressed. ``` button_state = 0; if(!digitalRead(button)){ timer = millis(); button_state = 1; while((millis()-timer) <= DURATION){ if(digitalRead(button)){ button_state = 2; break; } } } ``` ⭐ If the button is short-pressed, change the class number \[0 - 2] to choose among yogurt consistency levels (classes). ⭐ If the button is long-pressed, append the recently created data record to the given CSV file on the SD card. ``` if(button_state == 1){ // Save the given data record to the given CSV file on the SD card when long-pressed. save_data_to_SD_Card(SD, class_number); }else if(button_state == 2){ // Change the class number when short-pressed. class_number++; if(class_number > 2) class_number = 0; Serial.println("\n\nSelected Class: " + String(class_number) + "\n"); } ```



## Step 4.1: Collecting samples while producing yogurt to create a data set After uploading and running the code for collecting yogurt processing data and for saving information to the given CSV file on the SD card on XIAO ESP32C3: 🐄🥛📲 The device shows the opening screen if the sensor and MicroSD card module connections with XIAO ESP32C3 are successful. 🐄🥛📲 Then, the device displays the collected yogurt processing data and the selected class number on the SSD1306 OLED screen: * Temperature (°C) * Humidity (%) * Pressure (kPa) * Milk Temperature (°C) * Starter Weight (g) * Selected Class 🐄🥛📲 If the button (built-in) is short-pressed, the device increments the selected class number in the range of 0-2: * Thinner \[0] * Optimum \[1] * Curdling \[2]
🐄🥛📲 If the button (built-in) is long-pressed, the device appends the recently created data record from the collected data to the *yogurt\_data.csv* file on the SD card, including the selected yogurt consistency class number under the *consistency\_level* data field. 🐄🥛📲 After successfully appending the data record, the device notifies the user via the SSD1306 OLED screen. 🐄🥛📲 If XIAO ESP32C3 throws an error while operating, the device shows the error message on the SSD1306 OLED screen and prints the error details on the serial monitor.
🐄🥛📲 Also, the device prints notifications and sensor measurements on the serial monitor for debugging.

To create a data set with eminent validity and veracity, I collected yogurt processing data from nearly 30 different batches. Since I focused on predicting yogurt texture precisely, I always used cow milk in my experiments but changed milk temperature, yogurt culture (starter) amount, and environmental factors while conducting my experiments.



🐄🥛📲 After completing logging the collected data in the *yogurt\_data.csv* file on the SD card, I elicited my data set. ## Step 5: Building a neural network model with Edge Impulse When I completed logging the collected data and assigning labels, I started to work on my artificial neural network model (ANN) to detect yogurt consistency (texture) levels before fermentation so as to improve product quality and reduce the total cost for small dairies. Since Edge Impulse supports almost every microcontroller and development board due to its model deployment options, I decided to utilize Edge Impulse to build my artificial neural network model. Also, Edge Impulse makes scaling embedded ML applications easier and faster for edge devices such as XIAO ESP32C3. Even though Edge Impulse supports CSV files to upload samples, the data type should be time series to upload all data records in a single file. Therefore, I needed to follow the steps below to format my data set so as to train my model accurately: * Data Scaling (Normalizing) * Data Preprocessing As explained in the previous steps, I assigned yogurt consistency classes empirically while logging yogurt processing data from various batches. Then, I developed a Python application to scale (normalize) and preprocess data records to create appropriately formatted samples (single CSV files) for Edge Impulse. Since the assigned classes are stored under the *consistency\_level* data field in the *yogurt\_data.csv* file, I preprocessed my data set effortlessly to create samples from data records under these labels: * 0 — Thinner * 1 — Optimum * 2 — Curdling Plausibly, Edge Impulse allows building predictive models optimized in size and accuracy automatically and deploying the trained model as an Arduino library. Therefore, after scaling (normalizing) and preprocessing my data set to create samples, I was able to build an accurate neural network model to predict yogurt consistency levels and run it on XIAO ESP32C3 effortlessly. You can inspect [my neural network model on Edge Impulse](https://studio.edgeimpulse.com/public/159184/latest) as a public project. ## Step 5.1: Preprocessing and scaling the data set to create formatted samples for Edge Impulse If the data type is not time series, Edge Impulse cannot distinguish data records as individual samples from one CSV file while adding existing data to an Edge Impulse project. Therefore, the user needs to create a separate CSV file for each sample, including a header defining data fields. To scale (normalize) and preprocess my data set so as to create individual CSV files as samples automatically, I developed a Python application consisting of one file: * process\_dataset.csv Since Edge Impulse can infer the uploaded sample's label from its file name, the application reads the given CSV file (data set) and generates a separate CSV file for each data record, named according to its assigned yogurt consistency class number under the *consistency\_level* data field. Also, the application adds a sample number incremented by 1 for generated CSV files sharing the same label: * Thinner.sample\_1.csv * Thinner.sample\_2.csv * Optimum.sample\_1.csv * Optimum.sample\_2.csv * Curdling.sample\_1.csv * Curdling.sample\_2.csv First of all, I created a class named *process\_dataset* in the *process\_dataset.py* file to bundle the following functions under a specific structure. ⭐ Include the required modules. ``` import numpy as np import pandas as pd from csv import writer ``` ⭐ In the ***init*** function, read the data set from the given CSV file and define the yogurt consistency class names. ``` def __init__(self, csv_path): # Read the data set from the given CSV file. self.df = pd.read_csv(csv_path) # Define the class (label) names. self.class_names = ["Thinner", "Optimum", "Curdling"] ``` ⭐ In the *scale\_data\_elements* function, scale (normalize) data elements to define appropriately formatted data items in the range of 0-1. ``` def scale_data_elements(self): self.df["scaled_temperature"] = self.df["temperature"] / 100 self.df["scaled_humidity"] = self.df["humidity"] / 100 self.df["scaled_pressure"] = self.df["pressure"] / 1000 self.df["scaled_milk_temperature"] = self.df["milk_temperature"] / 100 self.df["scaled_starter_weight"] = self.df["starter_weight"] / 10 print("Data Elements Scaled Successfully!") ``` ⭐ In the *split\_dataset\_by\_labels* function: ⭐ Split data records by the assigned yogurt consistency level (class). ⭐ Add the header defining data fields as the first row. ⭐ Create scaled data records with the scaled data elements and increase the sample number for each scaled data record sharing the same label. ⭐ Then, generate CSV files (samples) from scaled data records, named with the assigned yogurt consistency level and the given sample number. ⭐ Each sample includes five data items \[shape=(5,)]: \*\[0.2304, 0.7387, 0.34587, 0.4251, 0.421] \* * temperature * humidity * pressure * milk\_temperature * starter\_weight ``` def split_dataset_by_labels(self, class_number): l = len(self.df) sample_number = 0 # Split the data set according to the yogurt consistency levels (classes): for i in range(l): # Add the header as the first row: processed_data = [["temperature", "humidity", "pressure", "milk_temperature", "starter_weight"]] if(self.df["consistency_level"][i] == class_number): row = [self.df["scaled_temperature"][i], self.df["scaled_humidity"][i], self.df["scaled_pressure"][i], self.df["scaled_milk_temperature"][i], self.df["scaled_starter_weight"][i]] processed_data.append(row) # Increment the sample number: sample_number+=1 # Create a CSV file for each data record, identified with the sample number. filename = "data/{}.sample_{}.csv".format(self.class_names[class_number], sample_number) with open(filename, "a", newline="") as f: for r in range(len(processed_data)): writer(f).writerow(processed_data[r]) f.close() print("CSV File Successfully Created: " + filename) ``` ⭐ Finally, create appropriately formatted samples as individual CSV files and save them in the *data* folder. ``` dataset.scale_data_elements() for c in range(len(dataset.class_names)): dataset.split_dataset_by_labels(c) ``` 🐄🥛📲 After running the application, it creates samples, saves them under the *data* folder, and prints generated CSV file names on the shell for debugging.



## Step 5.2: Uploading formatted samples to Edge Impulse After generating training and testing samples successfully, I uploaded them to my project on Edge Impulse. :hash: First of all, sign up for [Edge Impulse](https://www.edgeimpulse.com/) and create a new project. :hash: Navigate to the *Data acquisition* page and click the *Upload existing data* button.
:hash: Then, choose the data category (training or testing) and select *Infer from filename* under *Label* to deduce labels from CSV file names automatically. :hash: Finally, select CSV files and click the *Begin upload* button.




## Step 5.3: Training the model on yogurt consistency levels After uploading my training and testing samples successfully, I designed an impulse and trained it on yogurt consistency levels (classes). An impulse is a custom neural network model in Edge Impulse. I created my impulse by employing the *Raw Data* processing block and the *Classification* learning block. The *Raw Data* processing block generate windows from data samples without any specific signal processing. The *Classification* learning block represents a Keras neural network model. Also, it lets the user change the model settings, architecture, and layers. :hash: Go to the *Create impulse* page. Then, select the *Raw Data* processing block and the *Classification* learning block. Finally, click *Save Impulse*. :hash: Before generating features for the neural network model, go to the *Raw data* page and click *Save parameters*. :hash: After saving parameters, click *Generate features* to apply the *Raw data* processing block to training samples.
:hash: Finally, navigate to the *NN Classifier* page and click *Start training*.
According to my experiments with my neural network model, I modified the neural network settings and layers to build a neural network model with high accuracy and validity: 📌 Neural network settings: * Number of training cycles ➡ 50 * Learning level ➡ 0.005 * Validation set size ➡ 20 📌 Extra layers: * Dense layer (20 neurons) * Dense layer (10 neurons) After generating features and training my model with training samples, Edge Impulse evaluated the precision score (accuracy) as *100%*. The precision score (accuracy) is approximately *100%* due to the modest volume and variety of training samples from different batches. In technical terms, the model trains on limited validation samples. Therefore, I am still collecting data to improve my training data set. ## Step 5.4: Evaluating the model accuracy and deploying the model After building and training my neural network model, I tested its accuracy and validity by utilizing testing samples. The evaluated accuracy of the model is *100%*. :hash: To validate the trained model, go to the *Model testing* page and click *Classify all*.

After validating my neural network model, I deployed it as a fully optimized and customizable Arduino library. :hash: To deploy the validated model as an Arduino library, navigate to the *Deployment* page and select *Arduino library*. :hash: Then, choose the *Quantized (int8)* optimization option to get the best performance possible while running the deployed model. :hash: Finally, click *Build* to download the model as an Arduino library.

## Step 6: Setting up the Edge Impulse model on XIAO ESP32C3 After building, training, and deploying my model as an Arduino library on Edge Impulse, I needed to upload the generated Arduino library on XIAO ESP32C3 to run the model directly so as to create an easy-to-use and capable device operating with minimal latency, memory usage, and power consumption. Since Edge Impulse optimizes and formats signal processing, configuration, and learning blocks into a single package while deploying models as Arduino libraries, I was able to import my model effortlessly to run inferences. :hash: After downloading the model as an Arduino library in the ZIP file format, go to *Sketch ➡ Include Library ➡ Add .ZIP Library...* :hash: Then, include the *IoT\_AI-driven\_Yogurt\_Processing\_inferencing.h* file to import the Edge Impulse neural network model. ``` #include <IoT_AI-driven_Yogurt_Processing_inferencing.h> ``` After importing my model successfully to the Arduino IDE, I programmed XIAO ESP32C3 to run inferences when the switch button on the Blynk web application is activated so as to detect yogurt consistency (texture) levels before fermentation. * Blynk Switch Button ➡ Run Inference Also, I employed XIAO ESP32C3 to transmit the collected yogurt processing data to the Blynk application every 30 seconds and send the prediction (detection) result after running inferences successfully. You can download the *AI\_yogurt\_processing\_run\_model.ino* file to try and inspect the code for running Edge Impulse neural network models and communicating with a Blynk application on XIAO ESP32C3. You can inspect the corresponding functions and settings in Step 4. ⭐ Define the *Template ID*, *Device Name*, and *Auth Token* parameters provided by Blynk.Cloud. ``` #define BLYNK_TEMPLATE_ID "<_TEMPLATE_ID_>" #define BLYNK_DEVICE_NAME "<_DEVICE_NAME_>" #define BLYNK_AUTH_TOKEN "<_AUTH_TOKEN_>" ``` ⭐ Include the required libraries. ``` #include <WiFi.h> #include <WiFiClient.h> #include <BlynkSimpleEsp32.h> #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <SensirionI2CSht4x.h> #include <DFRobot_HX711_I2C.h> #include <OneWire.h> #include <DallasTemperature.h> ``` ⭐ Define the required variables for communicating with the Blynk web application and the virtual pins connected to the dashboard widgets. ``` char auth[] = BLYNK_AUTH_TOKEN; #define TEMP_WIDGET V4 #define HUMD_WIDGET V12 #define PRES_WIDGET V6 #define M_TEMP_WIDGET V7 #define WEIGHT_WIDGET V8 #define BUTTON_WIDGET V9 #define LABEL_WIDGET V10 ``` ⭐ Define the required parameters to run an inference with the Edge Impulse model. ⭐ Define the features array (buffer) to classify one frame of data. ``` #define FREQUENCY_HZ EI_CLASSIFIER_FREQUENCY #define INTERVAL_MS (1000 / (FREQUENCY_HZ + 1)) // Define the features array to classify one frame of data. float features[EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE]; size_t feature_ix = 0; ``` ⭐ Define the threshold value (0.60) for the model outputs (predictions). ⭐ Define the yogurt consistency level (class) names: * Thinner * Optimum * Curdling ``` float threshold = 0.60; // Define the yogurt consistency level (class) names: String classes[] = {"Thinner", "Optimum", "Curdling"}; ``` ⭐ Define monochrome graphics. ⭐ Create an array including icons for each yogurt consistency level (class). ``` static const unsigned char PROGMEM *class_icons[] = {thinner, optimum, curdling}; ``` ⭐ Create the Blynk object with the Wi-Fi network settings and the *Auth Token* parameter. ``` Blynk.begin(auth, ssid, pass); ``` ⭐ Initiate the communication between the Blynk web application (dashboard) and XIAO ESP32C3. ``` Blynk.run(); ``` ⭐ In the *update\_Blynk\_parameters* function, transfer the collected yogurt processing data to the Blynk web application (dashboard). ``` void update_Blynk_parameters(){ // Transfer the collected yogurt processing information to the Blynk dashboard. Blynk.virtualWrite(TEMP_WIDGET, temperature); Blynk.virtualWrite(HUMD_WIDGET, humidity); Blynk.virtualWrite(PRES_WIDGET, pressure); Blynk.virtualWrite(M_TEMP_WIDGET, m_temperature); Blynk.virtualWrite(WEIGHT_WIDGET, weight); } ``` ⭐ Obtain the incoming value from the switch (button) widget on the Blynk dashboard. ⭐ Then, change the model running status depending on the received value (True or False). ``` BLYNK_WRITE(BUTTON_WIDGET){ int buttonValue = param.asInt(); if(buttonValue){ model_running = true; } else{ Blynk.virtualWrite(LABEL_WIDGET, "Waiting..."); } } ``` ⭐ In the *run\_inference\_to\_make\_predictions* function: ⭐ Scale (normalize) the collected data depending on the given model and copy the scaled data items to the features array (buffer). ⭐ If required, multiply the scaled data items while copying them to the features array (buffer). ⭐ Display the progress of copying data to the features buffer on the serial monitor. ⭐ If the features buffer is full, create a signal object from the features buffer (frame). ⭐ Then, run the classifier. ⭐ Print the inference timings on the serial monitor. ⭐ Obtain the prediction (detection) result for each given label and print them on the serial monitor. ⭐ The detection result greater than the given threshold (0.60) represents the most accurate label (yogurt consistency level) predicted by the model. ⭐ Print the detected anomalies on the serial monitor, if any. ⭐ Finally, clear the features buffer (frame). ``` void run_inference_to_make_predictions(int multiply){ // Scale (normalize) data items depending on the given model: float scaled_temperature = temperature / 100; float scaled_humidity = humidity / 100; float scaled_pressure = pressure / 1000; float scaled_milk_temperature = m_temperature / 100; float scaled_starter_weight = weight / 10; // Copy the scaled data items to the features buffer. // If required, multiply the scaled data items while copying them to the features buffer. for(int i=0; i<multiply; i++){ features[feature_ix++] = scaled_temperature; features[feature_ix++] = scaled_humidity; features[feature_ix++] = scaled_pressure; features[feature_ix++] = scaled_milk_temperature; features[feature_ix++] = scaled_starter_weight; } // Display the progress of copying data to the features buffer. Serial.print("Features Buffer Progress: "); Serial.print(feature_ix); Serial.print(" / "); Serial.println(EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE); // Run inference: if(feature_ix == EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE){ ei_impulse_result_t result; // Create a signal object from the features buffer (frame). signal_t signal; numpy::signal_from_buffer(features, EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE, &signal); // Run the classifier: EI_IMPULSE_ERROR res = run_classifier(&signal, &result, false); ei_printf("\nrun_classifier returned: %d\n", res); if(res != 0) return; // Print the inference timings on the serial monitor. ei_printf("Predictions (DSP: %d ms., Classification: %d ms., Anomaly: %d ms.): \n", result.timing.dsp, result.timing.classification, result.timing.anomaly); // Obtain the prediction results for each label (class). for(size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++){ // Print the prediction results on the serial monitor. ei_printf("%s:\t%.5f\n", result.classification[ix].label, result.classification[ix].value); // Get the predicted label (class). if(result.classification[ix].value >= threshold) predicted_class = ix; } Serial.print("\nPredicted Class: "); Serial.println(predicted_class); // Detect anomalies, if any: #if EI_CLASSIFIER_HAS_ANOMALY == 1 ei_printf("Anomaly : \t%.3f\n", result.anomaly); #endif // Clear the features buffer (frame): feature_ix = 0; } } ``` ⭐ If the switch (button) widget on the Blynk dashboard is activated, start running an inference with the Edge Impulse model to predict the yogurt consistency level. ⭐ Then, change the model running status to False. ``` if(model_running){ run_inference_to_make_predictions(1); model_running = false; } ``` ⭐ If the Edge Impulse model predicts a yogurt consistency level (class) successfully: ⭐ Display the prediction (detection) result (class) on the SSD1306 OLED screen with its assigned monochrome icon. ⭐ Transfer the predicted label (class) to the Blynk web application (dashboard) to inform the user. ⭐ Clear the predicted label. ``` if(predicted_class != -1){ // Transfer the predicted label (class) to the Blynk application (dashboard). Blynk.virtualWrite(LABEL_WIDGET, classes[predicted_class]); // Print the predicted label (class) on the built-in screen. display.clearDisplay(); display.drawBitmap(48, 0, class_icons[predicted_class], 32, 32, SSD1306_WHITE); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0,40); display.println("Transferred to Blynk"); String c = "Class: " + classes[predicted_class]; int str_x = c.length() * 6; display.setCursor((SCREEN_WIDTH - str_x) / 2, 56); display.println(c); display.display(); // Clear the predicted label (class). predicted_class = -1; delay(1000); } ``` ⭐ Every 30 seconds, transmit the collected environmental factors and culture amount to the Blynk web application so as to update the assigned widgets for each data element on the Blynk dashboard. ``` if(millis() - timer >= 30*1000){ update_Blynk_parameters(); Serial.println("\n\nBlynk Dashboard: Data Transferred Successfully!\n"); timer = millis(); } ```




## Step 7: Running the model on XIAO ESP32C3 to predict yogurt texture levels My Edge Impulse neural network model predicts possibilities of labels (yogurt consistency classes) for the given features buffer as an array of 3 numbers. They represent the model's *"confidence"* that the given features buffer corresponds to each of the three different yogurt consistency levels (classes) \[0 - 2], as shown in Step 5: * 0 — Thinner * 1 — Optimum * 2 — Curdling After executing the *AI\_yogurt\_processing\_run\_model.ino* file on XIAO ESP32C3: 🐄🥛📲 The device shows the opening screen if the sensor and MicroSD card module connections with XIAO ESP32C3 are successful. 🐄🥛📲 Then, the device displays the collected environmental factor measurements and the culture (starter) amount on the SSD1306 OLED screen: * Temperature (°C) * Humidity (%) * Pressure (kPa) * Milk Temperature (°C) * Starter Weight (g)
🐄🥛📲 Also, every 30 seconds, the device transmits the collected yogurt processing data to the Blynk web application so as to update the assigned widgets for each data element on the Blynk dashboard.


🐄🥛📲 If the switch (button) widget is activated on the Blynk dashboard, the device runs an inference with the Edge Impulse model and displays the detection result, which represents the most accurate label (yogurt consistency class) predicted by the model. 🐄🥛📲 Each yogurt consistency level (class) has a unique monochrome icon to be shown on the SSD1306 OLED screen when being predicted (detected) by the model: * Thinner * Optimum * Curdling (Lumpy)


🐄🥛📲 After running the inference successfully, the device also transfers the predicted label (class) to the Blynk web application (dashboard) to inform the user. 🐄🥛📲 Also, the device prints notifications and sensor measurements on the serial monitor for debugging.

As far as my experiments go, the device detects yogurt consistency (texture) levels precisely before fermentation :)


After the fermentation process, I had yogurt batches with the exact consistency (texture) levels predicted by the Edge Impulse neural network model. ## Videos and Conclusion [Data collection | IoT AI-driven Yogurt Processing & Texture Prediction w/ Blynk](https://youtu.be/cpmZZqDV1yA) [Experimenting with the model | IoT AI-driven Yogurt Processing & Texture Prediction w/ Blynk](https://youtu.be/aNV-MDR6RSI) ## Further Discussions By applying neural network models trained on temperature, humidity, pressure, milk temperature, and culture weight measurements in detecting yogurt consistency (texture) levels, we can achieve to: 🐄🥛📲 improve product quality without food additives, 🐄🥛📲 reduce the total cost for local dairies, 🐄🥛📲 incentivize small businesses to produce organic (natural) yogurt. ## References \[^1] Good Food team, *Yogurt*, BBC Good Food, *[https://www.bbcgoodfood.com/glossary/yogurt-glossary](https://www.bbcgoodfood.com/glossary/yogurt-glossary)* \[^2] *Metabolism Characteristics of Lactic Acid Bacteria and the Expanding Applications in Food Industry*, Front. Bioeng. Biotechnol., 12 May 2021, Sec. Synthetic Biology, *[https://doi.org/10.3389/fbioe.2021.612285](https://doi.org/10.3389/fbioe.2021.612285)* # Delivered Package Detection - ESP-EYE Source: https://docs.edgeimpulse.com/projects/expert-network/delivered-package-detection-esp-eye Created By: Solomon Githu Public Project Link: [https://studio.edgeimpulse.com/public/103841/latest](https://studio.edgeimpulse.com/public/103841/latest) ## Background As ecommerce availability continues to expand worldwide, many people prefer to shop online and have their purchases delivered to their homes. As a result, package theft has increased along with more parcels being delivered. According to a recent [SafeWise](https://www.safewise.com/blog/metro-areas-porch-theft/) analysis, 210 million shipments will be stolen in 2021. In some cases, thieves follow delivery trucks and steal the package immediately when it has been delivered. Although there are ways to prevent package theft, such as having packages delivered to the Post Office or giving the courier access to your home remotely, many individuals prefer door deliveries. However, we may not always be around to collect packages, or thieves may be quicker to do so! ## Monitor delivered packages with TinyML There are a couple of techniques to prevent package theft, but we'll focus on parcels delivered to our front porches or mailboxes. We'll use Edge Impulse to create a Machine Learning model that recognizes parcels. The model will then be deployed on a low-cost, low-power device, the [ESP-EYE](https://www.espressif.com/en/products/devkits/esp-eye/overview) development board. This board has a 2MP camera that we will use to collect live video feeds of our shipments. To develop our Machine Learning model, we will use FOMO (Faster Objects, More Objects). This is an algorithm developed by Edge Impulse to enable real-time object detection, tracking and counting on microcontrollers. FOMO is 30x faster than MobileNet SSD and runs in \<200K of RAM. On a Raspberry Pi 4, live classification with FOMO achieved \~27.7 frames per second, while SSD MobileNetV2 gave \~1.56fps. ## Things used in this project ### Hardware components * ESP-EYE Board ### Software * Edge Impulse Studio ## Quick Start You can find the public project here: [Parcel Detection - FOMO](https://studio.edgeimpulse.com/public/103841/latest). To add this project into your account, click “Clone this project” at the top of the page. Next, go to “Deploying to ESP-EYE” section below to learn how to deploy the model to the ESP-EYE board. Alternatively, to create a similar project, follow the next steps after creating a new Edge Impulse project. ## Data Acquisition First, on the Project Dashboard, we set Labeling method to “Bounding boxes (object detection)”. We want our Machine Learning model to detect parcels in an image. To do this, we need pictures of parcels! Note that our dataset only includes box parcels and not envelopes or poly-mailer bags. In total, the dataset has 275 images with an 80/20 split for train and test data. If you want to add more images to the dataset, Edge Impulse has an [uploader](/studio/projects/data-acquisition/dataset/uploader) that enables different ways of adding data to your project. Afterwards, make sure to perform a Train/test split to re-balance your dataset. Next, we annotate the images and label a parcel in each image. ## Impulse Design We can now use our dataset to train our model. This requires two important features: a processing block and learning block. Documentation on Impulse Design can be found [here](/studio/projects/impulse-design). We first click ”Create Impulse”. Here, set image width and height to 96x96; and Resize mode to Squash. The Processing block is set to “Image” and the Learning block is “Object Detection (images)”. Click ‘Save Impulse’ to use this configuration. Since the ESP-EYE is resource-constrained device (4MB flash and 8MB PSRAM), we have used 96x96 image size to lower RAM usage. Next, we go to the processing block “Image” and set Color depth to Grayscale. "Save parameters", and this will open the “Generate Features” tab. Next, we generate features from our training dataset by clicking “Generate features”. The last step is to train our model. We click “Object Detection” which is our Learning block. 60 training cycles with a learning rate of 0.001 were used for this project. We select the FOMO model, by clicking “Choose a different model”.
After training, the model has an F1 score of 94%. An F1-score combines precision and recall into a single metric. ## Model Testing When training our model, we used 80% of the data in our dataset. The remaining 20% is used to test the accuracy of the model in classifying unseen data. We need to verify that our model has not overfit, by testing it on new data. If your model performs poorly, then it means that it overfit (crammed your dataset). This can be resolved by adding more dataset and/or reconfiguring the processing and learning blocks, and even adding Data Augmentation. If you need to increase performance a bit, some tips and tricks can be found in this [guide](/knowledge/guides/increasing-model-performance). Click “Model testing” then “classify all”. Our current model has an accuracy of 91%, which is pretty good.
## Deploying to ESP-EYE board To deploy our model, first go to the “Deployment” section. Next, under “Build firmware” we select Espressif ESP-EYE (ESP32) from the options. To increase performance on the board, we set “Enable EON Compiler” and chose “Quantized(int8)” optimization. This makes our model use 243.9K of RAM and 77.5K of Flash on the board. Chose “Build” and the firmware will be downloaded after the build ends.
Connect an ESP-EYE board to your computer, extract the downloaded firmware and run the script in the folder, to upload it to your board. Great! Now we have our model on the ESP-EYE. To get a live feed of the camera and classification, run the command: `edge-impulse-run-impulse --debug` Next, enter the provided URL in a browser and you will see live feeds from the ESP-EYE. The ESP-EYE gives \~ 1 fps, using 96x96 image size. Using a 48x48 image size gives \~5fps, but the model is not accurate in this case. The performance can be related to the ESP-EYE being a constrained device with limited flash and RAM. Inference has a latency of \~850ms with 96x96 image, while \~200ms with a 48x48 image. Larger images have more bytes that need to be processed, while in lower resolutions useful data for object-detection is collapsed, thus resulting in the poor accuracy. For this use-case of monitoring a front porch, taking one picture every second from ESP-EYE, and analyzing it, is acceptable. However, you can also target higher performance MCUs. FOMO firmware is currently compatible with various boards such as Arduino Nano 33 BLE Sense with a camera, Portenta H7 with a Vision Shield, Himax WE-I Plus, OpenMV, Sony’s Spresense, and Linux-based dev boards. You can also build the model as a library (C++, WebAssembly, TensorRT, Ethos-U, OpenMV, CubeMX, Simplicity Studio Component) and run it on any device! ## Taking it one step farther We can use this model to monitor delivered parcels, and take some actions such as sounding an alarm or sending a text message when no parcel, or fewer parcels are detected. A build library will allow us to add custom code to the predictions. We can check if one or more parcels are predicted, save the count, and then monitor the predictions count. If predictions count goes down, that means a parcel(s) is missing and we can raise an alarm using our development board, and even send a signal to other home automation devices such as security cameras or alarms. Edge Impulse has also developed a feature that enables sending an SMS based on inference from our model. This feature works with Development boards that support Edge Impulse for Linux, such as the Raspberry Pi. The repository and documentation can be found [here](https://github.com/zebular13/example-linux-with-twilio). ## Conclusion Developing Machine Learning models with [Edge Impulse](https://www.edgeimpulse.com/) has always been easy! We have seen how we can create a Machine Learning model capable of detecting parcels, but also run it on a constrained-MCU such as the ESP-EYE. FOMO was chosen in this project so that the model could be small, and also fast! We can now monitor packages easily, with minimal cost and power requirements. This demonstrates the massive potential that TinyML offers to make the world smarter and solve endless problems. Knowledge on deep learning and microcontrollers is not known by everyone, but the Edge Impulse platform provides easy, smarter and faster tools that we can use to create and build edge ML solutions quickly. # Detecting Worker Accidents with Audio Classification - Syntiant TinyML Source: https://docs.edgeimpulse.com/projects/expert-network/detecting-worker-accidents-syntiant-tinyml Created By: Solomon Githu Public Project Link: [https://studio.edgeimpulse.com/public/111611/latest](https://studio.edgeimpulse.com/public/111611/latest) ## Industrial Automation Inefficiencies Towards Accident Detection The International Labor Organization estimates that there are over 1 million work-related fatalities each year and millions of workers suffer from workplace accidents. However, even as technology advancements have improved worker safety in many industries, some accidents involving workers and machines remain undetected as they occur, possibly even leading to fatalities. This is because of the limitations in Machine Safety Systems. Safety sensors, controllers, switches and other machine accessories have been able to provide safety measures during accidents but some events remain undetected by these systems. Some accidents which are difficult to be detected in industries includes: * Falling Objects * Objects strike or fall on employees * Slips or Falls of employees * Chemical burns or exposure * Workers caught in moving machine parts ## Detecting Worker Accidents with AI Sound classification is one of the most widely used applications of Machine Learning. When in danger or scared, we humans respond with audible actions such as screaming, crying, or with words such as: "stop", or "help" . This alerts other people that we are in trouble and can also give them instructions such as stopping a machine, or opening/closing a system. We can use sound classification to give hearing to machines and manufacturing setups so that they can be aware of the environment status. TinyML has enabled us to bring machine learning models to low-cost and low-power microcontrollers. We will use Edge Impulse to develop a machine learning model which is capable of detecting accidents from workers screams and cries. This event can then be used to trigger safety measures such as machine/actuator stop, and sound alarms. The [Syntiant](https://www.syntiant.com/) TinyML Board is a tiny development board with a microphone and accelerometer, USB host microcontroller and an always-on Neural Decision Processor™, featuring ultra low-power consumption, a fully connected neural network architecture, and fully supported by Edge Impulse. Here are quick start tutorials for [Windows](https://drive.google.com/uc?id=1typui5iFPgFrm_sc9DVpeVH0xDItTvQz\&export=download) and [Mac](https://drive.google.com/uc?id=1jr4pyzAa3LVZzlnCP_WCml7-ZQrxYGrH\&export=download). ## Quick Start You can find the public project here: [Acoustic Sensing of Worker Accidents](https://studio.edgeimpulse.com/public/111611/latest). To add this project into your account projects, click "Clone this project" at the top of the window. Next, go to the "Deploying to Syntiant TinyML Board" section below to see how you can deploy the model to the Syntiant TinyML board. Alternatively, to create a similar project, follow the next steps after creating a new Edge Impulse project. ## Data Acquisition We want to create a model that can recognize both key words and human sounds like cries and screams. For these, we have 4 classes in our model: stop, help, cry and scream. In addition to these classes, we also need another class that is not part of our 4 keywords. We label this class as "unknown" and it has sound of people speaking, machines, and vehicles, among others. Each class has 1 second of audio sounds. In total, we have 31 minutes of data for training and 8 minutes of data for testing. For the "unknown" class, we can use Edge Impulse Key Spotting Dataset, which can be obtained [here](/datasets/audio/keyword-spotting). From this dataset we use the "noise" audio files.
## Impulse Design The Impulse design is very unique as we are targeting the Syntiant TinyML board. Under 'Create Impulse' we set the following configurations: Our window size is 968ms, and window increase is 484ms milliseconds(ms). Click 'Add a processing block' and select Audio (Syntiant). Next, we add a learning block by clicking 'Add a learning block' and select Classification (Keras). Click 'Save Impulse' to use this configuration. Next we go to our processing block configuration, Syntiant, and first click 'Save parameters'. The preset parameters will work well so we can use them in our case. On the window 'Generate features', we click the "Generate features" button. Upon completion we see a 3D representation of our dataset. These are the Syntiant blocks that will be passed into the neural network. Lastly, we need to configure our neural network. Start by clicking "NN Classifier" . Here we set the number of training cycle to 80, with a learning rate of 0.0005. Edge Impulse automatically designs a default Neural Network architecture that works very well without requiring the parameters to be changed. However, if you wish to update some parameters, Data Augmentation can improve your model accuracy. Try adding noise, masking time and frequency bands and asses your model performance with each setting. With the training cycles and learning rate set, click "Start training", and you will have a neural network when the task is complete. We get an accuracy of 94%, which is pretty good!
## Model Testing When training our model, we used 80% of the data in our dataset. The remaining 20% is used to test the accuracy of the model in classifying unseen data. We need to verify that our model has not overfit by testing it on new data. If your model performs poorly, then it means that it overfit (crammed your dataset). This can be resolved by adding more data and/or reconfiguring the processing and learning blocks if needed. Increasing performance tricks can be found in this [guide](/knowledge/guides/increasing-model-performance). On the left bar, click "Model testing" then "classify all". Our current model has a performance of 91% which is pretty good and acceptable. From the results we can see new data called "testing" which was obtained from the environment and sent to Edge Impulse. The Expected Outcome column shows which class the collected data belong to. In all cases, our model classifies the sounds correctly as seen in the Result column; it matches the Expected outcome column. ## Deploying to the Syntiant TinyML Board To deploy our model to the Syntiant Board, first click "Deployment". Here, we will first deploy our model as a firmware on the board. When our audible events (cry, scream, help, stop) are detected, the onboard RGB LED will turn on. When the unknown sounds are detected, the on board RGB LED will be off. This runs locally on the board without requiring an internet connection, and runs with minimal power consumption. Under "Build Firmware" select Syntiant TinyML. Next, we need to configure posterior parameters. These are used to tune the precision and recall of our Neural Network activations, to minimize False Rejection Rate and False Activation Rate. More information on posterior parameters can be found here: [Responding to your voice - Syntiant - RC Commands](/tutorials/hardware/syntiant-ndp-keyword-spotting), in "Deploying to your device" section. Under "Configure posterior parameters" click "Find posterior parameters". Check all classes apart from "unknown", and for calibration dataset we use "No calibration (fastest)". After setting the configurations, click "Find parameters". This will start a new task which we have to wait until it is finished. When the job is completed, close the popup window and then click "Build" options to build our firmware. The firmware will be downloaded automatically when the build job completes. Once the firmware is downloaded, we first need to unzip it. Connect a Syntiant TinyML board to your computer using a USB cable. Next, open the unzipped folder and run the flashing script based on your Operating System. We can connect to the board's firmware over Serial. To do this, open a terminal, select the COM Port of the Syntiant TinyML board with settings 115200 8-N-1 settings (in Arduino IDE, that is 115200 baud Carriage return). Sounds such as "stop", "help", "aaagh!" or crying will turn the RGB LED to red.
For the "unknown" sounds, the RGB LED is off. While configuring the posterior parameters, the detected classes that we selected are the ones which trigger the RGB LED lighting. ## Taking it one step further We can use our Machine Learning model as a safety feature for actuators, machines or other operations involving people and machines. To do this we can build custom firmware for our Syntiant TinyML board that turns a GPIO pin HIGH or LOW based on the detected event. The GPIO pin can then be connected to a controller that runs an actuator or a system. The controller can then turn off the actuator or process when a signal is sent by the Syntiant TinyML board. A custom firmware was then created to turn on GPIO 1 HIGH (3.3V) of the Syntiant TinyML Board whenever the alarming sounds are detected. GPIO 1 is next to the GND pin so we can easily use a 2-pin header to connect our TinyML board with another device.
Awesome! What's next now? Checkout the custom firmware [here](https://github.com/SolomonGithu/syntiant-tinyml-firmware-acoustic-detection) and add intelligent sensing to your actuators and also home automation devices! ## Intelligent sensing for 8-bit LoRaWAN actuator I leveraged my TinyML solution and used it to add more sensing to my LoRaWAN actuator. I connected the Syntiant TinyML board to an Atmega and SX1276 based development board called the WaziAct. This board is designed to play as a production LoRa actuator node with an onboard relay which I often use to actuate pumps, solenoids, and electrical devices. I programmed the board to read the pin status connected to the Syntiant TinyML board and when a signal is received it stops executing the main tasks. An alert is also sent to the gateway via LoRa while the main tasks remain halted. The Arduino code can be accessed [here](https://github.com/SolomonGithu/syntiant-tinyml-firmware-acoustic-detection/tree/main/safety_triggering_with_TinyML).
Below is a sneak peak of an indoor test… Now my "press a button" LoRaWAN actuations can run without causing harm such as turning on a faulty device, pouring water via solenoid/pump in unsafe conditions, and other accidental events! ## Conclusion We have seen how we can use sounds to train and deploy our ML solution easily and also run them locally on a development board. TinyML-based intelligent sensing, such as is shown here, is just one of the many solutions that TinyML offers. With Edge Impulse, developing ML models and deploying them has always been easy. The Syntiant TinyML board was chosen for this project because it provides ultra-low power consumption, fully connected neural network architecture, has an onboard microphone, is physically small, and is also fully supported by Edge Impulse. # Deter Shoplifting with Computer Vision - Texas Instruments TDA4VM Source: https://docs.edgeimpulse.com/projects/expert-network/deter-shoplifting-with-computer-vision-ti-tda4vm Created By: Roni Bandini Public Project Link: [https://studio.edgeimpulse.com/public/153222/latest](https://studio.edgeimpulse.com/public/153222/latest) ## Intro As any large retailer knows, lots of potential profits are lost each year due to shoplifting. Shoplifters are rarely caught, and even when they are, many regions have minimal punishment so shoplifters go right back to committing the crime. For this experimental project, I will use a new Vision AI single board computer from Texas Instruments, the TDA4VM, to detect forbidden bags. The TDA4VM SoC and it's Starter Kit contains a dual-core Arm Cortex-A72 processor, C7x DSP, and deep learning, vision and multimedia accelerators onboard. ## TDA4VM Starter Kit Setup First, download the OS image that TI provides here: [https://www.ti.com/tool/download/PROCESSOR-SDK-LINUX-SK-TDA4VM](https://www.ti.com/tool/download/PROCESSOR-SDK-LINUX-SK-TDA4VM) Flash the image onto a microSD card (there is one included with the kit, along with a power cable) and place the card into the board. The TDA4VM Starter Kit board is able to use a Raspberry Pi camera, connected with a standard ribbon cable. In fact, the board actually supports two Raspberry Pi cameras, as there are two connectors on the board. But, at the time of this tutorial, Edge Impulse support for the Raspberry Pi camera is not yet available, so instead you can use popular USB cameras like the Logitech C270, C920 or C922. Connect the camera to a USB port (use a blue USB 3.0 port if possible) and power the board with at least a 5V/3A power supply. Once booted, you'll notice the OS is not a typical Linux version. It called Arago, and has some differences that you might not be used to. Connecting a USB keyboard and HDMI screen won’t work, for example. Instead, you can connect to the board with a UART cable, but since the software tools included are limited (There is no `nano` editor, just `vi` so don't forgot the combinations `:q`, etc!), it is better to connect the Ethernet cable to a router, obtain the IP by checking DHCP lease, and access the board through SSH and SFTP. The OS user account credentials are username: `root`, and there is no password. After you connect with SSH, you will have to press Enter again since there will be no greeting, otherwise and you may think the board is locked up or powered off. If you want to configure the Raspberry Pi camera (though it won't work with Edge Impulse, as mentioned), open `/run/media/mmcblk0p1/uEnv.txt` and edit the file to include: ``` name_overlays=k3-j721e-edgeai-apps.dtbo k3-j721e-sk-rpi-cam-imx219.dtbo ``` Save and reboot the board with `$sudo reboot` ## Data Acquisition The first step is in a computer vision project is data collection, which in this case requires images. We need pictures of bags, lots of them. How can we get those pictures? Open Camera is an [Android app](https://play.google.com/store/apps/details?id=net.sourceforge.opencamera\&hl=en\&gl=US\&pli=1) that includes a "repeat" option that can take X pictures every Y seconds. Using a white background, I took 100 pictures of different bags in different positions. More pictures is even better, but 100 is enough to get started. Then, upload those files to Edge Impulse and label them. Uploading images is easy, using the Edge Impulse Studio. > Note: you can also skip this Data acquisition step, by simply cloning my Edge Impulse project, which will provide you with the images I collected. Go to Data Acquisition, Upload Data with "Automatically split between training and testing" selected. Next, go to the Labeling Queue. Drag a Bounding Box around the location of the bags in each image, and enter the label as 'bag'. This goes relatively quickly as Edge Impulse Studio will attempt to identify the bag automatically on subsequent images, so you may just need to move the box a bit for each picture. ## Model Training With the data all uploaded and labeled, go to **Impulse Design**. An Impulse is a machine learning pipeline. In the first block, select Image Data if it is not already chosen, and set the image width and height to 96 pixels, and Fit shortest axis. Next, choose Image for the Processing block. Then Object Detection in the Learning block. You can learn more about block choices [here](/studio/projects/impulse-design). Save the Impulse and move on to Parameters, then next move on to Generate features. Generating features will give you a visual representation of your data, and you should be able to notice the data is clustered. Move on to Object Detection on the left menu, and you can select the options to begin training your model. I went with 60 cycles, a 0.01 Learning Rate, set aside 20% of my data for Validation, and chose to enable Data Augmentation. You can click the **Start Training** button to begin the process.
Once training is complete, if you get a good F1 Score (75% could be considered good), you can move on to Test the model. Otherwise, you may need to collect more images of bags, alter lighting conditions, vary the location of the bag in your images, or fine tune the training settings. More information on these parameters and what they do, is located [here](/studio/projects/learning-blocks/blocks/classification). To test your model, you can choose **Model testing** on the left navigation, and check to see how well your model performs on unseen data that was set aside when uploading your data. ## Model Deployment To take the built model and install it on the TDA4VM Starter Kit board, head back to your SSD connection to the board. Run this command to install the Edge Impulse Linux runner on the board: ``` $ npm install -g --unsafe-perm edge-impulse-linux ``` Follow the prompts to login to your account, and select the Project to connect to. Back in the Edge Impulse Studio, click on Deployment on the left menu, and you will find all of the methods for building firmware and libraries. In this case, select Texas Instruments, TIDL-RT-Library, and download the `.zip` file that gets generated. That file is going to be needed on the TDA4VM board, so you could use SFTP to place it onto the board, or perhaps just use a USB drive and copy the file from your laptop or desktop PC, onto the USB stick, then place the USB stick into the TDA4VM board and copy it from USB to the local filesystem. Once it's on the TDA4VM board, unzip the file with: `$ unzip tda4vmbagdetector-tidl-lib-v17.zip` Then run: ``` $ edge-impulse-linux-runner --force-engine tidl --force-target runner-linux-aarch64-tda4vm 2>&1 | tee bagdetectorlog.txt ```
## Output Example ``` boundingBoxes 2ms. [{"height":16,"label":"bag","value":0.9940009713172913,"width":16,"x":64,"y":16}] boundingBoxes 1ms. [{"height":8,"label":"bag","value":0.5943511724472046,"width":16,"x":40,"y":24}] boundingBoxes 1ms. [{"height":8,"label":"bag","value":0.6335017085075378,"width":8,"x":40,"y":24}] boundingBoxes 1ms. [{"height":8,"label":"bag","value":0.7399385571479797,"width":8,"x":64,"y":24}] boundingBoxes 1ms. [{"height":8,"label":"bag","value":0.7302699685096741,"width":8,"x":64,"y":24}] boundingBoxes 1ms. [{"height":8,"label":"bag","value":0.5893773436546326,"width":8,"x":64,"y":24}] boundingBoxes 1ms. [{"height":8,"label":"bag","value":0.6636818647384644,"width":8,"x":64,"y":24}] boundingBoxes 1ms. [{"height":8,"label":"bag","value":0.545727550983429,"width":8,"x":64,"y":24}] ``` On our laptop or desktop machine, connecting with a browser to the device IP and port 4912 (for example, http\://:4912) we can see inferences in real time. As an extra bit to get you started, I have also developed a Python script that can check the log, filter by Confidence percent above a certain threshold, and send Telegram alerts. To make use of this script, you just need to: * Download `readLog.py` from [https://github.com/ronibandini/TDA4VM-bag-detector](https://github.com/ronibandini/TDA4VM-bag-detector) * Edit the file to set your Telegram Token, Chat ID and Confidence % threshold * Transfer the file to the TDA4VM via SFTP, or using a USB stick like previously * Run the application with `$ python3 readlog.py` ## Conclusion In this tutorial, we have built a proof-of-concept project to help deter shoplifting and theft. We used a Texas Instruments TDA4VM Vision AI Starter Kit and Edge Impulse to train a computer vision machine learning model that can detect bags, deployed the model to the TDA4VM board, and then added an application that can send an alert if a bag is identified during inferencing. The hardware acceleration built-in to the TDA4VM board performed inferencing at approximately 1ms, or 100 frames per second in this test. Only one camera is being used in this demonstration, but the TDA4VM [can support up to 8 cameras simultaneously](/projects/expert-network/deter-shoplifting-with-computer-vision-ti-tda4vm). ## Sources * [https://recfaces.com/articles/shoplifting-statistics](https://recfaces.com/articles/shoplifting-statistics) * [https://software-dl.ti.com/jacinto7/esd/processor-sdk-linux-edgeai/TDA4VM/latest/exports/docs/devices/TDA4VM/linux/getting\_started.html](https://software-dl.ti.com/jacinto7/esd/processor-sdk-linux-edgeai/TDA4VM/latest/exports/docs/devices/TDA4VM/linux/getting_started.html) * [https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1137524/faq-edge-impulse-setup-on-ti-processors-arm-only?tisearch=e2e-sitesearch\\\&keymatch=faq%3Atrue](https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1137524/faq-edge-impulse-setup-on-ti-processors-arm-only?tisearch=e2e-sitesearch\\\&keymatch=faq%3Atrue) # Dials and Knob Monitoring with Computer Vision - Raspberry Pi Source: https://docs.edgeimpulse.com/projects/expert-network/dials-and-knob-monitoring-with-computer-vision-raspberry-pi Created By: Roni Bandini Public Project Link: [https://studio.edgeimpulse.com/public/130291/latest](https://studio.edgeimpulse.com/public/130291/latest) ## Project Demo