이 글은 Vision-Based Parking-Slot Detection: A DCNN-Based Approach and a Large-Scale Benchmark Dataset 논문을 읽고 쓴 글이다.
들어가기에 앞서, parking-slot과 주차 구역은 동일한 단어라고 가정한다.
Abstract
이 논문은 DCNN을 기반으로 주차 구역(parking-slot)을 탐지하는 모델을 제안한다. 이 모델을 여기선 DeepPS이라 명칭한다. 이 모델의 주요 단계는 다음 두가지로 나뉜다.
- Input image에서 모든 marking points를 확인한다.
- Marking points의 쌍에 의해 형성된 로컬 이미지 패턴들을 분류한다.
여기서 Input image는 AVM과 같은 형태의 surround-view image이다.
이 논문에서는 전형적인 실내외 주차 공간에서 수집한 12165개의 surround-view 이미지 데이터셋을 구축하여 사용했다. 자체적으로 데이터셋을 구축한 것 같고 이 분야에서 가장 큰 데이터셋이라고 언급하고 있다.
공개된 데이터셋 : https://cslinzhang.github.io/deepps/
Introduction
전형적인 Self-parking system의 workflow는 다음과 같다.
- 주차 지역에 접근할 때, 차량은 낮은 속도의 무인 모드로 바꾼다.
- 자동으로 미리 결정된 트랙을 따라 주행한다.
무인 모드(unmanned mode)로 동작할 때, 차량은 high-definition maps, GPS signals, 또는 SLAM(Simultaneous Localization and Mapping)과 같은 기술에 의존할 수도 있다.
주행하는 동안에, 차량은 주변에 이용가능한 주차 구역을 찾거나 / 주차 구역 관리 시스템에 의해 할당된 주차 구역을 확인하고 위치를 알아내려 시도한다. 일단 적절한 주차 구역이 탐지되고 위치된다면, 차량은 자동 주차 모드로 바꾸고 주차 경로를 계획할 것이다. 최종적으로 지정된 주차 구역에 차량을 주차한다.
이 시스템의 중요한 이슈는 어떻게 빠르고 정확하게 차량 주변의 주차 구역을 탐지하고 그 중 하나의 위치를 정하는가 이다.
Related Work
A. Vision-Based Parking-Slot Detection: Algorithms and Datasets
- Free-space-based
- 개념 : 인접한 차량들 사이의 적절한 빈 공간을 인식함으로써 타겟 주차 위치를 지정한다.
- 접근 : 가장 넓게 사용되는 방법이며, 다양한 거리 측정 센서(range-finding sensors)를 사용하여 구현될 수 있다. - [ex) Ultrasonic sensors, Laser scanners, Short-range radars, Structured light, Depth cameras, Stereo cameras]
- 결함 : 참조로써 이미 차량들이 적절하게 주차되어 있다는 것을 전제로 한다. 이 말인 즉슨, 차량이 없는 열린 공간(open space)에서는 작동이 불가하다는 이야기다. 게다가, 이 방법의 정확도는 인접한 차량들의 주차된 위치와 포즈에 크게 의존한다.
- Vision-based
- 개념 : 땅에 그려진 주차 라인에 의해 정의된 주차 구역(parking-slots)을 확인하고 위치를 정한다.
- 접근 : AVM(Around View Monitoring) 시스템에서 사용되는 넓은 FOV(Field of View) 이미징 센서들을 사용하여 구현될 수 있다.
- 선행 연구 목록
- 주차 선의 색상 구분이 명확하다는 가정하에 주차선을 분할하는 신경망을 훈련한 뒤, 주차 구역 윤곽으로써 두 수직선(two perpendicular lines)을 어림잡는다. But, 기울어진 주차 구역과 같은 다른 타입의 주차 구역은 다룰 수 없다.
- 타겟 주차 구역 안쪽에 수동으로 제공된 지점을 기반으로 방향성 있는 기울기를 확인함으로써 주차 구역의 선 부분을 인식하는 원터치 방법.
- 운전자에 의해 제공된 주차 구역 entrance-line에 관한 두 지점에 기반하여 다양한 유형의 parking-slot-markings를 인식할 수 있는 투터치 방법.
- 빈 주차 구역을 확인하는 것을 운전자에게 의존하는 반자동 방식.
- 완전 자동화된 접근
Jung et al은 주차 선들이 고정된 넓이의 선들로 구성된다고 가정하고 peak-pair 탐지를 적용하고 Hough space에서 클러스터링함으로써 주차 선들을 인식했다. 주차 선 부분들을 분리하는 것은 T 모양의 template을 매칭함으로써 인식되었다. 비슷한 아이디어를 기반으로, Random 변형을 이용한 방법도 있다.
위 그림은 전형적인 vision-based 주차 구역 탐지 시스템의 고수준 구조를 보여준다. 보통 surround-view synthesis와 parking-slot detection from the surround-view 두 독립적인 모듈로 이루어진다. 일반적으로 surround-view 카메라 시스템은 차량 주변에 탑재된 각기 다른 방향을 찍는 4~6개의 wide-angle 카메라들로 구성된다. Surround-view synthesis 모듈은 차량 주변의 360도 surround-view 이미지를 생성한다. 주차 구역 탐지 모듈은 이 surround-view 이미지를 입력으로 해서 주차 구역을 탐지하고 그것들의 차량 중심(vehicle-centered) 좌표계에 관한 물리적인 위치를 내보낸다.
B. Deep Convolutional Neural Networks
DCNN을 이용한 R-CNN 아키텍처는 object detection을 수행할 수 있는 multi-stage detection framework다. R-CNN은 주어진 입력에 대해 objects를 포함하고 있을 가능성이 가장 높은 bounding-boxes를 찾는 object proposal 알고리즘을 첫 번째로 사용한다. 그리고나서 DCNN이 각 제안된 bounding-box에 feature extractor로써 적용되고 classifier가 box 안의 object class를 결정한다.
R-CNN에서 향상된 Fast-RCNN, Faster-RCNN, HyperNet 등과 같은 모든 변형된 아키텍쳐와 R-CNN은 object proposal에 매우 의존적이다. 그러므로 object proposal 알고리즘의 수행능력은 병목현상이 발생된다. 그래서 DCNN 기반 object detection 시스템에서 object proposal 알고리즘의 필요에 대한 연구가 시작되었다. 해당 연구들은 object detection을 공간적으로 분리된 bounding-boxes와 연관된 class 확률에 대한 regression 문제로써 나타내었다. 그러한 방법의 대표로 Yolo, SSD, YoloV2 등이 있다. 이 방법들의 실험 결과로 R-CNN 만큼의 정확도를 보여주었으며 더 빠르게 실행되었다.
결과적으로, 이 논문에서 parking-slot detection 접근법인 DeepPS는 marking-points를 탐지하기 위해 YoloV2를 채택했다.
C. DeepPS (Deep Parking-Slot)
- Summary
먼저, DeepPS는 주어진 surround-view 이미지에서 YoloV2 기반 pre-trained marking-point detector를 사용하여 marking-points를 탐지한다. marking-point 패턴은 위 그림처럼 두 개의 주차 선 부분이 교차하는 지점의 중앙 부분을 의미한다. 이 탐지된 marking-points p1, p2가 주어지면, 그 점들이 타당한 entrance-line을 형성할 수 있는지 아닌지를 결정하고 가능하다면 이 parking-slot의 유형을 결정할 필요가 있다. 이 task는 표준 pre-trained DCNN 모델을 사용하여 p1과 p2에 의해 정의된 로컬 이미지 패턴을 분류함으로써 이행할 수 있다.
DeepPS는 "T-shaped" 또는 "L-shaped" marking-points로 구성된 대부분의 parking-slot의 유형을 다룰 수 있다. 위 그림은 DeepPS가 잘 대처할 수 있는 이상적인 parking-slot 모델들이다. 그림에서 보듯 수직, 평행 또는 기울어진 parking-slot이 이상적인 모델이다.
parking-slots을 탐지하기 위해 다음 세 가지 주요 단계를 거친다.
- Marking-point detection
- Local image pattern classification
- Parking-slot inference
- Marking-Point Detection
먼저, testing stage에서 DeepPS는 주어진 surround-view 이미지에서 모든 marking-points를 탐지해낸다. 이를 위해 marking-point detector D를 훈련시킬 필요가 있다.
앞서 이야기한대로 detector D는 YoloV2를 기반으로 한다. D를 훈련시키기 위해 training samples를 준비해야 하는데 이 준비 과정에서 학습 데이터인 surround-view 이미지에 있는 모든 marking-points의 위치에 수동적으로 ground-truth를 표시했다. p¡의 ground-truth bounding-box로써 marking-point p¡를 중심으로 p x p로 고정된 크기의 box가 고려되었다.
또한, Detector D는 회전 불변(rotation invariance) 속성을 가져야 하므로 각 이미지를 회전하여 데이터를 증식(augmentation)시켰다.
구현에서는 VOC 데이터셋을 훈련시킨 YoloV2 모델을 fine-tuning했으며 하이퍼파라미터는 다음과 같다.
- mini-batch size = 64
- learning rate : started from 0.0001
- weight decay (L2 규제화) : 0.0005
- momentum : 0.9
- Local Image Pattern Classification
Detector D에 의해 계산된 confidence scores 중 임계값보다 더 큰 scores를 가진 points가 marking-points로써 고려된다. 탐지된 두 marking-points를 p1과 p2라 하면 해당 두 점이 타당한 entrance-line을 형성할 수 있는지 검증해야 한다. p1과 p2를 이은 직선이 후보라고 하면 두 점 사이의 거리는 약간의 제약들을 만족해야 한다. 후보 직선이 평행 주차 구역이라면 t1 < ||p1p2|| < t2를 만족해야 하고, 수직 혹은 기울어진 주차 구역이라면 t3 < ||p1p2|| < t4를 만족시켜야 한다. 파라미터 t1, t2, t3, t4는 다양한 유형의 주차 구역의 entrance-line 길이에 대한 선험적 지식을 기반으로 설정된다.
하지만 거리 제약을 만족시켰다고 해서 타당한 entrance-line을 형성한다고 볼 수 없다. 위 그림이 그 예시 중 하나다. 또한, 해당 직선이 타당한 entrance-line이라고 가정하면 연관된 주차 구역이 시계 방향 쪽에 있는지 반 시계 방향 쪽에 있는지와 직각인지 기울어진 건지를 결정해야 한다.
이러한 모든 이슈는 사전정의된 classes 중 하나로 local image pattern을 분류함으로써 해결될 수 있다.
Surround-view 이미지에 있는 두 marking-points p1, p2에 의해 정의된 local image pattern은 다음과 같이 추출된다.
먼저, 지역 좌표계를 구축한다. p1과 p2의 중간 지점을 원점으로 취하고 두 점을 이은 직선을 X-축으로 취한다. 그것의 Y-축은 그 결과에 따라 결정된다. 그런 뒤, 이 좌표계에서 X-축과 Y-축 둘 다에서 대칭적인 사각 지역 R이 정의된다. 한 쪽의 길이는 ||p1p2|| + △x로, 다른 쪽의 길이는 △y로 설정되며 위 그림의 (a)와 같이 된다. 이제 surround-view 이미지에서 R에 해당하는 이미지 부분을 추출하고 크기를 w x h로 정규화시킨다. 이렇게 생성된 이미지가 local image pattern으로 고려된다.
이제 training stage를 고려해보자.
label 데이터를 기반으로 각 marking-points 쌍에 의해 정의된 모든 local image pattern으로 구성된 집합 C를 얻을 수 있다. 그 다음, 연관된 주차 구역의 특성들에 따라 집합 C에 있는 샘플들을 7 classes로 카테고리화시킬 수 있다. 다음은 각 classes의 label이다.
- right-angled anticlockwise (직각, 반시계 방향) - (b)
- slanted anticlockwise with an acute parking angle (기울어짐, 반시계 방향, 예각) - (c)
- slanted anticlockwise with an obtuse parking angle (기울어짐, 반시계 방향, 둔각) - (d)
- right-angled clockwise (직각, 시계 방향) - (e)
- slanted clockwise with an obtuse parking angle (기울어짐, 시계 방향, 둔각) - (f)
- slanted clockwise with an acute parking angle (기울어짐, 시계 방향, 예각) - (g)
- invalid - (h)
예각과 둔각은 p1을 기준으로 한 각도 같다.
직각 주차 구역이 slanted 주차 구역보다 훨씬 많아 소수의 classes 데이터를 oversampling 하는 SMOTH를 사용했다.
집합 C를 가지고 class label을 예측하는 분류 모델 M을 훈련시킬 수 있다. 분류 모델에는 DCNN이 자연스러운 선택이다. 그렇지만 다음 두 가지 요건을 이유로 이미 존재하는 DCNN 아키텍쳐를 직접 사용하지 않았다.
1) 집합 C의 이미지 샘플들의 크기는 48 X 192이므로 인기 public DCNN의 요구된 크기보다 더 작다. 물론 public DCNN 모델의 요구를 만족시키기 위해 이미지들을 upsample할 수 있지만 분명히 가장 효율적인 방법은 아니다.
2) 거의 모든 인기 public DCNN 구조는 ImageNet의 이미지 분류 task를 위해 설계된다. ImageNet 분류 task는 1000개의 classes를 가지고 있는 반면 이 task는 단지 7 classes를 가지고 있다. 더욱이 이 이미지 패턴들의 복잡성은 일반적인 이미지들의 복잡성보다 더 낮다. 이러한 이유로, computing speed, 저장 공간 요구 등의 이점 때문에 작은 크기의 네트워크를 고려한다.
그러므로 AlexNet을 기반으로 커스터마이징하여 분류 모델을 만든다. 구조는 위와 같다. 입력은 48 x 192 grayscale 이미지가 주어지며 위에 분류한대로 7개의 출력을 내보낸다. 하이퍼파라미터는 다음과 같다.
- mini-batch size = 256
- learning rate = started from 0.002
- weight decay = 0.0005
- momentum = 0.9
- Parking-Slot Inference
자율 주차 시스템에서 주차 구역은 일반저그로 평행사변형이 고려되며 보통 4개의 정점 좌표들로 표시된다. 대부분의 경우, 두 개의 좌표는 보이지 않으며 추론을 통해 얻을 수 있다. 이를 위해 선험적 지식으로써 미리 알려진 주차 구역의 깊이를 추정해야 한다.
수직, 평행, 기울어진 주차 구역의 깊이를 각각 d1, d2, d3로 정의해보자.
p1, p2에 의해 정의된 local image pattern이 "right-angled clockwise" 또는 "right-angled anticlockwise"로 분류되었다고 하면, 보이지 않는 두 개의 좌표 p3, p4는 쉽게 계산될 수 있다. 위 그림의 (a)가 그 예시로, 아래의 계산으로 추론할 수 있다.
p1, p2에 의해 정의된 local image pattern이 "slanted"로 분류되었다면, 주차 각도 α를 계산해야 한다. 이 이슈 해결을 위해 template-matching 기반된 전략이 사용된다. 일단 위 그림 (d)와 같이 여러 각도의 이상적인 "T-shaped" 집합을 미리 준비한다. 여기서 각 template는 s x s 크기이며 zero-mean이다. testing stage에서, 각 p1, p2의 중앙에서 두 s x s 크기의 이미지 부분 I1, I2을 추출하고 다음 공식에 의해 α를 계산한다.
여기서 M은 template의 개수며, T는 template 이미지다. * 은 correlation 연산을 의미한다.
이렇게 α를 구하면 다음 공식에 의해 p3, p4를 구할 수 있다.
DeepPS의 전반적인 pipeline은 다음과 같다.
다음은 논문에서 제공한 오픈소스를 실행시키는 방법이다.
https://cslinzhang.github.io/deepps/ 에 들어가면 여러가지 평가와 함께 데이터와 코드 링크가 있다.
먼저, ps2.0.zip은 데이터 파일로 훈련데이터와 테스트데이터가 있고 각 이미지에 해당하는 mat파일이 존재한다. 다음으로 MarkingPointDetectionAndPerformanceMeasure.zip은 학습된 가중치와 테스트 데이터를 이용해 FPPI vs Miss rate 그래프를 그릴 수 있는 코드를 제공한다. 마지막으로, DeepPSMat.zip은 이미 학습된 가중치와 예측 코드가 있다.
테스트 환경
- Windows 10
- Matlab R2018 / R2019
- CUDA 8.0 ( CUDA 10.1 버전 호환 안 됨 )
DeepPSMat 폴더 안에 ps2.0.zip 파일 압축을 풀었다고 가정하여 진행한다.
많은 파일들 중 processTestImgs.m이 메인 파일이다. 이 코드를 돌려보기 위해 몇 가지 수정이 필요하다.
- 데이터 경로 수정
- Line 51, 56 in processTestImgs.m
- Line 13 in precisionRecall.m
데이터 경로를 수정하고 processTestImgs.m 파일을 실행시키면 caffe.Net 에러가 발생한다.
이 때 caffe.Net 파일에 들어가서 다음을 수정한다.
- caffe 로드 시 문제해결
- Line 71 in caffe.Net
수정 전
function delete (self)
caffe_('delete_net', self.hNet_self);
end
수정 후
function delete (self)
if self.isvalid
caffe_('delete_net', self.hNet_self);
end
end
이제 다시 실행해보면 잘 실행되는 것을 확인할 수 있다.
결과
The precision for the test folder outdoor-slanted is 0.9625
The recall for the test folder outdoor-slanted is 0.95062
'A·I' 카테고리의 다른 글
[object detection] Single Shot Multibox Detector (SSD) 아키텍쳐 분석 (0) | 2019.08.08 |
---|---|
[object detection] YOLO 모델의 원리 (9) | 2019.07.22 |
Keras로 구현하는 DCGAN (4) | 2019.05.26 |
What is AI and an Agent? (0) | 2019.04.18 |
DSP를 이용한 음성 인식 (speech recognition) 구현 1편 : 음성 데이터 분석 (9) | 2019.03.12 |
댓글