Traffic Sign Traffic Light

KDT Project
- 과정명 : K-Digital Training: 프로그래머스 자율주행 데브코스(Perception)
- 교육기관 : 프로그래머스
- 이수기간 : 2023.03.17~2023.08.18
프로그래머스 자율주행 데브코스에서 경진 대회를 진행하였다. Jetson TX2를 탑재한 자율주행 차량에 yolov3로 학습한 객체 인식 모델을 적용시켜 차선, 표지판, 장애물 등을 인식하고, 이를 기반으로 상황별 미션을 수행하는 것을 목표로 한다.
- 모든 차량은 출발지점의 정지선에서 신호 대기
- 신호등의 출발 신호에 맞춰 출발
- 제시되는 표지판의 내용대로 정지, 좌, 우 조향 제어
- 동적 장애물은 갑작스레 등장할 예정
인지부 1명, 판단부 2명, 제어부 1명으로 팀을 구성하여 협업을 진행하였다. 본선에서 촬영 카메라 오인식으로 인한 차선 이탈 1회, 기둥에서 정지 1회로 재위치를 2번하여 2등을 하였다.
데이터 준비
학습 데이터로 강의장 환경을 이용하였다. 차선 인식이 되는 자이카가 강의장을 돌아다니며 ROS bag 형태로 데이터를 수집하면 이것을 jpg로 변환 후 라벨링을 진행하였다.
TSTL class
left
right
stop
crosswalk
uturn
traffic_light
xycar
ignore
클래스는 총 8가지로 표지판과 신호등이다. 거리가 너무 먼 객체는 탐지하지 않기 위해 ignore로 처리하였다. uturn은 표지판이 없어서 학습하지 않았다가 추후 동적 장애물 탐지를 위해 small로 변경한다.
YoloLabel
데이터 라벨링 툴로 YoloLabel을 사용하였다. 쉽게 설치 가능하고 간단한 조작만으로 라벨링을 할 수 있다는 장점이 있다.
모델 변환
ONNX 변환
강의에서 직접 만든 yolov3에서 특정 레이어를 제거한 yolo-tiny 모델을 이용하여 학습하였다. TX2에서 TensorRT로 변환을 위해 ONNX로 변환을 진행한다.
TensorRT 변환
최적화를 시켜 주행환경에서 안정적인 정확성과 fps를 확보하기 위함이다.
trt 모델 생성 후 추론
trt 모델 로드 후 추론
추론 결과
결과
epoch 100 - 추론 실패
총 데이터 484
train : val : test = 423 : 52 : 9
400장 가량의 데이터로 예측을 시도하였지만 결과가 나오지 않았다.
epoch 400
pretrained weights
사용
cfg
수정 NMS
threshold 낮게 수정
인식은 되지만 한 클래스에 Bbox가 중복되고 정확도도 낮다.
![]() |
epoch 1100 - loss 0.021
epoch가 거듭될수록 전반적인 정확도가 높아진다. xycar, traffic light는 특징점이 많아서 인식이 잘되지만 형태가 유사한 left, right는 여전히 정확도가 낮다. cls loss가 지속적으로 감소하는 것을 확인하고 추가 학습을 결정하였다.
![]() | ![]() |
![]() | ![]() |
epoch 8400 - loss 0.008
충분히 학습이 되었는지 cls loss가 수렴하는 양상을 보인다. 더이상 Bbox는 중복되지 않고 정확도도 충분히 잘 나온다.
![]() | ![]() |
![]() | ![]() |
Auto Labeling
예측용 코드를 수정하여 400장으로 학습한 모델을 통한 오토라벨링 구축하였다. 모델이 라벨링을 하면 데이터 검수를 통해 기존에 잘못 라벨링되었거나 잘못 추론된 데이터 수정하였다. 검수 작업만으로 1300장 가량의 라벨링 작업을 손쉽게 진행하였다. 확보한 데이터의 클래스별 비율을 통일한 후 재학습시켰다.
총 데이터 1735
train : val : test = 1565 : 150 : 20
총 step은 전과 동일하게 진행하였지만 데이터셋 증가로 총 epoch는 2500회로 감소하였다. 같은 step에서 이전보다 loss값이 낮아졌다.
![]() | ![]() |
오토라벨링으로 추출된 라벨 중 신호등 이미지만 추출하여 crop하였고 신호등 색상 인식을 위한 검증 용도로 사용하였다.
RED | YELLOW | GREEN | OFF |
---|---|---|---|
![]() | ![]() | ![]() | ![]() |
미사용 클래스 변경
동적 장애물 회피를 위해 라이다를 이용하기로 계획하였다. 하지만 라이다가 기둥을 동적 장애물과 구분하지 못하였다. 해결 방안으로 동적 장애물(small
)이 인식될 때만 라이다를 활용하기로 결정하였다. 소량의 추가 데이터만으로 새로운 클래스인 동적 장애물 인식을 위한 학습 필요했다. 기존에 존재는 하였지만 사용하지 않던 uturn
클래스를 동적장애물 small
클래스로 변경하고 기존 데이터에 동적장애물 데이터 543장을 추가하여 재학습시켰다.
총 데이터 1735 + 543
train : val : test = 2050 : 200 : 28
epoch=2000
![]() | ![]() |
변경 클래스 추가 학습
추후 안정성 확보를 위해 backbone을 고정하고 head만 업데이트하는 fine-tunning을 하였다.
데이터는 small
로만 이뤄진 239장으로 구성하였다.
train : val = 220 : 19
300epoch만에 mAP가 개선되었다.
학습 전 epoch=2000
학습 후 epoch=2300