개발공부

파일을 training과 test 디렉토리로 나눠서 저장하는 방법 본문

Python/Deep Learning

파일을 training과 test 디렉토리로 나눠서 저장하는 방법

mscha 2022. 6. 15. 17:45

예시 코드

아래와 같이 /tmp/PetImage 경로에 Cat과 Dog 폴더로 나누어져 있고

그 안에 각각 고양이, 강아지 이미지가 있는 경우를 생각해봅시다.

이 때 Cat 폴더의 이미지와 Dog 폴더의 이미지를 각각 랜덤한 순서로 섞은후 

각각의 Cat, Dog 이미지의 90 %는 training 폴더에 새로운 폴더 cats와 dogs를 만들어 저장하고

10 % 는 test 폴더에 새로운 폴더 cats, dogs를 만들어 저장해야합니다. 

해당 방법은 아래와 같습니다.

각각 12501개의 이미지 데이터가 있습니다.

print(len(os.listdir('/tmp/PetImages/Cat/')))
print(len(os.listdir('/tmp/PetImages/Dog/')))

1. 먼저 각각의 폴더들을 생성합니다.

import os

try:
    #YOUR CODE GOES HERE
    os.mkdir('/tmp/cats-v-dogs')
    os.mkdir('/tmp/cats-v-dogs/training')
    os.mkdir('/tmp/cats-v-dogs/testing')
    os.mkdir('/tmp/cats-v-dogs/training/cats')
    os.mkdir('/tmp/cats-v-dogs/training/dogs')
    os.mkdir('/tmp/cats-v-dogs/testing/cats')
    os.mkdir('/tmp/cats-v-dogs/testing/dogs')
    
except OSError:
    pass

 

2. 이미지를 분리 저장하는 함수를 만듭니다.

import os
import random

from shutil import copyfile

def split_data(SOURCE, TRAINING, TESTING, SPLIT_SIZE):

    # 1. 원본 디렉토리에서, 파일명을 모두 가져옵니다.
    fnames = os.listdir(SOURCE)

    # 2. 잘 섞어줍니다.
    fnames = random.sample(fnames, len(fnames))

    # 3. 트레이닝과 테스트로 나눠주기위해서, 인덱스를 구합니다.
    index = int(len(os.listdir(SOURCE)) * SPLIT_SIZE)
    
    # 4. 트레이닝 이미지와, 테스팅 이미지로 나눕니다.
    training_images = fnames[: index]
    testing_images = fnames[index : ]

    # 5. 각각의 분리된 파일을 해당 디렉토리로 복사해줍니다.
    # 파일의 크기가 0보다 클때만 시행합니다.
    for i in training_images :
        if os.path.getsize(SOURCE + i) > 0 :
            copyfile(SOURCE + i,TRAINING + i)
    
    for i in testing_images :
        if os.path.getsize(SOURCE + i) > 0 :
            copyfile(SOURCE + i, TESTING + i)

 

3. 함수를 호출합니다.

CAT_SOURCE_DIR = "/tmp/PetImages/Cat/"
TRAINING_CATS_DIR = "/tmp/cats-v-dogs/training/cats/"
TESTING_CATS_DIR = "/tmp/cats-v-dogs/testing/cats/"
DOG_SOURCE_DIR = "/tmp/PetImages/Dog/"
TRAINING_DOGS_DIR = "/tmp/cats-v-dogs/training/dogs/"
TESTING_DOGS_DIR = "/tmp/cats-v-dogs/testing/dogs/"

# split_size = 90%
split_size = .9
split_data(CAT_SOURCE_DIR, TRAINING_CATS_DIR, TESTING_CATS_DIR, split_size)
split_data(DOG_SOURCE_DIR, TRAINING_DOGS_DIR, TESTING_DOGS_DIR, split_size)

 

4. 파일 복사가 제대로 됐는지 확인합니다.

print(len(os.listdir('/tmp/cats-v-dogs/training/cats/')))
print(len(os.listdir('/tmp/cats-v-dogs/training/dogs/')))
print(len(os.listdir('/tmp/cats-v-dogs/testing/cats/')))
print(len(os.listdir('/tmp/cats-v-dogs/testing/dogs/')))