늦깎이 공대생의 인공지능 연구실
영상 데이터셋의 관점에서 본 Vision AI모델의 학습과정 본문
기발한 연구 논문을 작성하는 것이 목적인 대학원생과 수익을 내는 것이 목적인 직장인은 AI를 다루는 관점이 다를 수밖에 없습니다. 대학원생의 경우 기존에 공개된 AI모델의 성능을 고도화 하는 것을 목표로 하고, 직장인의 경우 기존에 공개된 성능좋은 AI모델을 어떻게 실무를 적용할지를 목표로 합니다. 그렇기에 대학원생은 AI모델의 알고리즘 고도화에 집중하는 경향이 있고, 직장인의 경우 AI모델이 적용되는 도메인 분야의 데이터를 어떻게 효율적으로 학습시키는지에 대해 집중하는 경향이 있습니다. 저 또한 대학원생때 기존의 AI모델 성능 고도화에 목맨 적이 있었는데, 밤새 고군분투하며 노력해도 연구결과를 도출하는 것이 결코 쉽지는 않았습니다. 물론 현업에서 AI모델을 적용하는 것 또한 도메인 지식인 데이터의 특성을 잘 알아야 AI모델을 제대로 적용할 수 있습니다.
기존의 포스팅들은 주로 AI알고리즘이 적용되는 과정에 대한 설명이 대부분이어서 업무 적용이 우선인 실무자들이 목표로하는 데이터 기준의 학습 방법에 대한 내용을 다루는 컨텐츠가 많이 부족함을 느낀바, 이번 포스팅에서는 AI모델이 학습하게될 영상 데이터셋의 관점에서 Vision AI모델이 학습되는 과정에 대해 설명드리고자 합니다.
Vision AI모델의 추론 과정
Vison AI모델의 학습과정을 설명드리기 위해, 먼저 Vision AI모델의 추론 과정을 아래 그림으로 나타내보았습니다.
보편적인 Vision AI모델은 한 장의 이미지가 AI모델에 입력되면 이미지의 정보를 추론한 결과를 출력합니다. 이미지의 전반적인 특성을 하나의 Class로 나타내는 Image Classification, 이미지 내에서 해당 특성의 위치를 네모로 표시해 나타내는 Object Detection, 이미지 내의 해당 특성을 픽셀로 직접 표현하는 Semantic Segmentation이 있습니다. 자신이 개발하는 AI모델이 적용되는 도메인에 따라 각 종류의 Inference 결과중 가장 적합한 방법을 선택하면 됩니다.
영상 데이터 구조
Vision AI모델의 학습 과정을 알기 위해 먼저 Computer Vision의 기초지식을 톺아보겠습니다. 우리들의 눈으로 보는 세상은 가시광선에 반사된 파장을 보는 것으로, 물체들을 다양한 색상으로 볼 수 있습니다. 사람들의 눈이 가지고 있는 광수용체 세포인 원추세포는 빛의 파장에 따라 주로 파란색, 녹색, 빨간색으로 구성된 빛의 삼원색의 조합에 따라 다양한 색상을 볼 수 있는 것입니다.
우리들이 흔히 사용하는 TV, 스마트폰 등의 디스플레이는 사람의 눈에서 수용할 우 있는 3원색을 나타낼 수 있는 RGB 서브픽셀을 가지고 있으며 각 서브픽셀의 밝기에 따라 색상을 나타낼 수 있습니다. 아래의 그림은 하나의 이미지에서 빛의 삼원색인 파란색, 녹색, 빨간색의 밝기를 분리해서 표현한 것으로, 오른쪽의 표는 이미지의 좌상단으로부터 3픽셀까지의 성분값을 나타낸 것입니다. 앞에서 설명드린 바와 같이 우리가 보는 이미지는 빛의 3원색인 빨강, 파랑, 초록의 조합으로 다양한 색상을 볼 수 있는 것입니다.
그렇다면 AI모델은 이미지 데이터를 어떻게 입력으로 받아들일까요? 사람들이 한 끼 식사를 위해 식재료를 요리해 먹을 수 있는 음식을 만들듯이 Vision AI모델이 이미지 데이터셋을 학습하기 위한 데이터 전처리(Data Perprocessing) 과정을 거처 입력 데이터가 AI모델 학습에 적합하도록 가공합니다.
데이터 전처리 과정에서 이미지 데이터는 어떻게 가공될까요? 예를 들어 4종류의 동물들(개, 고양이, 곰, 양)을 구분하는 AI모델을 만들기 위한 데이터를 다룬다고 가정해봅니다. 세상에 같은 종의 동물이더라도 다양한 사람들이 존재하는 것과 같이 각양각색의 모습을 갖고 있습니다. 특히, 이미지 데이터의 관점에서 같은 종류의 동물이더라도 털의 무늬가 다를 수도 있기 때문에 AI 학습 수행시 다양한 색상의 동물들을 학습시켜 이들을 구분할 수 있도록 하여아겠지요?
위의 그림에서 보듯이 털색이 검은색인 동물의 이미지는 RGB 평균값이 0에 가깝고, 흰색인 동물의 경우 RGB 평균값이 255에 가까울 것입니다. 만약 이러한 데이터셋이 어떠한 가공 없이 AI모델의 입력값으로 들어가 학습되면 두 입력값의 차이가 상당히 커 AI모델의 Weight값의 변동이 커지게 되고 이는 학습이 원활하게 되지 않게 하는 요인이 되어 최종 학습 결과가 좋지 못할 수 있습니다. 가령, 이러한 데이터로 학습된 AI모델이 털색이 검은색인 동물과 흰색인 동물은 분류가 잘 되지만, RGB 평균값이 중간값에 분포된 다수의 데이터들은 분별이 잘 되지 않을 수 있습니다.
앞에서 언급하였던 데이터 전처리는 데이터셋 내부의 이미지들간의 값의 격차로 인한 AI학습의 성능저하를 줄이기 위해 데이터셋의 일반화(Normalization)과정을 거치게 됩니다. 아래와 같이 이미지 특정 채널 성분의 평균값이 0과 255로 극단적으로 떨어진 두 값이 일반화(Normalization) 과정을 거쳐 평균 0에 표준편차가 1인 정규분포로 변환되며, 양단의 극값의 격차를 최소한으로 줄여 AI모델이 편향을 최소화하고 정규분포 내에 속한 대다수의 데이터들을 고르게 학습하여 좋은 성능의 AI모델을 만들 수 있게됩니다.
지금부터는 이미지 데이터를 정규분포화 하여 전처리를 수행하는 방법을 설명드리도록 하겠습니다. 앞서 말씀드린 바와 같이 한 장의 이미지에서 빛의 삼원색별 성분을 각각 분리한 후 각 성분별 픽셀의 성분값을 전부 합한 값에 전체 픽셀수를 나누어 파란색, 녹색, 빨간색 성분의 평균값을 구합니다.
$$ \mu=\frac{\sum Each\;component\;of\;all\;pixels}{The\;number\;of\;all\;pixels}$$
위와 같은 방법으로 한 장의 이미지에서 각 성분값의 평균을 계산하는 방법을 설명드렸습니다. 이번에는 학습 데이터셋에 있는 모든 이미지의 성분별 평균을 구해봅니다. 아래와 같이 전체 학습 데이터셋 이미지가 4장이라고 가정하였을 때, 각 이미지별 BGR 평균을 구한 다음, 각 성분별 전체 이미지 데이터셋의 평균과 표준편차를 구합니다.
이제 우리는 데이터셋에 있는 모든 이미지 데이터의 성분별 평균과 표준편차를 구하였습니다. 위 값을 사용해 이미지들을 아래와 같은 방법으로 전처리를 하여 AI모델의 입력 데이터로 변환할 수 있습니다.
전처리가 끝난 데이터를 AI모델에 입력해보도록 합니다. 아래의 그림은 Batch size가 4인 입력을 받는 AI모델의 입력과 그 결과값을 나타낸 것입니다. Batch는 AI모델이 학습시 한 번에 받아들이는 입력값의 갯수로 1회의 학습 시 여러 개의 데이터를 동시에 학습할 수 있어 같은 시간동안 한 번에 많은 데이터를 학습할 수 있습니다.
1회의 Batch의 데이터가 AI모델에 입력되지 전 Batch Normalization을 거쳐 한 번더 가공되어 AI모델에 입력됩니다. 출력 이미지는 Batch의 크기와 같으며, 각 이미지와 Ground Truth와 비교하여 Loss값이 최소로 되도록 AI모델을 학습시킵니다.
혹시 Batch Normalization에 대해 좀 더 자세히 알고 싶으신 분은 아래의 자료를 참조해주시기 바랍니다.
[Deep Learning] Batch Normalization (배치 정규화)
Batch Normalization은 2015년에 아래의 논문에서 나온 개념이다.Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate ShiftData Normaliz
velog.io
위의 과정을 통해 학습된 AI모델이 이미지 데이터가 입력되었을 때 Inference가 되는 과정을 설명드리도록 하겠습니다. Inference 수행시 Batch에 1장의 이미지가 AI모델에 입력되며, 출력 양식에 따라 결과가 출력됩니다.
Image Classification 방식의 경우 Dataset의 각 label class별로 입력 이미지의 특성을 확률로 나타내며, 1에 가까울 수록 해당 물체가 있을 확률이 높은 것으로 보시면 됩니다.
Object Detection 방식의 경우 입력된 이미지에서 해당 물체가 이미지의 어느 위치에 있는지 네모(Bounding Box)로 직접 표시되며, 결과값은 각 label의 class속성과 신뢰도(score), 네모의 좌표값(예제의 경우 네모의 왼쪽위 꼭지점과 오른쪽아래 꼭지점의 좌표)를 출력합니다. 아래의 예제는 결과값을 json 양식으로 나타냅니다.
Semantic Segmentation은 이미지의 실제 픽셀 위치에 label class값을 표시하는 것으로 아래의 예제에서 배경은 0, 새에 해당되는 부분을 2로 나타낸 것입니다.
지금까지 Vision AI모델에 적용하기 위한 이미지 데이터를 처리하는 방법에 대해 설명드렸습니다. 비록 저의 부족한 지식으로 최대한 이해하기 쉽게 설명드리고자 하였으나 궁금한 사항이 있으시면 댓글로 질문 부탁드립니다. :)