이미지에서 감지 된 두 개의 직사각형을 어떻게 일치시킬 수 있습니까?

Nov 14 2020

딥 러닝을 기반으로 두 개의 검출기로 많은 이미지에서 검출 된 직사각형의 비율을 계산하고 싶습니다. 예를 들어 아래 그림에서 첫 번째 검출기는 큰 원 (c1 및 c2)을 감지하고 두 번째 검출기는 작은 원 (d1 및 d2)을 감지합니다. 이제 첫 번째 검출기는 c1과 c2의 좌표를 반환하고 두 번째 검출기는 d1과 d2의 좌표도 반환합니다.

그래서

d1 / c1과 d2 / c2의 비율을 자동으로 계산할 수있는 함수와 코드를 만들고 싶습니다. 그래서 내 생각은 작은 좌표 (예 : d1, d2)가 해당 큰 좌표 (예 : c1, c2)에 포함되면 비율 계산에 일치된다는 것입니다.

c1 좌표 (xmin, ymin, xmax, ymax) : (10, 10, 30, 30) d1 coorinate : (13, 15, 20, 23)

c2 좌표 : (20, 20, 40, 40) d2 좌표 : (25, 24, 32, 33)

하지만 저는 OpenCV와 파이썬의 많은 기능을 모릅니다. 코드 나 기능을 만들거나 라이브러리를 추천 해 주시겠습니까?

감사합니다

답변

2 Abhi25t Nov 14 2020 at 16:39

이 작업에 일반적으로 사용되는 메트릭은 "Intersection over Union"즉 IOU입니다.

이 형식의 경계 상자 (사각형)에 대한 입력을 사용하면 [50, 60, 200, 150]다음과 같이 사용자 지정 함수를 작성할 수 있습니다.

def intersection_over_union(box1, box2):
    # Get coordinates of the intersection 
    x1 = max(box1[0], box2[0])
    y1 = max(box1[1], box2[1])
    x2 = min(box1[2], box2[2])
    y2 = min(box1[3], box2[3])

    # Get the area of intersection rectangle
    intersection = max(0, x2 - x1 + 1) * max(0, y2 - y1 + 1)

    # Get the area of both rectangles
    box1Area = (box1[2] - box1[0] + 1) * (box1[3] - box1[1] + 1)
    box2Area = (box2[2] - box2[0] + 1) * (box2[3] - box2[1] + 1)

    iou = intersection / float(box1Area + box2Area - intersection)

    return iou

이를 위해서는 경계 상자가 다음 조건이 올바른 표준 형식으로 반환되어야합니다.

assert box1['x1'] <= box1['x2']
assert box1['y1'] <= box1['y2']
assert box2['x1'] <= box2['x2']
assert box2['y1'] <= box2['y2']

이 답변에 대한 자세한 내용 .

경계 상자 쌍이 해당 조건을 유지하지 않는 경우 sklearn에서 jaccard_score (IOU의 다른 이름)를 사용하는 것이 가장 좋습니다.

from sklearn.metrics import jaccard_score
import numpy as np

box1 = [180, 400, 450, 450]
box2 = [200, 450, 425, 425]

img = np.zeros((800, 800, 3), np.uint8)  # use your image shape here or directly below

img1 = cv2.rectangle(np.zeros(img.shape), (box1[0], box1[1]), (box1[2], box1[3]), (1, 1, 1), -1) 
img2 = cv2.rectangle(np.zeros(img.shape), (box2[0], box2[1]), (box2[2], box2[3]), (1, 1, 1), -1)

jaccard_score(img1.ravel(),img2.ravel())