이 프로젝트를 하면서 정말 많은 backbone과 model들을 써보며 실험했고 최상의 모델을 찾기 위해 노력했었다! 그 과정이 재밌기도했고 처음 접하는 backbone들도 많았어서 실험내용을 기록하고 이론적인 부분을 더 공부하고자한다😏🤤
실험관리
model | backbone | depth | augmentation | dice score(leader board) |
Unet | resnet | 50 | 2번 | 0.5751065275 |
PSP | densnet | 161 | 2번 | 0.6210865892 |
deeplabV3Plus | mobilenetV3large | 100 | 1번 | 0.5109556055 |
Unet | resnet | 50 | 1번 | 0.5436697873 |
deeplabV3Plus | efficientb5 | 528 | 1번 | 0.5166904565 |
deeplabV3Plus | resnet | 101 | 1번 | 0.5045345371 |
deeplabV3 | mobilenetV3large | 100 | 1번 | 0.5422620818 |
ensemble model
model & backbone (1) | model & backbone (2) | model & backbone (3) | model & backbone (4) | dice score |
psp &resnet152 | psp & densenet161 | unet &resnet50 | deeplabV3+ &mobilenet | 0.62068905 |
deeplabv3 &mobilenet | psp & densenet161 | unet &resnet50 | 0.6256782386 | |
psp & densenet161 | deeplabV3+ &mobilenet | 0.6131219049 |
||
deeplabv3 &mobilenet | unet &resnet50 | 0.5581992727 |
Model
-smp 라이브러리에서 사용할 수 있는 거의 대부분의 모델을 실험하였으며 최종적으로 PSP를 선정하였다.
Backbone
-backbone모델은 CNN계열로 실험을 해보았는데 그 결과 최종적으로 psp 모델에는 densenet , u-net모델에는 resnet50 ,deeplabV3모델에는 mobilenet을 backbone으로 사용한 모델이 가장 우수했다.
최종적으로 이렇게 세개의 모델을 ensemble한 모델과, 단일 모델으로는 PSP &densenet161 모델을 선정했다.
Augmentation
-다양한 augmentation 기법들을 실험하였다. 최종적으로는 2번 augmentation기법이 클래스 불균형처리에 효과적으로 작용함을 확인하고 선정하였다.
- 1번 augmentation 기법
# 데이터 증강을 위한 transform 파이프라인 정의
transform = A.Compose(
[
A.RandomCrop(224, 224), # 랜덤한 위치에서 224x224 크기로 자르기
A.RandomRotate90(), # 90도 회전 (랜덤하게)
A.HorizontalFlip(p=0.5), # 수평 뒤집기 확률 50%
A.VerticalFlip(p=0.5), # 수직 뒤집기 확률 50%
A.CLAHE(p=0.2), # CLAHE를 통한 대비 개선
A.Normalize(), # 이미지 픽셀값 정규화
ToTensorV2() # 이미지를 텐서로 변환
]
)
- 2번 augmentation 기법
# 데이터 증강을 위한 transform 파이프라인 정의
transform = A.Compose(
[
A.CropNonEmptyMaskIfExists(height=224, width=224),
A.HorizontalFlip(p=0.5),
A.VerticalFlip(p=0.5),
A.Rotate(limit=30,p=0.3),
A.ColorJitter(p=0.3),
A.ToGray(p=0.2),
#고정값
A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), # 이미지 픽셀값 정규화
ToTensorV2() # 이미지를 텐서로 변환
]
)
Ensemble
-다양한 ensemble 기법을 사용하여 여러 모델을 앙상블하여 실험하였다.
다수의 모델이 예측한 결과를 투표하여 최종 예측을 결정하는 방인 Voting(투표) 앙상블,
여러 모델의 예측값을 평균하여 최종 예측을 얻는 방식인 Averaging(평균) 앙상블 기법을 사용해보고 예측값들의 평균을 구하여 노이즈를 줄이고 안정적인 예측을 얻을 수 있는 평균 앙상블 기법을 선택하였다.
# DeepLabV3+ 모델 정의
model2 = smp.DeepLabV3Plus(
encoder_name="timm-mobilenetv3_large_100", # 백본으로 ResNet-50 사용
encoder_weights="imagenet", # ImageNet 가중치로 초기화
in_channels=3, # 입력 이미지 채널 수 (RGB 이미지인 경우 3)
classes=1 # 출력 클래스 수 (이진 분류인 경우 1)
)
model1 = smp.PSPNet(encoder_name="densenet161", # 필수 파라미터: 사용할 인코더 백본의 이름
in_channels=3, # 필수 파라미터: 입력 이미지의 채널 수 (일반적으로 3(RGB) 또는 1(Grayscale))
classes=1, # 필수 파라미터: 세그멘테이션 클래스의 수 (예: 물체 탐지의 경우 물체 클래스 수)
encoder_weights="imagenet" # 선택적 파라미터: 사용할 사전 훈련된 인코더 가중치의 경로 또는 'imagenet'으로 설정하여 ImageNet 가중치 사용
)
model3 = smp.Unet(encoder_name="resnet50", # 필수 파라미터: 사용할 인코더 백본의 이름
in_channels=3, # 필수 파라미터: 입력 이미지의 채널 수 (일반적으로 3(RGB) 또는 1(Grayscale))
classes=1, # 필수 파라미터: 세그멘테이션 클래스의 수 (예: 물체 탐지의 경우 물체 클래스 수)
encoder_weights="imagenet" # 선택적 파라미터: 사용할 사전 훈련된 인코더 가중치의 경로 또는 'imagenet'으로 설정하여 ImageNet 가중치 사용
)
# 저장된 모델의 파라미터 불러오기 (strict=False 옵션 사용)
state_dict_1 = torch.load('./ensemble/three/psp_dense_base_trained_epoch55.pth', map_location=torch.device('cpu'))
state_dict_2 = torch.load('./ensemble/three/v3plus_mobilenet_epoch42.pth', map_location=torch.device('cpu'))
state_dict_3 = torch.load('./ensemble/three/resnet_50_unet_new_aug_noempty_trained_epoch21.pth', map_location=torch.device('cpu'))
'Machine Learning > ML Contest' 카테고리의 다른 글
RSNA 2023 Abdominal Trauma Detection(1) -base line 입문 (0) | 2023.09.24 |
---|---|
위성 이미지 건물 영역 분할 AI 경진대회 - (3) - Hyperparameter,Regularization ,Loss Function (0) | 2023.08.03 |
위성 이미지 건물 영역 분할 AI 경진대회 - (2) - EDA & Preprocessing (0) | 2023.08.02 |
위성 이미지 건물 영역 분할 AI 경진대회 - (1) - intro (0) | 2023.08.01 |