Hello,
I’m experiencing an issue with my Edge Impulse project (ID: 597788).
I exported the project and imported it into Mbed Studio following the official documentation. When testing the model on a NUCLEO-F401RE board, we used raw features from signals that were correctly classified online. However, on the device, the classification results are different and appear to be stuck—it’s always printing the same class.
As a test, we input a vector of all zeros, and only in that case did the classification change to “noise.” I’ve attached a photo showing the terminal output and also included the main.cpp
file used for inference.
Could you help me understand what might be causing this discrepancy? How can I fix it?
Thank you in advance for your support.
#include “mbed.h”
#include “edge-impulse-sdk/classifier/ei_run_classifier.h”
#include <stdio.h>
#include “signals.h”
// Callback function declaration
static int get_signal_data(size_t offset, size_t length, float *out_ptr);
int main(int argc, char **argv) {
signal_t signal; // Wrapper for raw input buffer
ei_impulse_result_t result; // Used to store inference output
EI_IMPULSE_ERROR res; // Return code from inference
// Reset the classifier state before starting the inference
run_classifier_init(); // Add this line to reset the state
// Calculate the length of the buffer
size_t buf_len = sizeof(input_buf) / sizeof(input_buf[0]);
// Make sure that the length of the buffer matches expected input length
if (buf_len != EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE) {
printf(“ERROR: The size of the input buffer is not correct.\r\n”);
printf(“Expected %d items, but got %d\r\n”,
EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE, (int)buf_len);
return 1;
}
// Assign callback function to fill buffer used for preprocessing/inference
signal.total_length = EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE;
signal.get_data = &get_signal_data;
// Perform DSP pre-processing and inference
res = run_classifier(&signal, &result, false);
// Print return code and how long it took to perform inference
printf(“run_classifier returned: %d\r\n”, res);
printf(“Timing: DSP %d ms, inference %d ms, anomaly %d ms\r\n”,
result.timing.dsp, result.timing.classification,
result.timing.anomaly);
// Print the prediction results (object detection)
#if EI_CLASSIFIER_OBJECT_DETECTION == 1
printf(“Object detection bounding boxes:\r\n”);
for (uint32_t i = 0; i < EI_CLASSIFIER_OBJECT_DETECTION_COUNT; i++) {
ei_impulse_result_bounding_box_t bb = result.bounding_boxes[i];
if (bb.value == 0) {
continue;
}
printf(" %s (%f) [ x: %u, y: %u, width: %u, height: %u ]\r\n", bb.label,
bb.value, bb.x, bb.y, bb.width, bb.height);
}
// Print the prediction results (classification)
#else
printf(“Predictions:\r\n”);
for (uint16_t i = 0; i < EI_CLASSIFIER_LABEL_COUNT; i++) {
printf(" %s: “, ei_classifier_inferencing_categories[i]);
printf(”%.5f\r\n", result.classification[i].value);
}
#endif
// Print anomaly result (if it exists)
#if EI_CLASSIFIER_HAS_ANOMALY == 1
printf(“Anomaly prediction: %.3f\r\n”, result.anomaly);
#endif
return 0;
}
// Callback: fill a section of the out_ptr buffer when requested
static int get_signal_data(size_t offset, size_t length, float *out_ptr) {
for (size_t i = 0; i < length; i++) {
out_ptr[i] = (input_buf + offset)[i];
}
return EIDSP_OK;
}