[cs231n] Lecture 02 - 1

박이름·2022년 1월 31일
1

cs231n

목록 보기
1/3
post-thumbnail

<cs231n Lecture 02 영상 링크>

안녕하세요! 오늘은 스탠포드 대학교 cs231n 강의 2번째 Chapter 정리 입니다!

"Image Classification"

Image Classification ?
" 이미지 분류는 컴퓨터 비전의 주요 문제로서 물체를 인식하고 이미지에 해당하는 label 값을 예측하는 것"

이미지 분류는 다음과 같은 과정으로 진행됩니다.

1. 입력 이미지를 받는다.
2. 이미지를 보고 어떤 카테고리에 속할지 고른다.
: 카테고리(개, 고양이, 비행기, 말 등)는 시스템 상에서 미리 정해놓은 것

이렇게 보면 참 쉬워보이지만, 기계에게는 아주 어려운 일입니다.

위와 같이 기계는 사진을 아주 큰 격자 모양의 숫자 집합으로 인식합니다. 그리고 각 픽셀은 세 개의 숫자로 표현합니다. 각각 Red, Green, Blue를 의미하며 우리가 흔하게 접하는 RGB를 뜻합니다.

즉, 위의 사진에서 볼 수 있듯이 컴퓨터에게 이미지는 단지 거대한 숫자 집합에 불과합니다.

이러한 것을 바로 Semantic Gap(의미론적 차이)이라고 합니다.

고양이라는 category는 '사람'이 이미지에 붙인 "의미상의" 레이블입니다.
고양이 사진이라는 사실과 실제 '컴퓨터'가 보는 픽셀값과는 큰 차이가 존재하는데,
이를 바로 Semantic Gap이라고 부르는 것입니다.

컴퓨터가 고양이 이미지를 보고 고양이로 인식하는 데에 여러 Challenge가 존재합니다.

Challenge 1. Viewpoint variation

"이미지를 바라보는 방향" 개념으로 접근해보겠습니다.
이미지에 아주 작은 변화가 생기더라도 이미지의 '픽셀값'은 모두 변화합니다.

예를 들어, 고양이 사진을 찍으려는데 고양이가 가만히 앉아만 있으면 아무일도 일어나지 않습니다. 하지만 카메라를 아주 조금만 움직여도 픽셀의 모든 값들은 달라지게 됩니다.

픽셀값이 달라져도 고양이라는 사실은 달라지지 않는데 말이죠.

Challenge 2. Illumination

"조명"
사진을 찍을 때 조명의 중요성을 생각해보면 쉽게 이해할 수 있을 것이라 생각됩니다.

자연광, 역광, 어두운 조명, 밝은 조명 등 어떤 조명 아래에 있든 고양이는 고양이입니다.

어두운 조명에 있다고 해서 고양이가 강아지처럼 보일 순 있어도, 고양이가 강아지가 되지 않습니다.

Challenge 3. Deformation

"객체 자체의 변형"

고양이는 다양한 자세를 취할 수 있습니다. 네 발로 꿋꿋하게 서있는 고양이만 고양이인 것이 아닙니다. 이 부분은 쉬운 이해를 돕기 위해 학습 자료를 첨부하겠습니다.

Challenge 4. Occlusion

"가려짐"
무언가에 가려져 고양이의 일부분만 보인다고 해도 컴퓨터는 고양이로 인식할 수 있어야 합니다. 가려져있어도 고양이는 고양이니까요 !

Challenge 5. Background Clutter

"객체가 배경과 비슷할 경우"
흔히 말하는 '보호색'의 개념과 유사합니다!

하얀털을 가진 고양이가 새하얀 눈밭에 있는 사진이 주어지더라도 컴퓨터는 고양이로 인식해야합니다.

Challenge 6. Intraclass variation

"하나의 클래스 내에서도 다양성이 존재"

'고양이' 범주에 다양한 모습의 고양이가 속할 수 있다는 사실은 사람인 우리에겐 당연하게 여겨지는 개념이지만 컴퓨터에겐 생소한 개념일 것입니다.

컴퓨터에게 이미지는 그저 거대한 숫자 집합이니까요.

고양이에 따라 생김새, 크기, 색깔 등 많은 부분이 다르지만 '고양이'라는 한 범주에 속합니다. 이러한 다양성 또한 다룰 수 있어야 좋은 모델이 될 수 있습니다.

이러한 Challenge에도 컴퓨터는 인간만큼 물체를 구분할 수 있을까요?

강사는 기적과도 같은 일이라고 하지만 일부 제한된 상황에선 컴퓨터가 인간의 정확도만큼 분류를 구현할 수 있다고 합니다. 이후에 진행될 강의에서 어떤 요소가 이를 가능하게 만들 지 배우게 됩니다!

Data-driven approach

자 이제 그러면 컴퓨터가 고양이를 잘 분류할 수 있도록 하기 위해 어떻게 접근해야 할 지 생각해 보아요!

가장 먼저 떠올릴 수 있는 건, '고양이'의 '특징들을 정의'해 분류하는 방법이 있을 것입니다.

이러한 방식으로 분류를 진행하려면 강아지, 비행기, 말 등등 고양이 이외의 객체들의 특징 또한 처음부터 끝까지 정의를 해줘야 합니다. 사람이 생각할 수 있는 이 세상 모든 것의 특징들을 정의한다는 건 그만큼 소요되는 시간이 많을 것이고 잠깐 생각해보아도 아주 비효율적이라고 느껴질 것입니다.

따라서 이 세상에 존재하는 다양한 객체들에 유연하게 적용할 수 있는 확장성을 지닌 알고리즘이 필요합니다.

이러한 일을 가능하게 하는 것이 바로 Data-driven approach 입니다. 쉽게 말해 방대한 양의 정답이 있는 데이터를 받아 어느 것이 고양이인지 학습하고 이를 바탕으로 새로 들어오는 이미지가 고양이인지 분류하는 방식입니다.

Data-driven approach은 다음과 같은 과정으로 이루어집니다.

1. 이미지와 레이블로 구성된 데이터를 수집
2. 수집된 데이터로 이미지 분류기를 학습시킴
3. 테스트 이미지에 대해서 학습시킨 이미지 분류기를 평가

입력 이미지를 고양이로 분류하려면 두 개의 함수가 필요합니다.

  • 함수 1 = Train 함수
    입력 : 이미지와 레이블
    출력 : 모델
  • 함수 2 = Predict 함수
    입력 : 모델
    출력 : 이미지의 예측값

머신러닝 모델을 구현해본 적이 있다면 모델을 학습하고 평가하는 이 과정이 익숙하실 것이라 생각됩니다.

복잡한 알고리즘을 배우기 전에 간단한 Classifier를 한 번 살펴보고 가겠습니다 !

Nearest Neighbor (NN)

앞글자를 따서 NN알고리즘으로 부르는 Nearset Neighbor는 상당히 단순한 모델입니다.

Train Step에서는 모든 학습 데이터를 기억합니다.
Predict Step에서는 새로운 이미지가 들어오면 새로운 이미지와 기존 학습 데이터를 비교해서 가장 유사한 이미지로 레이블링을 예측합니다.

아주 간단한 방식이지만 Data-driven approach로써 아주 좋은 알고리즘입니다.

CIFAR-10 데이터셋을 예시로 들어보겠습니다. 왼쪽의 이미지들은 학습 데이터이고 오른쪽의 이미지는 테스트 이미지입니다.
가장 첫 번 째 열의 이미지는 주어진 테스트 이미지의 레이블에 "가장 가까운" 이미지입니다.

예를 들어
1) 테스트 이미지로 고양이 이미지가 주어지면,
2) 고양이와 가장 비슷하게 생긴 이미지를
3) 첫 번 째 열에 출력하는 것입니다.
4) 두 번 째, 세 번 째 열로 갈수록 비슷한 정도가 점점 떨어집니다.

그렇다면

이미지 쌍이 있을 때 어떻게 비교할 것인가?

테스트 이미지 하나를 모든 학습 데이터들과 비교할 때 여러가지 비교 방법들이 있습니다.

1. L1 distance ( Manhattan distance )

두 점 사이의 거리의(픽셀 간) 차이에 절댓값을 취하는 방식으로 계산됩니다.

이미지 처리에서는 테스트 이미지, 학습 이미지의 같은 자리에 있는 픽셀을 빼고 절댓값을 취합니다. 그 후 계산된 값들을 모두 더해 이미지 간의 차이 값을 구합니다.

위의 예시를 보면 테스트 이미지와 학습 이미지는 '456'만큼 차이가 있군요.

2. L2 distance ( Euclidean distance )

수식은 복잡해 보이지만 피타고라스의 정리와 같은 개념(제곱합의 제곱근)이라고 생각하시면 됩니다!

어떤 거리척도를 사용할 것인가?

서로 다른 척도에서는 공간의 근본적인 기하학 구조 자체가 다릅니다. 따라서 문제에 따라 적용하는 거리 척도를 다르게 사용합니다.

L1은 어떤 좌표 시스템이냐에 따라 많은 영향을 받습니다. 예를 들어 기존의 좌표계를 회전시키면 L1 distance가 변합니다.

반면에 L2는 좌표계와 아무 연관이 없습니다.

만약 특징 벡터의 각각 요소들이 개별적인 의미를 가지고 있다면(ex. 키, 몸무게)
L1 distance가 더 잘 어울릴 수 있습니다.

하지만 특징 벡터가 일반적인 벡터이고, 요소들 간의 실질적인 의미를 잘 모르는 경우라면 아마도 L2 distance가 더 잘 어울릴 수 있습니다.

K-NN 알고리즘을 사용했지만 서로 다른 거리척도를 사용한 결과입니다.
왼쪽의 L1 distance의 경우 결정 경계가 '좌표축'의 영향을 받는 것을 알 수 있습니다.
오른쪽의 L2 distance의 경우 좌표축의 영향을 받지 않고 결정 경계를 만들기 때문에 경계가 조금 더 자연스럽습니다.

NN 시각화

위 그림은 NN의 "decision regions" 입니다.

각 점은 학습 데이터를 나타내고, 색은 클래스 레이블(카테고리)입니다.
이 예제에서는 5개의 클래스를 갖고 있네요.
2차원 평면 내의 모든 좌표에서 각 좌표가 어떤 학습 데이터와 가장 가까운지 계산합니다.

위 그림을 보고 NN의 문제점을 확인할 수 있습니다.

  1. 가장 가운데에 주변은 전부 초록색인데 중간에 노란색이 끼어있음
  2. 초록색이 파란색 영역 침범

이러한 문제들을 보완하기 위해 조금 더 일반화된 알고리즘이 있습니다.

K-Nearest Neighbors ( K-NN )

distance metric을 이용해서 가까운 이웃을 K개만큼 찾고 이웃끼리 투표(과반수 이상)하는 방법입니다.
가장 가까운 K개의 이웃이 초록색이라면, 테스트 이미지는 초록색 영역으로 결정되는 원리입니다.

K=3의 경우, 초록색 영역에 있었던 노란색 영역이 사라졌습니다.
K=5의 경우, K=3에서 빨간색과 파란색 영역의 경계가 부드러워졌습니다.
(K=1은 사용하지 않습니다. K가 1보다 커야 결정 경계가 더 부드러워지고 더 좋은 결과를 보이기 때문입니다.)

참고로 저는 K-NN을 "친구따라 강남간다"라는 속담으로 이해했습니다ㅎㅎ

강의에서 한 학생이 '레이블링이 안된 흰색 영역은 어떻게 처리하는지' 질문했는데요,
이에 대해 '흰색 영역은 다수결로 결정할 수 없는 데이터로 가장 가까운 이웃이 없는 데이터를 뜻한다'고 답했습니다. 흰색 부분을 메꿀 수 있는 방법은 다양하지만 이번 강의에서는 다루지 않았습니다 !

최적의 거리 척도와 K 값은 문제에 따라 다르기 때문에,
다양한 값을 대입해보며 최적의 값을 찾아야 합니다 !

Cross-Validation ( 교차 검증 )

어떤 거리 척도를 만들지, 어떤 K값을 설정할 지 등 모델을 학습시킴에 있어 사람이 지정해주어야 하는 걸 '하이퍼 파라미터'라고 합니다.
가장 최적의 하이퍼 파라미터를 찾기 위해 사용하는 방식으로 Cross-Validation이 있습니다.

테스트 데이터는 "오로지 한 번만 수행"
아주 엄격하게 분리해야 함!

train 데이터와 test데이터로 나누고, train 데이터에서 학습이 잘 되었는 지 검증하기 위해 train 데이터의 일부를 validation 데이터 설정한 방법에서 발전된 방법입니다.

train데이터를 k개의 그룹으로 나누어서 1그룹을 validation 데이터로, 나머지는 train데이터로 사용하여 학습을 합니다. 이런 과정을 k번 반복해서 hypterparameter를 튜닝함으로써 분류기를 더욱 일반화시킵니다.

사실 이 방법은 작은 데이터셋일 경우 많이 사용하고, 딥러닝에선 많이 사용하지 않습니다.

이렇게 K-NN 방식을 알아보았는데,

사실 이미지를 분류함에 있어 K-NN을 사용하는 전략은 그리 좋은 방법이 아닙니다.

이유는 다음과 같습니다.

  • 계산하는 데에 시간이 오래걸림
  • 현실적으로 '거리'를 사용해서 정확한 예측을 하기 어려움
  • 차원의 저주
    : 차원이 증가함에 따라 필요한 학습데이터의 양이 기하급수적으로 증가
    고차원의 이미지라면 모든 공간을 조밀하게 메울 만큼의 데이터를 모으는 일은 현실적으로 불가능

강의 내용을 너무 자세하게 적었나 싶은 느낌이네요.. 앞으로 정리해가면서 조금 분량을 조정해볼까 싶습니다! Linear Classification은 다음 포스팅에서 이어가겠습니다!

cs231n 강의 이해에 도움이 되었으면 좋겠습니다 ㅎㅎ 읽어주셔서 감사합니다 :D

profile
딸기 못잃어

0개의 댓글