data_cleaning Project (3)
2025-01-09 17:58:24

1. 폴더 생성 및 데이터 이동

import os
import shutil

# 폴더 생성
os.makedirs("C:/0109_project/data_move_test/images")
os.makedirs("C:/0109_project/data_move_test/labels")

# 옮길 파일명
img_filename = 'image.jpg'
label_filename = 'label.txt'

# image 원본 및 옮겨질 경로
src1 = 'Origin_image/path'
dst1 = 'moved_image/path'

# label 원본 및 옮겨질 경로
src2 = 'Origin_label/path'
dst2 = 'moved_label/path'

# 이동복사
shutil.copy(os.path.join(src1, img_filename), os.path.join(dst1, img_filename))
shutil.copy(os.path.join(src2, label_filename), os.path.join(dst2, label_filename))

 

2. 텍스트 파일 읽기, 쓰기

txt_root = '텍스트 파일 경로'

# 텍스트 파일 읽기
f = open(txt_root, 'r')
f.read # read, readlines
f.close() # 파일 닫기

# 텍스트 파일 쓰기
f = open(txt_root, 'w')
f.write("example")
f.close()

 

3. 이미지 출력

import PIL
from PIL import Image, ImageDraw


# Load the image
image = Image.open('이미지 경로')
txt_root = '텍스트 파일 경로'

# Create an instance of ImageDraw
draw = ImageDraw.Draw(image)

f = open(txt_root, 'r') # file 열기/생성하기 / r: 읽기용, w: 쓰기용
data = f.readline()
f.close() # 파일 닫기

data = data.split()

data = list(map(float, data))

x1 = data[1]*255 - (data[3]*255 / 2)
x2 = data[1]*255 + (data[3]*255 / 2)

y1 = data[2]*255 - (data[4]*255 / 2)
y2 = data[2]*255 + (data[4]*255 / 2)

x, h, w, y = x1, data[4]*255, data[3]*255, y1
draw = ImageDraw.Draw(image)
draw.line([(x, y+30), (x+60, y+30), (x+60, y+90), (x, y+90), (x, y+30)], fill="red", width=2)

image.show()
image.save('저장 경로')
2025-01-09 17:34:14

현재 우리가 진행중인 프로젝트에서 사용할 데이터는 교통 표지판 데이터셋이다.

 

데이터셋의 정보는 다음과 같다.

 

(표 채우기)

(출처)

 

모델 학습에 악영향을 끼칠 수 있다고 판단되는 데이터의 모습을 생각해보자.

 

그리고 이를 sinfect 데이터라 칭하겠다.

 

반대로 좋은 데이터를 clean 데이터라 칭하겠다.

 

나중에 더 추가될 수 있지만 현재로서는 이 정도가 최선인 거 같다.

 

- sinfect 데이터 예시 -

 

1. 주제와 상관없는 데이터

동물

 

사람 얼굴
검은 배경

 

 

2. 바운딩 박스 좌표가 잘못된 데이터

잘못된 바운딩 박스

 

3. 객체의 클래스 정보가 잘못된 데이터

잘못된 클래스

2025-01-09 14:29:27

 우선 프로젝트 주제를 얘기하기 전에 짚고 넘어가야할 부분이 있다. 반성아닌 반성을 하자면, 지난 1년 동안 개발 공부를 해왔지만 정리도 제대로 안하고 코드 분석도 소홀히 한 거 같다. 블로그, 깃허브 또한 마찬가지이다. 처음엔 엄청난 의욕을 가지고 작성했었는데 지금은 그렇지 않고 있다. 주변에서는 이런 말을 많이 한다. "기록을 남겨야 한다." 이런 조언을 무시하며 1년 정도를 보내왔다. 그리고 이런저런 핑계를 대며 기록을 소홀히 했다. 아직 완성되지 않았으니 완성하고 올리자, 블로그에 시간을 많이 쓰면 결국 공부를 못한다 등. 사실은 이 모두가 핑계였다는 것을 나는 알고 있었을 지도 모른다. 따라서 지금부터라도 시작하려고  한다.

 

 

  지난 1년 동안 개발 공부를 하면서 시계열 데이터에 관한 프로젝트도 진행해보고 이미지 데이터에 관한 프로젝트도 진행하였다. 전자의 경우 깊이감있는 공부를 하진 않았고 후자의 경우 나름 논문도 하나 나올만큼의 성과가 있었다. 주제는 "교통 표지판 인식에서의 일반화 성능 평가"이다. 프로젝트 진행은 나와 연구실 동료와 진행하였고 담당 교수님의 지휘 하에 진행하였다. 프로젝트를 진행하면서 많은 고충이 있었다. 처음에는 GPU 연동과 모델 수집이 너무 어려웠다. 하지만 지나고보니 가장 힘들었던 부분은 데이터였다. 그저 데이터를 수집하고 모델에 입력하면 끝이라고 생각했는데 너무 오만한 생각이었다. 데이터 수집뿐만 아니라 분석 및 이상치 데이터를 관리하는 것이 이렇게나 힘들 줄 몰랐다. 또한 잘못된 데이터로 인해 모델의 성능이 떨어지는 것 또한 간과하고 있었다. 실제로 논문 마감 1주일 전에 예상치 못한 데이터의 오류가 있었다. 이를 해결하기 위해 낮과 밤이 바뀔 정도였다. 몇 천개 이상의 데이터를 눈으로 확인하고 잘못된 데이터를 직접 수정하는 것은 여간 쉬운 일이 아니었다. 따라서 생각한 것이 클린한 데이터를 학습한 모델로 다른 데이터를 정제하는 것이다.

 

 

 다음 챕터부터는 데이터 정제를 위한 설계를 준비하도록 하겠다.