TensorFlow+Keras로 Cutout 구현/평가
5484 단어 TensorFlowKerasDeepLearning기계 학습
소개
다른 기사 에서 각종 Data Augmentation을 구현했을 때, TensorFlow Addons를 사용하면 간단하게 Cutout을 구현할 수 있는 것을 깨달았다.
여기에서는 Dataset에 대해서 map 적용하는 구현과 그 평가를 실시한다.
환경
Cutout이란?
이미지의 데이터 확장 기법으로서 제안 된 것으로, 랜덤한 좌표의 구형을 단색으로 칠한다.
비슷한 방법으로 Random Erasing이 있지만, Cutout 쪽이 보다 단순.
TensorFlow Addons에는 tfa.image.cutout이 준비되어 있습니다.
구현
다음 함수를 Dataset의 map 함수로 적용한다.
import tensorflow_addons as tfa
@tf.function
def cutout_augmentation(images, cutout_size, cval=0):
img_shape = images.shape[-3:]
mask_size = (int(img_shape[0]*cutout_size[0])//2*2, int(img_shape[1]*cutout_size[1])//2*2)
images = tfa.image.random_cutout(images, mask_size, constant_values=cval)
return images
cutout_size는 채우는 사각형의 크기를 지정합니다. 원본 이미지의 비율은 [H, W]로 float로 지정됩니다. 32x32 이미지의 경우 [0.5,0.5]로 16x16 범위를 채웁니다.
cval은 채우는 색. 0.0~1.0의 화상의 경우는 cval=0.5로 회색이 된다.
tensorflow-addons의 버전이 낡으면 사용할 수 없기 때문에, Google Colab에서는 !pip install --upgrade tensorflow-addons
를 사전에 실행한다.
실행 결과는 이쪽.
평가
구형 사이즈의 설정치의 영향이나, 다른 Aumentation과의 비교를 실시한다.
다음 함수를 Dataset의 map 함수로 적용한다.
import tensorflow_addons as tfa
@tf.function
def cutout_augmentation(images, cutout_size, cval=0):
img_shape = images.shape[-3:]
mask_size = (int(img_shape[0]*cutout_size[0])//2*2, int(img_shape[1]*cutout_size[1])//2*2)
images = tfa.image.random_cutout(images, mask_size, constant_values=cval)
return images
cutout_size는 채우는 사각형의 크기를 지정합니다. 원본 이미지의 비율은 [H, W]로 float로 지정됩니다. 32x32 이미지의 경우 [0.5,0.5]로 16x16 범위를 채웁니다.
cval은 채우는 색. 0.0~1.0의 화상의 경우는 cval=0.5로 회색이 된다.
tensorflow-addons의 버전이 낡으면 사용할 수 없기 때문에, Google Colab에서는
!pip install --upgrade tensorflow-addons
를 사전에 실행한다.실행 결과는 이쪽.
평가
구형 사이즈의 설정치의 영향이나, 다른 Aumentation과의 비교를 실시한다.
결과는 이쪽.
확장법
cutout
fill_mode
Accuracy
Vertical Flip
-
-
89.15
Cutout
0.4
-
91.80
Cutout
0.5
-
92.31
Cutout
0.6
-
92.50
Cutout
0.7
-
92.63
Cutout
0.8
-
92.53
Shift
-
constant
92.86
Shift
-
reflect
93.39
Cutout+Shift
0.5
reflect
94.43
Cutout의 사이즈 비교에서는 0.7이 가장 양호했다. 0.7*0.7=0.49이므로 거의 절반이 사라지게 된다.
전 논문에서는 CIFAR10에서는 16x16 즉 0.5가 가장 좋다고 여겨졌기 때문에 결과에는 어긋남이 있었다. 모델의 차이가 영향을 미치는가? .
동 논문에서는 CIFAR100의 경우는 더 사이즈를 낮추는 편이 좋은 결과가 되고 있다. 학습 내용에 따라 파라미터 조정할 여지가 있는 것 같다.
Shift와의 비교가 되면, Shift 쪽이 좋은 결과였다.
전체적으로는 Shift와 Cutout을 혼합한 것이 가장 좋은 결과가 되었다. Shift(reflect)로부터는 1%의 인식률 향상이 있지만, 이 레벨에서는 상당히 큰 차이이므로 동시에 적용하는 가치는 충분하다고 생각된다.
실험 코드는 여기 .
참고
ImageDataGenerator를 확장하고 cutout 구현
PyTorch에서 데이터 급증(Data Augmentation)하는 방법
Reference
이 문제에 관하여(TensorFlow+Keras로 Cutout 구현/평가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/T-STAR/items/0aa81d95ceaa1cdc634d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(TensorFlow+Keras로 Cutout 구현/평가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/T-STAR/items/0aa81d95ceaa1cdc634d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)