Introduction
Goal
픽셀 단위로 물체의 edge를 구별해내는 semantic edge detection을 할 때, 보다 정확하고 sharp한 edge를 검출해내는 것을 목적으로 합니다.
Motivation
Edge 학습에서 큰 문제점 중 하나는 사람이 직접 표시한, gt에 해당하는 edge들이 정확하지 않고 noise가 많이 포함되어있다는 것인데요, 본 논문에서는 edge를 검출해내기 위해 edge의 normal 방향 및 normal 방향으로의 최대값을 edge로 사용합니다. 동시에 그런 noisy edges들을 true boundary에 맞게 하여 end-to-end로 학습하는 방법을 제안하고 있습니다.
STEAL: Semantically Thinned Edge Alignment Learning
이 논문에서 제안하고 있는 방법을 STEAL이라고 명명하였으며, 이 방법에서 새롭게 제안된 것들은 다음과 같습니다.
- 정확한 semantic edge를 검출하기 위해 새로운 boundary thinning layer와 손실함수
- Object edge 자체와 noisy한 GT edge들과 true edge들간의 정렬을 동시에 학습
Proposed Method
STEAL은 CNN backbone에 결합이 가능하며, 학습 기반의 edge 검출 네트워크에서 사용이 가능합니다.
Semantic Aware Edge-Detection
기존의 edge detection은 해당 edge들이 어떤 물체의 경계에 속하는지에 관계없이, 전경(edge)과 배경만을 구별합니다. 하지만 Semantic Aware Edge-Detection는 입력 이미지에 K개의 object class가 존재한다면, edge도 동일하게 K개의 class를 가집니다. 입력 이미지의 m번째 pixel이 k번째 class에 속하는지 여부의 gt를 다음과 같이 표시합니다.
입력 이미지를 x, CNN f의 parameter들을 theta로 하여 픽셀 단위로 m번째 픽셀이 k번째 클래스에 속하거나 (y^m_k=1), 속하지 않을 (y^m_k=0) 확률을 다음과 같이 표현합니다.
이 때 사진상에서 물체들이 겹쳐 보일 수 있기 때문에, 하나의 픽셀은 여러 개의 경계에 동시에 속할 수 있습니다.
Semantic Edge Learning
보통 boundary detector들에서 많이 사용하는 binary cross entropy loss를 사용합니다. 이 때 edge를 이루는 픽셀들은 전체 이미지에서 차지하는 비율이 매우 작기 때문에, 이를 보완하기 위해 mini-batch 내 모든 픽셀들 중 edge 픽셀들이 차지하는 비율을 손실함수의 가중치 \beta로 사용합니다. 다음과 같이 weighted binary cross-entropy를 표시할 수 있습니다.
Semantic Boundary Thinning Layer
위와 같은 loss를 이용하면, 각 픽셀과 각 클래스들은 모두 독립적이기 때문에 실제 경계가 있는 부분에서는 굉장히 많은 edge들이 검출되게 됩니다. 그래서 실제로 경계를 이루는 픽셀들의 normal 방향으로 normalize를 해준 후, 이 중 최대값을 가지는 edge를 선정합니다. 그리고 predicted boundary map에서의 normal들이 GT edge들의 normal들과 일치하게 하도록 하는 손실함수를 추가적으로 더해줍니다.
먼저 normal 방향에서 최대값을 선정하는 과정입니다. k번째 object의 각 positive gt boundary pixel p에 대해서 normal 방향 \vec{d}^k_p을 따라 response를 다음과 같이 normalize합니다. L=2의 값을 사용했으며, p_t에 따른 f_k값들의 값들은 bilinear interpolation을 합니다.
각 class에 대해서 각 픽셀의 normal 방향을 따라 위의 분포 h_k(p; )를 계산하고, GT를 Dirac delta 분포로 가정합니다. 이 때 두 분포 사이의 차를 최소화하기 위해서 다음과 같은 NMS loss를 도입합니다. NMS loss는 boundary pixel들에만 적용됩니다. (p는 모두 positive boundary pixel)
다음으로는 normalize할 normal 방향을 결정해야 하기 위한 방향 손실함수입니다. GT 픽셀 p의 normal direction을 \vec{d}_p, predicted boundary map에서 계산한 normal direction을 \vec{e}_p라고 할 때, 두 벡터가 이루는 각의 절대값들의 합을 손실함수로 정의합니다.
이 normal direction vector를 계산할 때는 2차 미분을 위한 fixed convolutional layer를 사용합니다. 따라서 gt에서 normal vector d를 추출해낼 때, 그리고 prediction map에서 normal vector e를 추출해낼 때 동일한 layer가 적용됩니다.
마지막으로 손실함수들을 모두 더하면 다음과 같습니다.
Active Alignment
여기까지는 학습한 edge들과 최대한 유사한 edge들을 검출하게 하는 과정이었습니다. 하지만 고려하지 못한 문제가 하나 있는데, 바로 실제 GT에 포함된 boundary들이 정말로 true boundary가 아닐 수 있다는 것입니다. 다른 GT들도 노이즈가 있거나 틀렸을 확률이 존재하긴 하지만, edge같은 경우에는 더더욱 정확한 annotation을 얻기 힘들 것 같은데요.
이 문제를 해결하기 위해서, 새로운 boundary를 도입합니다. 우리가 갖고 있는, 즉 noisy한 GT를 y라고 하고, 추정해내고자 하는 더 정확한 GT를 y\hat이라고 합시다. 학습의 최종 목표는 모델 f의 파라미터 \theta와 함께 y\hat까지 최적화하는 것이며, 이 최적화문제는 다음과 같이 표현할 수 있습니다.
두번째 줄의 두번째 항은 원래의 BCE에서 GT를 "true" boundary로 교체한 것이고, 첫번째 항은 GT와 "true" GT가 가까워지도록 하는 항입니다.
이 첫번째 항에서 "true" GT의 분포를 정하기 위해 level set formulation을 도입합니다. 이는 boundary 픽셀들이 서로 연결되어있다는 특징에서 착안한 것으로, "true" boundary들이 모두 폐곡선인 것으로 가정한다고 보시면 됩니다. "True" GT는 다음과 같이 embedding function \phi의 level set으로 정의합니다.
여기서는 level set의 evolution에 사용된 differential operator를 계산하기 위해서 morphological approach를 이용했는데요, 이 방법을 이용하면 level set은 bilinear piece-wise constant function이고 level set function의 constant reinitialization을 할 필요가 없습니다.
위의 level set method를 이용하면 y\hat이 편미분방정식의 형태를 갖기 때문에 evolution step t에 따라서 다른 값을 갖습니다. 여기서는 앞의 손실함수를 최소화하는 t를 선정합니다.
Learning
여기까지의 문제를 정식화하면 다음과 같습니다.
위 문제의 학습은 두 단계의 optimization을 반복함으로써 이루어집니다. 먼저 고정된 model \theta에 대해서 다음의 최적화를 수행합니다. (C는 상수)
이렇게 구한 y\hat ("true" boundary)을 GT로 하여 네트워크의 학습을 수행합니다.
Coarse-to-Fine Annotation
이렇게 y\hat을 embedding function의 level set으로 취급하는 것은 두 가지 장점이 있는데요, 먼저 y\hat의 위상 변화를 굳이 고려하지 않더라도 안정하게 반영할 수 있는 수치적인 방법이라는 장점이 있습니다. 또한 level set에 의해 감싸지는 부분들은 자연히 segmentation 영역이 되게 됩니다.
이 장점을 이용하면 annotation 작업에서 능률을 올리는데 사용할 수 있습니다. 예를 들어 작업자가 coarse하게 boundary를 그린다면, 학습된 모델과 level set formulation을 이용해서 더 "true" boundary에 가깝게 발전시킬 수 있습니다.
Experiment
Datasets
- SBD (Semantic Boundary Dataset)
SBD는 PASCAL VOC 2011의 trainval set 11355개를 training(8498)/test(2857) set으로 나눈 데이터셋으로, PASCAL VOC와 동일하게 20개의 class가 있습니다. Training set 중 임의로 100개를 골라 validation에 사용하고, 나머지 8398개로 학습하였습니다. 추가적으로 SBD test에서 1059개만 골라서 작업을 다시 한 high-quality re-annotated SBD test set이 있는데, 이 또한 사용했습니다.
- Cityscapes Dataset
5000개의 annotation이 잘 된 이미지들이 있으며, train/val/test는 각각 2975/500/1525개 입니다.
Implementation Details
Active alignment는 y_k를 고정시켜놓고 최적화하는 과정이 있기 때문에 network의 prediction 수준에 영향을 크게 받습니다. 그래서 초기에 네트워크의 학습이 어느정도 된 후에 active alignment를 개시합니다. 그리고 학습 시간을 좀 절약하기 위해서 n번의 학습마다 active alignment를 한번씩 수행합니다.
Backbone으로는 현재 semantic-aware-edge detection의 sota인 CASENet을 사용했습니다. 학습시에 해상도는 472*472를 사용했고, 위의 손실함수에서의 가중치는 각각 1, 10, 1로 하였습니다.
SBD에서는 lr 1e-7, 20k 후 1e-8 & beta=0, 55k후 active alignment 시작, 5k마다 한번씩. 전체 모델은 이틀에 걸쳐 70k후 수렴.
Cityscapes에서는 lr 5e-8, decay 1/20 for every 20k, beta=1, 60k 후 수렴. annotation이 이미 잘 되어 있어서 active alignment는 하지 않고 나중에 coarse data의 refinement에서만 사용.
Evaluation Metrics
Metric으로는 각 class의 maximum F-measure (MF)와 AP를 사용했습니다. Segmentation mask의 refine된 정도를 측정하기 위해서는 IoU를 사용했습니다.
Results
Baseline으로는 CASENet-S, SEAL을 사용했습니다. CASENet-S는 CASENet의 향상된 버전이고, SEAL은 CASENet-S의 top에서 misaligned label을 처리하는 부분입니다.
먼저 결과들을 시각화하여 보면 다음과 같습니다.
다음 표는 high quality re-annotated SBD test set의 각 카테고리별 성능을 보여줍니다. SEAL에 NMS loss를 추가한 것 만으로도 AP와 MF 모두에서 1% 이상의 성능 향상이 있음을 확인할 수 있습니다. 물론 active align까지 할 경우에는 더욱 더 개선되는 것을 보여주는데요. 저자들은 이렇게 정량적인 수치가 향상하는 것보다도, SOTA baseline들의 top에 단순하게 더할 수 있다는 점이 큰 강점이라고 강조하고 있습니다.
Boundary thinning layer
Test NMS는 inference 시의 post-processing 적용 여부를 나타냅니다.
다음은 active alignment의 효과에 대한 분석입니다. AA가 어느 정도의 annotation noise를 처리 가능하지 실험하기 위해서, 의도적으로 GT boundary에 8픽셀의 error를 더 추가하여 실험하였습니다. 참고로, fine re-annotated set을 기준으로 대략 4픽셀 정도의 오차가 있습니다.
Noisy traininig set에서 학습 후, reannotated set에서 evaluation 하였습니다. 다음 표는 원래의 noisy GT와 인위적으로 큰 오차가 추가된 GT의 경우 모두 AA의 효과가 분명함을 보여줍니다.
STEAL vs. DeepLab-V3
Semantic-aware edge detection을 통해 edge를 결정하면 자연스럽게 segmentation mask를 추출해낼 수 있기 때문에, semantic segmentation과 edge detection은 dual task라고 볼 수 있습니다. 그래서 직접적인 결과 비교가 가능합니다. 여기서는 특히 state-of-the-art semantic segmentation network인 DeepLab V3+ (78.8mIoU in Cityscapes val)과 비교하고 있는데, 결과물로 나온 mask에 sobel filter를 적용함으로써 edge를 얻어 비교하고 있습니다.
여기에 저자들은 segmentation metric에서 IoU 뿐만 아니라, 뭔가 boundary랑 관련된 값도 넣어서 평가해야 더 정확한 평가가 될 것 같다는 의견을 던지고 있습니다.
Refining Coarsely Annotated Data
그럼 이렇게 학습된 모델이 앞에서 언급한대로 noisy한 annotation들을 개선하는데 얼마나 쓸만한지 살펴보겠습니다. Simulated coarse data와 실제 coarse하게 annotation한 Cityscape의 train_extra와 val set을 사용하였고, 정량적인 비교를 위해 fine annotation과 coarse annotation이 모두 존재하는 Cityscapes val set을 사용하였습니다.
Sanity-check baseline으로는 GrabCut을 사용했는데, 돌려서 나온 결과를 다시 coarse mask로 하여 iteration하는 방식으로 여러 번 수행하여 평균적으로 좋은 값을 주는 것을 사용했습니다. Active alignment는 4px error에서는 1번, 8px error 이상에서는 5번의 iteration을 하였습니다.
왼쪽 표의 SBD 결과는 noisy data를 통해 학습한 모델로 refine한 결과입니다. 그리고 오른쪽 표의 Cityscapes 결과는 잘 annotation된 data로 학습한 모델을 사용한 결과입니다.
위의 결과를 보면, coarse segmentation (upper row)에서 시작해서 edge가 잘 정돈된 결과 (lower row)를 볼 수 있는데요. Annotation 작업에 도입된다면 작업 시간과 수고를 상당히 줄일 수 있을 것으로 생각됩니다.
실제로 refine한 annotation이 정말로 효용 가치가 있는지 알아보기 위해 비교해 보았습니다. 20K 이미지, 8개 class에 대해서 annotation 정제 작업을 거친 것과 거치지 않은 dataset으로 DeepLabV3+에 적용한 결과입니다. 일단 전체 mead IoU가 80.37에서 80.55로 향상되었고, 특히 rider, truck, bus class들에서는 1.2% 이상의 향상을 보였습니다.
Conclusions
이 논문에서는 기존의 boundary detector와 함께 사용할 수 있는 simple and effective thinning layer와 loss를 제안하였습니다. 또한 dataset의 noisy annotation들을 "true" object boundary에 가까워지도록 처리할 수 있는 방법을 제시하고 그 효용성을 살펴보았는데요. Annotation 작업자들이 polygon을 대충대충 찍어도 학습에 전혀 문제가 없는 날이 빨리 왔으면....
Share article