본문 바로가기
AI/AI 부트캠프

[AI 부트캠프] DAY 130 - 파이널 프로젝트 21

by HOHHOH 2024. 1. 25.

[오늘의 일지]

프로젝트 - 데이터 로더 수정하기

[상세 내용]

데이터 로더 수정하기

- 이번 프로젝트를 진행하면서 지난 일지 중에서 데이터로더를 만들어서 정리했었던 적이 있었습니다. 그런데 학습을 진행하면서 프로젝트 데이터의 바운딩 박스에는 생각보다 문제점이 많다는 것을 알게 되었습니다. 이번 일지에서는 제가 발견했던 문제점에 대해서 정리하고 어떤 식으로 데이터 로더 코드를 수정했는지도 설명하겠습니다.

 

지난 데이터 처리 설명

- 제가 지난 일지에서는 YOLO의 데이터 형식에 맞게 범위를 정해줘서 그냥 최종적으로 0~1의 값만 만족하면 될 거라고 예측을 해서 아래와 같은 형태의 데이터 정체처리를 했었습니다.

# 바운딩 박스 형태
<x_min> <y_min> <너비> <높이>

# 데이터 처리
x_min, y_min = max(0, float(x)), max(0, float(y))
x, y = min(1, float(((x_min*2 + width) / 2) / image_width)), min(1,float(((y_min*2 + height) / 2) / image_height))
w, h = min(1, abs(width) / image_width), min(1, abs(height) / image_height)

# YOLO의 데이터 형태
<클래스> <x_중심> <y_중심> <너비> <높이>

 

새로운 문제 정의

- 그런데 위에 코드와 같은 처리를 하고 나서 새롭게 발견한 문제가 있는 바운딩 박스를 발견하게 되었습니다. 기존 데이터의 바운딩 박스 중에 너비와 높이가 마이너스 값의 형태를 가지고 있는 값을 발견하게 되었습니다. 그래서 이 값을 최솟값과 최고값의 형태로 바꿔준 뒤에 이미지에 지점을 출력시켜 보니 문제가 없었지만 위에서 나온 방식으로 너비와 높이에 절댓값을 씌워서 가져왔을 때는 YOLO 데이터 형태로 변경했을 때 위치가 달라지는 것을 확인했습니다. 아래는 너비와 높이의 예시입니다. 정리하자면 너비와 높이에 절댓값을 먼저 씌우는 것이 문제를 발생시켰다고 할 수 있습니다.

# 문제 예시
[190.09, 230.6, -43.96, -55.91]
[38.51, 256.6, -98.09, -117.82]

 

- 위에서 제시했던 바운딩 박스의 특이한 점은 너비와 높이를 앞 쪽에 x_min과 y_min에 더하게 되면 계산상으로 x_max와 y_max가 생성되는데 기존의 x_min과 y_min 보다 더 작은 값으로 생성된 x_max와 y_max가 생성된다는 점을 알 수 있었습니다. 그런데 여기서 재밌는 사실은 바운딩 바스의 최소점과 최고점의 명칭만 반대로 바꿔주고 기존에 생성된 값을 그냥 사용하면 알맞은 위치에 바운딩 박스가 생성되어 있다는 것을 알게 되었습니다. 간단하게 위에 예시로 정리하자면 [190.09, 230.6, -43.96, -55.91] 여기에서 앞에 190.09와 230.6이 max값이라고 생각하면 제대로 된 바운딩 박스를 얻게 될 것이라는 말입니다. 마이너스 값의 너비와 높이가 190.09와 230.6에 더해졌을 때 떨어진 값이 발생해서 이 값을 min값으로 사용하면 문제가 해결되었다는 말이었습니다.

 

해결 코드

- 위의 문제를 해결하기 위해서 기존의 너비와 높이를 바로 사용했던 방식을 버리고 x_max와 y_max값을 먼저 만들어 주는 방식으로 바꿔주었습니다. 바운딩 박스의 최솟값과 최고값을 가져와서 범위를 지정해 주고 다시 YOLO 데이터에 맞게 설정을 해주면 최솟값과 최댓값이 반대로 지정이 되더라도 그냥 더해서 center값이나 너비 높이를 구해줘도 아무 상관이 없다는 것을 확인했습니다. 아래는 코드 예시입니다.

x_min, y_min = max(0, min(image_width, float(x_min))), max(0, min(image_height, float(y_min)))
x_max, y_max = max(0, min(image_width, float(x_min + width))), max(0, min(image_height, float(y_min + height)))
x, y = max(0, min(1, float(((x_min + x_max) / 2) / image_width))), max(0, min(1,float(((y_min + y_max) / 2) / image_height)))
w, h = max(0, min(1, abs(x_min - x_max) / image_width)), max(0, min(1, abs(y_min - y_max) / image_height))

 

실제 이미지에서 적용 확인

- 위에서 수정한 코드로 이미지에 적용시켰을 때 기존에는 잘못된 위치를 잡던 바운딩 박스가 제대로 된 위치를 잡게 된다는 것을 확인할 수 있었습니다.

수정전

 

수정후

[마무리]

 오늘은 학습을 진행하면서 발생한 문제에 대해서 코드 수정을 통해서 다시 문제를 바로잡는 과정에 대해서 정리해 보았습니다. 현재 프로젝트에서 사용하는 데이터 자체가 많기도 많은데 어떤 형태의 잘못된 데이터가 섞여 있는지 하나하나 찾기가 어려운 상황인 거 같습니다. 내일은 바운딩 박스를 다시 그려야만 해결이 될 거 같은 데이터를 그냥 처리하는 과정에 대해서 정리해 보도록 하겠습니다.

반응형

댓글