Programação 23/24 S2
Laboratório 2
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.
- Se tivermos as listas de BB verdadeiras e propostas:
- Escreve uma função que:
- Recebe:
- n_true: número de BB verdadeiras
- bb_true: vetor bidimensional com as BB verdadeiras, onde cada linha tem 4 elementos (x1, y1, x2, y2) = (canto superior esquerdo, canto inferior direito)
- n_prop: número de BB propostas
- bb_prop: vetor bidimensional com as BB propostas, onde cada linha tem 4 elementos (x1, y1, x2, y2) = (canto superior esquerdo, canto inferior direito)
- 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.
- Recebe:
- 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
ebb_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 é:
- Usa a função fornecida
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}
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:
- 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).
O cálculo de IoU é feita da seguinta foram:
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).