Berechnung der IoU für unterschiedliche Anzahlen von Vorhersageboxen und Ground Truth-Boxen

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

Dieser Code nutzt den Broadcasting-Mechanismus von NumPy, der es ermöglicht, Arrays unterschiedlicher Formen „automatisch“ in bestimmten Dimensionen zu erweitern, damit sie an Berechnungen derselben Form teilnehmen können. Dieser Mechanismus kann uns das manuelle Kopieren oder Schleifen des Arrays ersparen, wodurch die Berechnungszeit und der Speicherplatzverbrauch reduziert werden.

Konkret konvertieren wir in diesem Code zunächst die beiden Arrays boxes1in boxes2Numpy-Arrays und erweitern ihre Formen für nachfolgende Berechnungen. np.expand_dims()Die Funktion wird hier verwendet , um boxes1auf ein dreidimensionales Array von N1 × 1 × 4 und boxes2auf ein dreidimensionales Array von 1 × N2 × 4 zu erweitern. Wenn wir Berechnungen durchführen, sendet NumPy auf diese Weise diese beiden Arrays automatisch entlang der erweiterten Dimensionen, was zu einem N1 × N2 × 4-Array führt, das die Koordinatenbereichsinformationen zwischen allen möglichen Boxpaaren enthält.

Als nächstes führen wir eine Slicing-Operation für dieses dreidimensionale Array durch, um die Koordinatenbereichsinformationen zwischen allen möglichen Boxpaaren zu erhalten. Insbesondere verwenden wir Slice boxes1[:, :, 0], um die X-Koordinate der oberen linken Ecke aller Vorhersageboxen zu erhalten, und verwenden Slice, boxes2[:, :, 0]um die X-Koordinate der oberen linken Ecke aller Ground-Truth-Boxen zu erhalten. Verwenden Sie dann die NumPy- np.maximum()Funktion, um den maximalen bitweisen Wert dieser beiden Slices zu ermitteln und die x-Koordinate der oberen linken Ecke des Schnittpunkts der beiden Boxsätze zu erhalten. Diese Operation führt zu einem zweidimensionalen N1 × N2-Array, das die x-Koordinate der oberen linken Ecke des Schnittpunkts aller möglichen Boxpaare enthält.

In ähnlicher Weise verarbeiten wir die Koordinatenbereichsinformationen zwischen allen möglichen Boxpaaren, um die Breite und Höhe des Schnittpunkts und der Vereinigung zu erhalten, und berechnen daraus die Fläche des Schnittpunkts und der Vereinigung. Schließlich verwenden wir die Funktion von NumPy, np.maximum()um die IoU zu berechnen und ein zweidimensionales N1 × N2-Array zu erhalten, das die IoU-Werte zwischen allen möglichen Boxpaaren enthält.

Auf diese Weise können wir IoU-Berechnungen für eine unterschiedliche Anzahl von Vorhersageboxen und Ground-Truth-Boxen effizient durchführen, ohne diese manuell zu kopieren oder zu wiederholen. Dies kann die Effizienz der Berechnungen erheblich verbessern, insbesondere wenn die Anzahl der Vorhersageboxen und Ground-Truth-Boxen groß ist.

Guess you like

Origin blog.csdn.net/qq_37424778/article/details/130312183