Programação 23/24 S2

Laboratório 2

Autor
Afiliação

CAP Diogo Silva

Academia da Força Aérea

Regras

  • Esta laboratório vale 1 valor (5%) da nota final da UC.
  • O laboratório tem a duração de 1 hora e é individual.
  • Para resolver os seguintes exercícios, podem ser usados:
    • computador
    • ambiente de desenvolvimento, sem assistências configuradas (e.g. Github Copilot)
    • folha de rascunho
    • caneta ou lápis
    • folha de consulta “cheatsheet”
  • Não podem ser consultados ou usados quaisquer outros recursos.
  • Em cima da mesa de trabalho não devem estar quaisquer outros objetos, à excepção de uma garrafa de água, se desejado.
  • O incumprimento das regras supracitadas levará à anulação do laboratório e consequente atribuição de pontuação 0.
  • Lê o enunciado com atenção e usa o código fornecido quando apropriado.

Exercício 1 - IoU entre 2 listas de bounding boxes [50%]

  • IoU (Interseção sobre a União) entre 2 bounding boxes (BB) é uma métrica comum para avaliar a qualidade de deteção de objetos na área de visão computacional (se necessário, ver anexo no final para relembrar a explicação do exercício 1).
  • Neste exercício, a função para calcular a IoU entre 2 BB já é fornecida.
  • Para cada imagem, existem 2 listas de BB, uma com as BB verdadeiras e outra com propostas por um sistema.
  • O objetivo é construir uma matriz com a IoU entre todos os possíveis pares de BB.
  • Por exemplo
    • Se tivermos as listas de BB verdadeiras e propostas:
      • BB verdadeiras: \{BBv_1, BBv_2\}
      • BB propostas: \{BBp_1, BBp_2, BBp_3\}
    • A matriz de IoU seria:
      • \begin{bmatrix} IoU(BBv_1, BBp_1) & IoU(BBv_1, BBp_2) & IoU(BBv_1, BBp_3)\\ IoU(BBv_2, BBp_1) & IoU(BBv_2, BBp_2) & IoU(BBv_2, BBp_3) \\ \end{bmatrix}
      • Onde
        • IoU(BBv_1, BBp_1) é a IoU entre a primeira BB verdadeira e a primeira proposta
        • IoU(BBv_1, BBp_2) é a IoU entre a primeira BB verdadeira e a segunda proposta
        • etc.
  • Escreve uma função que:
    • Recebe:
      1. n_true: número de BB verdadeiras
      2. bb_true: vetor bidimensional com as BB verdadeiras, onde cada linha tem 4 elementos (x1, y1, x2, y2) = (canto superior esquerdo, canto inferior direito)
      3. n_prop: número de BB propostas
      4. bb_prop: vetor bidimensional com as BB propostas, onde cada linha tem 4 elementos (x1, y1, x2, y2) = (canto superior esquerdo, canto inferior direito)
      5. iou_matrix: vetor bidimensional para guardar as IoU, onde cada linha corresponde a uma BB verdadeira e cada coluna a uma proposta, logo a matriz tem dimensões n_true x n_prop
    • Calcula a IoU entre todas as BB verdadeiras e propostas, e preenche a matriz iou_mat com os valores correspondentes.
  • Notas:
    • Usa a função fornecida iou para calcular a IoU entre 2 BB.
    • Já existem 2 listas de BB verdadeiras e propostas fornecidas no código, com os nomes bb_true e bb_pred, respetivamente. Estas BB correspondem ao que está representado na imagem abaixo.
    • Usa a função main para testar a função implementada.
    • Para validação, a matriz de IoU para as seguintes listas de BB é:

BB_{true} = \begin{bmatrix} 240.00 & 200.00 & 340.00 & 380.00 \\ 610.00 & 180.00 & 690.00 & 380.00 \end{bmatrix}

BB_{pred} = \begin{bmatrix} 245.00 & 200.00 & 325.00 & 300.00 \\ 230.00 & 180.00 & 345.00 & 400.00 \\ 615.00 & 185.00 & 695.00 & 385.00 \\ 600.00 & 185.00 & 710.00 & 385.00 \\ 630.00 & 180.00 & 670.00 & 220.00 \\ 510.00 & 180.00 & 590.00 & 380.00 \end{bmatrix}

IoU = \begin{bmatrix} 0.44 & 0.71 & 0.00 & 0.00 & 0.00 & 0.00 \\ 0.00 & 0.00 & 0.84 & 0.70 & 0.10 & 0.00 \end{bmatrix}

As coordenadas de cada BB são identificadas com a nomenculatura aqui apresentada.

Exercício 2 - Análise [50%]

Na função main, implementa um programa que responda às seguintes questões:

  • Dada a matriz de IoU calculada no exercício 1, qual a melhor BB proposta para cada BB verdadeira?
    • Para cada BB verdadeira, a melhor BB proposta é aquela com a maior IoU.
    • O programa deve mostrar na consola o índice e as coordenadas da BB proposta com a maior IoU para cada BB verdadeira.
  • Qual a IoU média das BB verdadeiras?
    • O programa deve mostrar na consola a média da IoU entre as BB verdadeiras e as melhores propostas correspondentes.

Ajudas:

  1. Se o exercício 1 não foi resolvido, o vetor ious_solucao pode ser usado para simular a matriz de IoU.

Código fornecido - copiar

#include <stdio.h>

float iou(int x11, int y11, int x12, int y12, int x21, int y21, int x22, int y22);


float bb_gt[2][4] = {
  {240.00, 200.00, 340.00, 380.00},
  {610.00, 180.00, 690.00, 380.00}
};
float bb_pred[6][4] = {
  {245.00, 200.00, 325.00, 300.00},
  {230.00, 180.00, 345.00, 400.00},
  {615.00, 185.00, 695.00, 385.00},
  {600.00, 185.00, 710.00, 385.00},
  {630.00, 180.00, 670.00, 220.00},
  {510.00, 180.00, 590.00, 380.00}
};


//float ious_solucao[2][6] = {
//  {0.44, 0.71, 0.00, 0.00, 0.00, 0.00},
//  {0.00, 0.00, 0.84, 0.70, 0.10, 0.00}
//};



int main() {

    return 0;
}





float max(float a, float b) {
    return a > b ? a : b;
}

float min(float a, float b) {
    return a < b ? a : b;
}



float iou(int x11, int y11, int x12, int y12, int x21, int y21, int x22, int y22){
    float x1 = max(x11, x21);
    float y1 = max(y11, y21);
    float x2 = min(x12, x22);
    float y2 = min(y12, y22);

    float width = (x2 - x1);
    float height = (y2 - y1);
    if (width < 0 || height < 0) {
        return 0.0;
    }
    float area_overlap = width * height;

    float area1 = (x12 - x11) * (y12 - y11);
    float area2 = (x22 - x21) * (y22 - y21);
    float area_combined = area1 + area2 - area_overlap;

    return area_overlap / area_combined;
}

Anexo - O que são bounding boxes e IoU?

Na área de visão computacional, em particular na deteção de objetos, a métrica Intersection over Union (IoU) mede a área da interseção entre uma deteção positiva de um objecto de interesse e as características verdadeiras desse mesmo objecto. A deteção é especificada por uma bounding box (BB).

A bounding box verde representa as características verdadeiras do objecto de interesse, enquanto a amarela representa as características da deteção de um modelo de aprendizagem automática. Fonte: Flickr FAP

As coordenadas de cada BB são identificadas com a nomenculatura aqui apresentada.

O cálculo de IoU é feita da seguinta foram:

Diagrama do cálculo da IoU. Fonte: Wikipedia

IoU = \frac{A_I}{A_U}

A_U = A_1 + A_2 - A_I

Onde:

  • A_I -> área da interção
  • A_U -> área da união
  • A_1 -> área da BB 1
  • A_2 -> área da BB 2

A função iou calcula a IoU a partir das coordenadas das 2 bounding boxes, onde:

  • BB 1 é definida por (x11, y11) para o canto superior esquerdo e (x12, y12) para o canto inferior direito
  • BB 2 é definida por (x21, y21) para o canto superior esquerdo e (x22, y22) para o canto inferior direito

Esta função deve portanto receber 8 números inteiros (correspondentes às 2 BB) e devolver um número real (IoU).