Bamboo is coming

augmentation method(Mixup, Cutout, CutMix) 본문

인공지능 개념

augmentation method(Mixup, Cutout, CutMix)

twenty 2023. 7. 31. 23:38

https://arxiv.org/pdf/1905.04899.pdf

Regional Dropout은 CNN 분류기의 성능을 강화시켜왔다.물체의 덜 구별되는 구분에 대해 주목하여 지도하는 방식으로 일반화와 효과적인 객체 지역화 기능을 검증했다. 하지만, 검은 픽셀이나 랜덤 노이즈 픽셀을 training image에 오버레이함으로써 픽셀을 지운다. 이는 정보 손실과 비효율성을 야기한다. 

 

 

1. Mixup aumentation

 

2. Cutout aumentaion

 

 

3. CutMix augmentation

논문 CutMix : 2019년 ICCV에서 발표된 aumentation .method/ 연세대와 네이버 클로바에서 연구를 했다.

Cutmix augmentation은 patch 영역에 비례하여 ground truth label이 섞인 training image 중에서 patch를 잘라낸 후 붙여넣는다. training 픽셀의 효율적인 사용과 regional droupout의 정규화 효과는 유지한다.

 

$x$ - training image 

$y$ - label of taining image

$(x_{A}, y_{A}) and (x_{B}, y_{B})$ - CutMix 사용 이미지

$(\widetilde{x} ,\widetilde{y})$  -  CutMix의 결과 이미지

$M$ - $ M={\big\{0,1\big\}}^{W \times H}$ 0,1로 이루어진 바이너리 마스크

$lambda$ - 두 데이터 간의 기여 비율(Unif(0,1)의 랜덤값)

 

 

 

 

 

 

바운딩 박스 {B = (r_{x}, r_{y}, r_{w}, r_{h})}의 자세한 코드

rx는 0~W 사이에 균일분포를 따르는 랜덤값을 가진다.

즉, 이미지를 크롭하는 기준 위치(시작 위치)는 랜덤, 

rw는 기준 바운딩박스가 들어올 수 있는 너비 비율을 의미한다. 

이 부분에 대해서 자세히 설명해보자면 만약 A의 {\lambda}가 0.7이라고 했을 때 A 이미지에 들어올 수 있는 patch 사이즈는 0.3일 것이다. 그래서 1-{\lamda}로 바운딩박스의 비율을 정해준다.

루트를 사용하는 이유는 비선형성을 위해서라고 추측되는데 자세한 내용은 논문에서 나오지 않았다.

특이하게 r_x와 r_y가 왼쪽 상단 좌표라고 생각했는데 x1(왼쪽 상단) x2(오른쪽 상단)의 코드를 보면 r_x, r_y가 중앙값인 듯하다. min,max는 각각 0, W

 

lambda의 값을 갱신해주는 이유는 실제로 이미지에 적용된 부분의 면적을 정확하게 반영하기 위함. 이렇게 해서 두 이미지가 섞이는 정도를 더 정확하게 표현할 수 있다.

lambda는 잘린 이미지를 전체 이미지 크기로 나누어 잘린 이미지의 비율로 갱신한다.

target이 label, target_s가 랜덤값으로 찾아온 label 

target의 label로 값을 비율에 따라 조정하여 이걸로 loss를 계산해준다.

 

배치 사이즈만큼 인덱스를 섞었기 때문에 원래 인덱스에 랜덤된 인덱스를 믹스하여 새로운 이미지를 덧붙이는 형식이다. 레이블도 lambda로 각각 곱해서 기여도를 재측정한다.

파이토치 구현하기
import torch
w = 224
h = 224

# cutmix augmentation
def rand_bbox(cut_ratio):
  r_x = torch.randint(0,225,(1,))
  r_y = torch.randint(0,255,(1,))
  r_w = w * torch.sqrt(1 - cut_ratio)
  r_h = h * torch.sqrt(1 - cut_ratio)
  bbx1 = int(torch.clip(r_x - r_w, min=0, max=224).item())
  bbx2 = int(torch.clip(r_x + r_h, min=0, max=224).item())
  bby1 = int(torch.clip(r_y - r_w, min=0, max=224).item())
  bby2 = int(torch.clip(r_y + r_h, min=0, max=224).item())
  #torch.clip이 tesor를 리턴하기 때문에 item으로 변환해서 scalr값을 추출한다. => 인덱스 추출 위함

  return bbx1, bbx2, bby1, bby2

## augmentation check
a_img, a_lbl = next(iter(train_loader))

cut_ratio = torch.rand(1)
rand_index = torch.randperm(a_img.size()[0])
target_a = a_lbl
target_b = a_lbl[rand_index]
bbx1, bbx2, bby1, bby2 = rand_bbox(cut_ratio)
a_img[:, :, bbx1:bbx2, bby1:bby2] = a_img[rand_index, :, bbx1:bbx2, bby1:bby2]
cut_ratio = 1-(bbx2-bbx1)*(bby2-bby1)/(224*224)

CutMix

 

 

Unif(0,1)는  torch.rand로 구할 수 있다, 0~1 사이의 균등본포값을 리턴한다.

 

Unif(0,W)는 torch.randint으로 구할 수 있다. low~high 사이의 random integer값을 리턴

high는 추출할 분포값보다 1 큰수를 지정해야하고 size는 tuple 형식의 shape

 

clamp

clip과 clamp가 같은 함수인데 둘 다 집어서 무언가를 고정하는 물건들이라서 min, max를 고정할 수 있는 함수로 사용된다.

 

train에서 수기로 지정해서 cutmix를 해주어야한다.~! 

 

 

 

 

 

 

 

 

 

 

 

 


https://m.blog.naver.com/jjunsss/222523739775

 

CutMix 나름대로 정리하기

CutMix/CutOut Augumentation 이번 글에서는 최신에 등장한 Augumentation 기법 중 하나인 CutMix...

blog.naver.com

https://sseunghyuns.github.io/classification/2021/05/25/invasive-pytorch/

 

Cut-Mix in Classification

Cut Mix 방법 소개 식물 이미지로 침입종을 분류하는 이진 분류 대회 이미지 분류에서 Cut-Mix을 적용하여 모델 성능을 높일 수 있습니다.

sseunghyuns.github.io

 

Comments