오늘은 cs231n 5강을 제 소신껏 정리를 해 보겠습니다.
저희는 저번 시간에 단순한 linear score를 배웠습니다. 기억이 나시나요..??
f = Wx 였습니다.
2-layer 가 된다면 W2max(0,W1x) 이런식으로 된다고 하였습니다.
이렇게 하면 hidden layer가 추가된다고 하였습니다.
이제 우리는 컨볼루션 뉴런 네트워크에 대해서 배우게 될 것입니다.
convolutional nerual network ( CNN ) 은 이미지 인식에서 정말 많이 사용합니다.
들어가기 전에 앞서 CNN의 역사에 대해서 간단하게 알고 넘어가겠습니다.
처음 시작은 mark 1 perceptron 이라는 것 이였습니다.
단순히 기계로 동작했고 일반적인 단층 퍼셉트론 방식이었습니다.
w값들을 조절해가면서 train 시킨 방식 이였습니다.
그 다음 adaline(아달라인)/madaline이 나오게 됩니다.
이 때까지만 해도 기계로 숫자를 조절해가면서 진행을 했었습니다.
오차역전파(back-propagation)는 1986년도에 처음 나오게 됩니다.
2006년에는 hinton 교수님께서 weight를 잘 줄일 수 있는 방법 ( RBM-initialized ) 과 fine tuning 사용하는 방법에 대해서 알립니다.
그러다 2012년 딥러닝이 갑자기 확 ! 뜨는 계기가 있었습니다.
image net에서 alex krizhevsky가 제시한 알렉스 넷에서 그런 것인데요!!
image net에서 사람보다 더 뛰어나게 인식할 수 있도록 딥러닝을 이용해 이미지를 구별해낸 것입니다.
이때 사용한 방법이 CNN이고 이때부터 급격히 발전하게 됩니다.
위 그림을 보겠습니다.
위 그림은 CNN의 시초입니다.
1959년에 처음 나오게 되었죠.
어떤 것을 볼때마다 활성화 되는게 다른 것이고 분석하여
적용한 것이 CNN입니다.
위 그림을 보겠습니다. 위 그림을 보시면 큰 것 부터 시작하여서 섬세한 영역까지 들어가게 됩니다.
위와 같은 아이디어들이 합쳐져서 CNN이 탄생하게 된 것입니다.
위 그림을 보시면
lecun 등이 소개한 lenet에서 cnn이 제대로 적용이 됩니다.
위 그림에서 보이는 AlexNet도 마찬가지로 큰것에서 부터 섬세한 것으로 특징을 추출해내고
그 결과 image net에서 엄청난 정확도를 보여주게 됩니다.
위 그림처럼 CNN은 현재 어마어마 하게 사용되고 있습니다.
컴퓨터 비전에서 사용되는 detection , segmentation 등도 CNN으로 함께 사용할 수 있습니다.
opencv와 cnn을 함께 이용해서 이미지를 학습시키기도 합니다.
위 그림에서와 같이 자율 주행 자동차에서도 마찬가지 입니다.
테슬라는 GPU까지 넣어서 매우 빠른 속도로 탐지를 합니다.
위 그림에서와 같이 관절영역,은하계,표지판 탐지 등 이런 것들에 전부 CNN이 사용되고 있습니다.
생각보다 많은 곳에서 사용되고 있다고 합니다.
위 그림에서와 같이 CNN은 정말 핫한 기술입니다.
이제 cs231n강의 핵심주제인 CNN에서 다뤄보겠습니다.
과거에 우리는 단순히 input image를 늘려서 (stretch) wx에 넣고 계산하여 탐지를 하였습니다.
앞에서 다뤄본 바와 같이 이 방법은 좋은 방법은 아니였습니다.
기억나시는지요..?
이렇게 하여 나온 결과를 보았을 때
말머리가 2개가 나오는 것과 같이 이상한 결과가 포함되어 있었습니다.
그래서 이 방법을 아래와 같이 바꿀려고 합니다.
만약 RGB color로 한다고 가정을 해봅시다.
grey 계열이면 depth가 1 입니다.
그러면 depth가 3일듯 하군요.
거기에 width , height 가 각각 32x32 입니다.
총 32 x 32 x 3이 될것입니다.
위 그림을 보겠습니다.
convolve filter를 둘 것입니다. 이 필터를 이용하여서 input의 이미지에서 특징을 뽑아낼 것입니다.
filter는 5 x 5 x 3의 모양이며 여기서 depth가 3이기 때문에 이 filter 도 3의 모양을 갖고 있는 것입니다.
위 그림에서도 설명이 되어있습니다.
쉽게 말해서 input image와 filter의 depth는 같아야 한다는 것입니다.
위 그림을 보겠습니다.
필터를 가지고 하나의 지역에 대해서 하나의 값을 뽑아 내는 것입니다.
필터가 w라고 하면 w의 전체 값과 곱하기 x여기에 더하기 bias입니다.
위 과정에서 나온 값들을 모두 더해주면 하나의 값이 나오게 될 것입니다.
위 그림은 32 x 32 x 3 input 이미지에 5 x 5 x 3 convolve filter를 거치게 되면
28 x 28 x 1 의 하나의 activation map이 나오게 되는 것입니다.
이것들은 5 x 5 x 3 filter를 거쳐서 특징이 뽑힌 하나의 "층" 이 될 것입니다.
전 그림과 같이 필터를 1개만 사용하게 될까요...??
아닙니다.
여러개의 필터를 사용하게 됩니다.
만약 다른 필터를 사용하게 된다면 위 그림처럼 초록색의 필터가 하나 더 나오게 될 것입니다.
위 그림처럼 6개의 필터를 사용하게 된다면 6개의 activation maps가 나오게 되는 것입니다.
그리고 depth가 바뀌게 됩니다.
6개니까 28 x 28 x 6 이 될 것입니다.
위 2개의 그림을 보겠습니다.
첫 번째 그림은 1개의 filter를 거친것이고
두 번째 그림은 한개의 필터가 한 번더 거친 그림입니다.
초록색의 결과를 보면 5 x 5 x 6 filter가 10개 이구나(?) 라고 생각을 할 수 있습니다.
그래서 output이 24 x 24 x 10이 나오게 되는 것입니다.
위 과정을 반복하여 이미지의 특징을 추출해 나가는 것입니다.
시각화 해보면 위와 같이 나온다고 합니다.
첫 번째 계층을 보면 색상,edge 등 각 영역마다 다양한 모형을 가지고 있습니다.
아래층을 가면 갈수록 더 자세한 영역까지 다루는 것을 확인할 수 있습니다.
이게 CNN의 특징이라고 할 수 있겠습니다.
혹시 그런 생각이 드시는지요..??
과거에 저희는 큰 영역에서 부터 섬세한 영역까지 다룬다는 내용을 배웠습니다.
이 부분과 비슷하다는 것을 알 수 있습니다.
위 그림을 보겠습니다.
위 그림은 실제 자동차 앞부분을 보면 위 처럼 나오게 됩니다.
위에서 하나의 필터는 하나의 activation map을 만든다고 했었습니다.
위 그림의 있는 사진들이 filter들 입니다.
그리고 아래를 보시면 각각의 filter들에 대해서 activation map이 만들어 진것을 확인할 수 있습니다.
이거를 다 시각화 해본 결과이기도 합니다.
예를 들어서 파란색 화살표를 확인해 보겠습니다.
filter를 보면 주황색을 filter로 선택하였고 activation map을 확인해 본 결과
주황색 부분만 밝게 칠해진 것을 확인해 볼 수 있습니다.
이게 filter에 따른 activation map이 다르게 나와서 각 filter들이 각 특징을 추출해 내는 것을 확인할 수 있는 것입니다.
위 그림을 보겠습니다.
위 그림은 앞으로 우리가 배우게 될 내용들을 간략하게 보여주기도 합니다.
간단하게 CONV를 배웠고 이제 이 층에서 나온 값들이 ReLU의 활성화 함수(activation function)를 거쳐서 pooling을 만
나며 계속 진행될 것입니다.
한가지 의문점이 드신 분들도 계실듯 합니다.
위 사진에서는 검정색과 회색밖에 보이지 않습니다.
왜 그럴까요?!
ReLU를 거치면 검정색으로 바뀌는 것을 알 수 있습니다.
ReLU는 0이하의 값들을 전부 0으로 만들어 버립니다. 즉 - 값들이 전부 없어지게 됩니다.
그래서 검정색이 되는 것입니다.
ReLU를 하기전에는 -값을 하지 않으니까 회색까지 포함되어 있는 것입니다.
이제 우리는 filter를 통과하면 activation map이 나온다는 것을 알았습니다.
그럼 이게 어떻게 나오게 되는 것일까요!?
위 그림을 보겠습니다.
간단히 7 x 7 의 input과 3 x 3 의 filter가 있다고 가정해 보겠습니다.
depth가 3이라면 똑같이 3을 그냥 곱해주면 됩니다.
여기서는 간단히 하기 위해서 위처럼 합니다
위 그림또한 똑같습니다.
filter가 옆으로 계속 나아가면서 값을 하나씩 뽑아 낼 것입니다.
여기서 값이 하나씩 나오게 될 것입니다.
위 그림또한 같습니다.
하나의 값이 더 나오게 될 것입니다.
위 그림또한 똑같을 것입니다.
위 그림처럼 7 x 7 에서 3 x 3 filter가 움직일 수 있는 거리는 5번 입니다.
세로 또한 마찬가지일 듯 합니다.
그래서 위 그림처럼 output은 5 x 5가 나온 것입니다.
아까 앞에서 살펴본 32 x 32 에서 5 x 5 필터를 이용하면 28 x 28이 나왔던 이유가 이것 때문입니다.
그런데 여기서 stride가 1이었습니다.
stride란 쉽게 말해서 옆으로 움직일 수 있는 수치값(?) 이라고 해야할까요 ...??
이해가 쉽게 아래 그림을 보겠습니다.
만약에 stride 2라면 어떻게 될까요 ??
아래 그림처럼 될 것입니다.
위 그림을 보겠습니다.
위 그림을 보면 2칸씩 뛰어넘어가는 것을 확인할 수 있습니다.
앞에서 살펴보았을 때는 1칸씩 뛰어넘어 갔지만 위 그림은 stride가 2이기 때문에 2칸씩 뛰어넘어 가는 것을 확인할 수
있습니다.
stride가 2로 변경되었을 때 어떻게 되는지 다음 그림을 보겠습니다.
2개씩 뛰어넘어가기 떄문에 output 값이 줄어들 것입니다.
그렇다면 stride가 3이면 어떻게 될까요 ??
fit하지 않을 것입니다.
stride를 3으로 잡게 된다면 전부 둘러볼 수 없기 때문입니다.
그래서 이걸 일반화 공식으로 살펴보면
다음 그림과 같습니다.
위 그림을 보겠습니다.
N은 input size이며 , F는 filter의 크기입니다.
( N - F ) / stride + 1 의 값이 바로 output 의 size가 됩니다.
만약 여기서 값이 딱 떨어지지 않는다면 나오지 않는 것입니다.
그래서 N이 7일때 F가 3이면 stride가 1이면 5가 나왔던 것이ㅗ 2이면 3이 나왔던 것입니다.
위 그림을 보겠습니다.
이미지가 stride를 거칠 수록 계속 사이즈가 작아지게 됩니다.
이게 이미지가 급격하게 작아지게 되면 cnn 층을 몇 개 쌓지도 않았는데 금세 image가 없어지게 됩니다.
중간에 있는 영역들은 filter들이 중복해서 겹쳐서 보게 됩니다.
근데 양쪽 side는 중간에 비해서 좀 덜 보게 될 것입니다.
왜냐하면 side는 filter가 1번뿐 보질 못하기 때문입니다.
이게 조금 문제가 될 수도 있습니다.
가장 큰 문제는 image size가 작아지는 것입니다.
그래서 여기서 padding 이라는 개념이 나오게 됩니다. 위 그림에서는 zero padding을 통해 양쪽 사이드에 zero값을 취
해 줍니다.
padding을 1개 추가 하게 되면 왼쪽 + 오른쪽이 되니까 x 2가 될 것입니다.
즉 , 7 x 7 이미지가 9 x 9 가 되는 것입니다.
padding이 2개 layer가 추가된다면 어떻게 될까요?? 2 x 2 = 4의 숫자만큼 증가되어 11 x 11이 될것이라 생각이 듭니다.
그렇다면 한가지 생각을 해보겠습니다.
위 그림에서 padding을 1개 추가하면 output은 어떻게 될까요??
7 x 7 이 나올 것입니다.
이미지의 크기가 9 x 9 로 커졌기 때문입니다.
일반적으로 filter가 3이면 zero pad을 1개만하고
filter가 5이면 zero pad를 2개를 하고
filter가 7이면 zero pad를 3개를 하고 ...
이런식으로 되는 것입니다.
앞전에 얘기했던 내용으로 돌아가 보겠습니다.
돌아가 보면 padding을 써줘야 이미지 크기가 급격히 줄어드는 것을 방지할 수 있다고 하였습니다.
여기서 잠시 문제입니다 !!
32 x 32 x 3 의 input에 5 x 5 filter 10개와 stride 1 , pad가 2이면 어떻게 될까요 ??
32 x 32 x 10 이 될것입니다.
위 그림처럼 간단하게 계산해 보면 알 수 있을 것입니다.
그렇다면 파라미터 개수는 얼만큼 필요할까요...??
결과부터 말하자면 760입니다.
왜냐하면 5 x 5 x 3 = 75 입니다.
이게 10개가 있으니까 750 입니다.
그런데 bias 값이 각 필터마다 있으니까 + 10 을 하게 됩니다.
그래서 760이 나오게 됩니다.
위 그림은 방금 위에서 살펴본 내용을 일반화한 내용입니다.
영어로 되어있기 때문에 확 와닿지 않을수도 있습니다.
가벼운 마음으로 이런게 있구나 라고 생각하시면 될듯합니다.
위 그림을 보겠습니다.
그래서 보통은 input 이미지는 32 , 64 , 128 등 2의 지수승으로 가게 되는것이고
Filter가 3, stride가 1이면 padding이 1
Filter가 5, stride가 1이면 padding이 2 이런식으로 쓰여진다고 하는 것입니다.
위 그림을 보겠습니다.
1 x 1 CONV 내용이 나오게 됩니다.
여기서는 우리가 앞에서 확인해 본 5 x 5 가 아니라 1 x 1을 사용한다고 합니다.
이게 나중에는 CNN을 거치고 나서 Flatten()을 합니다.
쉽게 말하자면 쫙 핀 다음에 이걸 이제 input으로 FUlly Connected layer에 넣게 되는 것이고
이때 이 FC를 빼고 1 x 1 CONV를 써도 상관이 없다고 하는 것입니다.
연산이 똑같다고 설명하고 있습니다.
위 그림들을 보면 하나의 filter에 대한 영역에서 1개의 숫자가 나오게 되는데 이건 뉴런에서
local connect와 비슷하다고 합니다.
그래서 만약 5개의 필터면 같은 영역에 대해 5개의 값들이 나오게 되는 것입니다.
위 그림처럼 말입니다.
그렇지만 5개의 각각 다른 특징을 가지고 있을 것입니다
왜냐하면 필터가 다르기 때문입니다.
"같은" 영역에서도 필터가 다르니까 서로 다른 값들을 뽑아내는 것입니다.
fully connected layer에서는 위 그림처럼 된다고 합니다.
위 그림을 보겠습니다.
이제 저희는 Pooling을 배우면 될듯합니다.
pooling은 이미지의 사이즈를 줄여줍니다.
그런데 여기서 큰 특징값을 유지하면서 줄여주는것이 특징입니다.
그래서 보통 max pooling 을 많이 사용합니다.
max pooling은 큰 값을 뽑아내는 것입니다.
"큰 값"이라는 것은 그 "특징"의 값이 크다라는 것입니다.
결과적으로 매우 특이한 특징 값을 뽑아낸 뒤 나머지는 버리는 것입니다.
위 그림 처럼 말입니다.
max pool이 2x2이면 크기가 절반으로 줄어들게 됩니다.
여기서 빨간색 영역은 6 , 초록색 영역에서는 8 , 노란색 영역에서는 3 , 파란색 영역에서는 4
와 같이 값들을 뽑아내는 것입니다.
위 처럼 하여 이미지의 사이즈를 줄이는 것입니다.
stride로 줄여나가는 것이 아니라 max pooling을 이용하여서 이미지의 size를 줄여주는 것입니다.
위 그림을 보겠습니다.
summary를 하게 되면 위 그림처럼 된다는 것을 알 수 있습니다.
위 그림처럼
pooling filter가 2이면 stride가 2 이며
pooling filter가 3이면 stride가 2를 사용한다고 합니다.
마지막으로 FC layer로 넣어줘서 값들을 분류하게 되는 것입니다.
'컴퓨터비전' 카테고리의 다른 글
#IT #먹방 #전자기기 #일상
#개발 #일상