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

[AI 부트캠프] DAY 131 - 파이널 프로젝트 22

by HOHHOH 2024. 1. 26.

[오늘의 일지]

프로젝트 - 이상치 제거

[상세 내용]

이상치 제거

- 지난 일지에서 언급했듯이 이번 프로젝트는 이미지 데이터를 가지고 학습을 하는 것을 베이스로 하고 있습니다. 그래서 제가 이상치라고 생각한 부분은 바운딩 박스가 완전히 범위를 벗어난 값들은 모두 이상치라고 생각했습니다. 그런 데이터를 EDA 해보고 처리 코드를 통해서 제거하는 과정을 정리해 보겠습니다.

 

범위의 기준

- 제가 생각한 범위는 기본 이미지 사이즈를 기준으로 바운딩 박스의 min 지점이 넘어가면서 너비와 높이 또한 음수가 아닌 양수를 가질 때는 무조건 이미지 밖에 바운딩 박스가 존재할 것이라고 판단했습니다. 결과는 아래와 같이 나왔는데 전체 200만 개가 넘는 데이터 중에서 이 정도면 많은 정도는 아니라고 생각했습니다.

count1 = 0
count2 = 0
count3 = 0
count4 = 0
for index, row in tqdm(train.iterrows(), total=len(train)):
#     if abs(row['bbox'][2]) or abs(row['bbox'][3]) > 416:
    if row['bbox'][0] > 416 and row['bbox'][2] > 0:
        count1 += 1
    if row['bbox'][0] > 416 and row['bbox'][3] > 0:
        count2 += 1
    if row['bbox'][1] > 416 and row['bbox'][2] > 0:
        count3 += 1
    if row['bbox'][1] > 416 and row['bbox'][3] > 0:
        count4 += 1
        

print(count1, count2, count3, count4)
>>>
3542 5845 4052 3484

 

- 반대로 바운딩 박스의 min값이 마이너스로 시작하면서 너비와 높이가 양수가 아닌 음수를 가질 때도 완전하게 범위를 벗어나는 지점이라고 판단했습니다. 결과는 아래와 같이 나왔는데 위에서 지정한 조건보다도 더 적은 수가 나왔습니다.

count1 = 0
count2 = 0
count3 = 0
count4 = 0
for index, row in tqdm(train.iterrows(), total=len(train)):
#     if abs(row['bbox'][2]) or abs(row['bbox'][3]) > 416:
    if row['bbox'][0] < 0 and row['bbox'][2] < 0:
        count1 += 1
    if row['bbox'][0] < 0 and row['bbox'][3] < 0:
        count2 += 1
    if row['bbox'][1] < 0 and row['bbox'][2] < 0:
        count3 += 1
    if row['bbox'][1] < 0 and row['bbox'][3] < 0:
        count4 += 1
        

print(count1, count2, count3, count4)
>>>
46 648 2992 61

 

이상치 제거

- 저는 위에서 찾은 이상치 범위들이 전체 데이터에 비하면 많은 숫자가 아니라고 판단하여 과감하게 제거하였습니다.

filtered_train = train[
    ~(train['bbox'].apply(lambda x: x[0] > 416 and x[2] > 0) |
      train['bbox'].apply(lambda x: x[0] > 416 and x[3] > 0) |
      train['bbox'].apply(lambda x: x[1] > 416 and x[2] > 0) |
      train['bbox'].apply(lambda x: x[1] > 416 and x[3] > 0) |
      train['bbox'].apply(lambda x: x[0] < 0 and x[2] < 0) |
      train['bbox'].apply(lambda x: x[0] < 0 and x[3] < 0) |
      train['bbox'].apply(lambda x: x[1] < 0 and x[2] < 0) |
      train['bbox'].apply(lambda x: x[1] < 0 and x[3] < 0))
]
filtered_valid = valid[
    ~(valid['bbox'].apply(lambda x: x[0] > 416 and x[2] > 0) |
      valid['bbox'].apply(lambda x: x[0] > 416 and x[3] > 0) |
      valid['bbox'].apply(lambda x: x[1] > 416 and x[2] > 0) |
      valid['bbox'].apply(lambda x: x[1] > 416 and x[3] > 0) |
      valid['bbox'].apply(lambda x: x[0] < 0 and x[2] < 0) |
      valid['bbox'].apply(lambda x: x[0] < 0 and x[3] < 0) |
      valid['bbox'].apply(lambda x: x[1] < 0 and x[2] < 0) |
      valid['bbox'].apply(lambda x: x[1] < 0 and x[3] < 0))
]

 

[마무리]

 오늘은 바운딩 박스에서 발견될 수 있는 이상치 값들을 제거해 주는 과정에 대해서 정리해 보았습니다. 사실 이상치라고 하지만 양이 전체 데이터에 비하면 얼마 안 되는 숫자이기 때문에 제거를 해도 결과에서는 크게 차이는 나지 않았습니다. 그래도 좋은 경험을 했다고 생각하고 나중에 또 사용하면 좋을 거라 생각했습니다.

반응형

댓글