직전 글에서 생각했던 문제 중 2)와 3)을 다루는 글이다.
1)pooling의 방법을 잘 못 한것은 아닌가?
2)이미지의 색상에 따라 다르게 받아들이는 것일까?
3)Augmentation을 시행할 때 특성을 잃어버리는 것은 아닐까?
위의 사진처럼 모두 같은 사과 사진에 필터를 씌워 blue, green red로 분류해두었고, augmentation을 이용해 데이터를 증폭시켰다. 이후 모델을 만들었다.
중간에서 보면 한가지 의아한 것이 있다. 분명 'red', 'green', 'blue'인데 classes는 왜 '4'인가...?
이 부분은 나중에 다뤄야 할 것 같다.
위에서는 EfficientNet을 이용했으며, accuracy를 보면 알 수 있듯, 색상이 다를 경우에 CNN은 잘 분류를 해준다.
그렇다면 마지막으로 3)을 생각해야 한다.
1)pooling의 방법을 잘 못 한것은 아닌가?
2)이미지의 색상에 따라 다르게 받아들이는 것일까?
3)Augmentation을 시행할 때 특성을 잃어버리는 것은 아닐까?
keras에서 제공하는 ImageDataGenerator의 parameter 중 'fill_mode'에 중점을 두었다.
fill_mode에서는 default로 'nearest'가 있고, 다른 방법은, 'reflect' / 'constant' / 'wrap' 이 있다.
아래의 이미지를 참고하자.
rotation과 flip을 하면 원본(왼쪽)에서 augmentation 한 이미지의 파란부분처럼 잘리는 부분이 생긴다.
이 때, fill_mode라는 parameter는 차례대로
nearest : aaaa|abcd|dddd (파란부분에서 가장 가까운 pixel값을 그대로 사용)
reflct : dcba|abcd|dcba (파란부분을 반사하여 사용)
constant : kkkk|abcd|kkkk (파란부분을 검정색으로 채워 사용)
wrap : abcd|abcd|abcd (파란부분을 기존 이미지에서 잘린 부분을 그대로 사용)
위처럼 처리가 된다.
(더욱 자세한 설명은 링크에 잘 나와있으니 참고해도 좋을 것 같다.)
결론적으로 필자는 default인 'nearest'를 사용했지만,
이는 잘린 부분을 남아있는 이미지에서 늘리는 형태였기 때문에 이미지의 특성을 잃어버리는 결과를 초래했다.
따라서, 이미지의 특성을 제대로 살리는 방법으로 사료되는 'reflect' 방법을 사용했다.
'reflect'방법을 사용한다면, 각질로 분류되는 특성이 사라지지도 않을것이며, 각질 부분이 적어지지 않을 것이라고 생각했다.
'reflect'으로 augmentation을 진행하고 efficientNet으로 분류를 시도하니 accuracy는 85 이상이 나왔다.
validation set으로는 더 좋은 결과가 나왔지만, augmentation을 하지 않은 raw data를 집어넣었을 경우가 궁금하여 가지고 있는 모든 raw data를 집어넣고 분류를 해보았다.
건조 class의 68개, 보통 class의 68개 중 각각 50/66개를 제대로 분류했다.(85.29%)
앞의 글에서는 바로 EfficientNet을 사용한 것처럼 서술했지만, 'fill_mode'의 모든 방법을 사용하여 augmentation한 후 VGG-16, 19 도 사용했지만 비슷한 결과(accuracy : 51~54)였고, pooling 층에서 사람이 하나하나 parameter를 조정하지 않아도 되는 EfficientNet으로 방향을 돌리게 되었다.
'Python > EfficientNet' 카테고리의 다른 글
EfficientNet(1) (0) | 2021.04.19 |
---|