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

복원된 legacy 파이프라인의 실주행 출력 (공개 Udacity 클립). 파랑 = 검출 차선, 노랑 = 소실점·방향 벡터, 빨강 = 경보. 원 논문의 고정 ROI → Sobel/Canny → Hough → 기울기·거리 필터 → 소실점 추정 → fading-memory 필터 → 2프레임 지속 경보 로직을 그대로 보존.
직역 포팅본을 960px 폭의 공개 영상에 돌리자 221프레임 중 11프레임에서만
차선 2개가 잡혔습니다. 원인: 2013년 코드의 150px 후보거리 게이트는
당시 640px 소스 영상에 묶인 숨은 해상도 가정이었습니다.
150px 절대 임계값 → 960px 영상에서 두 차선 검출 11/221 프레임 (5%)
640px 기준폭 대비 스케일링 → 동일 영상에서 221/221 프레임 (100%), 원본 640px 동작은 불변
이 실패 사례는 숨기지 않고 레포 README에 그대로 기록했습니다 — 복원 프로젝트의 가치는 성공 스크린샷이 아니라 추적 가능한 원인 분석에 있습니다.

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

더 어려운 challenge 클립(곡선·그림자·주변 차량). legacy의 소실점이 흔들리는 동안 modern 트랙은 검출 신뢰도와 상태를 수치로 노출합니다.
경량 ML 차선 회귀 모델을 학습해 모든 프레임에서 실행하되, 고전 세그먼트 검출과의 일치 게이트(segment-agreement gate)를 통과할 때만 채택합니다. 합성 벤치마크(학습 도메인)에서는 대부분 채택되지만, 실도로 영상에서는 —
| 샘플 (실도로) | 프레임 | ML 실행률 | ML 채택률 | legacy 경보 | improved 상태 |
|---|---|---|---|---|---|
| udacity_solidWhiteRight | 221 | 100% | 0% | 0 | caution, normal |
| udacity_solidYellowLeft | 681 | 100% | 0% | 24 | caution, normal |
| udacity_challenge | 251 | 100% | 0% | 0 | caution, normal, unknown |
— 게이트가 전부 거부합니다. 합성 데이터로만 학습된 모델이니 당연한 결과이고,
영상 오버레이에 ml rejected 0.36처럼 근거가 그대로 찍힙니다.
주장은 "경량 모델이 프로덕션 차선 검출기"가 아니라, ML 출력이 계측 가능한 어댑터와
가드레일을 거쳐야만 고전 검출기를 대체할 수 있는 구조를 만들었다는 것입니다.
UFLD/ONNX 같은 실제 모델도 같은 어댑터·평가 파이프라인을 재사용합니다.