개발자로 후회없는 삶 살기
네이버 부스트캠프 AI Tech 7주차 회고 본문
서론
레벨 1 프로젝트 기간 동안 느낀점을 회고합니다.
본론
- 프로젝트 마무리와 함께 정리 시작
23.12.21 레벨 1프로젝트를 마무리하고 최종 순위가 발표되었습니다. 수고했기도 하고 아쉽기도한 상태에서 그 동안 달려가느라 정리하지 못했던 항목들을 정리해야겠다는 생각을 하였습니다. 대부분 협업, 느낀점 관련한 것들로 다음과 같습니다.
1. 발생한 이슈 정리
2. gpu 풀, 클라이언트-서버 형식의 GPU 서버 활용 개선 방안
3. 랩업 리포트
4. 완디비 팀 프로젝트 개선 방안
5. 레벨 1 ML 프로젝트 진행 방식에 대한 고찰
6. 프로젝트 릴리즈
7. 코드 리팩토링
8. 느낀점 정리
생각보다 많은 분량에 줄일까도 고민했지만, 그만큼 알차고 배운게 많은 프로젝트라고 되새기며 팀원들과 고민거리들을 공유하였습니다.
특히 2, 5번에서 많은 고민을 하였는데 ML 프로젝트로 하나의 프로젝트에서 여러명이 작업한 경험이 전무하기 때문이고 지금까지 너무 절차 지향적인 코드를 작성했기 때문이라 생각하였습니다. 이번 기회로 실무의 ML 프로젝트를 경험한 것 같아 뜻 깊었습니다. 또한 이와 관련한 멘토님의 피드백이 너무 값졌습니다.
- 최종 순위보다 팀과 함께 배운점
프로젝트를 진행하면서 추상적으로만 다가왔던 성능 향상 이론들을 직접 구현하고 눈으로 관찰하였고 결과적으로 우상향 그래프를 띄었습니다. 다양한 가설을 세우고 유명 논문들을 실험하며, ML의 발전 과정을 체감할 수 있었습니다.
- 커뮤니티 활용
프로젝트를 시작하는 6주차 회고에 게시판을 적극적으로 활용하여 지식을 공유할 것이라고 했습니다. 하지만, 결과적으로는 그렇게 하지 못 했습니다. 글을 논리 정연하게 정리할 시간도 없었고 공유하기에는 뭔가 다 부족해 보였습니다.
하지만, 위 게시글 하나를 올렸습니다.
내용은 위와 같이 어플리케이션 개발을 하던 개발자가 ML을 할 때 고민할 것들입니다. 항상 코드의 가독성, 데이터의 무결성을 중요시하는 코드를 작성해왔는데, 유명 레포지토리를 봐도 딱히 제가 고민한 부분이 들어나지 않아 보였고 논문을 구현한 코드의 나열이었습니다.
1. 데이터 셋
class CustomDataset(Dataset):
# 초기화 및 선언
def __init__(self, data_dir: str) -> None:
super().__init__()
# dir 경로 data\\train\\images
FILE_FORMAT: Final = data_dir + "*\\*.jpg"
self.DIR_DELIMITER: Final = '\\'
self.PROFILE_INDEX: Final = -2
self.GENDER_INDEX: Final = 1
self.AGE_INDEX: Final = 3
self.MASK_INDEX: Final = -1
self.PROFILE_DELIMITER: Final = '_'
self.PREFIX: Final = -5
self.MASK_LABEL_POINT: Final = 6
self.GENDER_LABEL_POINT: Final = 3
file_paths: Final = glob(FILE_FORMAT)
self.file_paths = file_paths
self.labels, self.genders, self.ages = self._setup()
self.transform = self._torchvision_transforms()
def __len__(self) -> int:
return len(self.images)
def __getitem__(self, index: int) -> Any:
image = Image.open(self.file_paths[index])
image = self.transform(image)
age_label: Final = self.ages[index]
mask_label: Final = self.labels[index]
gender_label: Final = self.genders[index]
return image, self._get_multi_class_labels(age_label, mask_label, gender_label)
def _setup(self) -> List[int]:
ages = []
genders = []
labels = []
for image in self.file_paths:
images_each_split_dir = image.split(self.DIR_DELIMITER)
profile = images_each_split_dir[self.PROFILE_INDEX]
profile_split = profile.split(self.PROFILE_DELIMITER)
gender = profile_split[self.GENDER_INDEX]
age = profile_split[self.AGE_INDEX]
# mask1, 2,,,을 같은 라벨로 보기 위해 -5로 지정
label = images_each_split_dir[self.MASK_INDEX][:self.PREFIX]
ages.append(age)
labels.append(label)
genders.append(gender)
self.labels = self._convert_class_to_numeric(labels)
self.genders = self._convert_class_to_numeric(genders)
ages = list(map(int, ages))
self.ages = self._convert_age_to_dummy(ages)
return self.labels.copy(), self.genders.copy(), self.ages.copy()
2. 유틸 메서드
# 유틸 메서드
def _convert_class_to_numeric(self, class_array: List[str]) -> ndarray:
class_to_number: Final = {class_value : idx for idx, class_value in enumerate(np.unique(class_array))}
return np.vectorize(class_to_number.get)(class_array).copy()
def _convert_age_to_dummy(self, ages: List[int]) -> ndarray:
return np.vectorize(Age._label_ages)(ages).copy()
def _get_multi_class_labels(self, mask_label: int, gender_label: int, age_label: int) -> int:
"""다중 라벨을 하나의 클래스로 인코딩하는 메서드"""
return mask_label * self.MASK_LABEL_POINT + gender_label * self.GENDER_LABEL_POINT + age_label
def _album_transforms(self):
return A.Compose([
A.RandomResizedCrop(height=150, width=300, scale=(0.3, 1.0)),
A.Resize(100, 100),
A.OneOf([
A.VerticalFlip(p=1)
], p = 0.5),
ToTensorV2()
])
def _torchvision_transforms(self):
return transforms.Compose([
transforms.RandomResizedCrop(150, scale=(0.3, 1.0)),
transforms.Resize((100, 100)),
RandAugment(),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
3. Enum 클래스
class Age(int, Enum):
"""Age Enum"""
YOUNG = 0
MIDDLE = 1
OLD = 2
@classmethod
def _label_ages(cls, ages):
if(ages < 30):
return cls.YOUNG
elif(ages < 60):
return cls.MIDDLE
else:
return cls.OLD
아직, 이 부분은 해결되지 않았지만 위 코드를 토대로 부캠 기간동안 꾸준히 토론해볼 예정입니다.
'[AI] > [네이버 BoostCamp 회고]' 카테고리의 다른 글
네이버 부스트캠프 AI Tech 9주차 회고 (1) | 2024.01.05 |
---|---|
네이버 부스트캠프 AI Tech 8주차 회고 (2) | 2023.12.29 |
네이버 부스트캠프 AI Tech 6주차 회고 (0) | 2023.12.11 |
네이버 부스트캠프 AI Tech 5주차 회고 (0) | 2023.12.06 |
네이버 부스트캠프 AI Tech 4주차 회고 (0) | 2023.11.28 |