무효 클릭 IP 추적 중...
머신러닝,딥러닝/딥러닝

python 딥러닝 폴더 구조 쉽게 나누는 방법(with splitfolders)

꼬예 2022. 11. 15.

 

데이터가 train, validation, test로 구분이 되어 있어야 보다 손쉽게 작업이 가능할 텐데요.

문제는 이러한 형태로 데이터셋이 구성되어 있지 않을 때가 많다는 것입니다.

 

이럴 경우 직접 수동으로 폴더 구조를 수정할 수 있지만 데이터가 코랩과 같은 클라우드에 있을 경우 상당히 번거로워 지죠.

 

이러한 문제를 해결하기 위한 툴로 splitfolders라는 툴을 소개하고자 합니다.

 

사용법을 설명하기 앞서 예제 데이터 셋에 대한 설명부터 하겠습니다.

 

1. 기본 데이터셋 설명

1) 예제 데이터 셋(https://www.kaggle.com/datasets/arunrk7/surface-crack-detection) 준비

캐글에서 다운로드한 파일을 코랩에 저장합니다.

압축된 상태 그대로 사용할 것이고, 코랩 코드상에서 압축을 풀 예정입니다.

(그렇게 하는 이유와 압축 해제 방법 해당 글에서 자세히 설명)

 

2) 압축 풀기

drive.mount를 통해 구글 드라이브와 연동하여 다운로드한 데이터에 접속 가능토록 합니다.

해당 데이터는 압축된 형태이기 때문에 압축을 먼저 풀어줄 건데요.

이때 test_data라는 폴더를 임의로 만들고 그 안에 파일을 저장하는 형태로 진행하겠습니다.

 

구글마운트연결

 

다운로드한 zip 파일을 풀어보면 Negative, Postive로 디렉토리가 구성되어 있습니다.

 

negative positive 구성

 

각 폴더 안에 들어있는 파일 개수는 각각 2 만장씩입니다.

 

폴더내 사진 숫자

 

2. split-folders 사용법

1) split-folders 설치 및 기본 세팅

pip install을 통해 라이브러리를 설치합니다.

 

pip install split-folders

 

split-folders 공식문서

 

자세한 내용은 공식문서 참조 : https://pypi.org/project/split-folders/

 

다운 받은 후 해당 라이브러리를 import 해줍니다.

 

splitfolders import

 

split-folders는 기본적으로 원본 파일을 복사하여 새롭게 디렉토리를 구성하는 컨셉입니다.

즉 어느 곳에 먼저 디렉토리를 구성할지부터 정해줘야 하는데요.

 

예제에서는 현재 경로를 기준으로 test_data_copy라는 폴더를 만들고 그곳에 새롭게 디렉토리를 구성해보도록 하겠습니다.

 

test_data_copy 폴더 만들기
새롭게 만들어진 디렉토리

 

splitfolders에서는 파일을 분류할 때 크게 두 가지 방법(비율, 개수)을 제공합니다.

 

2) 비율로 폴더 분리하기

(1) train / validation 형태로 만들기

분리하고 싶은 파일 경로를 첫 번째 인자로 넣어줍니다.

 

분리하고싶은 파일 경로 넣기

 

ouptut인자에는 분리 완료된 파일을 어느 경로에 넣어줄지 적어줍니다.

분리 완료된 파일 경로

 

실행할 때마다 각 폴더에 할당되는 파일이 달라질 수 있으니 고정을 위해 seed번호를 적어줍니다.

(사실 아무 숫자를 적어줘도 크게 문제는 없습니다.)

 

seed번호 고정

 

ratio 인자에는 튜플 형태의 값을 넣어주는데요.

첫 번째 값이 train data의 비율, 두 번째 값이 validation data의 비율을 의미합니다. 비율이기 때문에 두 값의 합은 1이 되어야겠지요?

 

train, validation데이터 비율 설정

 

코드 실행 후 디렉토리 형식이 변경된 것을 알 수 있습니다. 

 

디렉토리형식 변형

 

변경된 폴더 안 파일 개수를 확인해보면 앞서 지정한 비율로 파일들이 분리된 걸 알 수 있습니다.

 

비율에 따른 파일 분리

 

(2) train / validation / test 형태로 만들기

1번 예제와 차이가 있다면 ratio 인자에 3개의 값을 튜플 형태로 넣어줍니다.

마찬가지로 합이 1이 되어야 하고요.

 

train / validation /test 형태로 나누기

 

각 비율은 train, validation, test 순서로 할당된 비율입니다.

 

 

변형된 디렉토리

 

파일 개수도 지정한 대로 잘 할당된 걸 알 수 있습니다.

 

 

지금까지는 비율을 기반으로 파일을 나누었다면 파일 개수로 나눌 수도 있습니다.

 

3) 정확한 숫자로 분리하기 

기존에 ratio라는 키워드로 사용했던 부분을 fixed로 변경해줍니다.

 

fixed로 변경

 

예제에서 fixed인자에 1개의 값만 전달했는데요. 해당 코드를 실행해보면 train/val로 구성된 디렉토리가 완성이 됩니다.

 

train /val 폴더 구성

 

파일 개수를 확인해보면 fixed인자로 넣어주었던 숫자가 validation 폴더의 파일 개수로 지정된 걸 알 수 있습니다.

그리고 그 나머지분을 자동으로 train에 할당합니다.

fixed인자에 넣은 값은 validation에 적용

 

fixed에 두 개의 값을 전달하면 어떻게 될까요?

 

fixed인자에 두개의 값 전달

 

두개의 값을 전달하니 train /val /test 3개 디렉토리로 구성됩니다.

 

 

각 디렉토리 파일 개수를 확인해보니 fixed 첫번째 인자로 넣어준 값이 validation, 두번째가 test의 파일 갯수를 의미하고 나머지는 자연스럽게 train으로 할당되었습니다.

 

train /val/ test 파일 갯수 설정

 

여기서 oversample은 기본적으로 False로 설정되어있는데요.

True로 변경하면 뭐가 다를까요?

 

우리 예제에서 사용한 데이터셋은 불량품, 양품 사진 수가 각각 같기 때문에 학습 시 데이터 불균형으로 인한 문제가 발생하지 않습니다.

 

데이터 수가 같음

 

하지만 설명을 위해 일부러 데이터 불균형을 만들어보겠습니다.

불량품 사진 10000개 정도를 지웠는데요.

 

 

이런 상황에서는 양품이 더 많기 때문에 양품 쪽으로 더 학습을 하게 됩니다.

 

 

다시 돌아가서 oversample= False인 상태로 데이터를 분류하게 되면,

 

oversample false 적용

 

fixed인자로 숫자 데이터를 고정하다 보니 train Negative 파일 수가 상대적으로 적습니다. 즉 불균형이 발생한 것이죠.

 

데이터 불균형 발생

 

하지만 oversample = True로 설정하면,

 

 

데이터 복사를 통해 데이터 숫자를 맞춰주게 됩니다.

 

데이터 복사를 통한 파일 갯수 맞추기

 

실제로 내부 파일을 확인해보면 _숫자 형태로 새로 생긴 파일들을 볼 수 있습니다.

 

새로 생긴 파일들

 

관련 내용을 자세한 설명한 유튜버도 있으니 참조하시기 바랍니다.

 

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글