ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

     

    GitHub - jfilter/split-folders: 🗂 Split folders with files (i.e. images) into training, validation and test (dataset) folders

    🗂 Split folders with files (i.e. images) into training, validation and test (dataset) folders - GitHub - jfilter/split-folders: 🗂 Split folders with files (i.e. images) into training, validation an...

    github.com

     

Designed by Tistory.