본문 바로가기

~2023

[CSV] csv에 담겨 있는 정보로 이미지 파일을 이미지 데이터로 load하기

728x90
반응형

데이터셋으로 디렉토리 하나가 주어지는데 그 안에 이미지 파일과 이미지 파일명과 label이 정리된 csv 파일이 있다.

그래서 이미지 데이터로 만들기 위해 csv 파일을 읽어 파일명과 label의 index를 갖게 해줘야 한다. 그러기 위해서 우리는 다음과 같은 라이브러리를 사용한다.

필요한 라이브러리

import numpy as np
import pandas as pd
from PIL import Image

 

csv 파일 로드

train_dir = "data/train/"
test_dir = "data/test/"

train_csv = pd.read_csv(train_dir + "train_data.csv")
test_csv = pd.read_csv(test_dir + "test_data.csv")

위에 말한 데이터셋 디렉토리는 프로젝트의 root 디렉토리에서 data/ 아래에 존재한다. 그래서 train dataset은 data/train/ 아래에 있고 test dataset은 data/test/ 아래에 있다.

 

csv 파일 예시

 

데이터 로드 및 변환

# 리스트 초기화
train_images = []
train_labels = []
test_images = []

# csv에서 데이터 로드하기
for file in train_csv['filen_name']:
    image = np.array(Image.open(train_dir + file))
    train_images.append(image)
for label in train_csv['label']:
    train_labels.append(label)

for file in test_csv['file_name']:
    image = np.array(Image.open(test_dir + file))
    test_images.append(image)

# list -> ndarray로 변환
train_images = np.array(train_images)
train_labels = np.array(train_labels)
test_images = np.array(test_images)

# 정규화 후 ndarray 형변환
train_images = train_images / 255.
train_images = train_images.reshape(-1, train_images.shape[1], train_images.shape[2], 1)
test_images = test_images / 255.
test_images = test_images.reshape(-1, test_images.shape[1], test_images.shape[2], 1)

이미지 파일도 train_dir 아래에 있기 때문에 반복문을 통해 파일명에 일치하는 이미지를 이미지 데이터로 추출해 image 변수에 저장하고 이미지 데이터 리스트에 append()한다. label로 마찬가지로 ['label']열에 있는 행 값을 순서대로 label 리스트에 넣어주면 파일명과 label의 index가 일치하게 리스트에 저장할 수 있다. 그리고 test image data에 대해서는 train과 같은 방법을 사용하면 된다.

그런 다음 list를 ndarray로 변환해주고 흑백 이미지이기 때문에 0-1 사이 값으로 정규화해주고 reshape()로 (장 수, width, height, 1)의 크기로 형변환해준다.

 

데이터 저장 및 불러오기(npy 파일)

그런데 이미지 파일이 많다면 저렇게 로드하는 것은 시간이 많이 소요되기 때문에 비효율적이다.

그래서 npy 파일로 만들어 가볍게 이미지를 로드하자.

data_dir = "data/npy/"

# 데이터 저장
np.save(data_dir + "train_images.npy", train_images)
...

저장할 path인 data_dir를 선언하고 np.save()를 통해 이미지 데이터를 npy 파일로 저장하면 된다.

저장된 npy 파일을 로드하는 방법은 다음과 같다.

train_images = np.load(data_dir + "train_images.npy)

 

 

 

 

728x90
반응형