최근에 image classification을 하게 되었는데요. 그 과정에서 많은 것을 배웠습니다. 예를 들면 이미지 데이터 뭉치?를 학습하기 적합한 형식으로 만들어주는 과정과 pytorch의 딥러닝 모델 구조 등등
그 중에서도 가장 처음 단계인 이미지 데이터들을 학습하기 적합한 형식(라벨링)으로 만들어 주는 과정에 대해 정리해보려고 합니다.
현재 Preprocess코드 트리는 대략 이렇게 됩니다.
${ImagePreprocess}
├── data/
│ ├── train.zip
│ ├── test.zip
│ └── sample_submission.csv
├── config/
│ └── preprocess_config.yaml
├── modules/
│ ├── datasets.py
│ └── utils.py
└── preprocess.py
${data}
├── 00_source/
│ ├── images/
│ │ ├── 'image1.jpg'
│ │ ├── 'image2.jpg'
│ │ └── ...
│ └── grade_labels.csv
├── 01_splitdataset/
│ ├── train/
│ │ ├── images/
│ │ │ ├── 'image1.jpg'
│ │ │ ├── 'image2.jpg'
│ │ │ └── ...
│ │ └── grade_labels.csv
│ ├── val/
│ │ ├── images/
│ │ │ ├── 'image1.jpg'
│ │ │ ├── 'image2.jpg'
│ │ │ └── ...
│ │ └── grade_labels.csv
│ └── test/
│ ├── images/
│ │ ├── 'image1.jpg'
│ │ ├── 'image2.jpg'
│ │ └── ...
│ └── test_images.csv
├── sample_submission.csv
├── train.zip
└── test.zip
※ 폴더 구조
${data}
- 00_source: 전체 학습(원천) 데이터 폴더 ('trian.zip'에 들어있는 파일들)
- images: 모든 학습 데이터 이미지 파일들
- grade_labels.csv: 모든 학습 데이터 이미지명과 라벨(등급)이 있는 csv
- 01_splitdataset: 학습 데이터를 임의로 Train/Validation으로 나눈 결과와 Test 데이터 폴더
- train: 원천 학습 데이터 중 일부를 샘플링하여 만든 Train 데이터
- images: Train 데이터 이미지 파일들
- grade_labels.csv: Train 데이터 이미지명과 라벨(등급)이 있는 csv
- val: 원천 학습 데이터 중 일부를 샘플링하여 만든 Validation 데이터
- images: Validation 데이터 이미지 파일들
- grade_labels.csv: Validation 데이터 이미지명과 라벨(등급)이 있는 csv
- test: Test 데이터 ('test.zip'에 들어있는 파일들)
- images: Test 데이터 이미지 파일들
- test_images.csv: Test 데이터 이미지명이 있는 csv
- sample_submission.csv: 제출 파일 예시 csv
대략적인 프로세스는 아래와 같습니다.
1. train.zip과 test.zip의 압축을 풀어줍니다.
2. train data를 train과 val로 나누고
3. image 파일명과 label을 csv파일로 만들어 줍니다.
import os
import pandas as pd
from sklearn.model_selection import train_test_split
import shutil
from tqdm import tqdm
from modules.utils import load_yaml, save_yaml
import zipfile
# 1. Unzip datafiles
trainpath = os.path.join(DATA_DIR, 'train.zip')
testpath = os.path.join(DATA_DIR, 'test.zip')
with zipfile.ZipFile(trainpath, 'r') as zip_ref:
zip_ref.extractall(SRC_DIR)
with zipfile.ZipFile(testpath, 'r') as zip_ref:
zip_ref.extractall(SPLIT_TEST_DIR)
# 2. Split training data into train/val
LABEL_PATH = os.path.join(SRC_DIR, 'grade_labels.csv')
data = pd.read_csv(LABEL_PATH)
X = data['imname']
y = data['grade']
X_train, X_valid, y_train, y_valid = train_test_split(X,y,test_size = 0.2, shuffle=True, random_state=42)
train = pd.DataFrame(list(zip(X_train, y_train)),columns=['imname','grade'])
valid = pd.DataFrame(list(zip(X_valid, y_valid)),columns=['imname','grade'])
# 3. Save train and validation labels
train.to_csv(os.path.join(SPLIT_TRAIN_DIR, 'grade_labels.csv'), index=False)
valid.to_csv(os.path.join(SPLIT_VALID_DIR, 'grade_labels.csv'), index=False)