Object Merging FOMO - OpenMV

Hi, I want to ask you for help, I am testing the FOMO model for the first time and I ran into a problem. The model as such works great, but I don’t know how or if it is even possible to turn off the merging of individual objects into one big one when they are close to each other. I use an OpenMV H7 device, can you help me? Well thank you :slight_smile:
How it suppose to looks like:

Object is merged and len(detection_list) will return 1:

# Edge Impulse - OpenMV Object Detection Example

import sensor, image, time, os, tf, math, uos, gc

sensor.reset()                         # Reset and initialize the sensor.
sensor.set_pixformat(sensor.RGB565)    # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA)      # Set frame size to QVGA (320x240)
sensor.set_windowing((240, 240))       # Set 240x240 window.
sensor.skip_frames(time=2000)          # Let the camera adjust.

net = None
labels = None
min_confidence = 0.5

try:
    # load the model, alloc the model file on the heap if we have at least 64K free after loading
    net = tf.load("trained.tflite", load_to_fb=uos.stat('trained.tflite')[6] > (gc.mem_free() - (64*1024)))
except Exception as e:
    raise Exception('Failed to load "trained.tflite", did you copy the .tflite and labels.txt file onto the mass-storage device? (' + str(e) + ')')

try:
    labels = [line.rstrip('\n') for line in open("labels.txt")]
except Exception as e:
    raise Exception('Failed to load "labels.txt", did you copy the .tflite and labels.txt file onto the mass-storage device? (' + str(e) + ')')

colors = [ # Add more colors if you are detecting more than 7 types of classes at once.
    (255,   0,   0),
    (  0, 255,   0),
    (255, 255,   0),
    (  0,   0, 255),
    (255,   0, 255),
    (  0, 255, 255),
    (255, 255, 255),
]

clock = time.clock()
while(True):
    clock.tick()

    img = sensor.snapshot()

    # detect() returns all objects found in the image (splitted out per class already)
    # we skip class index 0, as that is the background, and then draw circles of the center
    # of our objects

    for i, detection_list in enumerate(net.detect(img, thresholds=[(math.ceil(min_confidence * 255), 255)])):
        if (i == 0): continue # background class
        if (len(detection_list) == 0): continue # no detections for this class?

        print("********** %s **********" % labels[i])
        for d in detection_list:
            [x, y, w, h] = d.rect()
            center_x = math.floor(x + (w / 2))
            center_y = math.floor(y + (h / 2))
            print('x %d\ty %d' % (center_x, center_y))
            img.draw_circle((center_x, center_y, 12), color=colors[i], thickness=2)

    print(len(detection_list))

Thank you very much :slight_smile:

Hi @Maros,

This merging is expected with FOMO with the existing heatmap configuration. You can read more about this in our doc: FOMO: Object detection for constrained devices - Edge Impulse Documentation

A downside of the heat map is that FOMO is that each cell acts as its own classifier. E.g. if your classes are “lamp”, “plant” and “background” each cell will be either lamp, plant, or background. It’s thus not possible to detect objects with overlapping centroids. You can see this in the Raspberry Pi 4 video above at 00:18 where the beer bottles are too close together. This can be solved by using a higher resolution heat map.

We’ll add higher resolution heat maps in the near future that could help with your use case.

Aurelien

Great, and about the example with bees: image — ImgBB
although it was created with a lower resolution, this solution is just not yet implemented in the edguimpulse interface for common users,?
Is there any way how to acces/evaluate heatmap data in opemv ? For example, if I wanted to divide the total number of active pixels in a heatmap by the average number for one object, I would get an approximate number of merged objects