코린이의 공부일기

[Boost Camp] U.stage_Semantic Segmentation 본문

BOOST CAMP_정리

[Boost Camp] U.stage_Semantic Segmentation

SOJUNG 2021. 9. 9. 22:26

Semantic Segmentation 이란 무엇일까?

 

물체를 픽셀 단위로 분류하는 방식

주의할 점 : 같은 class이지만 다른 물체라면 구분하지 않는다.(같은 색)

 

instance segmentation :같은 class여도 다른 물체라면 구분하는 방식

 

 

 

그렇다면 semantic segmentation은 어디에 사용될까?

 

영상에 대한 전면적인 컨텐츠를 이해하기 위해 사용한다.

영상을 편집하는데에 필수적인 기술이라고도 할 수 있다.

왜냐하면 semantic segmentation을 이용해 object detection을 통해 선별하여 편집을 진행할 수 있기 때문이다.

 

 

 

 

Semantic segmentation architectures

 

1. Fully Convolutional Networks (FCN)

 

입력 부터 출력까지 미분가능한 형태로 출력되어있다.

또한 호환성이 높은 네트워크구조로  특정 해상도에 학습이 되었더라도

test할 때 임의의 size을 문제없이 결과 값을 도출 할 수 있는 장점이 있다.

 

 

*Fully connected layer :공간 정보를 고려하지 않고 fixed dimension vector가 주어진다면 matrix manipulation을 통해 fixed dimension vector을 도출하는 방식이다.

* Fully convolutional layer : 입력은 activation map형태로 출력도 activation map으로 출력된다.

보통 1X1 convolution으로 구현이 되고 각 위치보다 classification이 적용된다.

 

 

 

Fully convolutional layer을 좀 더 자세하게 알아보자

 

 

각 위치마다 classification을 하기 위해서 채널축으로 Flattening을 진행하며 stacking을 진행한다.

1X1 convolution 이 이와 같은 계산으로 filter의 개수 만큼 내적을 진행하여 matrix을 쌓는다.

 

 

위에서 각 위치별로 classification을 사용했는데 stride와 pooling layer으로 인해서 최종map은 저해상도로 나올 수 있다.

-> receptive field을 넓게해서 해상도를 높게 할 수 있는 방법이 있지않을까?

->그게바로 up sampling

 

 

+추가 정보

 

 

Up sampling 이란 무엇일까 ?

up sampling 종류

1. Transposed convolution

 

각각 Input과 Filter가 곱해져서 계산하는 방식이다.

중첩되는 부분은 계속해서 더해지는 방식이다.

 

그렇다면 일정한 부분이 계속적으로 중첩되어 더해도 되는건가? 라는 의문이 생길 수 있다.

 

->중첩이 생기지 않도록 tuning이 필수적이다.

 

 

 

2. Upsamling and Convolution

 

 

맨 왼쪽과 같이 부분부분만 샘플링 하지않고 interpolation(Nearest-neighbor(NN), Bilinear)을 통해서 convolution layer을 일괄적으로 적용해

골고루 sampling을 적용해준다.

 

 

 

 

Fully Convolutional Network(FCN)

 

낮은 layer에서 receptive field사이즈가 작기 때문에 작은 차이에도 민감하다

높은 layer에서는 낮은 해상도를 갖지만 넓은 receptive field을 가진다.(전반적인 , 의미론적인 의미를가진다)

Segmentation은 각 픽셀 별로 의미를 파악해야하며, 영상전체를 바라보면서 현재픽셀이 물체의 경계선안or밖 에 있는지

둘다 확인해야하기 때문에 두 가지 모두 중요하다.

 

FCN은 end to end 네트워크로 모두 neural network이며 low level layer와 high level layer까지 잘 고려해서 경계선 까지

잘 따라갈 수 있는 것을 보여준다.

-> 중간에 unsampling을 많이 했을 때 더욱 더 좋은 결과가 나온다 (FCN-8s)

 

 

 

U_Net

 

U-Net은 영상의 일부분을 자세하게 봐야할 때 사용하는 것입니다.

 

 

U-Net 의 전체적인 구조

 

 

왼쪽의 구조는 receptive field을 늘리기 위해서 해상도는 줄이고 채널 수를 늘이는 방식으로 진행한다.

작은 activation map을 도출하여 영상의 전반적인 정보를 잘 녹여낼 수 있도록 한다.

(기존 CNN구조와 동일)

 

 

오른 쪽 구조는 Expanding path로 up samling하는 구조이다.

 해상도를 높히고 채널 수를 줄이는 방식이다.

 

-> 즉 해상도는 낮췄다가 늘리고

-> 채널 수는 늘렸다가 줄이는 방식이다.

채널과 해상도가 호환성을 가지도록 구성한다.

 

** 중요 

경계선 부분이나 중요한 공간 정보부분은 앞 쪽 layer에서 바로 뒤쪽 layer으로 정보를 보내는 방식으로 중요한 역할을한다

 

 

여기서 짚고 넘어가야할 점!

 feature map의 spatial size가 홀수라면 어떻게 될까?

 

 

U-Net에서는 Down sampling과 Up Sampling이 빈번하게 일어나는데 map사이즈가 홀수라면 Up sampling과정에서

원래의 해상도와 차이가 생길 수 있다.

홀수 가 나오지 않도록 유의해야한다.

 

 

Deeplab

 

테두리의 일정 공간을 집어넣어주는 방식으로

Dilated convolution을 반복함으로써 receptive field을 늘릴 수 있는 큰 장점이 있다.

 

*추가적으로 중요한 부분

 

일반적인 convolution은 3개의 채널 전체를 거쳐내적하여 하나의 값을 도출해냈다면, 

Depthwise separable convolution 은 채널 축 마다 값을 뽑고, 1X1 convolution(2 Pointwise convolution)을 통해서 하나의 값을 도출한다.

 

위의 식처럼 Depthwise separable convolution은 2 가지의 process을 진행하면서 표현력은 유지되면서 확실히 계산량이 줄어든 것을 볼 수 있다.

 

가장 최신의 deeplab v3+구조를 간단하게 본다면 처음에 Dilated convolution을 통해서 더 큰 receptive field을 가지는 feature map을 구한다.

그리고 다양한 spatial pyramid pooling을 적용하며 구해진 feature map으로 convolution을 통해 합쳐준다.

 

그리고 Decoder에서는 low label feature에서온 feature map 과 pyramid pooling을 거치고 upsamling한 feature map을 concat해 결합해주며 segmentation을 도출하도록 한다.

 

 

 

2021-09-09 U stage +회고

 

이번 강의는 나한테 너무 직관적(?) 으로만 다가왔다.  특히 되게 많은 내용을 교수님도 30분으로 압축해서 담으려니 짤막하게 정리하는 식으로 설명해주셔서 잘 이해가 되지않는 U-net 부분과 sampling부분은 조금 더 찾아볼 예정이다.!

30분 짜리강의를 사실 끊고 다시보고해서 2시간 이상을 봤는데..ㅎㅎ.. 

나에겐 아직도 너무 어려운 부분 같다..! 하지만 과제해보면 어느정도 틀은 잡히는 것 같아서 기분은 좋았는데

이게 다음에 나올 instance segmentation은 더 멘붕일 것 같은 느낌?..ㅎㅎ;

그래도 모를 때 마다 더 찾아보고 소통해야겠다!!!!

 

+ Backend project 시작

 

사실 이틀 전 부터 프로젝트를 시작했다! 다른 팀원 분과 시작했는데 누구보다 제일 친해진 캠퍼분 이시다 !ㅎㅎ

사실 aws가 뭔지도모르고 ubuntu가 뭔지도 어떻게 쓰는지도 몰랐는데 이 캠퍼 분 덕분에 저어엉말 많이 배웠다!

๑◕‿‿◕๑bb

 

첫 프로젝트를 구성하기로 한 날 aws에 대해서 설명해주시고 서버를 받아와서 git을 이용해 github와 연결도 했는데

이 과정을 통해서 git을 진짜 많이 배운 것 같았다 . 특히 merge할 때 충돌하는 상황일 때 대처하는 방식, 그리고 key값을 저장하고 서버를 받아오는 과정 등 ai stage에서 할때는 그냥 시키는대로만 해서 뭐가 뭔지도모르고 얼른 연결이나하자! 라는 마음가짐으로 횡설수설한 느낌이었는데 이 과정을 통해서 정리가 된 느낌이였다.

캠퍼님 최고 ٩(•̤̀ᵕ•̤́๑)૭✧!!!

아직도 배울게 산더미 같지만..! 내가 더 예습하고 공부해와서 프로젝트를 조금 더 수월하게 진행했음 좋겠다!ㅠㅠ 

 

 

특히 추가적으로 프로젝트 관해서 몇 가지 공부해보라고 키워드를 알려주셔서 그 중 crontab을 한번 찾아봤는데 고정된 날짜와 시간을 주기적으로 실행시켜주는 프로그램이였다 .  어느정도 프로젝트가 완성되었을 때 쓰는 방법 같은데 

얼른 명령어들이나 내가 프로젝트에 써야할 부분 들? 목록들 ? 을 찾아보고 공부해봐야겠다!

 

나의 첫 백앤드 프로젝트인데 성공적으로 잘 끝났음 좋겠다 (나만 잘하면 되겠지만...!)

 

우리 모두 화이팅 !!!!!!

 

 

Comments