본문 바로가기

카테고리 없음

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

1. !wget 리눅스 명령어를 사용하여 url에서 이미지 데이터셋을 가져온 후, 디렉토리에 저장

 

!wget --no-check-certificate \
    "https://block-edu-test.s3.ap-northeast-2.amazonaws.com/kagglecatsanddogs_5340.zip" \
    -O "/tmp/cats-and-dogs.zip"

local_zip = '/tmp/cats-and-dogs.zip'
zip_ref = zipfile.ZipFile(local_zip, 'r')
zip_ref.extractall('/tmp')
zip_ref.close()

 

2. 저장된 이미지 파일을 학습할 데이터와 테스트할 데이터로 나누기 위해 새로운 디렉토리를 만든다.

 

try:
    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:
    print("OSERROR")

 

3. 이미지 파일을 학습용 디렉토리(training)와 테스트용 디렉토리(testing) 나누어 저장한다.

 

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

  # 1. 원본 디렉토리에서 파일명을 모두 가져온다.
  filename_list = os.listdir(SOURCE)
  
  # 2. 잘 섞어준다.
  shuffled_list = random.sample(filename_list, len(filename_list))

  # 3. 트레이닝과 테스팅으로 분리하기 위해서 인덱스를 잡아준다.
  index = int(len(shuffled_list) * SPLIT_SIZE)

  # 4. 섞여 있는 리스트에서 위의 인덱스로 학습용과 테스트용 파일을 분리한다.
  training = shuffled_list[ : index ]
  testing = shuffled_list[ index  : ]

  # 5. 각각의 분리된 파일을 해당 디렉토리로 복사해준다.
  for filename in training :
    if os.path.getsize( SOURCE + filename ) > 0 :
      copyfile(SOURCE + filename, TRAINING + filename)

  for filename in testing :
    if os.path.getsize( SOURCE + filename ) > 0 :
      copyfile(SOURCE + filename, TESTING + filename)
      
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/"

# 전체 데이터 중 학습용 데이터는 90%, 테스트용 데이터는 10% 저장
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)