Método de cálculo de la relación intersección-unión (IOU)

        Intersetion Over Union (IOU, Intersetion Over Union), que significa la relación de intersección y unión, se usa para evaluar el grado de coincidencia del área de dos figuras geométricas. En el modelo de algoritmo de detección de objetivos, generalmente se usa para calcular el marco predicho y el marco real El error (función de pérdida) se usa en el algoritmo de supresión no máxima (NMS) para filtrar objetos superpuestos redundantes, o se usa para determinar si el objeto se predice al calcular mAP. Este es un algoritmo muy utilizado. Aquí hay una introducción detallada a su principio de algoritmo y la implementación del código.

Figura 1 Diagrama esquemático de la relación de fusión cruzada

         Como se muestra en la Figura 1, hay un diagrama esquemático de la relación de intersección de dos cajas rectangulares. La parte superpuesta en el medio es la intersección del rectángulo A y el rectángulo B. Luego, la fórmula de cálculo de la relación de intersección de estas dos cajas rectangulares es la siguiente :

IOU=\frac{A\cap B}{A\cup B}

Entre ellos, la unión de A y B se puede calcular mediante la siguiente fórmula:

A\taza B=A+BA\tapa B

Defina las coordenadas diagonales del rectángulo A y el rectángulo B como [\left (xmin_{A},ymin_{A} \right),\left (xmax_{A},ymax_{A} \right)], respectivamente [\left (xmin_{B},ymin_{B} \right),\left (xmax_{B},ymax_{B} \right)], y al mismo tiempo defina las coordenadas diagonales del rectángulo de intersección como [\izquierda (xmin_{AB},ymin_{AB} \derecha),\izquierda (xmax_{AB},ymax_{AB} \derecha)], entonces el método de cálculo de las coordenadas diagonales del rectángulo de intersección es el siguiente:

xmin_{AB}=máx(xmin_{A},xmin_{B})

ymin_{AB}=max(ymin_{A},ymin_{B})

xmáx_{AB}=mín(xmáx_{A},xmáx_{B})

ymax_{AB}=min(ymax_{A},ymax_{B})

Entonces, la intersección y la unión se calculan de la siguiente manera:

A\cap B=\left (xmax_{AB}-xmin_{AB} \right)*\left (ymax_{AB} -ymin_{AB}\right)

W_{A}=xmáx_{A}-xmin_{A}

H_{A}=ymax_{A}-ymin_{A}

W_{B}=xmáx_{B}-xmín_{B}

H_{B}=xmáx_{B}-xmín_{B}

A\taza B=W_{A}*H_{A}+W_{B}*H_{B}-A\tapa B

La fórmula anterior se deriva en base a la intersección de dos rectángulos.Si los dos rectángulos no se intersecan, ¿cómo hace un juicio la fórmula anterior? Si no hay intersección entre estos dos rectángulos, simplemente juzgue A\cap B\leq 0, es decir, si no hay intersección entre los dos rectángulos, entonces la relación de intersección es 0. El cálculo de la relación de intersección y unión se implementa en los códigos de lenguaje Python y C, respectivamente.

El código python se implementa de la siguiente manera:

def iou(b1,b2):
    xmin1,ymin1,xmax1,ymax1=b1
    xmin2,ymin2,xmax2,ymax2=b2
    w1=xmax1-xmin1
    h1=ymax1-ymin1
    w2=xmax2-xmin2
    h2=ymax2-ymin2
    xmin_inter=max(xmin1,xmin2)
    ymin_inter=max(ymin1,ymin2)
    xmax_inter=min(xmax1,xmax2)
    ymax_inter=min(ymax1,ymax2)
    inter=(xmax_inter-xmin_inter)*(ymax_inter-ymin_inter)
    union=w1*h1+w2*h2-inter
    if inter<=0:
        return 0
    else:
        return inter/union

El código del lenguaje C se implementa de la siguiente manera:

struct Box
{
	double xmin;
	double ymin;
	double xmax;
	double ymax;
};

double iou(Box b1, Box b2)
{
	double w1 = b1.xmax - b1.xmin;
	double h1 = b1.ymax - b1.ymin;
	double w2 = b2.xmax - b2.xmin;
	double h2 = b2.ymax - b2.ymin;
	double xmin_inter,ymin_inter,xmax_inter,ymax_inter;
	xmin_inter = (b1.xmin > b2.xmin) ? b1.xmin : b2.xmin;
	ymin_inter = (b1.ymin > b2.ymin) ? b1.ymin : b2.ymin;
	xmax_inter = (b1.xmax < b2.xmax) ? b1.xmax : b2.xmax;
	ymax_inter = (b1.ymax < b2.ymax) ? b1.ymax : b2.ymax;
	double inter=(xmax_inter-xmin_inter)*(ymax_inter-ymin_inter);
	double un=w1*h1+w2*h2-inter;
	if(inter<=0)return 0;
	else return inter/un;
}

Supongo que te gusta

Origin blog.csdn.net/qq_28249373/article/details/129397006
Recomendado
Clasificación