Code integration issue regarding esp32 cam module

Hi,
I have been struggling with esp32 cam project, which i am trying. I will explain my project before the issue.

As you might know ESP32 cam module is capable of running object detection, but the issue is, it keeps on running weather there is a object or not. So I was trying to integrate it with a PIR sensor. It will help the ESP cam to start running detection only when PIR detects object and send a HIGH to ESP. It will increase accuracy and battery life.

So the flow goes something like this:

                                             PIR detects motion, wakes ESP CAM
                                                                        |
                                             ESP CAM starts running detection, checks what it is?
                                                                        |
                                             And blinks LED if a human or animal is detected
                                            (in my case I am blinking a LED if the object 
                                            detected is animal or human, for everything else no action.)
                                                                        |
                                             Once PIR goes LOW, ESP back to sleep. Waits for trigger.

Now i have 2 independent code, one for "PIR wake and LED blink" and one is "ESP32 object detection code", which is readily available, just we need to train our model on edge impule and include the library in arduino IDE.

Now the issue, I have trieded multiple ways to integrate both code with each other, but nothing worked out. I am countinuously encountering "Camera initialization error" and "RAM error " and many other as I change the code. I took AI help too, but no luck.

I am putting both the code below, kindly check and help me integerate them and let me know what i am doing wrong.

AI code

/* Includes ---------------------------------------------------------------- */
#include <EliTrg_detect_inferencing.h>
#include "edge-impulse-sdk/dsp/image/image.hpp"

#include "esp_camera.h"

// Select camera model - find more camera models in camera_pins.h file here
// https://github.com/espressif/arduino-esp32/blob/master/libraries/ESP32/examples/Camera/CameraWebServer/camera_pins.h

#define CAMERA_MODEL_ESP_EYE // Has PSRAM
//#define CAMERA_MODEL_AI_THINKER // Has PSRAM

#if defined(CAMERA_MODEL_ESP_EYE)
#define PWDN_GPIO_NUM    -1
#define RESET_GPIO_NUM   -1
#define XCLK_GPIO_NUM    4
#define SIOD_GPIO_NUM    18
#define SIOC_GPIO_NUM    23

#define Y9_GPIO_NUM      36
#define Y8_GPIO_NUM      37
#define Y7_GPIO_NUM      38
#define Y6_GPIO_NUM      39
#define Y5_GPIO_NUM      35
#define Y4_GPIO_NUM      14
#define Y3_GPIO_NUM      13
#define Y2_GPIO_NUM      34
#define VSYNC_GPIO_NUM   5
#define HREF_GPIO_NUM    27
#define PCLK_GPIO_NUM    25

#elif defined(CAMERA_MODEL_AI_THINKER)
#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27

#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22

#else
#error "Camera model not selected"
#endif

/* Constant defines -------------------------------------------------------- */
#define EI_CAMERA_RAW_FRAME_BUFFER_COLS           320
#define EI_CAMERA_RAW_FRAME_BUFFER_ROWS           240
#define EI_CAMERA_FRAME_BYTE_SIZE                 3

/* Private variables ------------------------------------------------------- */
static bool debug_nn = false; // Set this to true to see e.g. features generated from the raw signal
static bool is_initialised = false;
uint8_t *snapshot_buf; //points to the output of the capture

static camera_config_t camera_config = {
    .pin_pwdn = PWDN_GPIO_NUM,
    .pin_reset = RESET_GPIO_NUM,
    .pin_xclk = XCLK_GPIO_NUM,
    .pin_sscb_sda = SIOD_GPIO_NUM,
    .pin_sscb_scl = SIOC_GPIO_NUM,

    .pin_d7 = Y9_GPIO_NUM,
    .pin_d6 = Y8_GPIO_NUM,
    .pin_d5 = Y7_GPIO_NUM,
    .pin_d4 = Y6_GPIO_NUM,
    .pin_d3 = Y5_GPIO_NUM,
    .pin_d2 = Y4_GPIO_NUM,
    .pin_d1 = Y3_GPIO_NUM,
    .pin_d0 = Y2_GPIO_NUM,
    .pin_vsync = VSYNC_GPIO_NUM,
    .pin_href = HREF_GPIO_NUM,
    .pin_pclk = PCLK_GPIO_NUM,

    //XCLK 20MHz or 10MHz for OV2640 double FPS (Experimental)
    .xclk_freq_hz = 20000000,
    .ledc_timer = LEDC_TIMER_0,
    .ledc_channel = LEDC_CHANNEL_0,

    .pixel_format = PIXFORMAT_JPEG, //YUV422,GRAYSCALE,RGB565,JPEG
    .frame_size = FRAMESIZE_QVGA,    //QQVGA-UXGA Do not use sizes above QVGA when not JPEG

    .jpeg_quality = 12, //0-63 lower number means higher quality
    .fb_count = 1,       //if more than one, i2s runs in continuous mode. Use only with JPEG
    .fb_location = CAMERA_FB_IN_PSRAM,
    .grab_mode = CAMERA_GRAB_WHEN_EMPTY,
};

/* Function definitions ------------------------------------------------------- */
bool ei_camera_init(void);
void ei_camera_deinit(void);
bool ei_camera_capture(uint32_t img_width, uint32_t img_height, uint8_t *out_buf) ;

/**
* @brief      Arduino setup function
*/
void setup()
{
    // put your setup code here, to run once:
    Serial.begin(115200);
    //comment out the below line to start inference immediately after upload
    while (!Serial);
    Serial.println("Edge Impulse Inferencing Demo");
    if (ei_camera_init() == false) {
        ei_printf("Failed to initialize Camera!\r\n");
    }
    else {
        ei_printf("Camera initialized\r\n");
    }

    ei_printf("\nStarting continious inference in 2 seconds...\n");
    ei_sleep(2000);
}

/**
* @brief      Get data and run inferencing
*
* @param[in]  debug  Get debug info if true
*/
void loop()
{

    // instead of wait_ms, we'll wait on the signal, this allows threads to cancel us...
    if (ei_sleep(5) != EI_IMPULSE_OK) {
        return;
    }

    snapshot_buf = (uint8_t*)malloc(EI_CAMERA_RAW_FRAME_BUFFER_COLS * EI_CAMERA_RAW_FRAME_BUFFER_ROWS * EI_CAMERA_FRAME_BYTE_SIZE);

    // check if allocation was successful
    if(snapshot_buf == nullptr) {
        ei_printf("ERR: Failed to allocate snapshot buffer!\n");
        return;
    }

    ei::signal_t signal;
    signal.total_length = EI_CLASSIFIER_INPUT_WIDTH * EI_CLASSIFIER_INPUT_HEIGHT;
    signal.get_data = &ei_camera_get_data;

    if (ei_camera_capture((size_t)EI_CLASSIFIER_INPUT_WIDTH, (size_t)EI_CLASSIFIER_INPUT_HEIGHT, snapshot_buf) == false) {
        ei_printf("Failed to capture image\r\n");
        free(snapshot_buf);
        return;
    }

    // Run the classifier
    ei_impulse_result_t result = { 0 };

    EI_IMPULSE_ERROR err = run_classifier(&signal, &result, debug_nn);
    if (err != EI_IMPULSE_OK) {
        ei_printf("ERR: Failed to run classifier (%d)\n", err);
        return;
    }

    // print the predictions
    ei_printf("Predictions (DSP: %d ms., Classification: %d ms., Anomaly: %d ms.): \n",
                result.timing.dsp, result.timing.classification, result.timing.anomaly);

#if EI_CLASSIFIER_OBJECT_DETECTION == 1
    ei_printf("Object detection bounding boxes:\r\n");
    for (uint32_t i = 0; i < result.bounding_boxes_count; i++) {
        ei_impulse_result_bounding_box_t bb = result.bounding_boxes[i];
        if (bb.value == 0) {
            continue;
        }
        ei_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
    ei_printf("Predictions:\r\n");
    for (uint16_t i = 0; i < EI_CLASSIFIER_LABEL_COUNT; i++) {
        ei_printf("  %s: ", ei_classifier_inferencing_categories[i]);
        ei_printf("%.5f\r\n", result.classification[i].value);
    }
#endif

    // Print anomaly result (if it exists)
#if EI_CLASSIFIER_HAS_ANOMALY
    ei_printf("Anomaly prediction: %.3f\r\n", result.anomaly);
#endif

#if EI_CLASSIFIER_HAS_VISUAL_ANOMALY
    ei_printf("Visual anomalies:\r\n");
    for (uint32_t i = 0; i < result.visual_ad_count; i++) {
        ei_impulse_result_bounding_box_t bb = result.visual_ad_grid_cells[i];
        if (bb.value == 0) {
            continue;
        }
        ei_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);
    }
#endif


    free(snapshot_buf);

}

/**
 * @brief   Setup image sensor & start streaming
 *
 * @retval  false if initialisation failed
 */
bool ei_camera_init(void) {

    if (is_initialised) return true;

#if defined(CAMERA_MODEL_ESP_EYE)
  pinMode(13, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);
#endif

    //initialize the camera
    esp_err_t err = esp_camera_init(&camera_config);
    if (err != ESP_OK) {
      Serial.printf("Camera init failed with error 0x%x\n", err);
      return false;
    }

    sensor_t * s = esp_camera_sensor_get();
    // initial sensors are flipped vertically and colors are a bit saturated
    if (s->id.PID == OV3660_PID) {
      s->set_vflip(s, 1); // flip it back
      s->set_brightness(s, 1); // up the brightness just a bit
      s->set_saturation(s, 0); // lower the saturation
    }

#if defined(CAMERA_MODEL_M5STACK_WIDE)
    s->set_vflip(s, 1);
    s->set_hmirror(s, 1);
#elif defined(CAMERA_MODEL_ESP_EYE)
    s->set_vflip(s, 1);
    s->set_hmirror(s, 1);
    s->set_awb_gain(s, 1);
#endif

    is_initialised = true;
    return true;
}

/**
 * @brief      Stop streaming of sensor data
 */
void ei_camera_deinit(void) {

    //deinitialize the camera
    esp_err_t err = esp_camera_deinit();

    if (err != ESP_OK)
    {
        ei_printf("Camera deinit failed\n");
        return;
    }

    is_initialised = false;
    return;
}


/**
 * @brief      Capture, rescale and crop image
 *
 * @param[in]  img_width     width of output image
 * @param[in]  img_height    height of output image
 * @param[in]  out_buf       pointer to store output image, NULL may be used
 *                           if ei_camera_frame_buffer is to be used for capture and resize/cropping.
 *
 * @retval     false if not initialised, image captured, rescaled or cropped failed
 *
 */
bool ei_camera_capture(uint32_t img_width, uint32_t img_height, uint8_t *out_buf) {
    bool do_resize = false;

    if (!is_initialised) {
        ei_printf("ERR: Camera is not initialized\r\n");
        return false;
    }

    camera_fb_t *fb = esp_camera_fb_get();

    if (!fb) {
        ei_printf("Camera capture failed\n");
        return false;
    }

   bool converted = fmt2rgb888(fb->buf, fb->len, PIXFORMAT_JPEG, snapshot_buf);

   esp_camera_fb_return(fb);

   if(!converted){
       ei_printf("Conversion failed\n");
       return false;
   }

    if ((img_width != EI_CAMERA_RAW_FRAME_BUFFER_COLS)
        || (img_height != EI_CAMERA_RAW_FRAME_BUFFER_ROWS)) {
        do_resize = true;
    }

    if (do_resize) {
        ei::image::processing::crop_and_interpolate_rgb888(
        out_buf,
        EI_CAMERA_RAW_FRAME_BUFFER_COLS,
        EI_CAMERA_RAW_FRAME_BUFFER_ROWS,
        out_buf,
        img_width,
        img_height);
    }


    return true;
}

static int ei_camera_get_data(size_t offset, size_t length, float *out_ptr)
{
    // we already have a RGB888 buffer, so recalculate offset into pixel index
    size_t pixel_ix = offset * 3;
    size_t pixels_left = length;
    size_t out_ptr_ix = 0;

    while (pixels_left != 0) {
        // Swap BGR to RGB here
        // due to https://github.com/espressif/esp32-camera/issues/379
        out_ptr[out_ptr_ix] = (snapshot_buf[pixel_ix + 2] << 16) + (snapshot_buf[pixel_ix + 1] << 8) + snapshot_buf[pixel_ix];

        // go to the next pixel
        out_ptr_ix++;
        pixel_ix+=3;
        pixels_left--;
    }
    // and done!
    return 0;
}

#if !defined(EI_CLASSIFIER_SENSOR) || EI_CLASSIFIER_SENSOR != EI_CLASSIFIER_SENSOR_CAMERA
#error "Invalid model for current sensor"
#endif

PIR code

#define PIR_PIN     13      // PIR sensor output connected to GPIO13
#define LED_PIN     4       // Onboard LED (or external LED)
#define BLINK_TIME  3000    // LED on duration in ms

void enterDeepSleep() {
  digitalWrite(LED_PIN, LOW);
  pinMode(PIR_PIN, INPUT);
  esp_sleep_enable_ext0_wakeup((gpio_num_t)PIR_PIN, 0); // Wake on HIGH
  Serial.println("Going to sleep...");
  delay(1000); // Allow time for serial print
  esp_deep_sleep_start();
}

void setup() {
  Serial.begin(115200);
  delay(1000);
  Serial.println("Booting...");

  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);

  // Check wakeup reason
  if (esp_sleep_get_wakeup_cause() != ESP_SLEEP_WAKEUP_EXT0) {
    Serial.println("Cold boot. Going to sleep...");
    enterDeepSleep();
  }

  Serial.println("Motion detected!");
  digitalWrite(LED_PIN, HIGH);
  delay(BLINK_TIME);
  enterDeepSleep();
}

void loop() {
  // Nothing here; system will sleep in setup()
}

Thankyou

Show us a picture of the esp32 board front and back.
Do an auto format on your code and reduce the needed vertical white space.
I don't understand where the second sketch PIR code is loaded. Are you using two MCUs?

@sonofcy sorry for the inconvenience, as the platform don't allow newbee to upload files, I was forced to do it that way.

I will put all the details below properly.

==============================================
Device Image's

====================================================
Code for PIR sensor - start

#define PIR_PIN 13       // PIR sensor output connected to GPIO13
#define LED_PIN 4        // Onboard LED (or external LED)
#define BLINK_TIME 3000  // LED on duration in ms

void enterDeepSleep() {
         digitalWrite(LED_PIN, LOW);
         pinMode(PIR_PIN, INPUT);
         esp_sleep_enable_ext0_wakeup((gpio_num_t)PIR_PIN, 0);  // Wake on HIGH
         Serial.println("Going to sleep...");
         delay(1000);  // Allow time for serial print
        esp_deep_sleep_start();
}

void setup() {
        Serial.begin(115200);
       delay(1000);
       Serial.println("Booting...");

       pinMode(LED_PIN, OUTPUT);
       digitalWrite(LED_PIN, LOW);

  // Check wakeup reason
  if (esp_sleep_get_wakeup_cause() != ESP_SLEEP_WAKEUP_EXT0) {
          Serial.println("Cold boot. Going to sleep...");
          enterDeepSleep();
  }

      Serial.println("Motion detected!");
      digitalWrite(LED_PIN, HIGH);
      delay(BLINK_TIME);
       enterDeepSleep();
}

void loop() {
      // Nothing here; system will sleep in setup()
}

====================================================
Code for PIR sensor - end


=======================================
Code for AI object detection - start

// These sketches are tested with 2.0.4 ESP32 Arduino Core
// https://github.com/espressif/arduino-esp32/releases/tag/2.0.4

/* Includes ---------------------------------------------------------------- */
#include <EliTrg_detect_inferencing.h>
#include "edge-impulse-sdk/dsp/image/image.hpp"

#include "esp_camera.h"

// Select camera model - find more camera models in camera_pins.h file here
// https://github.com/espressif/arduino-esp32/blob/master/libraries/ESP32/examples/Camera/CameraWebServer/camera_pins.h

// #define CAMERA_MODEL_ESP_EYE // Has PSRAM
#define CAMERA_MODEL_AI_THINKER // Has PSRAM

#if defined(CAMERA_MODEL_ESP_EYE)
#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 4
#define SIOD_GPIO_NUM 18
#define SIOC_GPIO_NUM 23

#define Y9_GPIO_NUM 36
#define Y8_GPIO_NUM 37
#define Y7_GPIO_NUM 38
#define Y6_GPIO_NUM 39
#define Y5_GPIO_NUM 35
#define Y4_GPIO_NUM 14
#define Y3_GPIO_NUM 13
#define Y2_GPIO_NUM 34
#define VSYNC_GPIO_NUM 5
#define HREF_GPIO_NUM 27
#define PCLK_GPIO_NUM 25

#elif defined(CAMERA_MODEL_AI_THINKER)
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27

#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22

#else
#error "Camera model not selected"
#endif

/* Constant defines -------------------------------------------------------- */
#define EI_CAMERA_RAW_FRAME_BUFFER_COLS 320
#define EI_CAMERA_RAW_FRAME_BUFFER_ROWS 240
#define EI_CAMERA_FRAME_BYTE_SIZE 3

/* Private variables ------------------------------------------------------- */
static bool debug_nn = false; // Set this to true to see e.g. features generated from the raw signal
static bool is_initialised = false;
uint8_t *snapshot_buf; // points to the output of the capture

static camera_config_t camera_config = {
    .pin_pwdn = PWDN_GPIO_NUM,
    .pin_reset = RESET_GPIO_NUM,
    .pin_xclk = XCLK_GPIO_NUM,
    .pin_sscb_sda = SIOD_GPIO_NUM,
    .pin_sscb_scl = SIOC_GPIO_NUM,

    .pin_d7 = Y9_GPIO_NUM,
    .pin_d6 = Y8_GPIO_NUM,
    .pin_d5 = Y7_GPIO_NUM,
    .pin_d4 = Y6_GPIO_NUM,
    .pin_d3 = Y5_GPIO_NUM,
    .pin_d2 = Y4_GPIO_NUM,
    .pin_d1 = Y3_GPIO_NUM,
    .pin_d0 = Y2_GPIO_NUM,
    .pin_vsync = VSYNC_GPIO_NUM,
    .pin_href = HREF_GPIO_NUM,
    .pin_pclk = PCLK_GPIO_NUM,

    // XCLK 20MHz or 10MHz for OV2640 double FPS (Experimental)
    .xclk_freq_hz = 20000000,
    .ledc_timer = LEDC_TIMER_0,
    .ledc_channel = LEDC_CHANNEL_0,

    .pixel_format = PIXFORMAT_JPEG, // YUV422,GRAYSCALE,RGB565,JPEG
    .frame_size = FRAMESIZE_QVGA,   // QQVGA-UXGA Do not use sizes above QVGA when not JPEG

    .jpeg_quality = 12, // 0-63 lower number means higher quality
    .fb_count = 1,      // if more than one, i2s runs in continuous mode. Use only with JPEG
    .fb_location = CAMERA_FB_IN_PSRAM,
    .grab_mode = CAMERA_GRAB_WHEN_EMPTY,
};

/* Function definitions ------------------------------------------------------- */
bool ei_camera_init(void);
void ei_camera_deinit(void);
bool ei_camera_capture(uint32_t img_width, uint32_t img_height, uint8_t *out_buf);

/**
 * @brief      Arduino setup function
 */
void setup()
{
    // put your setup code here, to run once:
    Serial.begin(115200);
    // comment out the below line to start inference immediately after upload
    while (!Serial)
        ;
    Serial.println("Edge Impulse Inferencing Demo");
    if (ei_camera_init() == false)
    {
        ei_printf("Failed to initialize Camera!\r\n");
    }
    else
    {
        ei_printf("Camera initialized\r\n");
    }

    ei_printf("\nStarting continious inference in 2 seconds...\n");
    ei_sleep(2000);
}

/**
 * @brief      Get data and run inferencing
 *
 * @param[in]  debug  Get debug info if true
 */
void loop()
{

    // instead of wait_ms, we'll wait on the signal, this allows threads to cancel us...
    if (ei_sleep(5) != EI_IMPULSE_OK)
    {
        return;
    }

    snapshot_buf = (uint8_t *)malloc(EI_CAMERA_RAW_FRAME_BUFFER_COLS * EI_CAMERA_RAW_FRAME_BUFFER_ROWS * EI_CAMERA_FRAME_BYTE_SIZE);

    // check if allocation was successful
    if (snapshot_buf == nullptr)
    {
        ei_printf("ERR: Failed to allocate snapshot buffer!\n");
        return;
    }

    ei::signal_t signal;
    signal.total_length = EI_CLASSIFIER_INPUT_WIDTH * EI_CLASSIFIER_INPUT_HEIGHT;
    signal.get_data = &ei_camera_get_data;

    if (ei_camera_capture((size_t)EI_CLASSIFIER_INPUT_WIDTH, (size_t)EI_CLASSIFIER_INPUT_HEIGHT, snapshot_buf) == false)
    {
        ei_printf("Failed to capture image\r\n");
        free(snapshot_buf);
        return;
    }

    // Run the classifier
    ei_impulse_result_t result = {0};

    EI_IMPULSE_ERROR err = run_classifier(&signal, &result, debug_nn);
    if (err != EI_IMPULSE_OK)
    {
        ei_printf("ERR: Failed to run classifier (%d)\n", err);
        return;
    }

    // print the predictions
    ei_printf("Predictions (DSP: %d ms., Classification: %d ms., Anomaly: %d ms.): \n",
              result.timing.dsp, result.timing.classification, result.timing.anomaly);

#if EI_CLASSIFIER_OBJECT_DETECTION == 1
    ei_printf("Object detection bounding boxes:\r\n");
    for (uint32_t i = 0; i < result.bounding_boxes_count; i++)
    {
        ei_impulse_result_bounding_box_t bb = result.bounding_boxes[i];
        if (bb.value == 0)
        {
            continue;
        }
        ei_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
    ei_printf("Predictions:\r\n");
    for (uint16_t i = 0; i < EI_CLASSIFIER_LABEL_COUNT; i++)
    {
        ei_printf("  %s: ", ei_classifier_inferencing_categories[i]);
        ei_printf("%.5f\r\n", result.classification[i].value);
    }
#endif

    // Print anomaly result (if it exists)
#if EI_CLASSIFIER_HAS_ANOMALY
    ei_printf("Anomaly prediction: %.3f\r\n", result.anomaly);
#endif

#if EI_CLASSIFIER_HAS_VISUAL_ANOMALY
    ei_printf("Visual anomalies:\r\n");
    for (uint32_t i = 0; i < result.visual_ad_count; i++)
    {
        ei_impulse_result_bounding_box_t bb = result.visual_ad_grid_cells[i];
        if (bb.value == 0)
        {
            continue;
        }
        ei_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);
    }
#endif

    free(snapshot_buf);
}

/**
 * @brief   Setup image sensor & start streaming
 *
 * @retval  false if initialisation failed
 */
bool ei_camera_init(void)
{

    if (is_initialised)
        return true;

#if defined(CAMERA_MODEL_ESP_EYE)
    pinMode(13, INPUT_PULLUP);
    pinMode(14, INPUT_PULLUP);
#endif

    // initialize the camera
    esp_err_t err = esp_camera_init(&camera_config);
    if (err != ESP_OK)
    {
        Serial.printf("Camera init failed with error 0x%x\n", err);
        return false;
    }

    sensor_t *s = esp_camera_sensor_get();
    // initial sensors are flipped vertically and colors are a bit saturated
    if (s->id.PID == OV3660_PID)
    {
        s->set_vflip(s, 1);      // flip it back
        s->set_brightness(s, 1); // up the brightness just a bit
        s->set_saturation(s, 0); // lower the saturation
    }

#if defined(CAMERA_MODEL_M5STACK_WIDE)
    s->set_vflip(s, 1);
    s->set_hmirror(s, 1);
#elif defined(CAMERA_MODEL_ESP_EYE)
    s->set_vflip(s, 1);
    s->set_hmirror(s, 1);
    s->set_awb_gain(s, 1);
#endif

    is_initialised = true;
    return true;
}

/**
 * @brief      Stop streaming of sensor data
 */
void ei_camera_deinit(void)
{

    // deinitialize the camera
    esp_err_t err = esp_camera_deinit();

    if (err != ESP_OK)
    {
        ei_printf("Camera deinit failed\n");
        return;
    }

    is_initialised = false;
    return;
}

/**
 * @brief      Capture, rescale and crop image
 *
 * @param[in]  img_width     width of output image
 * @param[in]  img_height    height of output image
 * @param[in]  out_buf       pointer to store output image, NULL may be used
 *                           if ei_camera_frame_buffer is to be used for capture and resize/cropping.
 *
 * @retval     false if not initialised, image captured, rescaled or cropped failed
 *
 */
bool ei_camera_capture(uint32_t img_width, uint32_t img_height, uint8_t *out_buf)
{
    bool do_resize = false;

    if (!is_initialised)
    {
        ei_printf("ERR: Camera is not initialized\r\n");
        return false;
    }

    camera_fb_t *fb = esp_camera_fb_get();

    if (!fb)
    {
        ei_printf("Camera capture failed\n");
        return false;
    }

    bool converted = fmt2rgb888(fb->buf, fb->len, PIXFORMAT_JPEG, snapshot_buf);

    esp_camera_fb_return(fb);

    if (!converted)
    {
        ei_printf("Conversion failed\n");
        return false;
    }

    if ((img_width != EI_CAMERA_RAW_FRAME_BUFFER_COLS) || (img_height != EI_CAMERA_RAW_FRAME_BUFFER_ROWS))
    {
        do_resize = true;
    }

    if (do_resize)
    {
        ei::image::processing::crop_and_interpolate_rgb888(
            out_buf,
            EI_CAMERA_RAW_FRAME_BUFFER_COLS,
            EI_CAMERA_RAW_FRAME_BUFFER_ROWS,
            out_buf,
            img_width,
            img_height);
    }

    return true;
}

static int ei_camera_get_data(size_t offset, size_t length, float *out_ptr)
{
    // we already have a RGB888 buffer, so recalculate offset into pixel index
    size_t pixel_ix = offset * 3;
    size_t pixels_left = length;
    size_t out_ptr_ix = 0;

    while (pixels_left != 0)
    {
        // Swap BGR to RGB here
        // due to https://github.com/espressif/esp32-camera/issues/379
        out_ptr[out_ptr_ix] = (snapshot_buf[pixel_ix + 2] << 16) + (snapshot_buf[pixel_ix + 1] << 8) + snapshot_buf[pixel_ix];

        // go to the next pixel
        out_ptr_ix++;
        pixel_ix += 3;
        pixels_left--;
    }
    // and done!
    return 0;
}

#if !defined(EI_CLASSIFIER_SENSOR) || EI_CLASSIFIER_SENSOR != EI_CLASSIFIER_SENSOR_CAMERA
#error "Invalid model for current sensor"
#endif

=======================================
Code for AI object detection - end

I hope the now it's understandable. And no, I only have 1 MCU. I need help in integretion of these two codes. As I am trying to integerate the ESP32 cam with PIR. I have mentioned all the details above. Kindly have a look and you will understand, what I am trying to achive. I tried integrating the code but none of the approach worked. If needed I can send my trial codes, which did not work for me.

I will again mention the flow of the project below. But please have a look above, I have given more detail's.

==========================================================================
PIR detects motion, wakes ESP CAM
|
ESP CAM starts running detection, checks what it is?
|
And blinks LED if a human or animal is detected
(in my case I am blinking a LED if the object
detected is animal or human, for everything else no action.)
|
Once PIR goes LOW, ESP back to sleep. Waits for trigger.

If I am unable to make myself clear above. I will try again in simple. As you know ESP32 cam runs object detection. But it's countinuously ON, which is not good if we are using a battery, it will drain soon. So integrating it with PIR trigger, will save a lot of power. CAM will start only when PIR sends HIGH, other time it will be in sleep and save power. It will also help increase accuracy as a good quality PIR will only give HIGH when something genuinely moves and AI will also not generate false alarm's.

Thank you.

I rarely give the answer but just point in the right direction but I will help more here. Simply add the PIR setup before the esp32 setup removing any duplicate lines like serial.begin.
Now rename the pir loop to a new name like processPir and stick that entire block of code ahead of the setup. In the esp32cam main loop, find an appropriate place to call the pitProcess function. Good luck.

Sorry, I didn't read and understand the PIR part fully. You will probably need to either break that code up into several functions, or rewrite it slightly. The PIR code must reflect what you wrote in bold.

Ok, I will do one thing @sonofcy, I will put both code in two seperate reply, for perfect readability. Kindly check and let me know.

PIR code

#define PIR_PIN 13       // PIR sensor output connected to GPIO13
#define LED_PIN 4        // Onboard LED (or external LED)
#define BLINK_TIME 3000  // LED on duration in ms

void enterDeepSleep() {
  digitalWrite(LED_PIN, LOW);
  pinMode(PIR_PIN, INPUT);
  esp_sleep_enable_ext0_wakeup((gpio_num_t)PIR_PIN, 0);  // Wake on HIGH
  Serial.println("Going to sleep...");
  delay(1000);  // Allow time for serial print
  esp_deep_sleep_start();
}

void setup() {
  Serial.begin(115200);
  delay(1000);
  Serial.println("Booting...");

  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);

  // Check wakeup reason
  if (esp_sleep_get_wakeup_cause() != ESP_SLEEP_WAKEUP_EXT0) {
    Serial.println("Cold boot. Going to sleep...");
    enterDeepSleep();
  }

  Serial.println("Motion detected!");
  digitalWrite(LED_PIN, HIGH);
  delay(BLINK_TIME);
  enterDeepSleep();
}

void loop() {
  // Nothing here; system will sleep in setup()
}

AI code

/* Includes ---------------------------------------------------------------- */
#include <EliTrg_detect_inferencing.h>
#include "edge-impulse-sdk/dsp/image/image.hpp"

#include "esp_camera.h"

// Select camera model - find more camera models in camera_pins.h file here
// https://github.com/espressif/arduino-esp32/blob/master/libraries/ESP32/examples/Camera/CameraWebServer/camera_pins.h

// #define CAMERA_MODEL_ESP_EYE // Has PSRAM
#define CAMERA_MODEL_AI_THINKER // Has PSRAM

#if defined(CAMERA_MODEL_ESP_EYE)
#define PWDN_GPIO_NUM    -1
#define RESET_GPIO_NUM   -1
#define XCLK_GPIO_NUM    4
#define SIOD_GPIO_NUM    18
#define SIOC_GPIO_NUM    23

#define Y9_GPIO_NUM      36
#define Y8_GPIO_NUM      37
#define Y7_GPIO_NUM      38
#define Y6_GPIO_NUM      39
#define Y5_GPIO_NUM      35
#define Y4_GPIO_NUM      14
#define Y3_GPIO_NUM      13
#define Y2_GPIO_NUM      34
#define VSYNC_GPIO_NUM   5
#define HREF_GPIO_NUM    27
#define PCLK_GPIO_NUM    25

#elif defined(CAMERA_MODEL_AI_THINKER)
#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27

#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22

#else
#error "Camera model not selected"
#endif

/* Constant defines -------------------------------------------------------- */
#define EI_CAMERA_RAW_FRAME_BUFFER_COLS           320
#define EI_CAMERA_RAW_FRAME_BUFFER_ROWS           240
#define EI_CAMERA_FRAME_BYTE_SIZE                 3

/* Private variables ------------------------------------------------------- */
static bool debug_nn = false; // Set this to true to see e.g. features generated from the raw signal
static bool is_initialised = false;
uint8_t *snapshot_buf; //points to the output of the capture

static camera_config_t camera_config = {
    .pin_pwdn = PWDN_GPIO_NUM,
    .pin_reset = RESET_GPIO_NUM,
    .pin_xclk = XCLK_GPIO_NUM,
    .pin_sscb_sda = SIOD_GPIO_NUM,
    .pin_sscb_scl = SIOC_GPIO_NUM,

    .pin_d7 = Y9_GPIO_NUM,
    .pin_d6 = Y8_GPIO_NUM,
    .pin_d5 = Y7_GPIO_NUM,
    .pin_d4 = Y6_GPIO_NUM,
    .pin_d3 = Y5_GPIO_NUM,
    .pin_d2 = Y4_GPIO_NUM,
    .pin_d1 = Y3_GPIO_NUM,
    .pin_d0 = Y2_GPIO_NUM,
    .pin_vsync = VSYNC_GPIO_NUM,
    .pin_href = HREF_GPIO_NUM,
    .pin_pclk = PCLK_GPIO_NUM,

    //XCLK 20MHz or 10MHz for OV2640 double FPS (Experimental)
    .xclk_freq_hz = 20000000,
    .ledc_timer = LEDC_TIMER_0,
    .ledc_channel = LEDC_CHANNEL_0,

    .pixel_format = PIXFORMAT_JPEG, //YUV422,GRAYSCALE,RGB565,JPEG
    .frame_size = FRAMESIZE_QVGA,    //QQVGA-UXGA Do not use sizes above QVGA when not JPEG

    .jpeg_quality = 12, //0-63 lower number means higher quality
    .fb_count = 1,       //if more than one, i2s runs in continuous mode. Use only with JPEG
    .fb_location = CAMERA_FB_IN_PSRAM,
    .grab_mode = CAMERA_GRAB_WHEN_EMPTY,
};

/* Function definitions ------------------------------------------------------- */
bool ei_camera_init(void);
void ei_camera_deinit(void);
bool ei_camera_capture(uint32_t img_width, uint32_t img_height, uint8_t *out_buf) ;

/**
* @brief      Arduino setup function
*/
void setup()
{
    // put your setup code here, to run once:
    Serial.begin(115200);
    //comment out the below line to start inference immediately after upload
    while (!Serial);
    Serial.println("Edge Impulse Inferencing Demo");
    if (ei_camera_init() == false) {
        ei_printf("Failed to initialize Camera!\r\n");
    }
    else {
        ei_printf("Camera initialized\r\n");
    }

    ei_printf("\nStarting continious inference in 2 seconds...\n");
    ei_sleep(2000);
}

/**
* @brief      Get data and run inferencing
*
* @param[in]  debug  Get debug info if true
*/
void loop()
{

    // instead of wait_ms, we'll wait on the signal, this allows threads to cancel us...
    if (ei_sleep(5) != EI_IMPULSE_OK) {
        return;
    }

    snapshot_buf = (uint8_t*)malloc(EI_CAMERA_RAW_FRAME_BUFFER_COLS * EI_CAMERA_RAW_FRAME_BUFFER_ROWS * EI_CAMERA_FRAME_BYTE_SIZE);

    // check if allocation was successful
    if(snapshot_buf == nullptr) {
        ei_printf("ERR: Failed to allocate snapshot buffer!\n");
        return;
    }

    ei::signal_t signal;
    signal.total_length = EI_CLASSIFIER_INPUT_WIDTH * EI_CLASSIFIER_INPUT_HEIGHT;
    signal.get_data = &ei_camera_get_data;

    if (ei_camera_capture((size_t)EI_CLASSIFIER_INPUT_WIDTH, (size_t)EI_CLASSIFIER_INPUT_HEIGHT, snapshot_buf) == false) {
        ei_printf("Failed to capture image\r\n");
        free(snapshot_buf);
        return;
    }

    // Run the classifier
    ei_impulse_result_t result = { 0 };

    EI_IMPULSE_ERROR err = run_classifier(&signal, &result, debug_nn);
    if (err != EI_IMPULSE_OK) {
        ei_printf("ERR: Failed to run classifier (%d)\n", err);
        return;
    }

    // print the predictions
    ei_printf("Predictions (DSP: %d ms., Classification: %d ms., Anomaly: %d ms.): \n",
                result.timing.dsp, result.timing.classification, result.timing.anomaly);

#if EI_CLASSIFIER_OBJECT_DETECTION == 1
    ei_printf("Object detection bounding boxes:\r\n");
    for (uint32_t i = 0; i < result.bounding_boxes_count; i++) {
        ei_impulse_result_bounding_box_t bb = result.bounding_boxes[i];
        if (bb.value == 0) {
            continue;
        }
        ei_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
    ei_printf("Predictions:\r\n");
    for (uint16_t i = 0; i < EI_CLASSIFIER_LABEL_COUNT; i++) {
        ei_printf("  %s: ", ei_classifier_inferencing_categories[i]);
        ei_printf("%.5f\r\n", result.classification[i].value);
    }
#endif

    // Print anomaly result (if it exists)
#if EI_CLASSIFIER_HAS_ANOMALY
    ei_printf("Anomaly prediction: %.3f\r\n", result.anomaly);
#endif

#if EI_CLASSIFIER_HAS_VISUAL_ANOMALY
    ei_printf("Visual anomalies:\r\n");
    for (uint32_t i = 0; i < result.visual_ad_count; i++) {
        ei_impulse_result_bounding_box_t bb = result.visual_ad_grid_cells[i];
        if (bb.value == 0) {
            continue;
        }
        ei_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);
    }
#endif


    free(snapshot_buf);

}

/**
 * @brief   Setup image sensor & start streaming
 *
 * @retval  false if initialisation failed
 */
bool ei_camera_init(void) {

    if (is_initialised) return true;

#if defined(CAMERA_MODEL_ESP_EYE)
  pinMode(13, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);
#endif

    //initialize the camera
    esp_err_t err = esp_camera_init(&camera_config);
    if (err != ESP_OK) {
      Serial.printf("Camera init failed with error 0x%x\n", err);
      return false;
    }

    sensor_t * s = esp_camera_sensor_get();
    // initial sensors are flipped vertically and colors are a bit saturated
    if (s->id.PID == OV3660_PID) {
      s->set_vflip(s, 1); // flip it back
      s->set_brightness(s, 1); // up the brightness just a bit
      s->set_saturation(s, 0); // lower the saturation
    }

#if defined(CAMERA_MODEL_M5STACK_WIDE)
    s->set_vflip(s, 1);
    s->set_hmirror(s, 1);
#elif defined(CAMERA_MODEL_ESP_EYE)
    s->set_vflip(s, 1);
    s->set_hmirror(s, 1);
    s->set_awb_gain(s, 1);
#endif

    is_initialised = true;
    return true;
}

/**
 * @brief      Stop streaming of sensor data
 */
void ei_camera_deinit(void) {

    //deinitialize the camera
    esp_err_t err = esp_camera_deinit();

    if (err != ESP_OK)
    {
        ei_printf("Camera deinit failed\n");
        return;
    }

    is_initialised = false;
    return;
}


/**
 * @brief      Capture, rescale and crop image
 *
 * @param[in]  img_width     width of output image
 * @param[in]  img_height    height of output image
 * @param[in]  out_buf       pointer to store output image, NULL may be used
 *                           if ei_camera_frame_buffer is to be used for capture and resize/cropping.
 *
 * @retval     false if not initialised, image captured, rescaled or cropped failed
 *
 */
bool ei_camera_capture(uint32_t img_width, uint32_t img_height, uint8_t *out_buf) {
    bool do_resize = false;

    if (!is_initialised) {
        ei_printf("ERR: Camera is not initialized\r\n");
        return false;
    }

    camera_fb_t *fb = esp_camera_fb_get();

    if (!fb) {
        ei_printf("Camera capture failed\n");
        return false;
    }

   bool converted = fmt2rgb888(fb->buf, fb->len, PIXFORMAT_JPEG, snapshot_buf);

   esp_camera_fb_return(fb);

   if(!converted){
       ei_printf("Conversion failed\n");
       return false;
   }

    if ((img_width != EI_CAMERA_RAW_FRAME_BUFFER_COLS)
        || (img_height != EI_CAMERA_RAW_FRAME_BUFFER_ROWS)) {
        do_resize = true;
    }

    if (do_resize) {
        ei::image::processing::crop_and_interpolate_rgb888(
        out_buf,
        EI_CAMERA_RAW_FRAME_BUFFER_COLS,
        EI_CAMERA_RAW_FRAME_BUFFER_ROWS,
        out_buf,
        img_width,
        img_height);
    }


    return true;
}

static int ei_camera_get_data(size_t offset, size_t length, float *out_ptr)
{
    // we already have a RGB888 buffer, so recalculate offset into pixel index
    size_t pixel_ix = offset * 3;
    size_t pixels_left = length;
    size_t out_ptr_ix = 0;

    while (pixels_left != 0) {
        // Swap BGR to RGB here
        // due to https://github.com/espressif/esp32-camera/issues/379
        out_ptr[out_ptr_ix] = (snapshot_buf[pixel_ix + 2] << 16) + (snapshot_buf[pixel_ix + 1] << 8) + snapshot_buf[pixel_ix];

        // go to the next pixel
        out_ptr_ix++;
        pixel_ix+=3;
        pixels_left--;
    }
    // and done!
    return 0;
}

#if !defined(EI_CLASSIFIER_SENSOR) || EI_CLASSIFIER_SENSOR != EI_CLASSIFIER_SENSOR_CAMERA
#error "Invalid model for current sensor"
#endif

I hope this will resolve all the confusions, regarding code.

Have you tested it?

@sonofcy, yes, I tried the approach you gave me, but it dident worked as it should be. And one more issue is I want the LED to blink if the desired object is detected. But with current approch, the PIR gives high and LED blinks as there is no connection in between AI and LED.

I also found one thing in my trial's that the deepsleep mode is also causing issue. As the MCU turns OFF in deepsleep mode, its more like a reset for the AI.

I am a very newbee to this and I think I have taken quite complicated part to integrate. I am sorry if the instructions told are not as it is followed as many of the times i get confused and lost.

I will keep you posted as and what I am trying. Let me know what else we can try?

Thankyou.

Obviously you will need to adjust the logic a bit, this is basic coding.
Yes, the camera does a restart from setup for certain conditions. If you don't want that behaviour, read the Espressif documentation to determine what condition you prefer to use.
If you were doing this from scratch, I would agree it is too difficult for you, but you are copying and letting AI do the work. All that remains for you is to rework the PIR code a bit (think STATE machine) in order to do what you want.

Hi,
I encountered one more issue. The basic AI code is flashed properly but, in serial monitor, I am getting these errors.

Errors:

Target detected!
Motion detected! Starting inference...
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 32, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 32, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 32, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 32, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 32, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 128, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 128, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 12, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 12, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
Target detected!
Motion detected! Starting inference...
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 32, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 32, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 32, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 32, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 32, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 128, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 128, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 12, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 12, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
Motion detected! Starting inference...
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 32, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 32, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 32, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 32, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 32, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 192, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 128, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 128, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 12, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT
ERR: Failed to allocate persistent buffer of size 12, does not fit in tensor arena and reached EI_MAX_OVERFLOW_BUFFER_COUNT

The buffer is overflowing, I even tried to declare and increase it by defining it in the code like this "#define EI_CLASSIFIER_TFLITE_ARENA_SIZE 24 * 1024", but it didn't worked.

Due to the above issue, my AI seems to behave abnormaly. It is detecting all the object that are coming infront of the CAM module. The threshold is about 90%.

Can any one help? I thing some one might have encounterd this issue.

Thank you.

@sonofcy can you please guide me with the above problem and help me resolve it?

Thank you.

Search for all memory allocations and triple-check that code.

sometimes there just not enough memory for the combination of liraries being used.

are these run-time dyanamic memory allocation failures?

@sonofcy I checked, but as far as I know the error's are for tensor flow arena, which is not assigned by me. Now the issue is I also looking for the errors root cause. I tried defining it directly in the code but it dident worked.

Thank you.

@gcjr, the ESP32 CAM module has 4MB of external PSRAM and I checked it is there and working. Yes, they are run-time dyanamic memory allocation failures, as when there is no object, it has by default code to clean buffer. I have given both the independent code above, you can have a look. The issue are coming when I am trying to integrate them.

Kindly check as I am new to this, and the idea or knowledge, I share could be wrong. So please correct me if you see so.

Thank you.

The normal way to debug memory errors like this is to add a debug statement before every malloc and every free, then look for a mismatch and determine the cause.

@sonofcy that is also what I did, But everything seems to be ok.

14:50:30.878 -> Free Heap after inference: 274276 bytes
14:50:30.878 -> Free PSRAM after inference: 1856544 bytes
14:50:30.878 -> Predictions (DSP: 14 ms., Classification: 2292 ms., Anomaly: 0 ms.): 
14:50:30.878 -> Object detection bounding boxes:14:50:30.878 -> Free Heap before snapshot free: 274276 bytes
14:50:30.878 -> Free PSRAM before snapshot free: 1856544 bytes
14:50:30.878 -> Free Heap after snapshot free: 274276 bytes
14:50:30.878 -> Free PSRAM after snapshot free: 2090020 bytes
14:50:30.878 -> Free Heap before snapshot alloc: 274276 bytes
14:50:30.878 -> Free PSRAM before snapshot alloc: 2090020 bytes
14:50:30.878 -> Free Heap after snapshot alloc: 274276 bytes
14:50:30.878 -> Free PSRAM after snapshot alloc: 1856544 bytes
14:50:30.917 -> Free Heap before inference: 274276 bytes
14:50:30.917 -> Free PSRAM before inference: 1856544 bytes

See in the above log it seems good. I am checking all the aspects as per your instructions. I will get back if I find anything.

Thank you.