IOU(Intersection over union) Python 예제 코드입니다.
2023. 6. 13 최초작성
코드에서 사용할 경계상자 정보입니다.
box1 = (0, 0, 100, 100) # x,y,w,h
box2 = (0, 0, 50, 50) # x,y,w,h
box3 = (150, 150, 50, 50) # x,y,w,h
box1과 box2의 관계부터 살펴봅니다.
IOU는 두 경계 집합의 교집합 면적과 두 경계 집합의 합집합 면적의 비율을 구합니다.
box1과 box2의 IOU를 구합니다.
box1과 box2의 교집합 면적은 box2의 면적이고 box1과 box2의 합집합의 면적은 box1의 면적입니다.
즉, 50*50 / 100*100 = 2500 / 10000 = 0.25 입니다.
box1에 box2가 겹친 비율은 아래 수식으로 계산할 수 있습니다. 계산해보면 50*50 / 50*50 = 1.0 입니다.
box1과 box3의 관계를 살펴봅니다.
box1과 box3의 IOU를 구하면 두 경계 집합의 교집합 면적이 0이라서 IOU는 0이 됩니다.
box1에 box3이 겹친 비율도 두 경계 집합의 교집합 면적이 0이라서 0이 됩니다.
전체 코드입니다.
def calculate_iou(box1, box2): x1, y1, w1, h1 = box1 x2, y2, w2, h2 = box2 x1_max, y1_max = x1 + w1, y1 + h1 x2_max, y2_max = x2 + w2, y2 + h2 # 두 개의 경계 상자가 겹치는 영역을 찾습니다. inter_x_min = max(x1, x2) inter_y_min = max(y1, y2) inter_x_max = min(x1_max, x2_max) inter_y_max = min(y1_max, y2_max) # 두 개의 경계 상자가 겹치는 영역의 면적을 계산합니다. if (inter_x_min < inter_x_max) and (inter_y_min < inter_y_max): intersection_area = (inter_x_max - inter_x_min) * (inter_y_max - inter_y_min) else: return 0.0 # 두 개의 경계 상자의 면적을 각각 계산합니다. box1_area = w1 * h1 box2_area = w2 * h2 # 교집합/합집합의 비율인 IOU를 계산합니다. # iou는 0에서 1사이의 값을 가집니다. # 값이 0이면 두 경계 상자는 전혀 겹치지 않으며 값이 1이면 두 경계상자는 완벽하게 겹쳐집니다. iou = intersection_area / (box1_area + box2_area - intersection_area) return iou def calculate_percentage_in_box(box1, box2): x1, y1, w1, h1 = box1 x2, y2, w2, h2 = box2 inter_x_min = max(x1, x2) inter_y_min = max(y1, y2) inter_x_max = min(x1 + w1, x2 + w2) inter_y_max = min(y1 + h1, y2 + h2) # 두 개의 경계 상자가 겹치는 영역의 면적을 계산합니다. if (inter_x_min < inter_x_max) and (inter_y_min < inter_y_max): intersection_area = (inter_x_max - inter_x_min) * (inter_y_max - inter_y_min) else: return 0.0 # 두번째 경계 상자의 면적을 구합니다. box2_area = (box2[2] - box2[0]) * (box2[3] - box2[1]) # 첫번째 경계 상자와 두번째 경계 상자가 겹치는 면적과 두번째 경계 상자의 비율을 구합니다. percentage = intersection_area / box2_area return percentage box1 = (0, 0, 100, 100) # x,y,w,h box2 = (0, 0, 50, 50) # x,y,w,h box3 = (150, 150, 50, 50) # x,y,w,h iou = calculate_iou(box1, box2) percentage = calculate_percentage_in_box(box1, box2) print(f"IOU : {iou}") print(f"box1과 겹치는 box2의 비율 : {percentage}") print() iou = calculate_iou(box1, box3) percentage = calculate_percentage_in_box(box1, box3) print(f"IOU : {iou}") print(f"box1과 겹치는 box3의 비율 : {percentage}") |
실행결과입니다.
IOU : 0.25
box1과 겹치는 box2의 비율 : 1.0
IOU : 0.0
box1과 겹치는 box3의 비율 : 0.0
'OpenCV > OpenCV 강좌' 카테고리의 다른 글
OpenCV 빌드 후 ModuleNotFoundError: No module named 'cv2' 에러 해결 (0) | 2023.10.28 |
---|---|
OpenCV Python 동영상의 전체 프레임수를 알아내는 방법 (0) | 2023.10.28 |
OpenCV 강좌 C++ & Python - 원을 그리는 circle 함수 사용법 (0) | 2023.10.25 |
OpenCV 좌표계 변환( Top Left ↔ Bottom Left ) (0) | 2023.10.21 |
Homography matrix를 이용한 planar rectification - OpenCV Python 예제 (0) | 2023.10.20 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!