Precisão Média (Mean Average Precision)
Visão geral
Precisão Média Average (mAP) (Mean Average Precision) é uma das métricas de avaliação mais usadas para detecção de objetos (object detection) e segmentação de instâncias (instance segmentation). Ela resume quão bem um modelo:
- encontra objetos (alta revocação),
- evita falsos alarmes (alta precisão),
- e os localiza com precisão (alta sobreposição entre previsão e verdade de referência, tipicamente medida por Interseção sobre União).
Em alto nível:
- Para cada classe, você calcula a Precisão Média (AP) (Average Precision) a partir de uma curva precisão–revocação (PR) (precision–recall (PR) curve).
- Em seguida, você tira a média dos valores de AP:
- entre classes (para obter a AP média), e frequentemente também
- entre limiares de IoU (como na métrica do COCO AP@[.50:.95]).
Como a mAP depende fortemente de detalhes do protocolo de avaliação (regras de correspondência, limiares de IoU, interpolação, máximo de detecções, tratamento de regiões “difíceis”/crowd, etc.), comparar valores de mAP entre artigos pode ser enganoso a menos que o protocolo seja idêntico.
O que precisão e revocação significam em detecção
Em detecção/segmentação, um “positivo” é uma instância prevista (caixa ou máscara) com um rótulo de classe e uma pontuação de confiança.
- Uma previsão é um verdadeiro positivo (VP) (true positive (TP)) se corresponder a uma instância de verdade de referência da mesma classe com IoU ≥ limiar.
- Uma previsão é um falso positivo (FP) (false positive (FP)) se não corresponder a nenhuma instância de verdade de referência (ou corresponder abaixo do limiar, ou duplicar uma correspondência já reivindicada por uma previsão com pontuação maior).
- Uma instância de verdade de referência é um falso negativo (FN) (false negative (FN)) se nenhuma previsão corresponder a ela.
Então:
- Precisão = VP / (VP + FP)
- Revocação = VP / (VP + FN)
Diferentemente de uma classificação simples, métricas de detecção precisam decidir qual previsão corresponde a qual verdade de referência e o que significa “perto o suficiente” (limiar de IoU). É aí que AP e mAP entram.
De detecções ranqueadas a uma curva precisão–revocação
Em avaliações de detecção de objetos (estilo VOC/COCO), em geral você não varre diretamente um limiar de pontuação. Em vez disso, você:
- Coleta todas as previsões de uma dada classe em todo o conjunto de dados.
- Ordena por confiança em ordem decrescente.
- Percorre essa lista e, para cada previsão, decide VP/FP usando regras de correspondência.
- Após cada previsão, calcula precisão/revocação cumulativas.
Isso produz uma curva PR por partes (um conjunto de pontos discretos).
Regras de correspondência (protocolo central)
Para uma classe fixa c e limiar de IoU t:
Para cada imagem:
- Considere apenas previsões rotuladas como classe c.
- Considere apenas instâncias de verdade de referência da classe c (com possíveis exclusões como “ignore” ou “crowd”, dependendo do conjunto de dados).
- Para cada previsão em ordem decrescente de pontuação:
- Calcule IoU com todas as verdades de referência ainda não correspondidas.
- Se o IoU máximo ≥ t, associe à verdade de referência com melhor IoU (ou conforme regras de desempate do conjunto de dados) e marque a previsão como VP e a verdade de referência como correspondida.
- Caso contrário, marque a previsão como FP.
- Qualquer verdade de referência que permaneça sem correspondência contribui para FN (afeta a revocação).
Essa correspondência “gulosa” um-para-um é crucial: múltiplas previsões para o mesmo objeto viram um VP + FPs extras.
Nota prática: A maioria das avaliações faz a correspondência dentro de cada imagem, mas a AP é calculada agregando decisões em todas as imagens para uma classe após ordenar as previsões pela pontuação.
Por que ranquear por confiança importa
A AP mede não apenas se seu modelo consegue encontrar objetos, mas se ele consegue ranquear detecções corretas acima de incorretas. Dois detectores com conjuntos idênticos de caixas podem obter AP diferente se um atribuir pontuações de confiança melhores.
Isso conecta a AP a métricas de ranqueamento em recuperação de informação, que é historicamente de onde vem “average precision”.
Como a Precisão Média (AP) é calculada
Precisão Média é (conceitualmente) a área sob a curva precisão–revocação:
[ AP = \int_0^1 p(r),dr ]
Mas como a curva PR é baseada em previsões discretas, a AP é aproximada usando uma de várias convenções padrão.
Passo 1: Construir vetores de precisão e revocação
Após ordenar as previsões de uma classe por confiança em ordem decrescente, compute em cada posição k:
- ( TP_k ) = número de verdadeiros positivos entre as top k previsões
- ( FP_k ) = número de falsos positivos entre as top k previsões
- ( P_k = TP_k / (TP_k + FP_k) )
- ( R_k = TP_k / N_{gt} ) onde ( N_{gt} ) é o número de objetos de verdade de referência daquela classe
Isso gera um conjunto de pontos ((R_k, P_k)).
Passo 2: Interpolar a precisão (comum em VOC/COCO)
Em detecção, a precisão bruta pode “ziguezaguear” conforme a revocação aumenta. A maioria dos protocolos usa um invólucro de precisão interpolada:
[ P_{\text{interp}}(r) = \max_{\tilde{r} \ge r} P(\tilde{r}) ]
Isso torna a precisão não crescente com a revocação e evita penalizar um detector por ruído pequeno de ranqueamento depois que ele já alcançou uma dada revocação.
Passo 3: Integrar / somar
Variantes comuns:
AP no estilo COCO (interpolação contínua / todos os pontos)
O COCO calcula AP integrando a curva PR interpolada sobre todos os pontos únicos de revocação. Uma implementação comum é:
- adicionar endpoints sentinela,
- calcular o invólucro de precisão,
- somar sobre deltas de revocação:
[ AP \approx \sum_i (R_i - R_{i-1}) \cdot P_{\text{interp}}(R_i) ]
Isso às vezes é chamado de AP “todos os pontos”.
AP de 11 pontos do VOC 2007 (legado)
O PASCAL VOC 2007 usava 11 níveis de revocação ( r \in {0, 0.1, \dots, 1.0} ):
[ AP_{11} = \frac{1}{11} \sum_{r \in {0,0.1,\dots,1}} \max_{\tilde{r} \ge r} P(\tilde{r}) ]
Isso tende a ser mais grosseiro e pode produzir valores ligeiramente diferentes em relação ao AP de todos os pontos/COCO.
Trabalhos modernos quase sempre usam AP no estilo COCO, a menos que indiquem explicitamente VOC 2007.
Um pequeno exemplo trabalhado (AP em IoU = 0.50)
Suponha que para a classe “cat” existam 3 gatos de verdade de referência no conjunto de dados. Seu modelo produz 5 previsões de “cat” em várias imagens, ordenadas por confiança:
| Rank | Score | IoU to best unmatched GT | Result |
|---|---|---|---|
| 1 | 0.95 | 0.80 | TP |
| 2 | 0.90 | 0.60 | TP |
| 3 | 0.70 | 0.30 | FP (IoU < 0.50) |
| 4 | 0.60 | 0.55 | TP |
| 5 | 0.40 | (duplicate / no match) | FP |
Calcule precisão/revocação cumulativas:
- Após rank 1: TP=1 FP=0 → P=1.00 R=1/3=0.33
- Após rank 2: TP=2 FP=0 → P=1.00 R=2/3=0.67
- Após rank 3: TP=2 FP=1 → P=0.67 R=0.67
- Após rank 4: TP=3 FP=1 → P=0.75 R=1.00
- Após rank 5: TP=3 FP=2 → P=0.60 R=1.00
Pontos PR brutos incluem:
- (0.33, 1.00), (0.67, 1.00), (0.67, 0.67), (1.00, 0.75), (1.00, 0.60)
Agora aplique o invólucro de precisão (P_{\text{interp}}(r)) (precisão máxima em qualquer revocação ≥ r):
- Em revocação 1.00: máxima precisão em ≥1.00 é max(0.75, 0.60) = 0.75
- Em revocação 0.67: máxima precisão em ≥0.67 é max(1.00, 0.67, 0.75, 0.60) = 1.00
- Em revocação 0.33: máxima precisão em ≥0.33 também é 1.00
Integre sobre os saltos de revocação:
- Revocação aumenta 0 → 0.33 com precisão 1.00
- 0.33 → 0.67 com precisão 1.00
- 0.67 → 1.00 com precisão 0.75 (porque a melhor precisão alcançável quando você exige revocação total é 0.75)
Então: [ AP \approx (0.33)\cdot 1.00 + (0.34)\cdot 1.00 + (0.33)\cdot 0.75 \approx 0.33 + 0.34 + 0.2475 = 0.9175 ]
Este exemplo ilustra um ponto-chave: alguns falsos positivos tardios podem não prejudicar muito a AP se alta precisão for alcançada na maioria dos níveis de revocação.
Precisão Média Average (mAP): média entre classes
Depois de calcular AP por classe, a mAP tipicamente é a macro-média:
[ mAP = \frac{1}{C}\sum_{c=1}^{C} AP_c ]
onde (C) é o número de classes.
Implicações importantes:
- Cada classe contribui igualmente, mesmo se o conjunto de dados for desbalanceado.
- Um modelo que é ótimo em classes frequentes, mas ruim em classes raras, pode ter mAP menor do que o esperado.
- Muitos benchmarks também reportam AP por classe para diagnosticar fraquezas.
Algumas configurações excluem classes sem instâncias de verdade de referência, enquanto outras definem AP como 0 para essas classes. Isso importa ao comparar números.
mAP entre limiares de IoU: COCO AP@[.50:.95]
O COCO popularizou uma métrica mais rígida e informativa ao fazer a média da AP em múltiplos limiares de IoU:
- Limiar(es) de IoU: 0.50, 0.55, …, 0.95 (10 valores)
- Para cada limiar (t), calcular AP(t)
- Fazer a média entre limiares e classes:
[ AP@[.50:.95] = \frac{1}{10}\sum_{t \in {0.50,0.55,\dots,0.95}} mAP(t) ]
Isso frequentemente é reportado simplesmente como “AP” em artigos do COCO, com detalhamentos adicionais:
- AP50: AP em IoU = 0.50 (frequentemente maior; localização mais fácil)
- AP75: AP em IoU = 0.75 (mais rígido)
- AP (small/medium/large): AP restrita a objetos em certas faixas de área (específico do COCO)
Por que fazer média em vários limiares de IoU ajuda
AP em IoU=0.50 testa principalmente se o detector encontra aproximadamente o objeto certo. Fazer a média até 0.95 recompensa fortemente localização apertada e penaliza caixas/máscaras “relaxadas”.
Essa é uma razão pela qual os números de AP do COCO parecem muito menores do que os antigos números de mAP@0.50 do VOC.
Aplicando mAP à segmentação de instâncias
Para segmentação de instâncias (por exemplo, Mask R-CNN), a estrutura é a mesma:
- As previsões são máscaras (com classe + pontuação).
- A IoU é calculada sobre pixels da máscara, e não sobre caixas delimitadoras.
- A correspondência, construção de PR, integração de AP e média de mAP não mudam.
Então você pode ver:
- bbox AP: calculada usando IoU de caixa delimitadora
- segm AP: calculada usando IoU de máscara
É comum que a AP de máscara seja menor do que a AP de caixa, porque máscaras exigem alinhamento mais fino.
Detalhes práticos de protocolo que você deve especificar
Quando alguém reporta “mAP”, normalmente você precisa destas respostas para interpretar o número:
1) Qual(is) limiar(es) de IoU?
- Estilo VOC: mAP@0.50
- Estilo COCO: AP@[.50:.95] mais AP50/AP75
- Alguns domínios usam outros (por exemplo, 0.3 para imagens médicas, ou limiares mais altos para objetos rígidos)
Sempre reporte os limiares explicitamente.
2) Como as detecções são correspondidas?
Regras típicas (tipo VOC/COCO):
- Correspondência apenas dentro da mesma classe
- Um GT pode corresponder no máximo a uma previsão
- Correspondência gulosa por ordem de pontuação
- “Detecções duplicadas” contam como FPs
Casos de borda incluem:
- Regiões crowd/ignore (o COCO tem tratamento especial: algumas previsões que sobrepõem uma região crowd podem ser ignoradas em vez de contadas como FP).
- Flags “difficult” em conjuntos VOC.
3) Qual é o número máximo de detecções por imagem?
A avaliação do COCO frequentemente limita detecções por imagem (por exemplo, maxDets = 100 no relatório padrão). Se um método produzir milhares de caixas, esse limite pode alterar a AP.
4) Como small/medium/large são tratados?
O COCO reporta AP para faixas de tamanho de objeto usando limiares de área em pixels. Se você comparar AP-small entre conjuntos de dados ou imagens redimensionadas, pode estar comparando coisas incomparáveis.
5) Quais classes são incluídas?
- Alguns benchmarks excluem uma classe “background” (quase sempre).
- Alguns incluem uma classe “unknown” ou “other”.
- Algumas tarefas avaliam um subconjunto de classes (por exemplo, apenas “person”).
6) Você está usando o script oficial de avaliação?
Pequenas diferenças de implementação podem produzir mudanças mensuráveis (especialmente para tratamento de crowd do COCO e interpolação de precisão). Para comparações publicadas, use o código oficial de avaliação quando possível.
Armadilhas ao comparar valores de mAP reportados
mAP é fácil de interpretar incorretamente porque comprime muitas decisões de protocolo em um único número.
Armadilha 1: Comparar mAP@0.50 do VOC com AP@[.50:.95] do COCO
Essas métricas não são diretamente comparáveis. A AP do COCO é muito mais rígida. Um detector pode obter:
- mAP@0.50 do VOC: 80+
- AP@[.50:.95] do COCO: 35–50
Ambos podem ser “bons” dependendo do benchmark.
Armadilha 2: Convenções diferentes de interpolação de AP
AP de 11 pontos do VOC 2007 vs AP de todos os pontos pode deslocar os números. Garanta que você sabe qual é usada.
Armadilha 3: Cálculo diferente de IoU (bbox vs máscara vs caixas rotacionadas)
Mesmo dentro de “IoU”, a geometria importa:
- caixas alinhadas aos eixos vs caixas rotacionadas,
- IoU de máscara,
- IoU 3D em LiDAR.
mAP entre domínios pode não ser comparável.
Armadilha 4: Calibração de pontuação e efeitos de ranqueamento
AP depende do ranqueamento. Dois modelos com qualidade de localização semelhante podem obter AP diferente porque um atribui pontuações de confiança mais “limpas”.
Fontes comuns de distorção:
- falsos positivos excessivamente confiantes,
- distribuições de pontuação por classe não calibradas,
- mudanças de pós-processamento (como Supressão Não Máxima) alterando o ranqueamento.
Armadilha 5: Desbalanceamento de classes e macro-média
Como mAP faz macro-média entre classes, melhorias em classes raras podem mover a mAP mais do que você espera em relação à acurácia global por instância. Sempre inspecione AP por classe.
Armadilha 6: Divisões de treino/val/test e subconjuntos de avaliação
Alguns artigos reportam em:
- apenas o conjunto de validação,
- um subconjunto reduzido de teste,
- apenas imagens contendo certas classes.
Se a distribuição avaliada muda, a mAP muda.
Armadilha 7: Tratamento diferente de rótulos “ignore” / regiões crowd
As anotações crowd do COCO e a lógica de “ignore” podem afetar significativamente contagens de FP. Se você reimplementar a avaliação do COCO sem replicar essas regras, sua mAP pode não bater com os números oficiais.
Pseudocódigo mínimo para cálculo de AP (classe única, limiar único de IoU)
Abaixo há um pseudocódigo simplificado capturando a estrutura comum VOC/COCO:
def average_precision(predictions, ground_truths, iou_thresh):
"""
predictions: list of (image_id, score, box_or_mask)
ground_truths: dict image_id -> list of gt instances (box_or_mask)
Returns AP for a single class at a single IoU threshold.
"""
preds = sorted(predictions, key=lambda x: x.score, reverse=True)
# Track which GTs are already matched per image
matched = {img_id: [False]*len(gts) for img_id, gts in ground_truths.items()}
tp = []
fp = []
for pred in preds:
gts = ground_truths.get(pred.image_id, [])
best_iou = 0.0
best_j = -1
for j, gt in enumerate(gts):
if matched[pred.image_id][j]:
continue
iou = compute_iou(pred.instance, gt.instance)
if iou > best_iou:
best_iou = iou
best_j = j
if best_iou >= iou_thresh:
matched[pred.image_id][best_j] = True
tp.append(1); fp.append(0)
else:
tp.append(0); fp.append(1)
tp_cum = cumulative_sum(tp)
fp_cum = cumulative_sum(fp)
n_gt = sum(len(v) for v in ground_truths.values())
recall = tp_cum / n_gt
precision = tp_cum / (tp_cum + fp_cum)
# Precision envelope
precision_env = make_non_increasing(precision)
# Integrate area under PR curve (all-points style)
ap = sum((recall[i] - recall[i-1]) * precision_env[i]
for i in range(1, len(recall)))
return ap
A avaliação real do COCO adiciona detalhes como tratamento de crowd, faixas de área e máximo de detecções, mas isso transmite a ideia central.
Quando usar mAP (e quando não)
mAP é especialmente apropriada para:
- benchmarks de Detecção de Objetos onde tanto classificação quanto localização importam
- Segmentação de Instâncias
- comparar detectores em uma faixa de pontos de operação (já que a AP integra sobre limiares)
No entanto, mAP pode ser menos informativa quando:
- Você se importa com desempenho em um ponto de operação específico (por exemplo, “a precisão deve ser ≥ 0.95”), caso em que você pode reportar precisão em revocação fixa ou vice-versa.
- Você precisa de calibração probabilística (a AP não mede calibração diretamente).
- Você tem forte desbalanceamento de classes e quer uma métrica ponderada por instâncias (mAP é macro por classe por padrão).
Na prática, muitas equipes reportam mAP mais diagnósticos:
- AP50/AP75,
- AP por classe,
- curvas PR para classes-chave,
- latência/vazão e memória.
Resumo
- AP mede a área sob a curva precisão–revocação para uma classe, construída ao ordenar detecções por confiança e aplicar correspondência baseada em IoU.
- mAP faz a média da AP entre classes e, frequentemente (COCO), entre limiares de IoU para recompensar localização precisa.
- O valor exato de mAP é altamente sensível a detalhes de protocolo: limiares de IoU, método de interpolação, regras de correspondência, máximo de detecções e tratamento de ignore/crowd.
- Ao comparar resultados de mAP, sempre confirme que você está comparando a mesma definição de métrica (por exemplo, mAP@0.50 do VOC vs AP@[.50:.95] do COCO) e, idealmente, o mesmo código oficial de avaliação.
Para o componente de localização subjacente à mAP, veja Interseção sobre União.