
데이터의 '잔차'가 들려주는 숨겨진 이야기: Lidar DEM 차분 분석 탐구
Lidar DEM 데이터의 차분 분석을 통해 데이터 사이의 '차이'가 말해주는 숨겨진 정보를 찾는 방법과 오픈소스 RESIDUALS 프로젝트의 인사이트를 공유합니다.
김영태
테크리드

안녕하세요. 풀링포레스트 테크리드 김영태입니다.
개발자로서 로그나 메트릭 데이터를 다루다 보면, 종종 '원본 데이터' 그 자체보다 데이터와 데이터 사이의 '차이'가 더 많은 진실을 말해줄 때가 있습니다. 평온해 보이는 트래픽 그래프 뒤에 숨겨진 마이크로 버스트나, 정상 범위 내에 있지만 미묘하게 어긋난 레이턴시 같은 것들 말이죠. 최근 백엔드 인프라 모니터링을 고도화하면서 노이즈 속에서 유의미한 신호를 걸러내는 방법에 대해 고민이 깊었습니다. 그러던 중, 지리 정보 시스템(GIS) 분야에서 Lidar 데이터를 분석하는 흥미로운 접근법을 발견해 여러분과 공유해보려 합니다. 바로 RESIDUALS라는 오픈소스 프로젝트입니다.
이 프로젝트는 디지털 표고 모델(DEM, Digital Elevation Model)에서 지형의 특징을 찾아내기 위해 '차분 분해(Differential Decomposition)'라는 방식을 사용합니다. 언뜻 보면 지리 데이터를 다루는 분들에게만 해당되는 이야기 같지만, 신호 처리와 데이터 필터링의 관점에서 백엔드 개발자들에게도 시사하는 바가 큽니다.
무엇을, 왜 쪼개는가?
우리가 흔히 접하는 Lidar 데이터는 엄청난 양의 포인트 클라우드로 이루어져 있습니다. 여기서 도로나 건물의 경계, 혹은 산의 능선 같은 특정 '특징(Feature)'을 찾아내려면 어떻게 해야 할까요? 단순히 눈으로 봐서는 알기 어렵습니다.
RESIDUALS의 접근 방식은 아주 체계적이고 집요합니다. 원본 데이터를 다양한 알고리즘으로 분해(Decomposition)하고, 다시 업샘플링(Upsampling)한 뒤, 그 결과물들 사이의 차이(Residuals)를 계산합니다. 핵심 통찰은 이것입니다. "서로 다른 알고리즘은 서로 다른 특징을 보존하거나 제거한다."
예를 들어, 가우시안(Gaussian) 필터는 부드러운 변화는 남기지만 급격한 경계선은 뭉개버립니다. 반면 바이래터럴(Bilateral) 필터는 경계선을 보존하면서 노이즈를 제거하죠. 이 두 필터를 거친 결과물의 차이를 구하면, 그 차이가 바로 '경계선'이 되는 원리입니다.
4단계 차분 계층 구조
이 도구는 단순히 원본과 필터링된 결과만 비교하지 않습니다. 총 4단계의 깊이 있는 비교를 수행합니다.
Level 0 (Ground Truth): 원본 DEM 데이터입니다.
Level 1 (Decomposition Residuals): Bicubic, Lanczos, B-Spline, FFT 등 다양한 방식으로 처리된 데이터입니다.
Level 2 (Residual vs Ground Truth): 각 처리 방식이 원본과 얼마나 달라졌는지(Δ)를 봅니다. 여기서 특징이 드러납니다.
Level 3 & 4 (Divergence): 방법론 간의 불일치(Divergence)를 봅니다. 즉, A 알고리즘과 B 알고리즘이 서로 다른 결과를 내놓는 지점이 어디인지를 찾는 것입니다.
저는 개인적으로 Level 3의 '발산(Divergence)' 개념이 가장 인상적이었습니다. 단순히 에러를 찾는 게 아니라, "알고리즘들이 서로 헷갈려하는 부분"이 어디인지를 시각화한다는 점이, 마치 우리가 분산 시스템에서 데이터 정합성이 깨지는 지점을 추적하는 과정과 닮아 있었기 때문입니다.
직접 돌려보기: 실험과 발견
백문이 불여일타, 직접 코드를 받아 실행해 보았습니다. Python 환경만 있다면 쉽게 시작할 수 있습니다.
# 저장소 클론 및 설치
git clone https://github.com/bshepp/RESIDUALS.git
cd RESIDUALS
pip install -r requirements.txt
# 테스트 DEM 생성 (Lidar 파일이 없어도 numpy로 생성 가능)
python run_experiment.pyrun_experiment.py를 실행하면 기본적으로 제공된 테스트 DEM을 바탕으로 다양한 조합을 실험합니다. 만약 실제 Lidar 데이터(.las 파일)가 있다면 generate_test_dem.py를 통해 직접 데이터를 구워낼 수도 있습니다.
실험의 꽃은 run_exhaustive.py입니다. 무려 39,731개에 달하는 파라미터 조합을 전수 조사합니다.
# 제한된 범위로 테스트 실행
python run_exhaustive.py --max-decomp 2 --max-upsamp 2물론 모든 조합을 다 돌리려면 상당한 컴퓨팅 리소스가 필요합니다. 저도 처음엔 로컬 맥북에서 패기 있게 전체 실행을 걸었다가 팬 소리가 이륙하는 것을 듣고 황급히 중단했습니다. 실무에서 대용량 데이터를 다룰 때는 반드시 --max-decomp 같은 옵션으로 범위를 좁혀서 테스트해보시길 권장합니다.
어떤 알고리즘이 무엇을 보는가?
이 프로젝트는 각 분해 방법이 어떤 특징을 잘 잡아내는지 명확히 정리하고 있습니다.
Gaussian: 부드러운 기울기나 계곡 같은 지형을 잘 봅니다.
Bilateral: 엣지(Edge)를 보존하므로, 건물이나 절벽 같은 급격한 경계를 찾는 데 유리합니다.
Wavelet: 주파수 분리를 통해 특정 스케일(크기)의 특징만 골라낼 수 있습니다.
Morphological: 형태학적 연산(Opening/Closing)을 통해 산봉우리나 웅덩이 같은 요철을 강조합니다.
여기에 업샘플링 방법(Bicubic, Lanczos, FFT 등)까지 조합하면 수많은 '필터'를 만들 수 있습니다. 결과물은 거대한 그리드 형태의 이미지로 출력되는데, 가로축과 세로축이 만나는 지점마다 서로 다른 지형적 특징이 하이라이트 되는 모습이 꽤 장관입니다.
한계와 배울 점
물론 만능은 아닙니다. 문서를 읽어보니 Morphological 방법은 이미지 경계면에서 아티팩트(원치 않는 노이즈)가 발생하는 문제가 있고, Polynomial 분해는 국소적인 특징보다는 전체적인 경향성만 파악한다는 한계가 있었습니다. 또한, 4000x4000 이상의 대형 DEM을 처리할 때는 시각화 파일 크기가 기하급수적으로 커져 메모리 관리가 필수적입니다.
하지만 제가 이 프로젝트에서 얻은 가장 큰 배움은 '비교의 힘'입니다.
우리는 종종 "가장 좋은 하나의 알고리즘"을 찾으려 노력합니다. 하지만 RESIDUALS는 "완벽한 알고리즘은 없다, 대신 여러 알고리즘의 차이를 통해 보이지 않는 것을 보자"고 말합니다.
서버 로그 분석이든, 데이터베이스 쿼리 최적화든, 혹은 GIS 데이터 처리든 마찬가지입니다. 하나의 뷰(View)만 고집하지 않고, 여러 각도에서 데이터를 쪼개고 비교해볼 때 비로소 숨겨져 있던 '진짜 정보'가 드러납니다. 여러분도 지금 다루고 있는 골치 아픈 데이터가 있다면, 한 번쯤은 '차분(Differential)'의 관점에서 바라보는 건 어떨까요? 의외의 실마리가 그 '차이' 속에 숨어있을지도 모릅니다.


