Boostcamp AI Tech (Day 041)
- 3강 복습
- 8강 복습 ✅ 2024-10-14
- Hard Negative Mining 정리 ✅ 2024-10-14
- OHEM 정리 ✅ 2024-10-14
- Focal Loss 정리 ✅ 2024-10-14
- Label Smoothing 정리 ✅ 2024-10-14
BoF 방법 도입 시도
Object Detection model을 향상시키기 위해 BOF, BOS 방법들을 실험을 통해서 증명하고 조합을 찾는다.
• BOF (Bag of Freebies) : inference 비용을 늘리지 않고 정확도 향상시키는 방법
• BOS (Bag of Specials) : inference 비용을 조금 높이지만 정확도가 크게 향상하는 방법
2024.10.14(Mon)
Semantic Distribution Bias
• 데이터셋에 특정 라벨(배경)이 많은 경우 불균형을 해결하기 위한 방법
Label smoothing
• 라벨에 0 또는 1로 설정하는 것이 아니라 smooth하게 부여
• Ex) 원래 0이었던 라벨을 0.1로 부여, 1이었던 라벨을 0.9로 부여
• 모델의 overfitting 막아주고 regularization의 효과
Bounding Box Regression
• Bounding box 좌표값들을 예측하는 방법(MSE)은 거리가 일정하더라도 IoU가 다를 수 있음
• IoU 기반 loss 제안 (IoU는 1에 가까울수록 잘 예측한 것이므로 loss처럼 사용 가능)
현재 inference.py
와 train.py
파일에서 MMDetection 라이브러리를 사용하여 실험을 진행하고, WandB를 통해 하이퍼파라미터 튜닝 및 실험 관리가 가능하도록 설정한 상태다.
1. BOF 기법 적용
BOF (Bag of Freebies) 는 추론 비용을 증가시키지 않고 정확도를 향상시키는 기법
- Data Augmentation: 이미지 크기 조정, 잘라내기, 회전, 색상 변형 등으로 다양한 데이터를 생성하여 학습의 다양성을 높입니다. MMDetection에서
pipeline
을 통해 설정할 수 있습니다. - Label Smoothing: 라벨 스무딩은 모델이 확실한 결정을 내리지 않도록 하여 overfitting을 방지하는 데 도움을 줍니다.
- IoU Loss: 일반적으로 사용하는
bbox regression
대신IoU Loss
를 사용하여 예측된 박스의 IoU가 높을수록 loss가 줄어드는 형태로 설정할 수 있습니다.
적용 방법:
- Label Smoothing 적용
- Config 파일에서
CrossEntropyLoss
대신LabelSmoothLoss
를 사용하는 방법입니다. 이를 위해 MMDetection의loss
부분을 수정합니다:model = dict( roi_head=dict( bbox_head=dict( loss_cls=dict( type='LabelSmoothLoss', # CrossEntropy 대신 Label Smooth Loss 적용 reduction='mean', smoothing=0.1) # smoothing 정도 설정 ) ) )
- Config 파일에서
- IoU Loss 적용
Bounding box regression
대신 IoU 기반의 손실 함수로 변경하여 정확도를 높입니다:bbox_head=dict( loss_bbox=dict( type='IoULoss', # IoU 기반 loss 적용 loss_weight=1.0 ) )
- Data Augmentation:
- Config 파일에서 데이터 전처리 파이프라인을 설정할 수 있습니다. 예를 들어:
train_pipeline = [ dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), dict(type='RandomFlip', flip_ratio=0.5), dict(type='RandomRotate', prob=0.5, degree=10), # 회전 추가 dict(type='ColorJitter', brightness=0.2, contrast=0.2, saturation=0.2), # 색상 변형 추가 # 다른 augmentation 기법 추가 가능 ]
3. Semantic Distribution Bias 해결
배경 데이터가 과도하게 많은 경우, 라벨 불균형 문제를 해결하기 위해 focal loss나 class re-weighting을 사용할 수 있습니다.
- Config 파일에서 데이터 전처리 파이프라인을 설정할 수 있습니다. 예를 들어:
model = dict(
roi_head=dict(
bbox_head=dict(
loss_cls=dict(
type='FocalLoss', # 불균형을 완화하기 위한 Focal Loss 적용
gamma=2.0,
alpha=0.25
)
)
)
)
Add DETR
- Debug 수현님이 작성하신 cascade_rcnn_config.py를 참고해서 detr_config 파일을 만들었다. 두 모델의 데이터 처리 파이프라인이 다르게 구성되어 있기 때문에 error가 발생했다. 두 모델 간의 차이점이 있어서 error가 발생한걸까?
1. DETR과 Cascade R-CNN의 차이점
-
Cascade R-CNN은 2-Stage Detector이다. 첫 번째 단계에서 Region Proposal Network(RPN) 을 통해 관심 영역(Region of Interest, RoI)을 찾아내고, 두 번째 단계에서 RoI를 이용해 객체를 분류하고 박스를 조정한다. 이 과정에서 데이터 처리 파이프라인에서의 이미지 변환이 잘 정의되어 있고,
RandomFlip
같은 변환이 문제가 되지 않았다. -
DETR(Detection Transformer)은 End-to-End 방식의 1-Stage Detector로, Transformer 구조를 기반으로 한다.(RPN)이 필요없다. 이 모델에서는 이미지의 크기 조정(
img_scale
)이 직접적으로 이미지 특징 추출과 학습에 중요하다. DETR의 경우Resize
는 이미지의 크기를 조정하는 단계에서만 사용되어야 하며,RandomFlip
같은 이미지 변환에서는img_scale
이 필요없다.2. 왜 DETR에서는 Error가 발생하는가?
Cascade R-CNN의 파이프라인에서는
RandomFlip
과Resize
가 별도의 역할을 하며, 이러한 변환이 이미지 크기나 비율과 관련된 오류를 발생시키지 않았다.RandomFlip
은 단순히 이미지를 좌우로 뒤집는 변환일 뿐, 이미지 크기를 다루지 않았다.
DETR에서는 img_scale
과 같은 인자가 잘못된 위치에서 사용되면, 모델이 데이터를 처리하는 과정에서 오류가 발생한다. RandomFlip
변환에서 img_scale
은 불필요한 매개변수인데, DETR에서는 이 매개변수가 전달되었기 때문에 오류가 발생한 것이다. (오류 메시지에 불필요한 매개변수가 입력되었다고 되어있었다.)
DETR은 Transformer 구조를 사용하기 때문에, 입력되는 이미지 크기 및 비율이 매우 중요한 역할을 한다. 따라서 이미지 크기 변환(Resize) 은 별도로 명확하게 처리되어야 하고, RandomFlip 와 같은 변환에서는 크기 변환과 관련된 인자를 포함하지 않아야 한다.