개발/머신러닝

파이썬 머신러닝 - 이미지파일을 테스트용과 학습용으로 나누기 위한 copyfile()

웅'jk 2022. 12. 30. 17:59

리눅스에서 파일을 복사하는 방법은 copyfile(파일의 경로 + 파일명 , 이동할 경로 + 저장명) 으로 가능하다.

import os
import zipfile
import random
import tensorflow as tf
from tensorflow.keras.optimizers import RMSprop
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from shutil import copyfile

def split_data(SOURCE, TRAINING, TESTING, SPLIT_SIZE):
# 소스는 원본 파일 경로
# 트레이닝은 이동할 트레이닝 경로
# 테스팅은 이동할 테스팅 경로
# 스플릿 사이즈는 트레이닝데이터의 비율
  
  # 원본 경로의 파일명들을 모두 가져온다.
  file_names = os.listdir(SOURCE)

  # 가져온 파일명을 잘 섞어준다.
  shuffled_files = random.sample(file_names,len(file_names))

  # 학습용과 테스트용 분리를 위해 index를 구한다.
  index = int(len(shuffled_files) * SPLIT_SIZE)

  # 섞인 파일명 리스트에서, 해당 인덱스만큼 잘라서 학습용고 테스트용 파일명 분리한다.
  training_images = shuffled_files[0:index]
  test_images = shuffled_files[index : ]

  # 학습용과 테스트용으로 각각 해당 폴더로 , 파일을 카피한다.
  for file_name in training_images :
    if os.path.getsize(SOURCE+file_name) > 0 :
    # /temp/PetImages/sjel.jpg
      copyfile(SOURCE + file_name , TRAINING + file_name)
  

  for file_name in test_images :
    if os.path.getsize(SOURCE + file_name) > 0 :
      copyfile(SOURCE + file_name , TESTING + file_name)



# YOUR CODE ENDS HERE


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 = .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)