https://github.com/parkyunsu/stereo_depth_and_object_detection
Project : Distance Measurement and Object Detection Using Stereo Cameras
https://github.com/parkyunsu/stereo_depth_and_object_detection
Last synced: 3 months ago
JSON representation
Project : Distance Measurement and Object Detection Using Stereo Cameras
- Host: GitHub
- URL: https://github.com/parkyunsu/stereo_depth_and_object_detection
- Owner: PARKYUNSU
- Created: 2024-11-11T12:43:08.000Z (7 months ago)
- Default Branch: main
- Last Pushed: 2025-02-21T06:32:43.000Z (4 months ago)
- Last Synced: 2025-02-21T07:29:01.018Z (4 months ago)
- Language: Jupyter Notebook
- Homepage:
- Size: 110 MB
- Stars: 2
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Stereo Depth and Object Detection
## VIP 영상
Link : https://www.youtube.com/watch?v=so9aCNwSJqw
## 자율 주행을 위한 객체 인식 및 거리 측정 모델 개발
- 참여 인원 : 박윤수, 윤병호, 차준영, 최현우
- 프로젝트 기간 : 2024/11/6 ~ 2024/11/12### 프로젝트 주제
- 자율 주행 기술에서 가장 중요한 것은 도로 주행의 안정성을 높이는 것입니다. 자율 주행 차량은 다양한 환경에서 수많은 객체들(차량, 보행자 등)을 정확히 인식하고, 이들과의 거리를 정확히 측정할 수 있어야 안전한 주행이 가능합니다. 따라서 본 프로젝트는 **자율 주행 차량의 주행 안정성 강화**를 목표로, **주행 중 객체 인식 및 거리 측정을 정확히 수행할 수 있는 모델을 개발**하고자 합니다.
---
# 1. EDA
### txt file
[Car 0.00 0 1.55 614.24 181.78 727.31 284.77 1.57 1.73 4.15 1.00 1.75 13.22 1.62]
[Car | 0.00 | 0 | 1.55 | 614.24, 181.78, 727.31, 284.77 | 1.57 1.73 4.15 | 1.00 1.75 13.22 | 1.62]
| 클래스 이름 | 트렁케이션 | 오클루전 | 관찰 각도(alpha) | 2D 상자 좌표 | 3D 크기 | 3D 위치 | 회전 각도 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Car | 0.00 | 0 | 1.55 | 614.24, 181.78, 727.31, 284.77 | 1.57, 1.73, 4.15 | 1.00, 1.75, 13.22 | 1.62 |
- **클래스 이름** (`Car`): 객체 클래스
- **트렁케이션(truncation)** (`0.00`): 객체가 이미지의 경계에 의해 잘려진 부분(%). `0.0`은 잘려 있지 않음 `1.0`은 완전히 잘려 있음
- **오클루전(occlusion)** (`0`): 객체가 얼마나 가려져 있는지 나타냄. `0`은 가려지지 않음, `1`은 부분적으로 가려짐, `2`는 상당히 가려짐, `3`은 완전히 가려짐
- **관찰 각도(alpha)** (`1.55`): 객체가 카메라에 대해 회전된 각도를 라디안 값
- **2D 경계 상자 좌표** (`614.24 181.78 727.31 284.77`): 객체 좌표. 순서대로 `xmin`, `ymin`, `xmax`, `ymax`로, 좌측 상단과 우측 하단 모서리의 x, y 좌표
- **3D 크기** (`1.57 1.73 4.15`): 객체의 실제 크기 (단위: 미터)로, 순서대로 `높이`, `너비`, `길이`
- **3D 위치** (`1.00 1.75 13.22`): 객체가 카메라로부터 떨어진 거리. `x`, `y`, `z` 위치 좌표입니다.
- **회전 각도** (`1.62`): 객체의 회전 정도의 값## 1.1 KITTI Dataset Class Count
### 기존 Class Count
| 클래스 이름 | 개수 | 비율 (%) | 설명 |
| --- | --- | --- | --- |
| Car | 28,742 | 55.42% | 일반 승용차 |
| Van | 2,914 | 5.62% | 화물 밴 |
| Truck | 1,094 | 2.11% | 일반 트럭 |
| Pedestrian | 4,487 | 8.65% | 보행자 |
| Cyclist | 1,627 | 3.14% | 자전거 타고 있는 사람 |
| Misc | 973 | 1.88% | 기타 클래스 (특정 객체로 분류되지 않는 객체) |
| Tram | 511 | 0.99% | 도로 위 경전철 |
| DontCare | 11,295 | 21.78% | 모델 학습 시 무시해야 할 영역 및 객체 (출력되지 않음) |
| Person_sitting | 222 | 0.43% | 앉아 있는 사람 (보행자와 다른 클래스) |
| **총합** | **53,865** | **100%** | |### 변경된 Class Count
- Pedestrian, Person_sitting → Person
- Tram → Misc
- DontCare 삭제| 클래스 이름 | 개수 | 비율 (%) | 설명 |
| --- | --- | --- | --- |
| Car | 28,742 | 70.85% | 일반 승용차 |
| Van | 2,914 | 7.18% | 화물 밴 |
| Truck | 1,094 | 2.7% | 일반 트럭 |
| Person | 4,709 | 11.61% | 사람 |
| Cyclist | 1,627 | 4.01% | 자전거 타고 있는 사람 |
| Misc | 1,484 | 3.66% | 기타 클래스 (특정 객체로 분류되지 않는 객체) |
| **총합** | 40,570 | 100% | |### 최종 Augmentation Dataset
| Class | Objects | Percentage |
| --- | --- | --- |
| Car | 55,983 | 71.01% |
| Person | 8,779 | 11.14% |
| Van | 5,831 | 7.40% |
| Misc | 2,836 | 3.59% |
| Truck | 2,386 | 3.03% |
| Cyclist | 3,020 | 3.83% |
| **Total** | **78,835** | **100.00%** |---
# 2. Stereo Vision (Semi-Global Block Matching)
## 2.1 Disparity(시차)
Stereo Vision은 두 개의 카메라(왼쪽, 오른쪽)를 사용하여 깊이 정보를 추정하는 기술입니다. 왼쪽 이미지와 오른쪽 이미지를 통한 동일한 객체의 위치 차이를 → “**시차”** 라고하며, 객체의 깊이를 계산합니다.
$Where$:
$Baseline(T)$ : 두 카메라 간의 거리
$Focal Length(f)$ : 카메라 렌즈에서 이미지 센서까지의 거리 (카메라 내부 파라미터)
$Disparity(x_l - x_r)$ : 시차 (pixels)
$Depth(Z)$ : 깊이 (meters)
> 즉, 스테레오(두 개의 카메라) 비전에서 두 삼각형이 유사하면 대응하는 변의 길이 비율이 같다 라는 특성을 이용한 방법입니다
>### 시차 계산 Code
```python
# num_disparities=5*16 80픽셀까지의 시차
def compute_sgbm_disparity(left_image, right_image, num_disparities=5*16,
block_size=11, window_size=5, display=False):
""" SGBM 알고리즘을 사용하여 완쪽 오른쪽 이미지의 시차를 계산합니다.
"""
# P1, P2 페널티
P1 = 8 * 3 * window_size**2
P2 = 32 * 3 * window_size**2
sgbm_obj = cv2.StereoSGBM_create(0, num_disparities, block_size,
P1, P2, mode=cv2.STEREO_SGBM_MODE_SGBM_3WAY)# 시차 계산
# 16배 확대하여정수로 저장된 것을 16으로 나눠서 복원
disparity = sgbm_obj.compute(left_image, right_image).astype(np.float32)/16.0# 시각화
if display:
plt.figure(figsize = (40,20))
plt.imshow(disparity, cmap='cividis')
plt.title('Disparity Map', size=25)
plt.show();return disparity
```> P1 : 시차 1픽셀 차이시 패널티
>> P2 : 시차가 크게날시 패널티
>
>
> P2는 P1 보다 큰 값으로 설정하여 시차가 크게날 상황을 억제
>> cv2.STEREO_SGBM_MODE_SGBM_3WAY : 왼쪽-오른쪽 이미지 매칭을 세방향(왼쪽-오른쪽, 상단-하단, 대각선)으로 수행
>## 2.1 Resizing
### 2.1.1 640 X 640 VS 1245 X 375(원본비율)
1. **640 X 640 Depth 결과**
2. **1245 X 375 (원본비율) Depth 결과**

3. **Resizing이 Stereo Vision Disparity 안정성에 미치는 영향**
- **640 X 640**
![]()
- **1245 X 375**
> 원본 이미지의 Bbox 비율이 Aspect Ratio와 맞지 않을 것을 고려해, 640x640 이미지로 Resizing하여 테스트하였지만, 오히려 원본 이미지에서의 disparity가 더 안정적인 것을 확인할 수 있었다.
>> 원본 이미지의 Bbox도 Aspect Ratio에 맞는 비율로 확인
>---
# 3. Object Detection Result with YOLOv8
## 3.1 YOLOv8s 모델 성능에 대한 그래프

> All classes에 대해 90%이상의 높은 성능을 확인할 수 있었습니다.
>## 3.2 Confusion Matrix

> TP값 기준 모든 클래스 80% 이상으로 높은 성능을 확인 했습니다.
>## 3.3 Epochs에 따른 성능 변화

results(loss, mAP, precision, reacall)

각 클래스에 대한 AP, mAP 값
> 200epochs동안 Overfitting 없이 학습 회수에 따라 성능이 개선 됨을 확인 했습니다.
>