ForFour

[kaggle]심슨 캐릭터 인식하기 - additional(삽질과 모델 개선) 본문

kaggle & ML

[kaggle]심슨 캐릭터 인식하기 - additional(삽질과 모델 개선)

for_four 2021. 11. 28. 07:43

이전 글:[kaggle]심슨 캐릭터 인식하기(The Simposons character recongnition)

The Simpsons Characters Data | Kaggle

 

The Simpsons Characters Data

Image dataset of 20 characters from The Simpsons

www.kaggle.com

 

첫 훈련 모델의 성능평가, 예측, confusion matrix 지표 확인을 하고 각 캐릭터의 랜덤 이미지에 대한 예측과 시각화를 진행해 보았습니다.

 

각 캐릭터 폴더에서 이미지를 가지고와 예측을 수행하고 true, prediction class를 표시했습니다만... 이상하게 전혀 다르게 예측을 하는 것을 볼 수 있었습니다. 분명 모델의 성능은 90% 이상이고 confusion matrix도 확인을 했을 때 대부분 정확한 class로 분류되는 것을 확인할 수 있었는데 이상하게 개별 이미지에 대한 예측만 진행하면 예측이 잘 수행되지 않았습니다.

밑의 시각화 그림은 개별 이미지에 대한 클래스 예측을 보여주고 있습니다만,, 전혀 다른 캐릭터에 대한 예측하고 있습니다. ㅠㅠ


처음에는 class indexing이 잘못된 것인 줄 알고 class별로 확인을 여러번 했지만 문제점은 확인할 수가 없었고 class indexing이 잘못되었다면 한 캐릭터에 대해 일관된 예측을 진행해야 되는데 그런 것도 아니었습니다.

 

분명히 모델 성능은 괜찮았는데 왜 그런거지?? 한참을 찾은 끝에 역시 어이없는 실수를 발견했습니다.

 

기본적으로 image는 rgb의 3차원 데이터를 가지고 있습니다. tensorflow도 이미지를 불러오고 학습시킬 때 동일한 형식으로 데이터를 불러오고 학습을 시키는 것을 반복합니다. 하지만 모든 라이브러리가 rgb를 기본으로 읽어 들이는 것은 아닙니다. python cv2는 기본적으로 brg로 이미지를 읽어 들이기 때문에 변환하는 작업을 해야 하는데 개별 이미지를 읽을 때 색을 rgb형식으로 변환하지 않아 아예 다른 이미지가 되어버린 것이었습니다.

그래서 주석의 코드를 추가하고 다시 데이터 예측을 진행했을 때는 모델 성능에 맞는 예측결과를 볼 수 있었습니다. 

 

그런데 이렇게 색의 변환작업을 거치지 않는 데이터의 잘못된 예측은 심슨의 노란색 이미지, 머리색깔등의 rgb 색에 종속된 모델이라는 것의 반증이라고도 할 수 있습니다.

 

물론 각각의 캐릭터 마다의 특징적인 색이 있겠지만 애초에 심슨 캐릭터를 구분하는 것은 캐릭터의 색깔이 아니라 실루엣이기 때문에 우리는 흑백사진으로도 캐릭터를 구별할 수 있습니다. 때문에 좋은 모델은 색깔에 종속적이지 않은 모델이어야 하고 색깔에 종속적이지 않은 모델이 되기 위해서는 색이 변형된 데이터 셋이 필요합니다. 

 

사용했던 ImageDataGenerator는 image preprocessing에 대한 기능도 지원하고 있습니다. 간단하게 60% 정도로 형식 변형을 일으키는 함수를 이용해 image Augmetation을 하고 학습을 다시 진행합니다.

def color(x: tf.Tensor) -> tf.Tensor:
    """Color augmentation

    Args:
        x: Image

    Returns:
        Augmented image
    """
    import random
    if random.randint(0,10) > 4:
        x = cv2.cvtColor(x,cv2.COLOR_RGB2BGR)
    
    return x

위와 같은 image augmentation을 color jitter라고 합니다. 이미지 색에 대한 augmentation을 수행하는 작업입니다.

 

위의 전처리를 수행하는 imageGenerator로 10번의 epoch로 처음 저장된 모델에 추가학습을 진행하였습니다. 60%로 augmentation을 해서인지 1 epoch에서 모델의 정확도가 0.4로 시작하는 것을 볼 수 있었습니다. 간단하게 10번의 수행을 마친 모델은 81% 정도의 정확도를 보여주었습니다. confusion matrix도 추가 학습 전과 비교해 많이 떨어지지 않은 성능을 보여주었습니다.

 

무엇보다 새로운 모델은 rgb color 형식이 아닌 이미지에 대해서도 좋은 예측을 보여주었습니다.

밑에는 추가 학습된 모델이 컬러형식이 rgb가 아닌 이미지에 대해 예측을 진행한 결과입니다.

Comments