# Cálculo de la Precisión Promedio y mAP
###### tags: `Definitions and References`
### Precisión Promedio (AP)
Otra forma de comparar el rendimiento de los detectores de objetos es calcular el área bajo la curva (AUC) de la curva de Precisión x Recall. Como las curvas AP a menudo son curvas en zigzag que suben y bajan, comparar diferentes curvas (detectores diferentes) en el mismo diagrama generalmente no es una tarea fácil, porque las curvas tienden a cruzarse entre sí con mucha frecuencia. Es por eso que la precisión promedio (AP), una métrica numérica, también puede ayudarnos a comparar diferentes detectores. En la práctica, AP es la precisión promediada en todos los valores de recall entre 0 y 1.
A partir de 2010, el método de calcular la AP mediante el desafío PASCAL VOC ha cambiado. Actualmente, **la interpolación realizada por el desafío PASCAL VOC utiliza todos los puntos de datos, en lugar de interpolar solo 11 puntos igualmente espaciados como se indica en su [artículo](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.157.5766&rep=rep1&type=pdf)**.
#### Interpolación de 11-puntos
La interpolación de 11 puntos intenta resumir la forma de la curva Precisión x Recall promediando la precisión en un conjunto de once niveles de recall igualmente espaciados [0, 0.1, 0.2, ... , 1]:

con

Donde  es la precisión medida al nivel de recall 
En lugar de utilizar la precisión observada en cada punto, el AP se obtiene interpolando la precisión solo en los 11 niveles  tomando la **máxima precisión cuyo valor de recall es mayor que** 
#### Interpolación de todos los puntos
En lugar de interpolar solo en los 11 puntos igualmente espaciados, puede interpolar a través de todos los puntos de tal manera que:

con

Donde  es la precisión medida al nivel de recall 
En este caso, en lugar de utilizar la precisión observada en solo unos pocos puntos, el AP ahora se obtiene al interpolar la precisión en **cada nivel**,  tomando la **máxima precisión cuyo valor de recall es mayor que . De esta manera se calcula un estimado del área bajo la curva.
#### Proceso de cálculo de la curva Precisión x Recall
Primero se crea una lista `TP_FP` donde se van acumulando los Verdaderos positivos y Falsos positivos de todas las imágenes, de la siguiente manera:
- Para cada imagen `image`:
- Para cada categoría `cat`:
- Se obtienen los recuadros de las etiquetas reales (`groundtruth_boxes`), los recuadros de las detecciones (`detected_boxes`) y los scores de las detecciones (`detected_scores`) de la categoría `cat`.
- Se aplica el algoritmo Non Max Supression (NMS) sobre `detected_boxes` para descartar las detecciones con recuadros que tengan un `iou >= nms_iou_threshold` con algún bounding box de otra detección con score mayor.
- Se calcula `iou` para cada par de los `detected_boxes` resultantes y los `groundtruth_boxes`.
- Para cada `detected_box` se busca el `groundtruth_box` con el que tenga el iou mayor y que cumpla que `iou >= iou_threshold` y que no haya sido marcado antes por otro `detected_box`. Si se cumple esto, la detección es acumulada como TP (se inserta un `True`) en `TP_FP[cat]` y el `groundtruth_box` es descartado para ser comparado con otras detecciones. Si no se cumple esto se acumula un FP (se inserta un `0`) en `TP_FP[cat]`. Al final se suma el total de `groundtruth_boxes` en `num_total_gt[cat]`, que servirá posteriormente para calcular el recall.
Después se calcula la precisión y recall sobre la lista de `TP_FP` de cada categoría:
- Para cada categoría `cat`:
- Se ordena `TP_FP[cat]` de forma descendente a partir del score de las detecciones.
- Se realiza una suma acumulada de True Positives y False Positives. P.e., si tenemos 10 detecciones y únicamente la segunda es un True Positive, tendríamos lo siguiente:
`true_positives` => `[False, True, False, False, False, False, False, False, False, False]`
`false_positives` => `[True, False, True, True, True, True, True, True, True, True]`
`cum_true_positives` => `[0, 1, 1, 1, 1, 1, 1, 1, 1, 1]`
`cum_false_positives` => `[ 1., 1., 2., 3., 4., 5., 6., 7., 8., 9.]`
- Se realiza el cálculo de la precisión y el recall con estos arreglos "acumulados" y el número de anotaciones de la categoría `cat` con las siguientes fórmulas:
`precision = cum_true_positives / (cum_true_positives + cum_false_positives)`
`recall = cum_true_positives / num_gt`
Obteniendo:
`precision` => `[0., 0.5, 0.33, 0.25, 0.2, 0.167, 0.14, 0.125, 0.11, 0.1]`
`recall` => `[0., 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25]`
#### Ejemplo ilustrativo
Para aclarar las cosas, proporcionamos un ejemplo comparando ambas interpolaciones. Considere las detecciones a continuación:

Hay 7 imágenes con 15 objetos verdaderos representados por los recuadros delimitadores verdes y 24 detecciones representados por los recuadros delimitadores rojos. Cada objeto detectado tiene un nivel de confianza y se identifica con una letra (A,B,...,Y).
La siguiente tabla muestra los recuadros con sus correspondientes scores. La última columna identifica las detecciones como TP o FP. En este ejemplo, se considera un TP si IOU  30%, de lo contrario es un FP. Al observar las imágenes de arriba podemos decir aproximadamente si las detecciones son TP o FP.

En algunas imágenes hay más de una detección que se superpone a recuadro verdadero (Imágenes 2, 3, 4, 5, 6 y 7). Para esos casos, la detección con el mayor IOU se considera TP y los otros se consideran FP. Esta regla se aplica mediante la métrica PASCAL VOC 2012: "por ejemplo, 5 detecciones (TP) de un solo objeto se cuentan como 1 detección correcta y 4 detecciones falsas".
La curva de Precisión x Recall se traza calculando la precisión y los valores de recall de las detecciones acumuladas de TP o FP. Para esto, primero debemos ordenar las detecciones por sus scores, luego calculamos la precisión y recall para cada detección acumulada como se muestra en la tabla a continuación:

Al trazar los valores de precisión y recall tenemos lo siguiente *Curva de Precisión x Recall*:

Como se mencionó anteriormente, hay dos formas diferentes de medir la precisión promedio interpolada: **interpolación de 11 puntos** e **interpolación de todos los puntos**. A continuación hacemos una comparación entre ellos:
#### Cálculo de la interpolación de 11-puntos
La idea de la precisión promedio interpolada de 11-puntos es promediar las precisiones en un conjunto de 11 niveles de recall (0, 0.1, ..., 1). Los valores de precisión interpolados se obtienen tomando la precisión máxima cuyo valor de recall es mayor que su valor de recall actual de la siguiente manera:

Aplicando la interpolación de 11-puntos tenemos:



#### Calculando la interpolación en todos los puntos
Al interpolar todos los puntos, la precisión promedio (AP) se puede interpretar como un AUC aproximado de la curva de precisión x recall. La intención es reducir el impacto de las oscilaciones de la curva. Al aplicar las ecuaciones presentadas anteriormente, podemos obtener las áreas como se demostrará aquí. También podríamos tener visualmente los puntos de precisión interpolados al observar los recalls comenzando desde el más alto (0.4666) a 0 (mirando el gráfico de derecha a izquierda) y, a medida que disminuimos el recall, recopilamos los valores de precisión que son los más altos como se muestra en la imagen a continuación:

Mirando la gráfica de arriba, podemos dividir el AUC en 4 áreas (A1, A2, A3 y A4):

Calculando el área total, tenemos el AP:

Con







Los resultados entre los dos métodos de interpolación diferentes son un poco diferentes: 24.56% y 26.84% por la interpolación de cada punto y la interpolación de 11 puntos respectivamente.
Nuestra implementación predeterminada es la misma que VOC PASCAL: **interpolación en todos los puntos**.
## Media de la precisión promedio (mAP)
Ahora que entendemos la Precisión promedio (AP), la media de la Precisión Promedio (mAP) para un conjunto de datos que contiene N categorías, es el promedia de la AP sobre las N clases.

El desafío PASCAL VOC usa la mAP como métrica con un umbral de IoU de 0.5, mientras que MS COCO promedia mAP sobre diferentes umbrales de IoU (0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95) con un paso de 0.05, esta métrica se denota en los artículos como mAP@[.5,.95]. Por lo tanto, COCO no solo promedia la AP en todas las clases sino también en distintos umbrales de IoU.
Tenga en cuenta que mAP y AP a menudo se usan indistintamente, este es el caso de la competencia COCO. Según su sitio web oficial:
- 'AP y AR se promedian sobre múltiples valores de Intersección sobre Unión (IoU). Específicamente utilizamos 10 umbrales de IoU de .50:.05:.95. Esto rompe con la tradición, donde AP se calcula en un único valor de IoU de .50 (que corresponde a nuestra métrica AP<sup>IoU</sup>=.50. El promedio sobre IoUs pondera más a los detectores con una mejor localización.'
Al optimizar AP o AR (que se analizará a continuación) sobre múltiples valores de umbral de IoU, el modelo penaliza las localizaciones deficientes y optimiza para una buena localización. Simplemente porque la precisión de la localización se evalúa sobre la base de la IoU entre los recuadros reales y el recuadro predicho, esta es la estrategia óptima que se utilizará para aplicaciones de detección que requieren un nivel alto de localización, como la conducción autónoma o las imágenes médicas.
## Recall promedio (AR)
En lugar de calcular el recall en un IoU particular, calculamos el recall promedio (AR) en los umbrales de IoU de 0.5 a 1 y, por lo tanto, resumimos la distribución del recall en un rango de umbrales de IoU.
Solo promediamos el recall sobre los umbrales de IoU de [0.5, 1] porque el rendimiento de la detección se correlaciona con el recall en los umbrales superiores a 0.5, donde en 0.5 los recuadros localizan muy poco los objetos y en un IoU de 1 los objetos están localizados completamente.
Por lo tanto, si se desea optimizar un modelo para un alto recall y una localización precisa de los objetos, puede considerar el recall promedio como una métrica de evaluación.
El recall promedio describe el área duplicada bajo la curva Recall x IoU. La curva Recall x IoU muestra los resultados de recall para cada umbral de IoU donde IoU ∈ [0.5,1.0], con los umbrales de IoU en el eje-x y los niveles de recall en el eje-y.
Esto se describe de forma matemática de la siguiente manera:

De manera similar a mAP, mAR es el promedio de AR sobre el número de clases del conjunto de datos.