-
[Python]Splitfloders 한줄로 Train/Test/Validation 나누기programming/Python 2021. 11. 15. 23:24
딥러닝이나 머신러닝에서는 Dataset을 분할하는 것은 필수적입니다. 보통은 딥러닝 또는 머신러닝 프레임워크에 데이터셋을 분할하는 함수나 클래스가 있지만 불가피하게 수작업으로 분할해야 할 때가 있습니다. 그럴 때는 보통 glob, os, shutil, re 등의 라이브러리를 사용해 분할을 하지만 이것 또한 귀찮을 때가 있습니다... 그럴 때 사용하는 라이브러리를 소개할까 합니다!..(저도 귀찮아서 검색하다가 찾았습니다!)
Train/Test/Validation
- Train set : 모델이 학습하는데 사용 되는 훈련용 데이터입니다.
- Test set : 학습 후에 모델의 성능을 평가하기 위해서만 사용되는 테스트용 데이터입니다. (수능 데이터!)
- Validation set : 모델의 일반화 능력을 높이기 위해 학습 중에 평가에 사용되는 데이터 입니다 (모의고사 데이터)
Splitfolders
Install
pip install split-floders / pip install split-floders tqdm #저는 많은 양의 데이터를 처리하다보니 progress bar를 보면서 사용하려고 tqdm을 같이 설치하였습니다
Use
원하는 비율로 데이터셋을 잘라주면 됩니다. type 1은 train validata test를 8 : 1: 1로 잘랐고 type 2은 train test를 8 : 2로 잘랐습니다.
import splitfolders # or import split_folders # seed 는 random.seed # type 1 # train / validation / test splitfolders.ratio("데이터 경로", output="스플릿된 아웃풋 폴더 경로", seed=1337, ratio=(.8, .1, .1)) # type 2 # train / test splitfolders.ratio("데이터 경로", output="스플릿된 아웃풋 폴더 경로", seed=1337, ratio=(.8,.2))
**데이터 폴더의 구조는 아래와 같아야 작동합니다.**
전체 폴더 밑에는 클래스가 클래스 밑에는 데이터들이 있어야 합니다.
data/ class1/ img1.jpg img2.jpg ... class2/ imgWhatever.jpg ... ...
이렇게 해서 코드를 실행시키면 아래와 같은 구조로 output폴더가 만들어집니다
output/ train/ class1/ img1.jpg ... class2/ imga.jpg ... val/ class1/ img2.jpg ... class2/ imgb.jpg ... test/ class1/ img3.jpg ... class2/ imgc.jpg ...
정해진 숫자만큼 데이터 나누기
또 아래와 같이 정해진 숫자만큼만 데이터를 나눌 수도 있습니다.
아래의 코드는 train / test 데이터의 개수를 각각 1000개씩으로 만들 때의 예시입니다.
# train / test splitfolders.fixed("데이터 경로", output="스플릿된 아웃풋 폴더 경로", seed=1337, fixed=(1000,1000), oversample=False, group_prefix=None)
- oversample의 기본값은 False입니다. True로 변경하면 데이터의 중복 복사를 허용해 fixed에 설정한 숫자만큼 데이터를 채워서 사용합니다
Annotation 파일 (txt , json, xml )과 함께 나누기
group_prefix의 값을 설정해주면 Annotation파일과 함께 사용할 수 있습니다.
예를 들어 이미지와 텍스트 파일이 있을 경우에 group_perfix의 값에는 2가 들어갑니다( 이미지, 텍스트)
Annotation파일이 json과 txt 이렇게 2개가 있을 경우에는 group_perfix=3 (이미지, txt, json)으로 바꿔주면 됩니다.!
# train / validation / test splitfolders.ratio("데이터 경로", output="스플릿된 아웃풋 폴더 경로", seed=1337, ratio=(.8, .1, .1), group_prefix=2)
오늘은 Splitfloders 라이브러리 사용법에 대해 알아보았습니다
조금 더 자세한 설명을 원하시면 github에 가시면 있습니다!
https://github.com/jfilter/split-folders
'programming > Python' 카테고리의 다른 글
[Python] List보다 Numpy 가 빠른이유 (0) 2022.04.23 [Python]_8. 튜플(Tuple) (0) 2021.11.17 [Python]Python의 유용한 라이브러리들 (0) 2021.09.16 [자료구조]링크드 리스트(Linked List) (1) 2021.06.08 [자료구조]배열(Array), 큐(Queue), 스택(Stack) (2) 2021.05.20