Calcular IoU para diferentes números de cuadros de predicción y cuadros de Ground Truth

import numpy as np

def calculate_iou(boxes1, boxes2):
    # 转换为 numpy 数组
    boxes1 = np.array(boxes1)
    boxes2 = np.array(boxes2)
    
    # 扩展维度,以便广播计算
    boxes1 = np.expand_dims(boxes1, axis=1)
    boxes2 = np.expand_dims(boxes2, axis=0)
    
    # 计算两组框的交集坐标范围
    x_min = np.maximum(boxes1[:, :, 0], boxes2[:, :, 0])
    y_min = np.maximum(boxes1[:, :, 1], boxes2[:, :, 1])
    x_max = np.minimum(boxes1[:, :, 2], boxes2[:, :, 2])
    y_max = np.minimum(boxes1[:, :, 3], boxes2[:, :, 3])
    
    # 计算交集和并集的面积
    intersection = np.maximum(x_max - x_min, 0) * np.maximum(y_max - y_min, 0)
    union = (boxes1[:, :, 2] - boxes1[:, :, 0]) * (boxes1[:, :, 3] - boxes1[:, :, 1]) + \
            (boxes2[:, :, 2] - boxes2[:, :, 0]) * (boxes2[:, :, 3] - boxes2[:, :, 1]) - \
            intersection
    
    # 计算 IoU
    iou = intersection / np.maximum(union, 1e-8)
    
    return iou

Este código utiliza el mecanismo de transmisión de NumPy, que permite que matrices de diferentes formas se expandan "automáticamente" en ciertas dimensiones, para que puedan participar en cálculos de la misma forma. Este mecanismo puede evitar que copiemos o repitamos manualmente la matriz, reduciendo así el tiempo de cálculo y el consumo de espacio.

Específicamente, en este código, primero convertimos las dos matrices boxes1en boxes2matrices numerosas y expandimos sus formas para cálculos posteriores. np.expand_dims()La función se utiliza aquí para boxes1expandirse a una matriz tridimensional de N1 × 1 × 4 y boxes2a una matriz tridimensional de 1 × N2 × 4. De esta manera, cuando realizamos cálculos, NumPy transmitirá automáticamente estas dos matrices a lo largo de la dimensión extendida, obteniendo así una matriz N1 × N2 × 4, que contiene la información del rango de coordenadas entre todos los pares posibles de cuadros.

A continuación, realizamos una operación de corte en esta matriz tridimensional para obtener la información del rango de coordenadas entre todos los pares de cajas posibles. Específicamente, usamos el corte boxes1[:, :, 0]para obtener la coordenada x de la esquina superior izquierda de todos los cuadros de predicción, y usamos el corte boxes2[:, :, 0]para obtener la coordenada x de la esquina superior izquierda de todos los cuadros de verdad del terreno. Luego, use la función NumPy np.maximum()para tomar el valor bit a bit máximo de estos dos sectores para obtener la coordenada x de la esquina superior izquierda de la intersección de los dos conjuntos de cuadros. Esta operación dará como resultado una matriz bidimensional N1 × N2, que contiene la coordenada x de la esquina superior izquierda de la intersección entre todos los pares de cajas posibles.

De manera similar, procesamos la información del rango de coordenadas entre todos los pares posibles de cuadros, obtenemos el ancho y el alto de la intersección y la unión, y los usamos para calcular el área de la intersección y la unión. Finalmente, usamos np.maximum()la función NumPy para calcular el IoU y obtener una matriz bidimensional N1 × N2, que contiene los valores de IoU entre todos los pares de cajas posibles.

De esta manera, podemos realizar cálculos de IoU de manera eficiente para diferentes números de cuadros predichos y cuadros de verdad del terreno sin duplicarlos ni realizar bucles manualmente. Esto puede mejorar en gran medida la eficiencia de los cálculos, especialmente cuando la cantidad de cuadros de predicción y cuadros de verdad del terreno es grande.

Supongo que te gusta

Origin blog.csdn.net/qq_37424778/article/details/130312183
Recomendado
Clasificación