Input image가 들어오면 convolution과 feature size를 줄이는 pooling 과정을 반복하며 feature size는 줄이고 depth는 늘린다. 그리고 bilinear interpolation으로 upsampling을 거친 feature와 이전 layer의 feature를 더하는 skip connection과정을 계속 반복해 input image와 feature가 같은 shape이 되도록 맞춰준다.
Encoder 부분은 FCN과 방식이 매우 유사하다. Decoder 부분에서 차이가 있는데, Upconvolution을 거친 feature와 encoder의 feature를 concatenation해준다. 그리고 convolution을 두 번 적용하는 과정을 반복한다.
DeepLab V3와 다른 점은 U-net의 encoder-decoder 구조를 따른다는 점이다.
Encoder에서 low level features는 atrous convolution을 적용하였다. 그리고 low level features의 output에 parameter를 줄이고 좋은 성능을 보여주는 depth-wise separable convolution, spatial pyramid pooling을 적용하고 마지막으로 1x1 convolution을 거쳐 encoder의 output을 얻었다.
Decoder에서는 encoder의 output feature를 4배 upsampling하고 encoder의 low level feature에 1x1 convolution을 적용해 서로 concatenation을 수행한다. 그리고 3x3 convolution을 거치고 다시 4배 upsampling을 수행해 input image와 shape을 맞춰줘 prediction result를 얻는다.
Leader board를 보면 Encoder / Decoder, Dilated convolution, Spatial Pyramid Pooling(SPP) 순으로 적용함에 따라 성능이 올라가는 경향을 보이고 있다.
Cross entropy loss
아래 식은 기본적인 cross entropy loss이다. 가 ground truth이고 가 prediction이다. segmentation에 cross entropy loss를 사용할 경우에는 pixel 단위로 loss를 계산한다.
Cross entropy loss를 그대로 segmentation에 사용하면 class imbalance 문제에 취약할 수 있다.
이를 해결하기 위해 weighted cross entropy loss를 적용할 수 있다. 가 1보다 크면 foreground에 더 집중하게 되며 1보다 작으면 background에 더 집중하게 된다.
Weighted cross entropy와 아이디어는 유사하다. 식은 다음과 같다.
Dice loss
Dice loss는 dice coefficient에서 아이디어를 얻은 loss이다. Loss 계산 시 background는 고려하지 않기 때문에 foreground를 cross entropy loss에 비해 더 잘 학습할 수 있다는 장점이 있다. 식은 다음과 같다.
아래 식은 pixel 기준으로 loss를 계산하는 방법이다.
아래 식은 image를 기준으로 loss를 계산하는 방법이다.
Pixel accuracy
Intersection over Union
Dice coefficient
Hausdorff distance
Average distance