입력 데이터 처리 순서
원본 CULane image:
[590, 1640, 3] BGR uint8
crop:
image[270:, :, :]
[320, 1640, 3]
resize:
cv2.resize(..., (800, 320))
[320, 800, 3]
normalize:
float32 / 255.0
[320, 800, 3], range 0~1
transpose:
HWC -> CHW
[3, 320, 800]
batch:
[1, 3, 320, 800]
- crop은 CULane 이미지의 위쪽 하늘/먼 배경 영역을 잘라내는 역할
모델 출력 처리 순서
model output:
[1, 192, 78]
remove batch:
predictions = predictions[0]
[192, 78]
score 계산:
softmax(predictions[:, :2])[:, 1]
[192]
confidence filter:
score >= 0.4
[N, 78]
N <= 192
NMS용 tensor 변환:
[N, 77]
class lane logit 하나를 제외하고 NMS에 필요한 geometry만 사용
NMS 단위 변환:
length: normalized -> 72-point index scale
x 좌표: normalized -> 800 input image pixel scale
NMS:
겹치는 lane 후보 제거
최대 4개 유지
[M, 78]
M <= 4
lane point 변환:
각 lane 후보의 72개 x 좌표에서 유효한 point만 선택
x 좌표 복원:
x_norm * 1640
y 좌표 복원:
y_norm * 320 + 270
final output:
[
[(x, y), (x, y), ...],
[(x, y), (x, y), ...],
]
- model 출력은 Batch, 한 이미지당 차선 후보, 차선 후보를 표현하는 값
- 차선 후보 : (background logit, lane logit, start_y, start_x, theta, length, 72개의 x좌표)
- score 계산에서 각 후보의 앞 2개 값이 background logit, lane logit이기 때문에 2개만 슬라이싱해서 연산 수행
- CULane 평가를 위한 Spline interpolation은 생략함
위 내용을 더 정리하면 아래와 같음
모델 출력:
192개 후보
후처리:
score filtering + NMS
최종 결과:
최대 4개 lane point list