꺼내먹는지식 준
Semantic segmentation 본문
Semantice Segmantation
: Image classification 을 pixel 단위로 진행
영상 속에 있는 물체에 mask 생성
다만, 같은 클래스 서로 다른 물체가 겹쳐져 있을 때 구분 못한다.
$\rightarrow$ 추후 instance segmentation 참고
포토샵에서 사람 제외하고 image에 특수 효과 주는 등의 기능이 가능
Semantic Segmentation Models
FCN (Fully Convolutional Networks)
End to End
입력부터 출력까지 미분가능한 형태로
입력과 출력 데이터의 표현만 있으면 중간의 neural net 을 학습해서 target task 수행 가능
사람이 손으로 algorithm을 만들때는 학습 가능 부분이 제한적이었으나, neural net 덕에 굉장히 큰 성장
입력 출력 서로 크기 맞출 수 있다.
Conv 경우 최종 layer 전에 크기를 맞춰줘야 해서 입력 해상도가 일정해야만 했던 반면 FCN 은 그런 문제가 없다. 즉 임의의 사이즈 영상을 사용할 수 있다. 특정 해상도에 학습이 되어도 임이의 해상도를 추론단계에서 사용가능하다. (다만 1 ~ 1.5배 정도의 크기까지만 성능이 좋다.)
FC:
공간 정보를 고려하지 않고 fix dimensional vector가 주어지면 또다른 fix dimensional vector로 출력한다.
FCN:
입력도 activation map tensor고 출력도 activation map tensor이다. 즉, spatial coordiante를 유지한 상태로 operation을 수행한다. 보통 1 by 1 으로 구현되어서 각 위치마다 classification 결과를 map 형태로 출력한다.
기존의 FC layer 를 1by1 convolution으로 대체만 하면 sementic segmenation을 수행할 수 있다.
FCN 연산
기존 FC layer 는 주어진 activation map을 flattening 하여 긴 벡터 형태로 만든 후 FC layer에 input으로 넣어줬다.
이 경우 영상의 공간 정보를 고려하지 않고 하나의 벡터로 섞여버린다.
어떻게 고쳐야할까?
각 위치마다 채널축으로 flattening한다고 생각해보자.
즉 채널 축으로 각각의 값들을 벡터 형태로 쌓는다.
각각의 위치마다 벡터가 하나씩 나와서 쌓인다.
이를 통해 각각에 대해서 FC 를 입력으로 적용한다.
1 by 1 이 이와 동일하다.
채널축으로 1 by 1 conv kernel이 fc layer 의 한 weight column 즉, 필터 개수만큼 통과를 시키면 각자 위치마다 fc layer 를 별도로 돌려서 각각의 위치에 결과값을 채워넣는 것과 동일한 결과를 얻는다.
설명하자면 채널 축으로 flattening 한 덩이들을 각각 fully connected layer 로 통과시켜주는 것이,
결국 1X1 Convolution을 적용하면 channel축으로 filter 가 곱해지는 것과 같다. 채널 축으로 얻은 vector를 FC layer 를 통과시켜서 한 neuron 으로 mapping 시키는 것이 1 X 1을 통해 한개의 pixel로 mapping 시키는 것과 같다고 보는 것이다.
Conv 는 sliding 방식으로 weight를 적용해서 spatial 정보를 저장한다.
결론적으로 FC 는 1 X 1 conv 로 해석과 구현이 가능해서 대체하여 어떤 입력 사이즈에도 대응 가능한 FCN 를 만들었다.
https://powerofsummary.tistory.com/171
[딥러닝 개념] 1x1 convolution에 대한 고찰(FC와의 차이점, 공통점)
[C,H,W] 크기의 입력 tensor에 대하여 1x1 convolution을 거칠때와 FC(linear) layer를 거칠때는 무슨 차이가 있을까? 둘은 똑같은 연산이라고 할 수 있을까? 둘은 똑같지는 않지만 그 결과가 비슷한 의미를
powerofsummary.tistory.com
1x1 convolutions, equivalence with fully connected layer
I'm confused by the concept of equating a 1x1 convolution with a fully connected layer. Take the following simple example of a 1x1 convolution of 2 input channels each of size 2x2, and a single out...
datascience.stackexchange.com
참고 자료.
굉장히 이해하기가 어려웠다. 사실 지금도 두개가 정확히 같을 수 있다는 개념이 이해는 안간다.
좀더 인사이트가 쌓이면 지금 적은 글이 이해가 가겠지..
위 그림과 같이, stride 나 pooling layer에 의해서 최종 activation map 은 대체적으로 해상도가 낮다.
영상에서 stride나 pooling layer 는 receptive field size를 키워서 넓은 context를 고려하고 싶다.
receptive size field 를 키워서 더 정답에 가까운 결과를 내리기 위해 사용하는데 해상도를 필연적으로 낮춘다.
이 문제를 피하기 위하여 upsampling을 도입한다.
Upsampling
FCN 에서는 작은 activation map 을 원래 입력 사이즈에 맞춰주기 위해서 upsampling 을 사용한다.
stride 나 pooling을 제외하면 작은 actvation map 을 얻지 못하고 고해상도 activation map을 유지할 수는 있다.
다만 문제는 똑같은 layer 수를 사용할 때 receptive field size가 작기 때문에 전반적인 context 를 파악하지 못한다.
receptive field size 가 작다는 표현보다는, 상대적으로 사진에서 볼 수 있는 영역이 작다는 말이 더 옳다.
일단은 작게 만들어서 receptive field 가 볼 수 있는 영역을 최대한 키우는 것이 성능에 좋고,
그 후에 upsampling을 통해서 resolution 을 맞춰주는 전략이다.
대표적인 upsampling method
1. Transposed convolution
a,b 두개의 입력이 주어졌을 때, transpose convolution은 filter 를 scaling 한 것을 해당하는 출력 위치에 붙여 넣는다.
az bx 처럼 중첩된 위치는 더해져서 나간다.
이렇게 되면 kernel 사이즈가 중첩된다고 해서 결과를 계속 더해도 되는건가?
매우 주의해야 할 점. convolutional kernel size 와 stride 사이즈를 잘 조절해서 중첩이 잘 생기지 않도록 튜닝을 해야한다.
https://m.blog.naver.com/mincheol9166/221740156045
[Deep learning] Upsampling (Transposed Convolution) 설명
본 포스팅은 개인 공부를 용도로 작성되었습니다. 이번 포스팅에서는 Segmentation이나 GAN의 Generat...
blog.naver.com
Nearest neighborhood등은 들어봤는데, 이건 뭐지 싶어서 추가 설명을 찾아보았다.
기존의 down sampling 방법을 정반대로 키우겠다는 건데, 이때 기존의 수학적 보간법들이 아니라 학습을 통해 최적의 보간법을 학습한다는 것이다. (down sampling 도 학습하면 어떨까?)
관련 내용은 참고한 글을 보면 되는데, 문제는 거기서도 학습이 어떻게 되는지는 명확히 설명되어 있지 않아서 추후 논문을 읽어야할 것 같다.
쉽게 구현하면서도 성능이 좋은 것이 바로 upsampling + convolution 이다.
Transposed convolution은 overlap 일부만 오버랩 된다는 문제가 있었는데,
upsampling은 그런 중첩 문제가 없고 고골고루 영향을 받게 만든다.
transposed convolution은 학습 가능한 upsampling을 하나의 layer로 한방에 처리했다면
upsampling convolution은 upsampling operation 을 두개로 분리해서 간단한 영상 처리 operation 으로 많이 사용되는 interpolation들을(Nearest neighbor (NN), Bilinear) 먼저 적용을 한다. 여기에는 어떤 학습가능한 파라미터는 없고 그저 해상도만 좀 키웠는데, 학습 가능한 learnable upsampling 으로 만들기 위해서 convoluion을(n X n Conv) 적용해준다.
FCN
아무리 upsampling 을 해도 이미 해상도가 줄어든 상태에서 잃어버린 정보를 살리는건 쉽지 않다.
이에 따라 각 layer 별로 activation map에 해상도와 의미를 살펴보면 다음과 같은 경향성이 있다.
낮은 layer 쪽에서는 receptive field size가 작아서 굉장히 국지적이고 디테일을 보고 작은 차이에도 민감하다.
높은 layer 쪽에서는 해상도는 꽤 낮아지나 receptive field 가 커서 전반적이고(global)하고 의미론적인 정보를 많이 포함한다.
Sementic segmentation은 두 정보가 모두 필요하다. 각 pixel 별로 의미를 파악해야 하고, 영상 전체를 바라보면서 현재 pixel이 물체의 경계선 안쪽에 해당하는지 바깥쪽에 해당하는지 경계부분을 detail하게 파악해야 한다.
두 특징을 모두 확보하기 위해서 다음과 같이 fusion을 한다.
높은 layer 의 activation map을 upsampling해서 해상도를 키우고, 중간 층의 activation map들을 upsampling을 해서 가져온다.
이 둘을 concat 해서 최종 출력을 만든다.
FCN 8s 가 가장 많은 activation map 을 사용한다.
이거를 통해서 최종적으로 각 pixel마다 class score를 뱉어주게 된다.
맨 마지막 activation map만 사용한 것, 적당히 합친 것, 많이 합친 것을 비교해보면
중간 단계의 특징들을 합쳐서 쓰는 것이 큰 도움이 된다는 것을 알 수 있다.
FCN 은 end to end network로, 손으로 만든 별도의 알고리즘을 사용하지 않고, 모두 neural net layer 로 구성되어 있어 GPU 로 병렬처리도 가능하고, 굉장히 빠르다. 또한 모델이 해당 테스크에 대해서 딱 학습되기 때문에 더 좋은 성능을 발휘하고 low level feature 와 high level feature 까지 고려한 end to end learning task 를 통해서 이러 경계선을 잘 따라가는 결과까지 얻을 수 있었다.
hypercolumn 이라는 비슷한 연구가 존재. 심지어 같은 학교. 그러나 FCN 을 강조하는 것이 아닌, 낮은 layer 와 높은 layer의 feature를 융합해서 사용하는 파트가 제일 강조되었었다.
FCN 논문 리뷰 — Fully Convolutional Networks for Semantic Segmentation
딥러닝 기반 OCR 스터디 — FCN 논문 리뷰
medium.com
참고자료
U-Net
그러나 sementic segmentaion의 break trough 는 U-Net에서 시작한다.
지금까지도 neural net model 중 영상과 비슷한 사이즈의 출력을 가지는 모델이자, object detecion, segmentation등 영상의 일부분을 더 자세히 봐야하는 기술은 대부분 U-Net 에 기원을 둔다.
U-Net은 FCN 에 기원을 둔다.
낮은 층의 feature 와 높은 층의 feature 의 특징을 더욱 잘 결합하는 방법을 제시했다.
skip connection을 통해서.
이로 인해 앞선 FCN 보다 더 정교한 segmentation 결과물을 볼 수 있었다.
U 자처럼 그려놓고 U Net 이라 했다.
입력 영상을 몇개의 Conv layer에 통과시키고 pooling을 통해서 receptive field 를 크게 확보하기 위해 해상도를 낮추고 channel 수를 늘렸다. 이를 반복하여 작은 activation map 을 구하고 여기에 영상의 전반적인 정보가 잘 녹아있다고 가정한다.
여기까지를 Contracting part 라 부르고 이전의 일반적인 CNN 과 동일하다고 보면 된다.
3 X 3 conv 적용, channel doubling, holistic(global) context capture.
Decoding part인 upsampling. 한번에 upsampling 하지만, activation map의 해상도는 점진적으로 단계별로 키우고 채널사이즈를 줄인다.
이때 activation map의 해상도와 채널사이즈는 contracting part에서 오는 대칭으로 대응되는 레이어와 맞춰서 낮은 층의 있었던 activation map 을 사용할 수 있도록 디자인
upsampling 경로를 expanding path 라 한다. 해상도를 점진적으로 늘리면서 대칭되는 특징들을 skip conncetion을 통해서 fusion을 한다.
fusion 방법은 resNet 처럼 더하는 방법등 여러 방법이 있겠지만 여기서는 concat 방법을 사용한다.
activation map 을 두배씩 줄였다가 두배씩 키우고, channel은 반대로 두배씩 키웠다가 2배씩 줄이도록 설계되어있다.
대칭되는 layer 는 activation map들이 concat될 수 있도록 해상도와 채널이 호환성 있는 값을 가진다.
낮은 레이어에서 localize 정보를 준다고 하는데: 공간적으로 높은 해상도와 입력이 약간 바뀌는 것 만으로도 민감한 정보를 제공하기 때문에 경계선, 공간적으로 중요한 정보들을 뒤쪽 레이어에 바로 전달하는 중요한 역할을 한다.
U-Net의 주의점
feature map의 spatial size가 홀수값을 갖게되면?
다운 샘플링과 업 샘플링
다운 샘플링은 보통 버림으로 3X3 이 된다. 3 X 3 을 upsampling하면 6 X 6이 된다.
원래 입력하고 해상도 차이가 생긴다.
입력 영상을 넣어줄 때 어떤 레이어에서도 홀수 해상도의 activation map 이 나오지 않도록 유의해야 한다.
그렇지만 모든 down sampling(버림), upsampling이 U-Net 처럼 구현된건 아니다.
내부 구현에 따라 다를 수 있으니 돌다리도 먹어보고 건너자.
conv가 계속 channel 크기를 키우고 max pooling은 down sampling을 한다.
기존 CNN 과 별다를 차이가 없다.
Expanding path는 새로운 점이 많다.
2로 한칸씩 뛰면서 2칸씩 채워넣는 식으로 upsampling을 하여 중첩되는 부분이 안생긴다. (체커보드 X)
Sementic segmentation
CRF (Conditional Random Field)
후처리로 사용되는 툴 (이해를 위해서는 그래프 모델, 최적화 툴 등 배경지식 필요)
픽셀과 픽셀사이의 관계를 모두 이어줌으로써 픽셀 맵을 그래픽으로 본 것. 경계를 잘 찾을 수 있도록 한다.
대부분의 neural net 기반의 한게이지만 sementic segmentation에서 처음 결과를 뽑고나면 다음과 같이 굉장히 블러리 한 정보를 얻게 된다.
feedforward구조로 출력을 입력과 비교대조하는 구조가 없어서 2번과 같이 나온다.
이를 해결하기 위해서 rough 하게 나온 출력 score map과 뽑은 이미지 경계선을 활용해서 score map 이 경계선에 잘 맞을 수 있도록 혹산한다. 반대로 back ground 에 대한 score 들은 물체의 경계까지 확산이 되어서 안쪽과 바깥쪽 모두 확산이 일어나게 하고, 물체의 마스크와 바깥의 마스크를 굉장히 타이트하게 경계선을 만들어주는 알고리즘이고, 결국 맨 오른쪽과 같이 정교한 segmentation map 을 얻을 수 있게 된다.
Dilated convolution
convolution kernel 사이에 dilation factor 만큼 일정 공간을 넣어준다.
dilated convolution 은 왼쪽과 달리 실제 Conv kernel 보다 더 넓은 영역을 고려할 수 있도록 하고 다만 파라미터 수는 늘어나지 않는다.
이를 통해 dilation layer 를 몇번 반복하는 것만으로도 receptive field 가 exponential 하게 확 증가하는 결과를 얻을 수 있다.
(이를 통해 입력값에서 어느 크기의 영역에서 커버할 수 있는지를 결정하는 receptive field 크기 상승과 디테일한 정보가 줄어들고 특성이 점점 추상화 되는 것을 어느정도 방지한다. )
DeepLab v3 +
sementic segmentation의 입력 해상도가 워낙 크기 때문에 연산이 오래 걸려서 dilated conv + depth wise seperable conv 을 통해 Astros seperable conv 를 제안한다.
기존 conv layer 는 하나의 activation 값 을 얻기 위해서 커널 전체가 채널 전체에 걸쳐서 내적을 해서 하나의 값을 뽑았다.
Depth wise 는 이 절차를 둘로 나눈다.
첫번째는 각 체널별로 convolution해서 값을 뽑고
두번째 layer 도 따로 convolution해서 값을 뽑고..
채널 별로 conv를 해서 값을 뽑는다.
채널 별로 activation map을 얻고
1 by 1 conv 를 통해서 하나의 값이 출력이 되도록 합쳐준다.
이를 통해 conv 의 표현력도 어느정도 유지가 되면서 계산량은 획기적으로 줄어든다. (상단 이미지의 계산량 참고)
가장 최신 DeepLab v3+ 를 살펴보면
다음의 구조를 가진다.
https://kuklife.tistory.com/121
[Semantic Segmentation] DeepLab v3+ 원리
논문1. DeepLab V1 : https://arxiv.org/pdf/1412.7062.pdf 논문2. DeepLab V2 : https://arxiv.org/pdf/1606.00915.pdf 논문3. DeepLab V3 : https://arxiv.org/pdf/1706.05587.pdf 논문4. DeepLab V3+ : https:..
kuklife.tistory.com
아주 좋은 참고글
'AI > CV' 카테고리의 다른 글
AutoGrad (0) | 2022.03.11 |
---|---|
CNN Visualization (0) | 2022.03.11 |
semantic segmentation, Detection (0) | 2022.02.08 |
Convolution network model 소개 (ILSVRC 모델) (0) | 2022.02.08 |
CNN 간단 정리 2 (0) | 2022.02.08 |