본 포스팅은 충남대 고영준 교수님의 강의자료를 바탕으로 작성한 글입니다.
컴퓨터비전의 task로는,
분류 / semantic segmentation / object detection이 있다.
semantic segmentation은 픽셀을 객체별로 구분하는 것이다.
Segmentation
의미있는 단위로 나누는 작업. 약간의 모호함이 있다.
super pixel은 픽셀단위로 나누는 것은 너무 오래 걸리기에, 경계선을 기준으로 픽셀을 뭉쳐준다.
그렇게 뭉쳐진 집합이 super pixel이고, 그걸 하나의 node로, 픽셀처럼 사용한다.
image segmentation은 비슷한 색/형태가 합쳐진다.
모호하긴 하지만, 최대한 경계선끼리는 안 합쳐지도록 한다.
그리고 뭐 video segmentation, contour detection도 있다.
Segmentation with ConvNets
이건 명확한 경우인데,
semantic segmentation은 픽셀마다 class가 정해진다.
단, 여기선 class를 많이 지정해놔야 커버 가능하다.
instance segmentation은 배경은 제외하고 객체만 탐지한다.
box를 찾고, 그 안의 픽셀이 객체에 포함되는가 아닌가를 확인한다.
panoptic segmentation은 배경까지도 구분하는 것이다.
video object segmentation은 동영상에서 구분하는 것
Semantic Segmentation
각 픽셀에 카테고리별 라벨을 부여하는데,
객체끼리 구분하지는 않는다. 그냥 픽셀단위 class 구분.
즉, 강아지 두 마리가 같이 있으면 걔네끼린 구분하지 않는단 뜻
이건 보통 classifier와 sliding window를 이용한다.
패치로 돌아다니면서 여기에 객체가 있나~ 판별하는 것인데,
패치의 크기도 제각각이고, 모든 픽셀을 찾아봐야 하니 효율이 많이 떨어진다.
따라서 Fully convolutional을 이용하는데, 모든 layer가 conv에 들어가는 것이다.
그냥 계속 conv layer를 통과하면서 결과적으로 image와 같은 크기의 출력을 내놓고,
그것이 바로 픽셀마다 어느 class에 해당하는지를 나타내는 점수이고,
이를 argmax해서 가장 큰 인덱스를 찾으면 이미지가 객체별로 구분되는 것이다.
주의할 점은 보통 CNN에서는 마지막에 FC가 있는데 여기선 없다는 점!
그리고 여기서 포인트는, 2차원 공간적 크기를 계속 가져간다는 것이다.
이미지의 크기가 줄어들면 안되기 때문이다.
보통 클래스 개수는 만약 cow, grass, tree, sky라면 c=4로 정의되지만,
[아무것도 아님]이라는 class가 있다면 c=5로 정의된다.
근데 이렇게 계속 Conv layer를 통과할 때,
작은 filter로 보면 이게 객체인지.. 뭔지 잘 모를 수도 있다.
그래서 넓게 보기 위해 해상도는 줄이는 작업을 실행한다. downsampling!
이렇게 downsampling을 하면 크기가 엄청 줄어드는데, 이때 원상복구 시키기 위해 interpolation을 해도 되지만, 보통 upsampling conv를 이용해서 원래 크기로 돌아온다.
downsampling 과정을 encoder, upsampling 과정을 decoder라고 한다.
아니면 위에 말했듯 encoder에 bilinear interpolation을 하는 경우도 있다.
그럼 얘는 어떻게 학습하냐면,
decoder의 결과를 softmax 시켜 그 결과이미지를 ground-truth,
즉 실제 semantic segmentation된 결과와 비교해 loss를 계산한다.
gt에서 각 픽셀은 [0, 0, 0, 1] 이런 형태이다.
UNet
이건 semantic segmentation에서 가장 유명하고, 간단한 모델이다.
당연히 en-decoder를 통과했을 때, 이 결과는 입력에 비해 정보가 많이 손실돼있을 것이다.
그래서 해상도가 컸을 때의 정보가 필요한 것이다.
그래서 같은 해상도인 것들끼리 skip connection을 이용해 결합한다.
encoder를 통과할수록 high-level이 된다.
요즘엔 그냥 당연히 unet을 사용한다.
요런 형태라고 생각하면 된다.
DeepLab
이건 V1, V2, V3, V3+로 나뉜다.
V1
사진을 보면 바로 이해갈 것이다. Atrous convolution이다.
오른쪽 그림은, rate를 2로 주어 conv layer를 통과시킨 결과이다.
이렇게 하면 #parameter, #연산은 같은데, rate가 커질수록 receptive field가 증가한다.
뭐 rate=3으로 한 3*3 kernel에서는 7*7과 같은 범위의 receptive field가 된다는 말이다. 내용은 아니지만..
V2
위처럼 dilated conv(간격 있는 커널)를 사용해 Image를 downsampling하는 것이다.
이렇게 0.5x가 될 때 dilated conv 가 사용된다.
V3+
U-Net을 따와서 DeepLab V2를 좀 변경한 건데,
이렇게 말이다.
Instance Segmentation
이건 이제 Semantic Segmentation과 다르게 객체'마다' 분리하는 것이다.
Faster R-CNN을 이용해 객체 탐지를 하고,
Mask R-CNN을 이용해 각 instance를 분할한다.
이렇게 말이다.
Semantic Segmentation : 배경 - 나무 - 배 - 사람 이런 식으로 나누는 거
Instance Segmentation : 배1 - 배2 - 사람1 - 사람2 - 사람2 이런 식으로 나누는 거 (배경 X)
Panoptic Segmentation : 배경은 Semantic에서, 객체는 Instance에서. -> 둘의 장점만 취한 거임
'AI > 컴퓨터비전' 카테고리의 다른 글
SIFT (0) | 2024.12.16 |
---|---|
Image Classification (0) | 2024.12.15 |
CNN, Architectures (0) | 2024.12.09 |
Feature Matching (1) | 2024.11.25 |
Corner Detection (0) | 2024.11.15 |