컴퓨터 비전 기본 개념 복기하기
1. 시각 지각능력이 왜 중요한가
인간이 처리하는 대부분의 데이터는 오감을 통해 들어온다.
오감 = 센서
이로부터 취득한 데이터를 뇌에서 프로세싱하여 정보로 사용함
오감중 가장 많은 정보량을 차지하는 것은 시각이다
인간의 75%정보는 눈으로부터 들어옴
귀에 이어폰을 꽂고 돌아다니는건 불편하지 않지만, 눈을 감고 돌아다니면 상당히 불편함을 느낌
2. 인간이 세상을 인식하는 방법
시각적 세상이 주어질때, 눈을 통해 세상을 인지하고 그렇게 받은 신호를 뇌에 보내서 이를 기반으로 정보 해석
3. 컴퓨터가 세상을 인식하는 방법
사람의 눈 = 카메라, 사람의 뇌 = GPU, AI, 알고리즘 시스템
카메라로 촬영된 시각 데이터를 GPU에 올려서 알고리즘을 이용해 프로세싱을 하고 understanding이 이루어지면서
컴퓨터가 다루기 쉬운 형태이면서도 사람도 이해할 수 있는 중간단계인 high-level의 표현으로 변환
사람과 컴퓨터가 세상을 인식하는 방법이 나름 비슷함
시각지능을 만드는 방법은 결국 영상(이미지)을 어떻게 처리하는가의 문제로 귀결
4. 2012 AlexNet
2012 ImageNet 대회에서 우승
상당한 주목을 받았는데 기존 2011우승 방법론에 비해 2배 이상의 압도적인 성능차이를 보였다
꾸준한 발전으로 image classification문제에서 인간의 능력을 뛰어넘었다
그간 주목받지 못했던 딥러닝이 2012년 Deep Convolution Neural Network라는 이름으로 주목받기 시작
5. LeNet-5
1998년 Lecun이 발표한 convolutional neural network의 원조
convolution layer 2개와 fully connected layer로 만든 간단한 모델을 제안
기존 fully connected layer로만 구현된 neural network에 비해 상당한 성능 향상
우편번호 인식에서 엄청난 성공
그러나 일반적인 이미지에서는 적용하기 어려웠다
6. AlexNet과 LeNet은 무슨 차이가 있었나
AlexNet은 LeNet에 비해 convolution layer가 많아서 Deep convolution neural network라고 불렸다
깊게 쌓아놓으면 성능이 향상될거라고 기대해서 깊게 쌓긴했지만.. LeNet 당시에는 깊게 쌓는 것 조차도 쉽지 않았다
convolution layer를 5개 층으로 AlexNet처럼 만들었을때 학습하기 쉽지 않았다
이유는 gradient vanishing으로 불리는.. 상단 layer에서는 gradient가 계산이 잘 되었지만 최종단으로 갈수록 gradient가 작아져 계산이 안되었다
1) 하지만 이런 문제를 해결할 수 있었던 AlexNet 당시의 알고리즘의 발전
그리고 ImageNet 스케일의 대용량 데이터가 LeNet 당시에는 존재하지 않았다
하지만 인터넷 발달로 본인의 이미지, 영상을 공유하면서 이런 다양한 이미지를 수집하여
2) 데이터로 만들어 좋은 대용량 데이터셋인 ImageNet 데이터를 얻을 수 있었다
3) 그리고 딥러닝 모델의 계산에는 수많은 곱셈과 덧셈의 연속인데, 이를 빠르게 할 수 있었던 하드웨어의 발전
기존에는 CPU를 사용하다가 갑자기 GPU를 사용하면서 계산을 빠르게 할 수 있었던거
**GPU가 왜 유리했는가?
딥러닝 모델의 계산은 행렬연산의 연속임
그리고 행렬연산은 병렬처리가 용이한 구조
그런데 마침 게임에 사용하는 GPU가 병렬처리에 상당히 최적화 되어있었다
그래서 nvidia가 게임에만 사용하는 것이 아닌 일반적인 컴퓨터 연산에서도 사용할 수 있도록 선제적으로 제시
4) 그리고 추가적으로 오픈소스 문화
과거에는 소스코드를 만들었는데 성능이 좋았다면 공개하지 않았음
하지만 오픈소스 문화의 발전으로 무슨 코드든지간에 공개하는 문화가 발달되었다
그래서 일반 사용자들조차도 레고블록을 쌓는것처럼 여러가지 시도를 해볼 수 있도록 오픈한게 큰 성과
아무튼 이런 노력으로 현재 인공지능의 대가들은 2018년 컴퓨터 분야의 노벨상이라 불리는 상을 수상
7. Convolutional Neural Network(CNN)는 어떻게 디자인되었는가
convolutional layer는 fully connected layer같은 perceptron의 일반화된 형태
fully connected layer는 다음과 같이 데이터가 주어지면
오직 하나의 hidden node(=feature)를 정의하기 위해 데이터와 가능한 모든 connection을 계산
하나의 hidden node만 해도 연결이 너무 많다보니.. 학습해야하는 parameter가 기하급수적으로 증가
게다가 이미지가 조금이라도 움직인다면, 현재 시점에서 학습된 parameter가 달려진다
이러한 문제를 해결하기 위해 locally connected neural layer가 등장
다음과 같이 local 지역에서만 neural network를 정의함
해당 지역에서만 연결을 정의하여 hidden node를 도출하는 형태로 구현
그러면 배워야하는 parameter 수는 이전에 비해 상당히 감소함
이렇게 디자인이 가능한 이유는 이미지의 특성을 생각해보면...
이미지는 전체를 항상 봐야하는게 아니라, local한 부분만 보더라도 해당 부분이 어떤 의미를 가지는지 파악할 수 있어서 그렇다
여기서 조금 생각해본다면.. 빨간색 hidden node를 얻기 위해 배운 parameter를 초록색, 파란색, 검정색 같이 다른 데서도 재활용할 수 있을것 같다
이는 사람의 눈이 2개인데 한쪽 눈이 이미지를 바라보는 방법을 익혔다면..
다른쪽 눈은 완전히 새로운 이미지를 바라보는 방법을 익혀서 학습해야하는지 생각해본다면.....
그럴필요가 없다는 점에서 공유하는건 너무나도 자연스러운 생각이다
그래서 이렇게 parameter를 공유하면서 locally connected neural network는 convolutional neural network로 진화
그러면서 매우 적은 parameter로 전체 이미지를 파악할 수 있어서 효율적
그리고 node를 정의하기 위한 patch단위들 하나하나가 데이터이므로 더욱 많은 데이터를 활용할 수 있게되었다
그래서 이렇게 shared parameter가 많은 local을 바라보면서 학습하여 더욱 좋은 성능을 낼 수 있었다
이러면서 이미지에 최적화된 neural network 디자인이 되었다
8. fully connected layer가 이미지의 특징을 뽑는 방법
단순한 선형모델 f = Wx+b가 주어질때.. 이 모델에 이미지를 넣을려면..?
2*2 이미지가 다음과 같이 주어진다면.. 이러한 이미지를 1차원 벡터로 펼친다
2*2 이미지를 z자 모양으로 1차원으로 펼쳐서 모델에 입력
W와 1차원 입력 벡터를 곱셈.. W의 한 행과 1차원 벡터열의 element-wise product 계산
계산된 결과를 b 벡터와 더해서 우변의 class에 대한 score를 도출하게 됨
이런식으로 계산하면서 올바른 답을 도출하도록 잘 학습하면 적절한 가중치 행렬 W를 얻는데..
이제 위 W행렬에서 각 row를 W1, W2, W3라고 하자.
그러니까 W1 = [0.2, -0.5, 0.1, 2.0], W2 = [1.5, 1.3, 2.1, 0.0], W3 = [0,0.25, 0.2,-0.3]이라고 한다면...
이전에 2*2 input image를 1차원 벡터로 펼친것처럼 이 W1,W2,W3를 2*2 image 형태로 복원시킬 수 있을 것이다
그러면 이제 이미지 형태니까 각 W1,W2,W3는 visualization이 가능할 것이다
그래서 offset과 scale 등을 살짝 조정해서 시각화해보니..
fully connected layer를 잘 학습시켜보니까.. 가중치행렬 W의 각 row vector들이
현재 task의 class를 나타내는 대표 템플릿 형태로 잘 학습된 것을 볼 수 있었다
자동차는 흐릿한 자동차 형태
말은 머리가 두개이긴 한데 말과 빗스한 형태
배는 바다에 있다보니까 파란색 배경으로 잘 학습된 형태
아무튼 가중치행렬이 흐리긴해도 class에 대한 정보를 잘 가지고 있게 된다는 것을 알 수 있다
9. fully connected layer의 문제
fully connected layer는 가중치의 각 row가 class의 특징을 잘 담은 벡터를 나타낸다고 볼 수 있는데
추론단계에서 말 이미지가 나왔을때
우리가 가지고 있는 말을 나타내는 벡터와 내적 연산을 해서 유사도를 계산해가지고
들어온 이미지가 말인지 아닌지 판단하는 모델
근데 말 이미지가 저렇게 들어오면 다행이지만 이번에는 말 이미지가 아니라 기존보다 엄청 큰 이미지에서
부분만 짤려가지고 아래 그림처럼 모델에 들어온다면..
모델이 알고있는 이미지 템플릿과 전혀 다른 형태를 보게되니.. 이게 말인지 소파인지 구별이 안되는거
그래서 엉뚱한 답을 내놓는다
이런 위치에 대해서도 불변한 결과를 내놓기를 바라는데 이를 수행할 수 있는 것이 convolutional neural network였다.
10. convolution
filter를 input image에서 훑어보면서 filter와 대응하는 위치의 원소끼리의 element-wise product를 수행하여 이들의 총 합을 output을 내놓는다.
이런 연산을 convolution 연산이라고 함
2d영상에 convolution을 적용하는 수식
도대체 이 convolution이 무엇을 하는 연산인가
어떻게 잘 만든 filter가 [-1,1]이라고 해서 input image에 convolution을 수행해보니
아래에 회색사진이 나온다
보면 이미지의 각 요소요소에 수직선 부분을 자세히 표시할려고 하는데
이러한 filter [-1,1]은 x축에 수직인 요소를 뽑을려고 하는 filter라고 할 수 있다
이미지는 2d이기때문에 x축 방향의 gradient와 y축 방향의 gradient가 있다
여기서 x축 방향의 gradient만 본다면...
image같은 경우는 연속적으로 보는 것이 아니라 pixel단위의 grid 구조로 표현하는 discrete 형태이기에
gradient도 근사해서 사용한다
그러면 이웃한 픽셀간의 차이로 미분 연산이 정의된다는데.. [-1,1]이라 그런거임 ...
아무튼 결론은 convolution filter를 어떤 것을 사용하느냐에 따라 이미지에서 필요한 특징을 추출한 것도 다르다
그래서 좋은 filter, 이미지의 특징을 잘 담은 filter를 잘 학습하는 것이 convolution neural network의 하는 일이다.
11. convolution layer를 만드는 방법
이미지가 32*32*3으로 주어질때...
여기서 depth라고 불리는 3은 RGB 컬러 이미지의 경우 R,G,B 3채널이라 3
그리고 여기에 대응하는 convolution 연산을 위한 5*5*3 filter가 존재한다
참고로 convolution filter의 depth와 input image의 depth는 전통적으로 같은 값을 가지도록 설계한다고함
물론 어드밴스드한 convolution layer의 경우 이렇게 depth가 다른 경우가 있다고함..(처음 듣는데)
그리고 filter를 몇개를 사용하느냐에 따라 출력된 activation map의 channel수가 결정
1개 쓰면 1채널이고 2개쓰면 2채널이고
convolution 연산의 특징은 filter가 이미지를 훑어보면서 대응하는 위치에 convolution 계산을 통한 output feature를 배치하여
원래 이미지와 output activation의 spatial 구조가 동일하다는 특징이 있다
filter가 input image를 훑으면서 계산한 output feature를 쌓아나가 activation map을 만들고
여러개의 filter를 사용하면 여러개의 activation map이 만들어져서 channel이 깊은 activation map이 만들어진다
12. 예시로 convolution 연산 이해하기 - stride란?
왼쪽은 7*7 input image
오른쪽은 convolution 연산에 의한 output activation
3*3 filter인 초록색과 convolution 연산을 하면 대응하는 위치인 노란색 부분에 결과가 나옴
------------------------------------------------------------------------------------------------------------
참고로 convolution과 inner product는 다르다
사실 지금까지 말한 filter를 input에서 훑어보면서 element wise product를 하여 노란색 결과를 얻는 것은 inner product
그리고 filter를 뒤집어서 inner product를 수행하는 것이 convolution
근데 딥러닝에서 filter 학습을 하다보니 inner product를 하든 뒤집어서 inner product를 하든 차이가 없어짐
그래서 딥러닝에서는 구별해서 사용하지는 않는다
하지만 전통적인 신호 처리에서는 엄밀하게 두 용어는 서로 정의가 다르다
------------------------------------------------------------------------------------------------------------
아무튼 filter를 오른쪽으로 stride = 1칸 움직여서 다시 convolution하면...
이렇게 1칸씩 움직이는 이유는 stride = 1로 지정했기 때문
아무튼 오른쪽으로 끝까지 이동하면 1*5 결과를 얻고
다시 아래쪽부터 시작해서 이를 총 5번 반복하면 계속 끝까지 이동하면.. 5*5 output을 얻겠지
만약 stride = 2로 준다면?
먼저 현재 시작이 아래와 같다
stride = 2가 된다면 오른쪽으로 2칸 이동해서 convolution을 수행함
그래서 2칸 이동해서 convolution을 수행한다면...
끝까지 도달하면...
그리고 stride = 2이기 때문에 다음 줄에서도 1줄만 내려오는게 아니고 2줄씩 내려온다
이번에 stride = 3이면 어떨까?
3칸씩 이동하는데.. 7*7에서는 마지막 1줄이 비어버림..
그래서 그 부분은 버리고 다음줄로 넘어간다
이처럼 stride에 따라 convolution이 처리되지 않고 남는 부분이 생긴다
이를 통해 N*N 이미지에서 F*F filter를 convolution할때, stride에 따라 출력 size를 예측할 수 있는데
이 공식을 통해 얻은 출력 사이즈가 소수라면.. filtering이 덜 되는 부분이 있다고 생각할 수 있겠지
13. zero padding
이처럼 모든 이미지에 대해 filtering이 안되는 경우를 방지하고자 이미지의 둘레에 0을 가지는 padding을 씌우고
convolution하는 방법이 있다.
사실 0을 가지는 padding이 아니라... 다른 원소를 가지게 할 수도 있다
padding 방법은 여러가지가 있다
일반적으로 stride = 1이고 filter size가 F*F일때, image에 (F-1)/2만큼 zero padding을 씌워서
convolution을 하면, output activation의 크기는 input image의 크기와 동일하다
> 적절한 zero padding을 사용하면 convolution을 하여 input image와 동일한 크기의 output activation을 얻을 수 있다
14. 여러개의 filter 사용
하나의 filter는 중간 출력의 하나의 activation map을 결정
여러개의 filter를 사용한다면.. 여러개의 개별적인 activation map을 얻는다
15. pooling layer
convolution layer만으로 다룰수 없는 부분은 이미지가 확대되어서 들어오거나 축소되어서 들어올때 대비를 하지 못한다는 점이다.
또한 convolution layer는 하나의 local한 부분의 feature를 뽑는 layer로 서로 다른 hidden node 사이 관계성을 잘 파악하지 못한다
그래서 이런 scale 부분과 local끼리 관계성을 효율적으로 고려하고자 pooling layer를 사용함
이미지에서 다음과 같이 눈이 있는지 여부만을 여러 상황에서 잘 찾고자 한다면.. 어떻게 가능할까?
filter가 눈을 찾는다고 가정할때 filtering을 통해 9개의 output feature를 찾았다고 한다면..
눈을 찾는 filter니까 눈을 가리키는 output feature는 값이 크게 나올 것
눈과 관련 없는 부분은 작게 나올 것이고
이를 pooling을 사용하여 해결 가능하다
feature가 눈에 정확하게 있지 않더라도.. 이 중 값이 매우 큰 곳은 그곳에 눈이 존재하는 가능성이 상당히 높다
그래서 그 가장 큰 값을 찾는 mapping을 pooling이라고 부름
pooling도 여러가지가 있지만 위와 같이 여러개의 값을 하나의 값으로 mapping하는 것을 spatial pooling이라고 부름
대표적인 방법중 하나가 max pooling
2*2 max pooling filter을 stride = 2로 움직이면 위와 같이 4칸을 찍는데
각 칸에서 가장 큰 값을 고르는 것이 max pooling
빨간색 영역에서 6을 가져오는 pooling은.. 빨간색 영역에서 대표하는 값인 6을 추출해오는 것이다
이는 filter size가 작더라도 이미지의 전체 부분을 빠르게 보도록 하는 operation이다
비슷한 방식으로 average pooling도 있다
average pooling은 max값이 아니라 4칸에서 mean값을 뽑아 output feature로 만드는 것
다른 pooling도 많지만 max, average pooling이 제일 많이 쓰인다.
16. activation function
convolution layer와 pooling layer는 matrix의 product와 sum의 연속으로 이루어진 선형함수인데
선형함수의 결과에 activation function이 들어가면서 비선형성을 넣어준다
activation function이 없으면 convolution layer와 pooling layer를 아무리 쌓아도 하나의 큰 선형모델에 불과하며
powerful한 성능을 기대할 수 없다
activation function이 들어가면서 모델이 감당할 수 있는 capacity가 상당히 커지면서 다양한 함수를 학습할 수 있게 된다.
identity는 linear함수이며 나머지는 non-linear 함수이다.
identity를 사용하면 아무리 convolution layer와 pooling layer를 쌓아도 하나의 linear model로 치환이 가능하다
하지만 binary ~ ReLU까지 non-linear activation을 중간에 섞으면 convolution block을 쌓으면서 더욱 복잡한 함수를 학습할 수 있게 된다
가장 많이 사용하는건 마지막에 제시된 ReLU이며 그 이외에 다양한 ReLU에서 변형된 activation이 제안되었다
17. fully connected layer
FC layer라고도 부름
convolutional layer와 pooling layer와 activation function의 다양한 조합으로 input을 받아 연산을 하면,
최종적으로 fully connected layer에서 그 연산 결과를 받아 하나의 값을 얻는다
image classification에서 위 input image를 받아 계산을 한 다음에 얻은 최종 activation map을 vector로 바꿔서 fully connected layer에 넣어주면..
해당 image에 대한 classification probability distribution을 얻는다
거기서 가장 큰 값을 가지는 class로 분류를 하게 된다
task마다 fc layer의 활용은 다르다. 없을 수도 있고.. 아예 다르게 활용될 수도 있고
예를 들어서, convolution, pooling, activation의 연속된 연산으로 32*32*3 activation map이 나왔다면...
이걸 벡터로 바꾸면 3072*1로 바뀐다
이게 그림에서 x가 되고 10개의 class중 하나로 분류하고 싶다면..
W는 10*3072로 설정하면 Wx는 fully connected layer를 통과한 값이다.
그리고 나온 값은 10*1의 activation vector로 나온다
activation vector의 각 차원은 각 class에 대한 가능성을 나타내는 score값
output activation의 각 차원은 activation input의 모든 차원과 weight matrix인 W의 모든 차원의 내적의 결과로, 모든 feature 요소에 대해 집대성한 결과이다.
18. CNN은 어떤 지식을 학습하는가?
CNN은 도대체 무엇을 학습했길래 성능이 좋은지 분석해본 시도들이 있었다
"의미적으로 계층적인 특징을 표현하는 방법을 학습"
layer의 각 층이.. Edges를 학습한 layer와..
더 나아가면 Object parts를 학습한 layer와
더 나아가 Object 자체를 학습한 layer들이 전부 모여있다는거
input image feature의 각 특징을 잘 학습한 layer들의 모임이 된다는 소리
19. AlexNet
convolution, pooling, LRN, FC layer들의 연속된 모임
마지막 결과는 1000개의 dimension을 가지는 vector
ImageNet 문제의 class 수는 1000개라서
이 vector에 softmax function을 취해 가장 큰 값을 가지는 차원이 나타내는 클래스로 해당 이미지를 분류해준다
첫번째 convolution layer가 11*11 convolution filter를 사용했다
LeNet은 input image size가 28*28인데 AlexNet은 이보다 큰 227*227 image를 받았다
그래서 더 큰 size의 filter를 사용해 더 넓은 이미지의 영역을 커버하였다
그리고 LRN(local response normalization)이라는 기법을 사용했다.
지금은 안쓰는 기법이지만 당시에는 성능이 좋았겠지
image activation map에서 활성화된 activation의 주변 neuron을 정규화시키는데 사용
지금은 batch normalization이라는 기법으로 대체되었다
input batch data로부터 얻은 통계치로 정규화시키는 기법
20. VGGNet
AlexNet이 5~6개의 convolution layer를 사용하였는데 VGGNet은 16개, 혹은 19개의 convolution layer를 사용한,
더욱 깊은 deep convolutional network
layer를 많이 쌓아 AlexNet에 비해 더욱 많은 이미지의 영역을 살펴봤다
LRN 기법을 제거했다
이전 AlexNet이 11*11 convolution을 주로 사용했지만 VGGNet은 3*3 convolution을 사용했다
2*2 maxpooling을 사용했다.
그리고 AlexNet이 하나의 convolution block내에 하나의 convolution만 사용했지만,
VGGNet은 하나의 block내에 여러개의 convolution을 사용하여, 더욱 복잡한 함수 학습이 가능하게 했다
ImageNet에서 AlexNet보다 더 좋은 성능을 보였다
Fine tuning 없이도 다른 방법으로 일반화를 더 잘하는 성능을 보였다
더 좋은 네트워크들이 많이 개발되어왔지만, 지금까지도 VGGNet은 단순하면서도 좋은 성능을 보여 기본 네트워크로 많이 사용한다
21. degradation problem
네트워크를 무조건 깊게 쌓으면 성능이 좋아질텐데, 왜 깊게 쌓지 못했을까?
깊게 쌓을수록 좋은 성능을 내기가 어려웠다
layer를 더 쌓아볼려고 했더니, 정확도는 더 빠르게 수렴했지만 test error는 더 안좋은 형태가 되었다
training error와 test error 모두 56-layer가 20-layer보다 높았다
56-layer가 20-layer보다 표현력이 높아 더 낮아야할것 같았는데..
overfitting이었다면.. 56-layer가 training error가 20-layer보다 낮고 test error가 더 높아서 일반화를 더 못하는 형태여야 하는데..
이는 training error도 높고 test error도 높은 특이한 형태
학습이 완벽하게 잘 됐다면, 56-layer가 가지는 표현력에 의해서 20-layer에 비해 학습한 데이터에서는 training error가 더 낮아야했다.
따라서 학습이 잘 안된 형태라고 생각했고 이를 degradation problem이라고 정의했다
그래서 이러한 학습을 잘 시키고자 하는 최적화 문제를 어떻게 해결해야할지 고민하여.. 새로운 network가 등장했다.
22. ResNet
skip connection이라는 획기적인 함수를 추가함
gradient가 기존의 경로 외에도 identity 경로로도 갈 수 있게 만들어서 optimization, 학습이 잘 될 수 있도록 만들어줬다
하나의 input이 주어졌을때, 원래 학습하고자 하는 함수가 H(x)라면..
모듈에서 input feature는 그대로 전달해주므로 input feature 외에
H(x) - x = F(x)라는 목적함수와 input feature의 차이만 학습하더라도 좋은 성능을 낼 수 있을 것이라고 생각했다
그래서 input x는 계속 전달해주고 그 사이 convolution layer는 작은 차이만 전담해서 학습한다면 학습 부담이 줄어서
더욱 깊은 layer를 만들 수 있을 것이라 생각했다
당시 만들어진 모델 중 하나가 152개의 layer를 쌓은 ResNet
나중에는 1000개 이상도 쌓았다
ImageNet에서 우승함은 물론이고 사람의 인지 능력을 뛰어넘은 역사적인 network가 되었다
'딥러닝 > Computer Vision' 카테고리의 다른 글
computer vision의 한 획을 그은 ResNet의 아이디어 복습하기 (0) | 2023.05.09 |
---|---|
visual attention + visual & sound modeling 기본 개념 배우기 (0) | 2023.03.02 |
물체 감지(object detection) 개념 돌아보기 (0) | 2023.01.08 |
GAN(Generative Adversarial Network) 기본 개념 되돌아보기 (0) | 2022.12.20 |
CNN(Convolutional neural network) 기본 개념 되돌아보기 (0) | 2022.12.18 |