Computer Vision · Restoration · Evidenced Modernization

2013년의 내 알고리즘을,
2026년의 규율로 다시 짓다

학부논문(2013)으로 작성했던 차선이탈경보(LDW) 알고리즘 — 유일하게 남은 사본은 논문 PDF 부록에 인쇄된 OpenCV 2.x C/C++ 코드였습니다. 13년 뒤, 그 코드를 복원하고, 어디서 가정이 깨지는지 계측하고, 근거를 남기며 한 번에 한 가지씩 현대화했습니다.

01

복원 — 2013년 로직이 그대로 달립니다

Legacy restoration: 파란 차선, 노란 소실점 벡터, 빨간 Warning

복원된 legacy 파이프라인의 실주행 출력 (공개 Udacity 클립). 파랑 = 검출 차선, 노랑 = 소실점·방향 벡터, 빨강 = 경보. 원 논문의 고정 ROI → Sobel/Canny → Hough → 기울기·거리 필터 → 소실점 추정 → fading-memory 필터 → 2프레임 지속 경보 로직을 그대로 보존.

목표는 "차선 검출이 된다"가 아니라, 13년 전 나의 설계 판단을 감사(audit) 가능한 상태로 만드는 것 — 모듈 분리, 타입드 데이터클래스, 단위테스트 18개, CLI, 프레임별 메트릭 CSV.
02

첫 실패 — 그리고 근본원인 분석

직역 포팅본을 960px 폭의 공개 영상에 돌리자 221프레임 중 11프레임에서만 차선 2개가 잡혔습니다. 원인: 2013년 코드의 150px 후보거리 게이트는 당시 640px 소스 영상에 묶인 숨은 해상도 가정이었습니다.

직역 포팅 (숨은 가정 그대로)

150px 절대 임계값 → 960px 영상에서 두 차선 검출 11/221 프레임 (5%)

수정 (가정을 명시적으로)

640px 기준폭 대비 스케일링 → 동일 영상에서 221/221 프레임 (100%), 원본 640px 동작은 불변

이 실패 사례는 숨기지 않고 레포 README에 그대로 기록했습니다 — 복원 프로젝트의 가치는 성공 스크린샷이 아니라 추적 가능한 원인 분석에 있습니다.

03

4패널 비교 — 같은 프레임, 세 세대의 알고리즘

원본 | legacy | first modern | improved modern 4패널 비교

← 좌우 스크롤. originallegacy restoration(2013 로직 — Warning! 오탐이 깜빡임) → first modern(프로파일 ROI + 유한 선분 검출) → improved modern(제어상태 평가 + 게이트 뒤의 ML).

곡선·그림자 challenge 클립 4패널 비교

더 어려운 challenge 클립(곡선·그림자·주변 차량). legacy의 소실점이 흔들리는 동안 modern 트랙은 검출 신뢰도와 상태를 수치로 노출합니다.

04

ML은 게이트 뒤에서만 — 도메인 시프트를 아는 통합

경량 ML 차선 회귀 모델을 학습해 모든 프레임에서 실행하되, 고전 세그먼트 검출과의 일치 게이트(segment-agreement gate)를 통과할 때만 채택합니다. 합성 벤치마크(학습 도메인)에서는 대부분 채택되지만, 실도로 영상에서는 —

샘플 (실도로)프레임ML 실행률ML 채택률legacy 경보improved 상태
udacity_solidWhiteRight221100%0%0caution, normal
udacity_solidYellowLeft681100%0%24caution, normal
udacity_challenge251100%0%0caution, normal, unknown

— 게이트가 전부 거부합니다. 합성 데이터로만 학습된 모델이니 당연한 결과이고, 영상 오버레이에 ml rejected 0.36처럼 근거가 그대로 찍힙니다. 주장은 "경량 모델이 프로덕션 차선 검출기"가 아니라, ML 출력이 계측 가능한 어댑터와 가드레일을 거쳐야만 고전 검출기를 대체할 수 있는 구조를 만들었다는 것입니다. UFLD/ONNX 같은 실제 모델도 같은 어댑터·평가 파이프라인을 재사용합니다.

이 원칙은 제 다른 프로젝트들과 같습니다 — tools over tokens, models behind gates. 오류 허용치가 낮은 도메인에서 학습 모델은 검증 가능한 경로를 통해서만 결정에 개입해야 합니다.
05

왜 이 프로젝트인가

GitHub 레포 (코드·테스트·문서 전체) ← 포트폴리오 홈