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

[AI 부트캠프] DAY 118 - 파이널 프로젝트 9

by HOHHOH 2024. 1. 9.

[오늘의 일지]

프로젝트 - 데이터 정제

[상세 내용]

데이터 정제

- 지난주에 데이터를 파악했을 때는 반정형 데이터인 json 파일로 되어 있어서 보는데도 불편하고 가져다가 쓰기 위해서도 불편한 부분이 많다는 것을 느꼈습니다. 그래서 기존에 프로젝트 때마다 사용했던 방식인 케글이나 데이콘에서 많이 제공하는 pandas 데이터 프레임 방식으로 정형화시키기를 시도했습니다.

 

json 파일 열고 원하는 부분 정형화 하기

- 기존의 존재하는 라이브러리를 사용하여 json을 열고 pandas의 json을 노멀라이즈 하는 기능이 있어서 사용한 뒤 for문을 통해 순환되는 데이터들을 마지막으로 concat을 토해서 전체적으로 받았다. 아래와 같은 방법을 한 사이클로 해서 데이터를 받았습니다.

data1_list = []

# 파일 리스트 가져오기
folder_path = './[라벨]상표이미지_valid'
file_list = os.listdir(folder_path)

for value in file_list:
    file_path = os.path.join(folder_path, value)
    
    try: # 파일이 비어 있거나 JSON 형식이 아닌 경우에 대비하여 try-except 블록 사용
        with open(file_path, 'r', encoding='utf-8') as json_file:
            json_data = json.load(json_file)
            
            temp_images_df = pd.json_normalize(json_data, 'images')
            
            data1_list.append(temp_images_df)
    except (json.JSONDecodeError, ValueError) as e:
        print(f"Error decoding JSON in file {file_path}: {e}")

images_df = pd.concat(data1_list, ignore_index=True)

print(images_df)

 

크게 3종류의 정형데이터 생성

- json 파일이 가지고 있었던 딕셔너리 별로 큰 분류를 기준으로 데이터를 정제하면 크게 3가지 정형 데이터를 얻을 수 있었습니다. 각각의 특징은 이미지 자체의 비엔나 코드를 가지고 있는 데이터와 비엔나 코드의 특징을 설명해 주는 데이터 그리고 마지막으로 각 이미지 별로 비엔나 코드가 존재하는 좌표인 bbox를 가지고 있는 데이터였습니다. 

 

- 데이터 예시 1

비엔나 코드 정보를 가지고 있는 데이터

 

- 데이터 예시 2

비엔나 코드의 설명을 가지고 있는 데이터

 

- 데이터 예시 3

비엔나 코드의 좌표와 특징을 가지고 있는 데이터

 

최종적으로 겹치는 칼럼으로 병합

- 마지막으로 모든 데이터를 병합하기 위해서 각각의 데이터에 겹치는 칼럼을 생성시켜 놓았습니다. 결과적으로 데이터의 수가 가장 많은 3번째 데이터를 기준으로 join 해서 완성시켰습니다. 칼럼의 개수는 총 12개입니다.

12개의 칼럼을 가지고 있는 최종 데이터

 

[마무리]

 오늘은 프로젝트를 위해서 제공받은 반정형 데이터인 json파일을 정형 데이터로 정제해 보는 것을 정리해 보았습니다. 제가 본격적으로 프로젝트를 하기 위해서는 기존의 데이터 방식이 우리가 사용했던 형태로 변경시켜 놓고 시작하면 일이 더 수월하겠다고 느꼈습니다. 아마도 내일은 만들어 놓은 데이터를 활용해서 YOLO 모델로 이미지에 detection이나 분류를 위한 과정을 해보면 좋을 거 같습니다.

반응형

댓글