네이버 부스트캠프/LEVEL-1

[부스트캠프][P-stage][WK04 / Day2] Image Classification 2

1. 금일 목표

  • 1회 이상 제출
  • 이미지와 해당하는 클래스 Label (18개의 클래스 중 하나)을 생성할 수 있는 Pytorch Dataset Class를 직접 생성
  • albumentation 라이브러리의 여러 transform 기법을 적용

2. 진행사항

1) 1회 이상 제출


처참하다... 보완해야 할 부분이 많다.

2) 이미지와 해당하는 클래스 Label (18개의 클래스 중 하나)을 생성할 수 있는 Pytorch Dataset Class를 직접 생성

class TrainDataset(Dataset):
    def __init__(self, img_paths, transform):
        self.df = pd.read_csv(os.path.join(img_paths, 'train.csv'))
        self.img_paths = self.find_path(self.df, os.path.join(img_paths, 'images'))
        self.transform = transform

    def find_path(self, df,image_dir): # 폴더 내에 있는 파일의 경로를 모두 불러옴
        file_path = []
        for img_path in df.path:
            for img in os.listdir(os.path.join(image_dir, img_path)):
                # 'ipynb_checkpoints'파일과 숨김파일 제외하고 불러오기
                if (img.split('.')[0] != '') and (img.split('.')[-1] != 'ipynb_checkpoints'): 
                    file_path.append(os.path.join(image_dir, img_path, img))
        return file_path

    def make_label(self,img_paths):
        gender = img_paths.split('/')[-2].split('_')[1]
        age = int(img_paths.split('/')[-2].split('_')[-1])

        if img_paths.split('/')[-1].split('.')[0] not in ['incorrect_mask','normal']:
            wear = 'mask'
        else:
            wear = img_paths.split('/')[-1].split('.')[0]

        # gender, age, wear 각각 class를 만들기위해 숫자로 변환
        gender_class = 0 if gender=='male' else 1
        age_class = int(age/30)
        if wear=='mask':
            wear_class = 0
        elif wear=='incorrect_mask':
            wear_class = 1
        else:
            wear_class = 2

        return 6*wear_class + 3*gender_class + age_class # class 반환

    def __getitem__(self, index):
        image = Image.open(self.img_paths[index])
        label = self.make_label(self.img_paths[index])

        if self.transform:
            # 이미지 변환
            image = self.transform(image=np.array(image))

        return image, label

    def __len__(self):
        return len(self.img_paths)

3) albumentation 라이브러리의 여러 transform 기법을 적용

HorizontalFlip, VerticalFlip, Resize, RandomCrop, Rotation 등 다양한 기법을 적용해 보았습니다.

transform = albumentations.Compose([
    albumentations.Resize(224, 224), 
    # albumentations.RandomCrop(224, 224),
    albumentations.HorizontalFlip(), 
    albumentations.pytorch.transforms.ToTensorV2()
])

3. 피어세션 정리

https://hackmd.io/LdnsTb1aSCumiB2pyPb1iw?view


4. 학습 회고

나름의 데이터셋을 생성하는데 성공했습니다. albumentation 패키지를 사용하여 더 다양한 augmentation 기법을 사용해볼 예정입니다. 스코어는 모델을 잘못 사용한 것인지 너무 나오지 않아 pretrained weight를 가져와 학습시켜볼 예정입니다!