본문 바로가기
Personal Projects/Toy Projects

[토이 프로젝트 3] 범인의 몽타주 그려주는 AI - 데이터 전처리

by muns91 2024. 12. 11.
Text to 몽타주 AI 만들기 - 데이터 전처리

 

 이번 글은 세 번째 토이 프로젝트의 데이터 전처리에 대한 글입니다. 또 다시 시작된 가상 환경 설정, pip install, Error, 그리고 Wandb까지... 등등 힘겨운 우열곡절(?) 끝에 겨우 학습을 시킨 후, 토이 프로젝트 3에 대한 글을 쓸 수 있게 되었습니다.  데이터 전처리의 경우는 경로 설정 등의 부분 빼고는 대부분 영상을 따라하시면 되고, 약간의 오타(?) 부분을 수정하면 데이터 전처리를 수행할 수 있습니다. 그럼 데이터 전처리 과정에 대해서 살펴보도록 하겠습니다. 

 

 

AI-Hub

샘플 데이터 ? ※샘플데이터는 데이터의 이해를 돕기 위해 별도로 가공하여 제공하는 정보로써 원본 데이터와 차이가 있을 수 있으며, 데이터에 따라서 민감한 정보는 일부 마스킹(*) 처리가 되

www.aihub.or.kr


■ 데이터 전처리

 AI 허브로부터 받는 데이터의 크기는 약 10GB 정도되고 데이터는 이미지 데이터와 JSON 파일로 구성되어 있습니다. 데이터를 다운받는 데, 조금 시간이 걸리니 이점을 유의해주세요. 데이터를 다 받으셨으면 01. 데이터에서 TrainingValidation에서 라벨링데이터에서 TL 파일(압축 파일)을 사용하시면 됩니다. TL 파일의 압축을 푸시면 Images 폴더와 json 폴더를 확인할 수 있습니다. 

 

 

1. 라이브러리 import

from glob import glob
from tqdm import tqdm
import os, json
from pathlib import Path
from shutil import copy2

 

2. 데이터 경로 지정

base_path = '데이터 위치 경로'

json_list = glob(os.path.join(base_path, 'json/*/*.json'))

print(len(json_list))

 

3. 데이터 확인 (1)

for json_path in json_list:
    with open(json_path, 'r') as f:
        meta_data = json.load(f)

    print(meta_data)
    break

 

4. 데이터 확인 (2)

for json_path in json_list:
    with open(json_path, 'r') as f:
        meta_data = json.load(f)

    print(meta_data['description']['impression']['description'])
    print(meta_data['sketch_info']['img_path'])
    print(meta_data['org_sketch_info']['img_path'])
    break

 

5. preprocessed 폴더에 데이터 옮기기 + 데이터 path를 text로 파일로 만들기

target_path = '프로젝트경로/preprocessed'

img_list = []
label_list = []

os.makedirs(target_path, exist_ok=True)
os.makedirs(os.path.join(target_path, 'images'), exist_ok=True)
os.makedirs(os.path.join(target_path, 'labels'), exist_ok=True)

for i, json_path in enumerate(tqdm(json_list)):
    with open(json_path, 'r') as f:
        meta_data = json.load(f)

    if 'impression' in meta_data['description']:
        text = meta_data['description']['impression']['description']
    else:
        # print(meta_data['descripton'][0])
        text = meta_data['description']['face']['description']

    img_path = os.path.join(base_path, meta_data['sketch_info']['img_path'][1:])
    orig_img_path = os.path.join(base_path, meta_data['org_sketch_info']['img_path'][1:])

    target_img_path = os.path.join(target_path, 'images', str(i).zfill(5) + '_' + os.path.splitext(os.path.basename(json_path))[0] + '.jpg')
    target_orig_img_path = os.path.join(target_path, 'images', str(i).zfill(5) + '_' + 'orig_' + os.path.splitext(os.path.basename(json_path))[0] + '.png')

    target_label_path = os.path.join(target_path, 'labels', str(i).zfill(5) + '_' + os.path.splitext(os.path.basename(json_path))[0] + '.txt')
    target_orig_label_path = os.path.join(target_path, 'labels', str(i).zfill(5) + '_' + 'orig_' + os.path.splitext(os.path.basename(json_path))[0] + '.txt')

    img_list.append(target_img_path)
    img_list.append(target_orig_img_path)
    label_list.append(target_label_path)
    label_list.append(target_orig_label_path)

    copy2(img_path, target_img_path)
    copy2(orig_img_path, target_orig_img_path)

    with open(target_label_path, 'w') as f:
        f.write(text)
    with open(target_orig_label_path, 'w') as f:
        f.write(text)

print(len(img_list), len(label_list))

 

6. 데이터 저장 및 확인

import numpy as np

np.savetxt(os.path.join(target_path, 'image_list.txt'), img_list, fmt='%s')
np.savetxt(os.path.join(target_path, 'label_list.txt'), label_list, fmt='%s')


image_path = Path(os.path.join(target_path))
image_files = [
    *image_path.glob("**/*[0-9].txt"),
    *image_path.glob("**/*[0-9].jpg"),
    *image_path.glob("**/*[0-9].png"),
]

len(image_files) / 2

 

7. TEST SET

val_img_list = glob(os.path.join('C:/Users/Server1/Desktop/Toy_Project/1. Project_3/preprocessed', 'val/*.jpg'))

len(val_img_list)

np.savetxt(os.path.join('C:/Users/Server1/Desktop/Toy_Project/1. Project_3/preprocessed', 'image_list_test.txt'), val_img_list, fmt='%s')

 

8. 결과

 


마무리

 여기까지 토이프로젝트 3의 데이터 전처리 과정이었습니다. 다음에는 학습을 위한 과정을 수행하는 것을 순차적으로 보여드리도록 하겠습니다. 전처리는 정말 쉽게 넘어갈 수 있었지만 이후, 학습을 위해서 중간에 정말 많은 절차와 오류들을 물리치느니라, 포기할 뻔(?) 했지만 그래도 블로그에... 써놓은 것이 있으니 아까워서라도 해야겠다는 생각으로 겨우 겨우 해낼 수 있었던 것 같습니다. 역시 누군가의 프로젝트를 따라하는 것은 정말 쉬운 일은 아닌 것 같습니다. 그럼 이번 글은 여기까지 작성하고 다음 글로 찾아뵙겠습니다. 오늘도 화이팅입니다~!

 

 

반응형