객체 인식과 depth 추정을 통한 차선 인식 주행 프로젝트
1:10 스케일 모형 차(Xycar)를 활용한 객체 인식 및 depth 추정을 통한 차선 인식 주행 프로젝트
개발 기간 : 2024.01.16 ~ 2024.01.26
- 프로젝트 소개
- 환경 설정
- 실행 방법
- 전체 과정
- 파일 구조
- 주행 영상
- Stacks
- 카메라 센서로 차선을 인식하여 Xycar가 주어진 코스를 완수한다
- 카메라 센서에서 획득한 이미지를 object detection 하여 인식한 표지판, 신호등에 맞는 반응을 한다
- 라이다 센서를 활용하여 돌발 장애물, 차량 장애물이 있을 시 정지하거나 회피한다
- 그렇지 않을 경우 과태료가 부과된다
- 차량 주변의 객체 위치 정보를 Bird’s Eye View로 표현한다
- ROS melodic
- Ubuntu 18.04 LTS
- OpenCV 4.5.5
- python3
- torch >= 1.7.0
- roslaunch로 YOLOV7.launch 파일을 실행시키면 된다
roslaunch yolov7 YOLOV7.launch
- 체스보드를 사용하여 캘리브레이션을 수행할 데이터 획득
- GML C++ Camera calibraion tool을 사용하여 camera intrinsic matrix과 distortion coefficient를 구한다
- 이를 활용하여 이미지의 왜곡을 제거한다
- 직접 이미지를 촬영하여 data로 사용하였다
- 이때 사용된 이미지는 위의 calibration이 적용된 이미지이다
- CVAT tool을 사용하여 labeling을 수행한다
- 총 9개의 class
- left, right, stop, crosswalk, green_light, yellow_light, red_light, car, ignore
- annotation 파일은 txt 파일이다
- (class_id, bbox_x, bbox_y, bbox_width, bbox_height)로 구성되어 있다
- 이때 bounding box 정보인 bbox_x, bbox_y, bbox_width, bbox_height는 normalize된 값이다
- bbox_x : bounding box의 중심 x 좌표
- bbox_y : bounding box의 중심 y 좌표
- bbox_width : object의 width
- bbox_height : object의 height
└─ tstl_dataset
├── tstl_train
| ├── Annotations <-- 라벨링 데이터
| ├── ImageSets <-- 이미지 데이터 파일명 list
| ├── JPEGImages <-- 이미지 데이터
| └── tstl.txt <-- class 정보
├── tstl_eval
| ├── Annotations
| ├── ImageSets
| ├── JPEGImages
| └── tstl.txt
└── tstl_test
├── ImageSets
└── JPEGImages
- https://github.com/WongKinYiu/yolov7
- yolo v7 모델을 전이학습하기 위해 1차로 AiHub dataset으로 학습을 진행하였다
- 그 후 획득한 데이터로 전이학습을 하였다
- 학습한 모델을 자이카가 탑재하기 위해서 onnx, tensorrt로 변환한다
- 위의 github에서 제공한 코드를 사용하여 변환하였다
- 예측 결과를 보면 대부분 90% 이상 confidence score를 보이며 객체 탐지에 대한 좋은 정확도와 안정성을 확인할 수 있다
- 또한, YOLOv7은 40에 가까운 FPS를 유지하며 기존 yolov3보다 대략 2~3배 높은 FPS 성능을 보여주며 실시간에 가까운 차선 인지와 객체 탐지가 가능하였다
- 모델을 통해 예측한 object와 자이카 간의 거리를 계산하기 하였다 (object의 bounding box 밑면의 중심과 자이카 앞 간의 거리)
- world 좌표와 image 좌표쌍을 구해 homography matrix를 구하는 방법으로 depth를 추정한다
- 거리는 x, y 좌표를 모두 이용하여 두 점간의 거리를 구하는 방법을 사용하여 계산하였다
- 기본적으로 차선을 인식하여 주행한다
- 돌발 장애물과 차량 장애물이 나타나면 LiDAR를 사용하여 정지하거나 회피 주행을 수행한다
- 정지선을 인식하면 3초 정지하였다가 주행한다
- 정지선의 경우 검출된 직선의 기울기와 길이를 통해 인식하였다
- object를 인식한 경우 그 object에 맞게 주행한다
- 초록불 (green light) : 전진
- 빨간불 (red light) : 정지 (초록불이 들어올 때까지 정지)
- 정지 표지판 (stop) : 3초 정지 후 전진
- 횡단보도 표지판 (crosswalk) : 3초 정지 후 전진
- 오른쪽 표지판 (right) : 2초 동안 오른쪽으로 회전 후 전진
- 왼쪽 표지판 (left) : 2초 동안 왼쪽으로 회전 후 전진
- get_homography
- homography matrix를 구하는 부분
- prepare_dataset
- 비디오로 촬영한 영상을 이미지로 변환하는 부분
- 이때 camera calibration을 적용하여 왜곡을 제거한다
- lane_detection_offline-main
- 주행을 수행하는 부분
- 카메라, LiDAR, YOLO로부터 메세지를 받아 처리하는 부분
- yolov7
- 카메라에서 획득한 이미지에서 object detection을 수행하는 부분
- yolo v7 모델과 weight 정보 파일이 있다
- 예측한 object의 bounding box를 통해 자이카와의 depth 계산
- object_id, bounding box 정보, depth 정보를 메세지로 발행한다