[Day 8] Boostcamp AI-Tech

donggunseo·2021년 8월 11일
0

Boostcamp AI-Tech

목록 보기
8/34

2021년 8월 12일
2주차 DL Basic
강의수강 : 4강~6강

1. 학습내용 정리

CNN에 대해서 배웠는데 사실 이론적인 내용은 이 글의 2번 항목을 보는 것이 좋고 내용이 중복되므로, 강의에서 다룬 CNN의 여러 논문과 트렌드, 코드 구현 등에 더 집중하여 다루겠다.

CNN은 목적과 모델링에 따라 다르겠지만 기본적으로 Convolution layer, Pooling layer, Fully connected layer로 구성되어 있다고 할 수 있다. Convolution layer와 Pooling layer는 데이터로 부터 feature를 추출(extraction)하기 위함이고, FC layer는 이 feature를 바탕으로 Classification이나 Prediction 등 원하는 Task를 진행하는 목적이다.

기존 글에서 다루지 않은 내용으로 StridePadding이라는 개념이 있는데, Stride는 이미지를 커널(필터)가 훑을 때 그 간격을 정하는 하이퍼파라미터이다. 또 Padding(주로 Zero Padding)은 이미지 주변에 0을 채워 convolution을 진행하는 것인데 input data의 dimension을 보존하려는데 목적이 있다. 입력 크기를 (H,W)(H,W), 필터 크기를 (FH,FW)(FH, FW), 출력 크기를 (OH,OW)(OH, OW), 패딩을 PP, 스트라이드를 SS라 하면 출력 크기를 다음과 같이 계산한다.

OH=H+2PFHS+1OW=W+2PFWS+1OH = \frac{H+2P-FH}{S} +1 \\ OW = \frac{W+2P-FW}{S} +1

또 Pooling 이란 것도 다루지 않았는데 이는 입력의 Dimension을 줄이는 방법이다. 학습해야할 파라미터가 따로 없고 채널 수는 변하지 않은채 Dimension만 줄이는 방식으로 MaxPooling이나 AvgPooling이 있다. 정해진 크기만큼 입력에서 지정된 연산(정해진 크기 내 데이터 중 최댓값 혹은 데이터들의 평균)을 통해 한 픽셀(원소)로 내보낸다.

한 Convolution layer의 파라미터를 계산하는 방법은 위 표기법을 사용하여 H×W×C×OCH\times W \times C \times OC 로 표현할 수 있다. 이때 CC는 입력의 채널 수이고, OCOC는 출력의 채널수이며 이는 곧 커널(필터)의 개수를 의미한다. FC 와 비교했을 때 Conv의 장점은 Shared parameter를 사용하기 때문에 파라미터 수 자체가 크게 줄어들며 이는 곧 학습에 있어서 큰 장점이 된다. 이 파라미터 수에 초점을 둔 1×11 \times 1 conv 가 있는데, 입력의 채널 수를 reduce하는 효과가 있어 이를 통해 깊이가 깊어질 수록 파라미터가 증가하는 것을 완화할 수 있는 효과가 있다. 또, 이를 활용해 FC를 대체할 수도 있다.

비교적 시간이 지나긴 했지만 몇가지 CNN을 활용한 CV 논문들을 살펴보며 CNN 기술의 트렌드를 알아보도록 하자.

(1) AlexNet(2012)


AlexNet은 우선 당시 GPU의 연산 한계로 병렬처리를 했다는 것이 특징이다. 또 ReLU를 activation function으로 사용했다는 것도 특징이다. 이는 AlexNet이 Local response normalization을 사용했다는 것과 이어진다. Local response normalization은 이미지의 인접화소들을 억제시키고 특징을 부각시키기 위해 주변 뉴런들을 normalization한 것인데, 이는 Relu를 통해 0보다 큰 값이 선형적으로 그대로 나갈 때 특정 값이 크다면 인접한 다른 부분들의 특징이 학습되지 못하는 점을 막기 위함이다. 또 Pooling에서 풀링 커널의 사이즈보다 스트라이드보다 작게하여 더 꼼꼼하게 풀링하는 Overlapping maxpooling을 사용하였다. 그림으로 표현하면 다음과 같다.

Dropout도 사용하였다.

(2) VGGNet(2015)


VGGNet의 특징은 3×33\times 3 Conv filter(with stride 1)만 사용하여 연산했다는 것인데, 이는 다음 그림을 보면서 확인해보자

먼저 Receptive field라는 개념에 대해 알아야 하는데, conv를 통해 하나의 데이터로 변하는 이미지 크기(범위)를 의미한다. 3×33\times 3을 두번 conv하는 것과 5×55\times 5를 한번 conv하는 것 둘 다 모두 Receptive field가 5×55\times 5이다. 그러나 파라미터수 차이는 3×3×128×128+3×3×128×128=2949123 \times 3 \times 128 \times 128 + 3 \times 3 \times 128 \times 128 = 2949125×5×128×128=4096005 \times 5 \times 128 \times 128 = 409600으로 큰 차이가 난다. 또 더 좁은 필터를 쓰는 것은 층을 깊게 만들어 더 정확한 모델을 만드는데 도움을 준다.
또 하나의 특징은 앞에서 언급했던 1×11 \times 1 conv를 FC layer 대신 사용하여 파라미터 수를 크게 줄였다. 마찬가지로 Dropout도 사용하였다.

(3) GoogLeNet(2015)


구조가 매우 복잡하며 이전의 Net들보다 훨씬 깊은 것을 볼 수 있다. 주의 깊게 볼 부분은 저 검은 네모 속의 블록인데, 논문에서는 inception module이라고 표현하였다.

다양한 conv 필터를 사용하므로 다양한 특징들을 담을 수 있는 것은 물론 1×11 \times 1 conv를 적극적으로 활용하여 channel-wise dimension reduction 하였다. 이는 곧 파라미터 숫자의 감소와도 이어진다. 1×11 \times 1 conv의 파라미터수 감소 효과를 좀 더 자세히 확인해보자.

왼쪽과 오른쪽 그림의 입출력 데이터 사이즈는 같다. 하지만 1×11 \times 1 conv를 통해 채널 수를 감소시킨 후 똑같은 Conv연산을 진행하였음에도 불구하고 파라미터 숫자는 크게 줄어든 것을 확인할 수 있다. 실제로 앞 두 모델에 비해 층이 훨씬 깊음에도 불구하고 파라미터 숫자가 압도적으로 적었고 성능도 더 우수하였다.

이전의 모델들은 마지막에 분류의 목적으로 FC 혹은 그와 같은 기능을 하는 layer를 넣었다. 하지만 GoogLeNet은 global average pooling을 활용하였는데, 이는 각 특성맵들을 평균내어 flat한 벡터로 내보내 원하는 분류작업을 하기 위함이다. 예를 들어, 1024장의 7 x 7의 특성맵이 생성되었다면 1024장의 7 x 7 특성맵 각각 평균내주어 얻은 1024개의 값을 하나의 벡터로 연결하여 내보내는 것이다. 풀링계층은 당연히 파라미터가 필요없기 때문에 파라미터 숫자를 줄이는데 큰 도움이 된다.

마지막으로 층이 깊어 기울기 소실 문제가 발생할 수 있는 문제점을 해결하기 위해 auxiliary classifier를 이용하였다. Net 중간에 두개의 softmax가 있는데, 이 두개가 보조 분류기 역할을 하여 중간중간에 분류작업을 통해 층이 깊어져도 분류 작업을 충실히 수행해 낼 수 있게 하였다. 참고로 훈련시에만 사용되며 테스트시에는 사용하지 않는다.

(4) ResNet(2015)

잘 알다시피 깊은 네트워크는 훈련시키기 어렵다.

그래프를 보면 오히려 더 깊은 구조를 갖는 56층의 네트워크가 20층의 네트워크보다 더 나쁜 성능을 보임을 알 수 있다. 층을 무작정 깊게 한다고 좋은 것은 아니라는 것이다. 새로운 해결책이 필요하다는 생각이 새로운 방법을 만들었다.

Skip-connection이라 하여 간단하게 입력값을 마지막 출력값이랑 더해주는 연산만으로도 성능을 크게 향상시켰다. 점선 블록을 통한 출력을 f(x)f(x), 최종 출력을 H(x)H(x)라고 할 때 f(x)=H(x)xf(x)=H(x)-x가 성립하고 이 f(x)f(x)를 최소화 하는것이 목적인데, 즉 전차(residual)인 H(x)xH(x)-x를 최소화 하는것이 목적이란 뜻이다. 그래서 이름이 ResNet이 된 것이다. 덕분에 층이 깊어질 수록 더 좋은 성능을 보이는 지표가 나타나게 되었다.

(5) DenseNet(2017)

DenseNet은 기본적으로 위에서 마지막에 덧셈연산을 하였던 것을 대신 concatenation 연산하는 것으로 대체하였다. 덧셈이 정보흐름을 더디게 할 수도 있다는 이유였다. 또 다음 그림과 같이 블록 안의 모든 레이어의 연산을 concatenate하여 큰 feature map을 만들어 버린다.

하지만 최종적으로 원하는 바에 이르기 위해선 이 거대한 feature map의 dimension과 채널 수를 감소시킬 필요가 있다. 이를 위해 Transition block이 필요하다.

Transition block은 BatchNorm -> 1×11 \times 1 Conv -> 2×22 \times 2 AvgPooling으로 구성되어있는데 이를 통해 Dimension과 채널을 감소시키는 역할을 한다.

마지막 6강은 CV application 맛보기로 Semantic Segmentation과 Image Detection에 대해 다루었다.

(1) Semantic Segmentation

Semantic Segmentation이란 주어진 이미지에서 특정 Target들을 구분해 내는것이다. 예를 들어 자전거를 타고 있는 사람을 찍은 이미지에 대해서 사람과 자전거, 배경을 정확히 구분하는 것이 그 목표이다. 이를 위해 새로 고안된 기술이 Fully Convolutional Network(2014)이다.

일반적으로 이전의 Net들은 분류를 위해 뒷단에 FC layer를 달았다. 그렇게 되니 고정된 크기의 입력만 받을 수 있다는 문제가 있었고, 게다가 FC layer를 거치면 위치정보가 사라진다는 것이다. 따라서 이를 앞에서 사용했던 1×11 \times 1 conv로 대체하면 위치정보가 남게 되고 이는 Detection, 그리고 이어서 Semantic Segmetation에 큰 도움이 된다는 것이다.
그러나 다시 새로운 문제가 대두된다. Conv layer들을 거칠수록 출력 dimension이 줄어드는데(subsampling) 우리가 Semantic Segmentation에서 원하는 것은 맨 처음 이미지의 사이즈에 잘 Segmentation된 출력이다. 따라서 upsampling이 필요하다는 것이다. 단순히 Score로 upsampling하게되면 좋은 성능이 나지 않는다. 따라서 고안된 방법이 Deconvolution이다.

간단히 생각해 우리가 input에 필터를 통해 output을 만들어냈다면 필터를 output과 합성곱하여 input을 만들어낼 수 있도록 퇴플리츠 행렬 (Toeplitz matrix)로 만들어낸다. 이 과정으로 기존 다른 upsampling 방법 들에 비해 더 우수한 성능을 낼 수 있었다.

(2) Detection

사실 Semantic Segmentation을 하려면 먼저 해당하는 타겟에 대한 Detection이 우선이다. Object Detection이란 한 물체(single object)가 아닌 여러 물체(Multiple objects)에 대해 어떤 물체인지 클래스를 분류하는 Classification 문제와, 그 물체가 어디 있는지 박스를 (Bounding box) 통해 위치 정보를 나타내는 Localization 문제를 모두 포함한다. 그 흐름이 크게 1-stage Detector와 2-stage Detector로 분기가 갈리게 되는데 1-stage Detector는 이 두 가지 task를 동시에 행하는 방법이고, 2-stage Detector는 이 두 문제를 순차적으로 행하는 방법이다. 2-stage Detector 의 경우 물체의 위치를 찾는 Region Proposal, 그리고 물체를 분류하는 Region Classification 순서로 진행하게 된다. 보통 1-stage Detector는 빠르지만 정확도가 낮고 2-stage Detector는 느리지만 정확도가 높다고 할 수 있다. (근데 YOLO는 1-stage인데 빠르고 정확하다.) 논문들의 흐름보며 정리해보자.

1) R-CNN(2014)

CNN을 Object Detection에 처음으로 적용시킨 모델이다. 총 네 가지 모듈로 나눠서 볼 수 있다.

먼저 Region Proposal. R-CNN은 이미지를 데이터로 사용하며 정답 레이블은 그 Bounding box로 한다. Selective Search algorithm을 통해 임의의 Bounding box를 설정하는 것에서 출발한다. 이 Selective Search algorithm은 1) Bounding box들을 Random하게 작게 많이 생성을 한다. 2) 그리고 이것들을 계층적 그룹핑 알고리즘을 사용해 조금씩 Merge 해나간다. 3) 이를 바탕으로 ROI(Regions of Interest)라는 영역을 제안하는 Region Proposal 형식으로 진행된다. (자세한 내용은 링크한 블로그 참고바람. 왜냐면 난 비전에 관심이 없음)

그 다음 AlexNet을 통해 이를 넣어주게 되는데, 이때 각기 다른 Bounding box를 같은 사이즈(227* 227)로 통일시키는 Wrapping 작업을 하게된다.

CNN을 통해 나온 Feature는 Training Label이 적용된 후 SVM을 통해 분류작업을 하게된다.

병렬적으로 CNN을 통해 나온 Bounding Box와 Truth Bounding Box와의 regression을 통해 학습하여 Region Proposal을 더 잘 되게 한다.

2) SPPNet(2014)

본래 CNN에서는 고정된 입력 크기를 맞추기 위해서 이미지를 Crop(자르기), Wrap(줄이거나 늘리기)를 해야 한다. 그러나 이 과정에서 데이터가 일부 손실되거나 왜곡되는 등의 문제가 발생한다. 따라서 SPPNet은 이 문제를 해결하기 위해 CNN layer와 FC layer 사이에 Spatial Pyramid Pooling layer를 추가하여 입력으로 임의의 사이즈의 이미지를 받을 수 있게 한다.

Spatial Pyramid Pooling layer는 spatial bins라는 것을 지정하는 데서 시작한다. 예를 들어 50bin = [6×66\times 6, 3×33\times 3, 2×22\times 2, 1×11\times 1]나 30bin = [4×44\times 4, 3×33\times 3, 2×22\times 2, 1×11\times 1] 라고 하자. 이 각각의 원소들은 마지막 conv의 출력 feature map에 풀링을 적용하여 생성되는 출력 크기이다. 이 다양한 feature에서 pooling의 window size와 stride를 각각 window size=ceiling(feature map size / pooling size), stride=floor(feature map size / pooling size) 로 설정한다면 입력 크기와 상관없이 고정된 사이즈인 k * M feature map이 나오게 되는데 k는 마지막 conv의 출력 필터수, M은 앞에서 언급한 bin 수이다.

최대 장점은 CNN을 여러번 돌려야 하는 기존 방법과 다르게 한번만으로 해결할 수 있기 때문에 큰 장점으로 작용한다.

3) Fast R-CNN(2015)

기존 R-CNN의 단점은 1) RoI (Region of Interest) 마다 CNN연산을 함으로써 속도저하 2) multi-stage pipelines으로써 모델을 한번에 학습시키지 못함 이었다. 이를 개선하기 위해 1) RoI pooling 2) CNN 특징 추출부터 classification, bounding box regression까지 하나의 모델에서 학습 이라는 방법을 도입하였다. 전체 프로세스는 다음과 같다. (슬슬 난이도가 높아져 블로그를 참고하지 않을 수 없었다. 이 글이 굉장히 잘 정리되었다)

1-1. R-CNN에서와 마찬가지로 Selective Search를 통해 RoI를 찾는다.
1-2. 전체 이미지를 CNN에 통과시켜 feature map을 추출한다.
2. Selective Search로 찾았었던 RoI를 feature map크기에 맞춰서 projection시킨다.
3. projection시킨 RoI에 대해 RoI Pooling을 진행하여 고정된 크기의 feature vector를 얻는다.
4. feature vector는 FC layer를 통과한 뒤, 두 브랜치로 나뉘게 된다.
5-1. 하나는 softmax를 통과하여 RoI에 대해 object classification을 한다.
5-2. bounding box regression을 통해 selective search로 찾은 box의 위치를 조정한다.

이 projection 시킨 RoI에 대해 앞에서 사용한 SPP 처럼 고정된 길이의 feature vector를 만들기 위해 grid 크기만큼 max pooling 시키는 것이 바로 RoI라고 하는 것이다. 원래 이미지를 CNN에 통과시킨 후 나온 feature map에 이전에 생성한 RoI를 projection시키고 이 RoI를 FC layer input 크기에 맞게 고정된 크기로 변형할 수가 있는 것이다. SPPNet처럼 한 번의 CNN 연산만으로 feature vector를 만든 것이다.

4) Faster R-CNN(2015)

이전 R-CNN에서 RoI를 찾기 위해 CNN 외부에서 Selective Search를 사용하였는데 이게 병목을 일으킨다. 그래서 이 Region Proposal 단계도 CNN과 그 모델 전체에서 수행하고자 하는게 목적이다. 따라서 Region Proposal Network가 제시되었다. (참조 : https://ganghee-lee.tistory.com/37)

RPN의 input 값은 이전 CNN 모델에서 뽑아낸 feature map이다. Region proposal을 생성하기 위해 feature map위에 nxn window를 sliding window시킨다. 이때, object의 크기와 비율이 어떻게 될지모르므로 k개의 anchor box를 미리 정의해놓는다. 이 anchor box가 bounding box가 될 수 있는 것이고 미리 가능할만한 box모양 k개를 정의해놓는 것이다. 이 단계에서 k개의 anchor box를 이용하여 classification과 bbox regression을 먼저 구한다. (For 학습)
먼저, CNN에서 뽑아낸 feature map에 대해 3x3 conv filter 256개를 연산하여 depth를 256으로 만든다. 그 후 1x1 conv 두개를 이용하여 각각 classification과 bbox regression을 계산한다. 이때 네트워크를 가볍게 만들기 위해 binary classification으로 bbox에 물체가 있나 없나만 판단한다. 무슨 물체인지 classification하는 것은 마지막 classification 단계에서 한다.
위 단계로부터 positive / negative examples들을 뽑아내는데 다음 기준에 따른다. IoU가 0.7보다 크거나, 한 지점에서 모든 anchor box중 가장 IoU가 큰 anchor box는 positive example로 만든다. IoU가 0.3보다 작으면 object가 아닌 background를 뜻하므로 negative example로 만들고
이 사이에 있는 IoU에 대해서는 애매한 값이므로 학습 데이터로 이용하지 않는다.
Faster R-CNN에 대한 학습이 완료된 후 RPN모델을 예측시키며 하마 한 객체당 여러 proposal값이 나올 것이다. 이 문제를 해결하기 위해 NMS(Non-Maximu Suppression 알고리즘을 사용하여 proposal의 개수를 줄인다. NMS알고리즘은 다음과 같다.
1. box들의 score(confidence)를 기준으로 정렬한다.
2. score가 가장 높은 box부터 시작해서 다른 모든 box들과 IoU를 계산해서 0.7이상이면 같은 객체를 detect한 box라고
생각할 수 있기 때문에 해당 box는 지운다.
3. 최종적으로 각 object별로 score가 가장 높은 box 하나씩만 남게 된다.

블로그 글을 긁다시피 했는데, 왜냐면 내가 이해하기엔 너무 오래걸리는 task이고 그렇다고 내 관심분야도 아니다.

5) YOLO(You Only Look Once)(2015)

현재 버전이 5까지나 나온 성능 좋은 모델이고 1-stage detector이다. 돌아가는 방식은 사실 내 설명으로는 많이 힘들고 그냥 더 좋은 블로그 보시는게 좋을 것 같다. 동시에 여러개의 bounding boxes와 class probabilities를 찾는 아주 아주 빠른 모델이라고 한다.

2. 과제

생략

3. 피어세션

우선 Receptive field에 대해 앞에서 언급한 "3×33\times 3을 두번 conv하는 것과 5×55\times 5를 한번 conv하는 것 둘 다 모두 Receptive field가 5×55\times 5이다." 라는 것을 처음에 이해하지 못해 질문 하였고 답을 듣다가 스스로(?) 머릿속에서 그림이 그려져 해결하였다. 또 SPP를 잘 모르겠어서 질문했다가 명확한 답을 못 들었는데 학습정리를 하며 블로그 참고를 통해 잘 해결하였다.

4. 마무리

비전은 재미없다

0개의 댓글