Como Obter localização de Objetos com o IA

Obter localização de Objetos com o IA é uma tarefa relativamente simples que tem uma relevância de aplicações inimaginável, principalmente para pessoas com deficiência motora.

Introduzindo ao Básico da Visão Computacional

A princípio o retângulo é a forma geométrica mais básica que é usada em toda identificação de objetos na visão computacional como na imagem abaixo que foi retirada do Maix Bit:

Exemplo da IA reconhecendo objeto

Centroide de um Retângulo

Primeiramente é necessário entender um pouco de geometria para obter a localização do objeto. Neste caso, o melhor ponto de referência é o centro, como a IA já retorna a posição do retângulo, é só achar o centro, porém para achar a centroide (CM) é só dividir a base e altura por dois como na imagem abaixo:

Localizar a Posição de CM

Para obter a posição de CM é só obter a coordenada do retângulo (X, Y) e somar com a coordenada da centroide (X, Y).

centroid_x = int(i.w() / 2)
centroid_y = int(i.h() / 2)
            
location_x = i.x() + centroid_x
location_y = i.y() + centroid_y

Converter Localização em Pixel para Percentual

Em seguida, para facilitar outras aplicações, o ideal é transformar o valor de pixel para percentual por meio da regra de três. Por exemplo, o Maix bit tem uma resolução de 320px por 240px, então ficará desta forma:

percent_location_x = int(location_x * 100 / 320)
percent_location_y = int(location_y * 100 / 240)


Demonstrar a Localização do Objeto

Após a finalização do código e testes com o Maix Bit, foi pensando em uma aplicação simples no Visual Studio, para demonstrar o funcionamento de forma mais clara possível. Para isso se tornar possível, foi necessário formatar a localização em Json.

{
  "y": 63,
  "x": 45
}

Lógica do App

O aplicativo basicamente irá ler a serial, desserializar o json e mover o quadrado vermelho de acordo com a localização do objeto.

Interface do aplicativo para obter localização de objetos com o IA

Sobre o App

Como dito anteriormente, o é feito no Visual Studio e trata-se de uma demonstração e por isso não é executável. Por isso, não tem tanta relevância, mas ficará disponível no GitHub.

Código do Maix Bit

O código a seguir é para obter localização de objetos com o IA do Maix Bit com o modelo que contém 20 objetos. Caso queira baixar os arquivos, é só acessar este link.

import sensor,image,lcd,time
import KPU as kpu
import ujson

lcd.init(freq=15000000)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_vflip(1)
sensor.set_hmirror(1)
sensor.run(1)
clock = time.clock()
classes = ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor']
task = kpu.load("/sd/20class.kmodel") 
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)
a = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)

while(True):
    clock.tick()
    img = sensor.snapshot()
    code = kpu.run_yolo2(task, img)
    if code:
        for i in code:
            a = img.draw_rectangle(i.rect())
            
            centroid_x = int(i.w() / 2)
            centroid_y = int(i.h() / 2)
            
            location_x = i.x() + centroid_x
            location_y = i.y() + centroid_y

            percent_location_x = int(location_x * 100 / 320)
            percent_location_y = int(location_y * 100 / 240)
            
            a = img.draw_circle(location_x, location_y, 3, color=(255, 255, 255), fill=True)
            
            json_map = {}
            json_map["x"] = percent_location_x
            json_map["y"] = percent_location_y
            json_percent_location = ujson.dumps(json_map)
            
            print(json_percent_location)
            
            a = lcd.display(img)
            for i in code:
                lcd.draw_string(i.x(), i.y(), classes[i.classid()], lcd.RED, lcd.WHITE)
                lcd.draw_string(i.x(), i.y()+12, '%f'%i.value(), lcd.RED, lcd.WHITE)
    else: 	
        a = lcd.display(img)
a = kpu.deinit(task)

Funcionamento do App e Maix Bit

O vídeo a seguir foi gravado na tela do computador e para gravar a tela do Maix bit, foi usado um celular, por isso há alguns tracejados no display.