본문 바로가기

Backup/cs231n

cs231n 2강 Image classification pipeline



이미지는 classificatoin은 컴퓨터 비젼에 있어서 가장 핵심적인 작업입니다.

예를 들어 dog, cat,truck같이 레이블이 있을때 이중에 이 이미지를 보고 이것은 고양이다 라고 판단하는게 image classification이라고 할수있습니다. 

classification이 가능하면 detection, segmentation, image captioning이 수월해진다고 합니다.




이미지는 기본적으로 숫자로 구성된 3d array.

숫자는 0~255사이의 값이 될것이고

예를 들어 이 이미지같은경우 800*600*3으로 구성이 되는데

제일앞은 height 중간은 width 마지막은 rgb로 이루어짐




그런데 보는 각도에 따라서 이미지가 다르수있고


조명에 따라서 이미지가 다르게 보일수도있고


형태의 변형이 있을수 있습니다.

그리고 이런 은패 은닉과 같은 것들도 기계에게 인식해야하는 문제가 있을수있고

그리고 배경하고도 구분하게끔해야됩니다.


그리고 다 같은 고양이인데 이 고양이중에서도 종으로 구분시켜야하는 문제가 또 있습니다.


일단 기본적인 이미지 분류기를 함수로 표현하자만 이렇게 됩니다.

입력으로 이미지를 받아서 이 이미지가 어떤 클래스에 속하는지 레이블을 리턴하는것이 기본적인 함수형이 되겠습니다.

여기서 주의해야할점은 어떤 숫자를 정렬해야되는 것처럼 다른 알고리즘과는 다르게 고양이같은 클래스로 인식을 하는데 있어서는 

이것을 하드코딩할수있는 그런 알고리즘은 존재하지 않다.


울론 역사적으로 볼때 오랜기간동안 그런 시도가 있었습니다.

어떤 시도를 했냐하면 이 이미지를 보고 이 이미지에 있는 특징적인 엣지나 세이프 같은걸 라이브러리하고

이런것들이 어떻게 배열되어있는지를  비교해가면서 탐색하는 방법이었어요.

즉 오른쪽 그림에 보면 이미지의 작은 부분부분들을 이미지에서 어떻게 배열되어있는가를 찾아내는 것이다.

그럼 전반적인 상태를 비교해서 이 이미지를 분류해려는 시도였음

그런데 기본적으로 스케일업하지 않는 방법이여서 많은 한계가 있다.


우리가 하려는 방법은 데이터에 기반한 접근방식이다.

즉 이미지와 레이블로 구성된 데이터셋을 수집하고 이 데이터 셋에 대해서 우리의 이미지 분류기를 학습을 시킴니다.

그리고  테스트 이미지 셋에 대해서 학습시킨 이미지 분류를 평가를 해보는겁니다.,

함수로 표현하자면 아래와 같다.

아까는 이미지를 입력으로 주고 출력으로는 레이블을 주는 하나의 함수를 가졌었는데

지금은 학습과 예상이라는 두개의 함수를 가지게 되었음

즉 학습시기에는 이미지와 레이블을 받아서 모델을 도출해내는거 

그리고 예측을 할때는 모델과 테스트 이미지를 넣어주고 테스트 이미지의 레이블을 반환하는것이 이 분류기만드는것의 목적이 되겠습니다.



그래서 이런 데이터기반 방식으로 첫번째 방법으로 NN라는 분류기를 학습해보겠습니다.

미리 말하자면 이 NN은 더이상 사용하지 않는 더이상 사용하지 않는 방법입니다. 

그치만 학습용으로 여기서 한번 언급해보겠습니다.

학습단계는 매우 간단합니다. 모든 학습 이미지와 레이블들을 그냥 메모리상에서 기억하게 한다.

예측 단계에서는 테스트이미지를 모든 트레이닝 이미지 하나하나와 다 비교해봅니다. 

그리고 가장 비슷한 트레이닝 이미지 레이블을 테스트 이미지 레이블이라고 예측하게 되는겁니다.




우리는 이를 위해 테스트를 해볼건데 우리가 사용할 데이터셋은 cifar10이라는 데이터 셋인데요

cifar10은 10개의 레이블을 가지는 총 6만개의 데이터셋입니다./

이중에 만개는 테스트 5만개는 트래이닝에 사용됩니다.

각이미지는 레이블을 가지고있고 사이즈는 32*32로 구성된 이미지가 됩니다.




실제로 NN으로 구현을 하게되면 이런식으로 결과가 나오는것을 볼수있는데요.

이 왼쪽열의 열게의 이미지들은 테스트이미지입니다.

이 보트의 테스트 이미지을 5만개의 트래이닝 이미지에서 가장 비슷하다고 생각하는 이미지10개를 보여주는 겁니다, 

제일 왼쪽의 것이 가장 비슷한거고 맨 오른쪽은 10번째 비슷하다고 합니다.

보시면 잘안되는걸 알수있는데 보트이미지인데 말이미지와 닮았다고 나오죠?

이게 어떻게 작동되는지 살펴보도록하겠습니다.




테스트 이미지를 모든 트레이닝 셋에 있는 이미지 하나하나와 비교한다고 했는데

그 비교하는 기준이 거리입니다.

여기서는 우선 L1 distance입니다. 맨허튼 디스턴스라고도 하는데 저 식에서 보듯이

이미지 1과 이미지2와의 차이에 절대값을 씌워준 형태를 가지고 있습니다. 

아래 그림 보시면 테스트 이미지가 4*4라고 구성되어 있다고 가정할때 

이두개의 픽셀와이즈, 각각의 원소별로 빼주고 절대값값을 씌어주고 이것의 합을 냄.

즉 이 특정 test이미지와 트래이닝이미지간의 거리는 456이 된다는겁니다.




여기서 트레인에서는 모든 트레인 이미지 셋을 그냥 메모리에 올림.

그리고 프리딕트 함수에서는 그냥 테스트 이미지만 주고 

모든 픽셀값에 대해서  그 차이를 가져오는겁니다.

결과적으로 이 코드에서 하는건 L1디스턴스 기준으로 해당 테스트 이미지가 가장 가까운,

즉 L1디스턴스가 가장 작은 그런 트레인셋중의 이미지를 찾는것이 됩니다.

그래서 이 테스트 이미지의 레이블을 예측을 할수있게 되는겁니다.









여기서 잘 이해했는지 질문을 하나 해보면

트레이닝 이미지가 많아지면 분류하는데에 속도는 어때질까요?








분류하는 속도는 리니어하게 증가함.

즉 트레이닝 이미지가 두배로 늘어나면 분류하는데 속도도 두배가 됩.

이건 큰 단점.

트레이닝속도가 빠르는게 중요할까, 테스트때 속도가 중요한가?

물론 테스트떄 속도가 중요. 예측할때 빨리빨리 결과가 나와야되는데

NN에서는 그렇지 못하는것이죠.

사질 나중에 우리가 배우게될 CNN에서 보면 

트레이닝에서는 시간이 굉장히 오래가지만 평가시에는 시간이 굉장히 짧게 걸리게 됩니다.

테스트때는 일정한 시간이 소요된다고 할수있습니다.



아까 NN같은경우 가장 가까운 이미지로 분류를 했는데

이 KNN같은경우에는 가장 가까운 K개의 이미지에서 많이 겹치는걸로 분류를 하게되는겁니다.

일반적으론 KNN이 일반 NN보다 성능이 좋다고 알려져있습니다. 















우리가 아까 L1디스턴스를 사용한다고했는데 L2디스턴스라는것도있습니다.


L1을 사용할것이냐 L2를 사용할것이냐는 하나의  하이퍼파라미터입니다.

이 하이퍼파라미터는 주어진 환경에서 여러번 실험을 통해서 최적의 파라미터를 찾아야되는겁니다.





그래서 지금까지 보면 어떤 디스턴스, L1 L2을 사용해야되냐

그리고 K을 몰써야되는지 질문이 생기는데


이런 하이퍼파라매터는 문제마다 다릅니다.

그래서 주어진 환경에서 각각의 파라미터들을 실험해보고 그중 가장 퍼포먼스가 잘나오는걸로 선택해야됩니다.



그럼 이런 실험을 데이터셋을 어떻게 나눠서 해야될까요?

모든 데이터를 트레이닝 시키고, 또 똑같은 데이터셋을 테스트하면될까요?

이러면 항상 거리가 0이 성능이 무조건 잘나오게 되죠.













그럼 트레이닝 테스트로 나눠서 테스트셋에서 잘 작동되는 하이퍼파라미터를 찾아 실험을 해야될까요?






이래도 안된다 합니다. 테스트 셋은 최종적으로 이 만든 모델이 잘 작동되는지 평가할때만 쓰는 데이터 세트입니다.

이 테스트 데이터셋은 모델을 만드는과정에서는 절대 사용하면 안된다 합니다.






그래서 우리는 최적의 하이퍼 파라미터을 찾기위해, 여러가지 실험을 해야하기 떄문에 

데이터셋을 train validation test이렇게 3개로 나눕니다.

트레이닝 세트에서 일부분, 일반적으로 20%을 때어내서 하이퍼 파라미터를 튜닝하기위한 그런 공간으로 사용하게 됩니다.





때로는 트레이닝 데이터셋이 적은경우가 있는데 이럴때는 cross validation을 적용하면 된다.

즉 1,2,3,4에서 트레이닝을 하고 5에서 validation을 합니다.

그리고나서 2345번에서 트레이닝을 하고 1번에서 validation을 합니다,

이런걸 cross validation이라고 합니다.




이 그래프는 각각의 K개의 대해 5fold cross validation을 했을때 그 정확도가 어떻게나오는지에 대한 그래프인데요

보시면 각 K개에 대해서 5개의 validation을 나눠서 정확도을 구한 5개의 점이 찍혀있음을 보일수있습니다.

저 선은 각 5개의 점의 평균인데 이 평균값이 가장 높을때가 7,

즉 이 문제에서는 k가 7일떄가 가장 최적이라 할수있습니다. 






처음에 말씀들인대로 NN은 현실에서는 사용안합니다.

일단 test time때 성능이 매우 않좋다는거고

그리고 디스턴스라는것이 현실적으로 정확한 예측을 하기 어렵습니다.

여기 보시면 각 이미지를 다 조금식 바꿨는데

이 모든이미지가 동일한 거리를 가진다고 계산해버리기 때문에 현실적으로 NN은 사용하지 않습니다.








이건 요약분


이제 선형분류기에 대해서 배워보도록하겠습니다.

이건 이제 우리가 다룰 인공신경망에 대해 배우기 위한 시작점이라고 보시면 됩니다.




이 그림에서 보다싶이 신경망이라는건 레고블럭을 쌓아나가는 과정이라고 생각해볼수있는데요







나중에 우리가 익히게 될 내용인데 이런 이미지 캡셔닝하는 모델도 공부하게됩니다,

해당 이미지에 있는 옵젝들을 분류하고 그것을 텍스트로 설명해주는겁니다.




이런 이미지 캡셔닝은 CNN과 RNN과 결합되서 마치 하나의 네트워크로 동작하게됩니다.


CNN으로 이미지를 인식하고 RNN으로 문장을 구상하는 그런 역할을 하는것입니다.


나중에 배우겠지만 RNN은 이런 sequence 처리에 강한 문장이라던가 동영상 음성에 강한 네트워크입니다,




앞에서 했던거처럼 cifar10이라는 데이터셋을 활용할것이고요.



지금부터 하고자하는 선형분류는 파라미터 기반의 접근방식을 사용하고있습니다.


앞에서 봤던 NN같은경우 파라미터를 사용하지 않았습니다.

이 함수을 보시면 f x외에 W가 있습니다.

x는 이미지인데 이 x는 우리가 컨트롤할수있는 부분이 아닙니다. 


그렇지 않고 주어진거이기 떄문에

우리가 컨트롤해야할 부분은  이 weight값이다.


그래서 3072개의 숫자로 구성된 하나의 이미지가 입력되면 그 출력값으로 어떤 클래스로 속하는지,

즉 10개의 숫자을 리턴해주는 그런 방식을 그대로 취하고있는데

여기서 달라지는건 w라는 파라미터가 있다는 차이가 있습니다.




우선 32*32*3을 쭉 펴주빈다. 그러면 이 이미지는 3072라는 벡터가 될것입니다.





이걸 입력을 넣어주고 그결과로 우리는 10개의 숫자를 받아야 하기 떄문에 그결과는 10*1로 받아와야 합니다.


그래서 우리가 선형대수학에서 배웠다싶이 이 가운데 W는 10*3072가 되어야지만 그 결과값이 10*1이 될것입니다,


즉 이 Weight의 차원은 우리가 맞춰줘야하는거고 결과적으론 우리가 컨트롤해야하는 weight들은 총 30720개가 됩니다.


우리가 이들을 컨트롤해야되기떄문에 이를 parametric approach입니다.




여기서 생략한게있는데 여기에 bias값도 있습니다.

Bias도 parameter이기 때문에 우리가 찾아내야하는거고요





우리가 원래 이미지는 3072*1의 차원을 가지는 vector라했는데 예을 들기위해서 그냥 4개의 픽셀을 가진다고 가정하겠고 10개가 아니라 3개의 클래스만 있다고 가정하겠습니다.

그래서 이쪽 결과값이 3*1이  되는거고 bias도 마찬가지로 3*1이라고 하겠습니다. 



그래서 입력 w가 이미지를 3*4형태로 맞춰줘야 되서 이런 형태가 된거고요 그다음에는 그냥 행렬 연산만 하면 됩니다.

첫번쨰 는 그냥 각 행의 연산을 하면 고양의의 점수 개의 점수 양의 점수을 얻게됩니다.



결과적으로는 고양이의 점수가 매우 낮게 나왔자나요 


현재 우리의 모델은 아직 학습이 되지 않아 성능이 저조한 상태라 할수있겠습니다.







그래서 질문을 하나 드리면 선형분류기는 모냐라고 한문장으로 설명하면


just a weighted sum of all the pixel value of image

= 이미지내의 모든 픽셀값들에 대해서 가중치를 곱하여서 처리를 한것의 합이다 







"Counting colors at different spatial position"

또 두번쨰로는 각각 다른 공간에 있는 컬러들을 카운팅 한 것이다. 라는 의미도 있다고 합니다.

컬러가 그만큼 중요하다는 건데




학습한 가중치들을 시각적으로 보면

아래그림처럼 자동차는 자동차의 형상이 보이지만 빨간색입니다.

빨간 차가 많았나봐요


말도 보면 왼쪽을 향한 말 오른쪽을 향한 말도 있습니다.

왼쪽으로 향한 말이 많았나보죠


문제는  만약 노란색 차가 입력으로 들어오면 개구리라고 분류해버리게되겠죠. 이런 색상에 대한 단점이 가지고있습니다.

결론적으론 한계가 있고 나중에 배울 NN같은경우 훨씬 더 좋은 결과을 얻게 됩니다..







이 선형 분류을 해석하는 방법은 공간에 각각의 클래스가 있고 

이 클래스를 분할해주고이다 라고 해석을 할수도있곘습니다.


그래서 선형 분류할때 분류하기 힘들데이터셋이 무엇인가라는 질문이 있었고 








학생들 : 컬러가 전혀 반대인 negative 이미지, gray이미지 같은것들은 성능이 많이 떨어질것이다.

  







그래서 지금까지 우리가 한건 score function을 정의 한것입니다.

이런 점수을 기반으로 앞으로 해야할것이 loss function을 정의해야합니다.



이 스코어들이 어느정도 좋은지 나쁜지을 정량화하는 겁니다.



스코어 함수을 이용해 함수을 만들었고 이제는 오차함수을 통해 오차를 구해야합니다.




















'Backup > cs231n' 카테고리의 다른 글

cs231n 6강 Training NN part 2  (0) 2017.12.05
cs231n 5강 Training NN part 1  (0) 2017.12.05
cs231n 7강 CNN  (0) 2017.11.02
cs231n 4강 Backpropagation and NN part 1  (0) 2017.10.20
cs231n 3강 Loss fn, optimization  (1) 2017.10.18