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)