1. 프로젝트 시작 동기
"RGB 값만 주어진 상황에서 깊이를 예측할 수 있을까?"라는 의문에서 시작한 프로젝트입니다. RGB-D 데이터를 활용하여 RGB만으로 깊이(Depth) 예측이 가능한지 검증하고자 이 여정을 시작하였습니다. 이를 위해 기존에 연구된 논문들을 조사하였습니다.
2. 참고 논문 탐색 과정
여러 연구를 검토하던 중 "Deep Monocular Depth Estimation via Integration of Global and Local Predictions" 논문을 발견하여 참고하게 되었습니다. 이 논문은 네트워크 구조, 손실 함수, 학습 방식에 대한 독특한 접근법을 제시하고 있어, 이를 바탕으로 구현을 진행하였습니다.
3. 논문 분석: 네트워크, 손실 함수, 학습 방법
1. Global Network
- 구조: Skip Connection이 추가된 인코더-디코더 아키텍처를 사용하였습니다.
- 인코더: VGG-16 네트워크의 conv1부터 conv5까지를 포함하여 구성하였으며, 사전 학습된 가중치를 사용하였습니다.
- 전이 학습 적용 및 레이어 동결: 모델의 일반화 능력을 향상시키기 위해 encoder1과 encoder2 레이어의 가중치를 동결하였습니다.
- Skip Connection: 요소별 합(Element-wise Summation)을 사용하여 인코더와 디코더의 대응되는 레이어를 연결하였습니다.
2. Local Network
- 구조: 9개의 합성곱 레이어와 마지막 출력 레이어로 구성되어 있습니다.
- 특징: Batch Normalization과 ReLU 활성화 함수를 사용하였으며, 풀링 레이어 없이 구현되었습니다.
3. Integration Network
- 구조: FFT를 사용하여 변분 문제를 해결하고 있습니다.
- 작동 방식: u-Update, d-Update, b-Update 단계를 반복적으로 수행하여 최종 깊이 맵을 계산합니다.
4. Discriminator
- 구조: LeakyReLU, Batch Normalization, 스트라이드가 있는 컨볼루션을 사용하여 공간 해상도를 줄입니다.
- 출력: 마지막에 Sigmoid 함수를 사용하여 출력값을 [0, 1] 범위로 스케일링합니다.
5. Training 과정
1) 글로벌 네트워크 학습
- 손실 함수: L1 손실을 사용하여 RGB 이미지와 실제 깊이 맵 간의 차이를 최소화합니다.
- 학습 에포크: 15 에포크로 학습합니다.
2) 로컬 네트워크 학습
- 손실 함수: L1 손실을 사용하여 예측된 그라디언트 맵과 실제 깊이 맵의 그라디언트 간의 차이를 최소화합니다.
- 그라디언트 계산: compute_depth_gradient 함수를 통해 실제 깊이 맵의 그라디언트를 계산합니다.
- 학습 에포크: 15 에포크로 학습합니다.
3) 전체 모델 학습
- 손실 함수: L1 손실과 적대적 손실(BCE 손실)을 결합하여 전체 모델을 학습합니다.
- 적대적 손실 가중치 설정: 적대적 손실의 가중치 η를 1e-3으로 설정하였으며, 이는 Generator와 Discriminator 간의 균형을 맞추기 위해 최적화된 값입니다.
- 학습률 조정: Integration Network와 Discriminator의 학습률을 각각 1e-5와 1e-4로 설정하여, Generator가 더 안정적으로 학습될 수 있도록 조정하였습니다.
- 판별자(Discriminator) 학습: Integration Network와 함께 Discriminator를 동시에 학습합니다.
- 학습 에포크: 15 에포크로 학습합니다.
4. 데이터셋 구현
- 네트워크 구현 과정: 논문의 네트워크 구조를 파이썬(PyTorch)으로 구현하였습니다. 실내(Indoor) 데이터셋을 학습시킬 예정이므로 깊이 값을 0~6,000mm로 클리핑하여 6m 이상의 데이터에 대한 신뢰성을 확보하였습니다.
- 데이터셋 구성: 총 39,366장의 RGB 이미지와 깊이 맵을 사용하였으며, 실내 환경에서 촬영된 데이터로 구성되어 있습니다.
5. 손실 함수 및 학습 파이프라인 구현 시 어려웠던 점
1. 손실 함수 결합의 복잡성
- 다중 손실 함수 조정: L1 손실(깊이 예측 오차)과 BCE 손실(적대적 학습을 위한 판별기 손실)을 결합하면서, 각 손실 함수의 비중을 설정하는 것이 모델 성능에 큰 영향을 미쳤습니다. 적대적 손실의 가중치 η를 최적의 값인 1e-3으로 설정하여 균형을 맞추었습니다.
- 손실 함수의 수렴 문제: 적대적 손실이 추가되면서 손실 값이 빠르게 수렴하지 않거나 발산하는 문제가 발생하여, 학습률을 조정하고 손실 비중을 변경하여 수렴을 유도하였습니다.
2. 학습 파이프라인에서의 병렬 학습 어려움
- 판별기와 생성기 동시 학습: GAN 구조에서는 Integration Network와 Discriminator를 번갈아 가며 학습시켜야 하는데, 두 네트워크 간의 학습 진행 속도가 달라 학습이 불안정해지는 문제가 있었습니다. 이를 해결하기 위해 Integration Network의 학습률을 낮추고, Discriminator의 학습률을 상대적으로 높게 설정하였습니다.
- 가중치 업데이트와 메모리 사용량 최적화: VGG 기반의 큰 인코더와 GAN 구조로 인해 메모리 사용량이 커서, GPU 메모리가 제한적인 경우 배치 크기를 줄여야 했습니다. Mixed Precision Training을 시도해보았으나, Integration Network에서 FFT 연산이 복소수와 주파수 도메인 계산을 포함하여 FP32 이상의 정밀도가 필요하였기 때문에 학습에 실패하였습니다. 따라서 배치 크기를 줄이는 방법으로 메모리 문제를 해결하였습니다.
6. 검증과 결과 분석
- 성능 분석: RGB 값만으로 깊이를 예측하는 과정에서 다음과 같은 성능을 얻었습니다.
- 검증 데이터셋 성능:
- RMSE: 0.48
- 검증 데이터셋 성능:

7. 추가적인 개선 방향
- 네트워크 구조 개선: Global Network를 구현할 때 논문에서는 VGG-16을 이용하였지만, 더 깊은 ResNet이나 EfficientNet을 이용하면 더 좋은 성능을 발휘할 것으로 예상됩니다. 이러한 네트워크들은 더 깊은 계층과 스킵 연결을 통해 특징 추출 능력이 우수하기 때문입니다.
- 데이터 증강 활용: 데이터 증강 기법을 적용하여 다양한 상황에서의 데이터로 모델을 학습시키면, 일반화 능력이 향상되어 더 좋은 성능을 발휘할 것으로 기대됩니다.
8. 프로젝트를 통해 얻은 통찰
- 배운 점: RGB-D 데이터를 활용한 **지도학습(Supervised Learning)**이 가능할지에 대한 궁금증을 해결할 수 있었습니다. 두 달 동안 네트워크를 구성하고 데이터셋을 만들어 보면서 이미지 학습에 대한 이해도를 높일 수 있었습니다.
- 향후 연구 방향: 지도 학습이 아닌 비지도 학습을 이용하여, 기존에 많은 데이터셋이 있는 RGB 값으로만 학습하여 깊이를 추론하는 프로젝트를 진행해보고 싶습니다. 예를 들어, **자기 지도 학습(Self-Supervised Learning)**을 활용하여 스테레오 이미지나 동영상 시퀀스를 이용한 깊이 추정을 시도해볼 계획입니다.
9. 코드 및 데이터셋 공유
전체적인 코드 및 데이터셋은 다음장 에서 공유하겠습니다.
'딥러닝' 카테고리의 다른 글
| [프로젝트] self_learning_depth 프레임워크 작성 (0) | 2025.01.14 |
|---|---|
| [프로젝트] MNIST pytorch 딥러닝 (1) | 2024.09.15 |
| [프로젝트] 카메라로 거리 예측하기 2 (0) | 2024.09.14 |
| [프로젝트] 카메라로 거리 예측하기 (2) | 2024.09.14 |
| 5. 내맘대로 만드는 딥러닝 프레임 워크 (손실함수) (1) | 2024.09.13 |