# os.listdir(DIRECTORY) 디렉토리에 있는 파일 리스팅
# os.path.getsize(PATH) 파일 사이즈 확인
# copyfile(source, destination) 원하는 디렉토리로 파일 복사
# random.sample(list, len(list)) 리스트를 섞는다.(파일명 섞기)



def split_data(SOURCE, TRAINING, TESTING, SPLIT_SIZE):
# YOUR CODE STARTS HERE
    # 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[0: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)


# 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)

 

먼저 파일들을 잘 섞은 후,  트레이닝은 90%, 테스트는 10%로 파일을 나눕니다. 그리고 파일의 사이즈가 0이 아니면, 
 그 파일을 트레이닝 또는 테스트 디렉토리에 실제로 저장을 합니다.

from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale = 1 / 255.0)
validation_datagen = ImageDataGenerator(rescale = 1 / 255.0)

train_generator = train_datagen.flow_from_directory('/tmp/horse-or-human', target_size = (300, 300), class_mode = 'binary')
validation_generator = validation_datagen.flow_from_directory('/tmp/validation-horse-or-human', target_size = (300,300), class_mode = 'binary')

epoch_history = model.fit(train_generator, epochs = 20, validation_data = (validation_generator))

학습시킬 데이터는 넘파이 어레이 인데, 현재 우리는 png 파일로만 준비가 되어있다. 따라서 이미지파일을 넘파이로 바꿔주는 라이브러리를, 텐서플로우가 제공해준다.

 

ImageDataGenerator를 import 하고 rescale 에다 1 / 255.0을 대입한다. 0 ~ 255 로 표현된 rgb값을 0 ~ 1로 만들기 위해서다.

 

변수로 만들어 줬으면, 그다음 할일은, 이미지가 들어있는 디렉토리의 정보, 이미지 사이즈 정보, 분류할 갯수 정보를 알려줘야 한다. 이것들을 flow_from_dirctory에 대입해 준다.
 

 

아래 train_generater는, 넘파이어레이와, 해당 이미지의 정답지도 가지고 있는 변수다. 즉, X_train과 y_train을 모두 한꺼번에 가지고 있다! fit에 학습데이터로 넣어 준뒤 validation_data에는 (validation_generator)를 대입해서 테스트한다.

import zipfile
zip_ref = zipfile.ZipFile('/tmp/horse-or-human.zip')
zip_ref.extractall('/tmp/horse-or-human')

코랩환경에서 했다. 먼저 zipfile을 import한다. zipfile.ZipFile에 압축파일이 있는 경로를 대입해준다.

이것을 변수 zip_ref로 저장한뒤 exttractall에 압축풀 경로를 지정해주면 경로에다 압축 파일이 풀어진다.

!wget --no-check-certificate \
    https://storage.googleapis.com/laurencemoroney-blog.appspot.com/horse-or-human.zip \
    -O /tmp/horse-or-human.zip

!를 통해 리눅스 명령어 wget을 이용한다.

다운로드 할 주소와 -O 뒤에 경로를 써준다.

+ Recent posts