[Review] LS-Net : Fast Single-Shot Line-Segment Detector
지극히 개인적인 공부를 위한 리뷰입니다. 크게 도움은 안 되실 듯
원문 : https://arxiv.org/pdf/1912.09532.pdf
LS-Net : Fast Single-Shot Line-Segment Detector
Abstract
저고도의 무인 항공기(Unmanned Aerial Vehicle, UAV)의 비행에서 power line(전선)은 가장 위험한 요인 중 하나입니다.
최근 몇 년간 UAV의 자동 장애물 방지를 위해 power line을 detection하는 많은 vision based 기술이 제안되었는데,
대부분의 메서드들은 일반적으로 (1) edge detection, (2) Hough Transform, (3) power line의 구조를 기반으로 실제 전선만 남기기 와 같이 3단계의 접근법을 가집니다.
그러나 이러한 접근법들은 매우 느리고 정확도가 떨어지며, (3)번 과정을 위한 post-processing이 번거롭습니다.
따라서 이 논문에서는 Fast single shot line sement detector인 LS-NET을 제안합니다.
LS-NET은 (1) fully convoultional feature extractor, (2) classifier, (3) line segment regressor 와 같이 세 모듈로 구성되어있습니다.
데이터셋의 양을 증가시키기 위해 Physically Based Rendring(PBR)을 이용해 전선을 합성한 이미지를 생성하였고,
또한 VGG-16 네트워크를 customizing하여 Back-bone으로 사용합니다.
기존의 자동 장애물 방지를 위한 검사에서 실시간에 가까운 전선 감지가 가능해졌다고 합니다.
(쉽게 이해하려면 Faster R-CNN과 비슷한 맥락...?이라고 생각하면 될 듯)
Introduction
딥러닝을 이용한 power line detection 기법은 이전에도 제안되었으나 training set의 부족, class의 불균형, background 이미지가 너무 어수선한 점, 성능 평가를 위한 지표가 부족한 점 등의 문제점이 있었습니다.
본 연구에서는 background가 복잡함에도 power line detection을 훌륭하게 수행할 수 있는 딥러닝 기반의 LS-Net을 제안합니다.
LS-Net은 feed-forward의 CNN 구조이며, 3개의 모듈로 이루어졌고 PBR 기법을 통해 data augmentation을 진행하였으며, customized VGG-16을 back-bone으로 삼았다고 abstract에서 언급하였습니다.
본 논문의 contribution은 다음과 같습니다.
1) LS-Net이라고 불리는 end-to-end로 학습된 모델을 제안하였으며, Focal loss와 Win loss를 결합한 weighted mutli-task loss function을 통해 학습시켰습니다.
2) single-shot detectors의 문제점이었던 one-grid 접근 방식을 four-grid 접근법으로 바꿨습니다.
3) PBR 기법을 통해 training set 양을 늘렸습니다.
4) 고속 UAV가 power line을 자동으로 탐색하고, 데이터를 수집하며 온라인으로 potential fault를 빠르게 식별할 수 있는 검사가 가능해집니다.
Background and Related Work
A. CNN
CNN은 너무 유명해서 구조 등은 설명하지 않도록 하겠습니다.
LS-Net을 위해 사용될 CNN의 기술 및 특성 등을 간략히 요약하도록 하겠습니다.
1) High-level vision task
본 논문에서는 CNN을 이용한 Image classification과 segmentation, detection에 대해 설명하고,
CNN, VGG-Net, ResNet, Faster R-CNN, R-FCN, YOLO, SSD까지 설명합니다.
Lin et al에서 YOLO와 SSD와 같은 one-stage detctor가 최고로 좋은 성능을 달성하지 못하는 이유를 class imbalance라고 생각하여, Focal Loss(FL)라고 하는 loss function을 소개합니다.
FL은 정확한 class에 대한 confidence(신뢰도)가 증가함에 따라 0으로 감소하는 scaling factor로 standard cross-entropy loss를 동적으로 scaling합니다. (레퍼런스를 읽어보는게 좋을듯)
이를 통하여 FC는 model이 자동적으로 쉬운 example에 대해선 weight를 줄이고, 어려운 example에 대해 weight를 증가하며 학습하게 합니다.
Feng et al은 facial landmark localization과 같은 여러 개의 point localiztion에서 작거나 중간 범위의 에러의 샘플에 더 집중해야한다고 말했습니다.
이를 위해 Wing loss라고 하는 function을 제안했는데요, 크기가 다른 오류의 influence(영향)의 균형을 복원하는 것을 목적으로 하며 작은 에러의 오프셋에는 log function을, 큰 에러에는 L1 function을 적용합니다.
저자의 말에 따르면 상대적으로 작은 에러에 대처하는데 적합하다고 합니다.
Batch Normalization의 경우 네트워크의 성능을 높일 수 있으나 GPU 메모리로 인해 매우 deep한 CNN 혹은 고해상도의 영상은 학습시키기가 어렵습니다.
따라서 Batch size에 대한 의존성을 없애고 batch statistics 연산을 피할 목적으로, BN의 대안인 Group Normalization(GN)이 제안되었습니다. 이를 사용합니다.
여기까지 정리하자면 : Focal loss (class imbalnce를 위해), Wing loss (작은 에러를 위해), Group Normalization (메모리 문제 해결)
2) Low-level vision tasks
CNN은 edge detection과 같은 low-level vision task에 강한 성능을 보입니다.
레퍼런스로 이용한 논문들에서 VGGNet을 기반으로 많이 사용하였네요.
B. Common approaches to power line detection
1) Line-based metods
일반적인 power line detection을 위한 기법들은 power line을 직선이라고 생각하고 line detection 알고리즘을 그대로 적용합니다.
이러한 접근법들은 쉽고 효과적이긴 합니다만,
(1) power line이 일정한 밝기를 가지고있어야 하고,
(2) power line이 직선에 가까워야 하며,
(3) power line이 평행한 상태여야 한다는 가정이 필요합니다.
이러한 점들 때문에 메탈 울타리 등이 power line이라고 잘못 detection 되기도 한답니다.
2) Piece-wise line segment-based methods
휘어진 power line 또한 detection하기 위해서, piece-wise line segment 기법이 제안되었습니다.
그러나 이러한 기법들도 background에 line과 같은 특성이 있는 물체들이 detection되는 문제점이 있다고 합니다.
3) Auxiliaries assisted methods
위에 두 기법들을 한계를 해결하기 위해, auxiliary가 제공하는 correlation information과 context features를 활용하는 기법이 제안되었습니다.
power line을 detection 하기 위해 그 주변의 주탑(pylon)과 송전선(transmission line) 사이의 spatial correlation을 사용할 것을 제안했습니다.
이 기법은 위에 두 기법들에 비하여 좋은 성능을 보였으나, 주탑이 없거나 가려지면 성능이 크게 떨어졌습니다.
이 이후에도 auxiliary를 수동적으로 사용하거나, auxiliary의 성능을 평가하는 metric을 이용하는 기법들이 제안되었다고 합니다.
4) DL-based metohd
딥러닝 기반의 기법도 제안되었는데요, Histogram of Gradient (HoG) feature를 입력으로 사용하고 sliding window 기법을 사용해 '라인이 있음'과 '라인이 없음' 두 개의 클래스로 분류하는 CNN 기반의 classifier를 제안하였습니다. GoogleNet을 fine-tuning 하였고요.
또한 다른 논문에서는 wire detection을 sementic segmentation으로 처리하고 CNN의 한정된 공간에 걸쳐 grid search를 수행하여 optimal model을 찾았습니다.
wire-detection을 semantic segmentation task로 처리하는 게 좋은 성능을 보이긴 하지만, pixel-level의 ground truth를 만드는게 실용적이지가 않다는 문제점이 있습니다.
그래서 image-level class information을 사용하여 pixel-level에서의 power line을 localizing는 weakly supervised learning의 CNN도 제안되었습니다.
VGG-19를 classifier로 사용하여 512x512의 input image에 128x128의 sub-regions을 sliding window로 분류하고, power line이 있다고 분류되는 sub-region의 중간단의 convolutaional layer의 featuremap을 조합하여 power line의 위치를 시각화합니다.
pyramidal patch classification을 기반으로 하는 power detection pipeline도 제안되었습니다.
너무 길어서 이정도까지만 정리할게요.
3. The Line Segment Detector (LS-Net)
A. Data generation
1) Synthetic Data Generation
power line을 위한 데이터셋이 적은 관계로, Nordic Media Lab (NMLab)과 협력해서 PBR 기법을 사용하여 power line을 합성한 이미지를 rendering 하였습니다.
Autodesk 3DS Max 프로그램으로 stell center 가닥 하나와 여러개의 알루미늄 가닥으로 이뤄진 ACSR 케이블을 모델링했다고 합니다.
또한 사실적으로 표현하기 위해 metal brased steel texture등을 이용하였고, 인터넷에서 수집한 케이블들을 무작위로 겹쳤다고 하네요.
조명 데이터들도 케이블에 적용하였고, 초점을 흐린다든지 카메라 각도 및 거리 등을 조절하여 많은 합성 이미지를 rendering 하였다고 합니다.
2) Data augmentation
data-space에서의 transformation을 통해 더 많은 training data를 만들었다고 합니다.
생성된 이미지의 background를 실제 이미지로 변경하여 dataset의 diversity를 증가시켰다고 합니다. 계절, 날씨, 빛 등을 바꿨다고 하네요.
또한 가우시안 분포를 기반으로 하여 노이즈를 추가하였다고 합니다.
또 랜덤하게 밝기, saturation, 대조 등도 변경하였는데, 색상은 바뀌지 않게 하기 위해 RGB 영상을 회색조로 변환한 뒤 augmentation을 하고 RGB로 다시 변환하였다고 합니다.
B. LS-Net Architecture
드디어 나왔네요!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
SSD와 YOLO의 성능 향상을 보고 본 논문에서 LS-Net을 제안하였다고 합니다.
LS-Net은 W x H x C 크기의 입력 영상을 grid로 나누고,
C x C 크기의 각각의 grid cell에서 가장 긴 line segment의 좌표와 confidence score를 예측합니다.
confidence score는 line segment를 포함하는 cell의 probability를 나타내고, 좌표는 line segment의 x축과 y축에서 두 개의 끝점의 normalized된 거리입니다.
YOLO와 SSD와 같이 one-grid를 사용하는 기법은 2개의 문제점이 있습니다. (1)grid cell의 테두리가 끊기고 gap이 발생하는 것, (2) grid cell의 모서리가 끊기고 갭이 발생하는 것.
one-grid의 경우 regression error로 인해 detected line segment가 실제 ground truth보다 짧습니다. 이로 인해 border나 corner에 있는 line이 끊기고, 갭이 생기는 것입니다.
또한 one-grid는 부족한 feature로 인해 short line segments를 무시합니다.
따라서 이러한 문제점을 해결하기 위해서 LS-Net에서는 four-grid 기법을 사용합니다.
입력된 이미지를 4개의 overlapping grids로 나눕니다.
main grid는 SSD와 YOLO에서 사용된 grid와 같으며 line segment를 위해 사용됩니다.
horizontal grid와 vertical grid는 각각의 border에서의 gap을 닫아주는데 사용합니다.
center grid는 main grid에서는 무시되는 셀 코너의 짧은 line segment를 detecting 하는데 사용됩니다.
네 개의 grid에서 detected 된 line segment는 모두 합쳐져 line segment map을 형성합니다.
1) Fully Convolutional Feature Extractor
LS-Net에서의 feature extractor는 VGG-16 네트워크를 기반으로 합니다.
마지막 max-pooling layer 이전의 네트워크는 자르고, 남아있는 max-pooling layer를 stride 2의 convolutional layer로 대체합니다.
Max pooling layers가 line segment의 끝점을 예측하는데에 유용한 spatial information을 버리기 때문에라고 합니다.
optimization을 쉽게 하고, 네트워크를 빨리 수렴시키기 위해서 모든 convolution layer의 activation 전에 앞서 언급한 Group Normalization을 사용합니다.
2) Classifier
classifier sub-network는 1번의 feature extractor로부터 추출된 feature map을 input으로 받고, 각각의 셀이 line segment를 포함하는지 아닌지를 예측합니다.
이 sub-network는 2개의 레이어로 구성되어있는데, 첫 번째는 2x2 convolution layer (stride 1)으로 입력 feature를 4개의 overlapping grid에 해당하는 feature map으로 변환합니다.
두 번째 레이어는 각 grid cell의 confidence score를 예측하는 1x1의 convolutional layer입니다.
3) Line Segment Regressor
line segment regressor sub-network는 classifier와 같이 1번 네트워크로부터 출력된 feature를 입력으로 받고, 각 grid cell에서 가장 긴 line segment의 좌표를 예측합니다.
이 네트워크 또한 2개의 레이어로 구성되어있는데요, 첫 번째 레이어는 classifier의 첫 번째 레이어와 동일하고, 두 번째 레이어는 line segment의 좌표를 예측하기 위한 1x1의 convolutional layer입니다.
4) Summary
four-grid approach로, LS-Net의 출력값은 CxC 크기의 sliding window detector와 유사하지만,
기존의 기법에 비해 늘어난 셀에 대해 line segment 예측이 가능하고 neighboring cell의 정보를 결과 예측에 사용한다는 장점이 있습니다.
본 논문에서는 512x512x3크기의 이미지를 입력받아 32x32 크기의 셀에서 line segments를 하게끔 학습하였습니다.
feature extractor 안에서의 모든 convolutional layer는 padded되어 같은 크기의 output을 출력하고, 이는 classifier와 regressor에는 적용되지 않는다고 하네요.
C. LS-Net Multi-task Loss
LS-Net은 테이블 1에서 보다시피 두 개의 sibling한 output layer를 가집니다.
첫 번째 classifier는 i번째에서 line segment가 있는 셀과 없는 셀, 두 개의 클래스에 걸쳐 이산 확률 분포인 p를 출력합니다.
이 p는 i번째 셀에서 1x1의 convolution layer에서 softmax를 통해 계산됩니다.
두 번째 regressor에서는 i번째의 grid cell에서 가장 긴 line segment의 끝점 좌표를 출력합니다.
(추가중)