클래스 지도와 개체 지도를 나눈다
semantic segmentation은 각 픽셀에 클래스 의미를 부여한다. 한 이미지에 자동차 두 대가 붙어 있어도 둘 다 car로 표시하면 클래스 지도에서는 같은 값일 수 있다. instance segmentation은 같은 클래스의 서로 다른 물체를 개별 mask/ID로 구분한다. 한 프레임의 instance ID가 다음 프레임에서도 같은 실제 물체를 뜻하는 tracking ID라고 자동 보장되지는 않는다. 시간 연결은 M12.05에서 따로 판단한다.
그림 M12.04-1. 같은 클래스의 두 물체를 semantic 지도는 같은 값으로, instance 지도는 개체별 값으로 나눈다. 색 자체는 class ID가 아니며 단일 프레임 instance ID와 시간 추적 ID도 다르다. 직접 제작.
도로 장면에도 여러 질문이 있다. road/sidewalk/person 같은 semantic 클래스, 개별 차량/사람의 instance, 차선 표시 픽셀/곡선·서로 다른 차선 ID/연결 관계는 다른 출력이다. 넓은 도로 영역을 잘 찾았다고 얇은 차선의 연속성이나 좌/우 경계를 맞췄다는 뜻은 아니다. 차선이 보이는 위치와 로봇이 통과할 수 있는 공간도 다르다. 원하는 행동을 위해 어떤 출력과 라벨 정책이 필요한지 먼저 정한다.
Cityscapes 공식 자료는 도심 semantic/instance 주석과 class·group/void 정책을 설명한다. 하나의 데이터셋에서 정한 관례를 모든 분할 작업의 정답으로 옮기지 않는다. 예를 들어 가림이나 투명 영역/개체 경계가 애매한 경우의 정책은 자료에 따라 다를 수 있다. 라벨 정책과 모델 출력의 정의가 같은지 확인해야 한다.
예쁜 색과 학습 ID는 별개다
분할 결과를 사람이 보기 쉽게 색으로 칠할 수 있지만 팔레트 색은 표시 방식이다. 실제 라벨 파일은 정수 class ID나 instance ID, 또는 별도의 mask 목록일 수 있다. 저장된 RGB 색을 클래스 번호와 혼동하거나 JPEG처럼 손실 압축한 표시 그림을 그대로 정답 ID로 읽으면 값이 바뀔 수 있다. 원본 mask의 dtype/shape/코드표와 표시용 overlay를 분리한다.
Cityscapes의 원본 id와 학습용 trainId도 역할이 다르며 공식 평가에서는 요구하는 ID로 되돌리는 매핑이 필요하다. 공식 labels.py는 id/trainId/hasInstances/ignoreInEval/색을 구별한다. 이번 활동은 그 표를 복제하지 않고 자체 코드 0=road/1=obstacle/255=ignore를 쓴다. 255는 이번 주석에서 평가 대상이 아닌 픽셀이지 일반 배경 클래스 0의 다른 이름이 아니다.
모델의 출력도 class별 score 배열일 수 있고 argmax 뒤 정수 지도일 수 있다. score 축/해상도와 class 순서를 알아야 정답과 비교할 수 있다. 공식 torchvision segmentation 자료처럼 특정 모델은 정해진 학습 클래스/전처리를 가지므로 이름만 보고 road 모델이라고 가정하지 않는다. 이 단위에서는 그 모델이나 가중치를 다운로드하지 않는다.
ignore를 적용한 지표를 직접 센다
여섯 픽셀의 합성 정답은[0,0,0,1,1,255], 예측은[0,0,1,0,1,0]이라고 하자. 인덱스는 왼쪽부터 0~5다. 정답 255인 마지막 픽셀은 이번 평가에서 제외하여 유효 픽셀은 5개다. 예측이 스스로 255를 내놓았다고 유효 정답의 분모까지 지워 좋은 점수를 만드는 것은 아니다. 미응답/unknown 출력의 평가·coverage 정책은 따로 정해야 한다. 이번 예측은 모든 유효 위치에서 0/1을 낸다.
유효 위치 0/1/4는 정답과 같고 2/3은 다르므로 pixel accuracy=3/5=0.6이다. road를 관심 클래스로 보면 정답 road는 0/1/2, 예측 road는 0/1/3이다. 교집합 2/합집합 4라 IoU=0.5다. obstacle은 정답 3/4, 예측 2/4로 교집합 1/합집합 3, IoU=1/3이다. 두 클래스에 같은 가중치를 둔 mean IoU는(0.5+1/3)/2=5/12≈0.416667이다.
같은 예측에서 정확도 0.6과 mean IoU0.416667이 다른 것은 모순이 아니다. 정확도는 유효 픽셀을 세고 mean IoU는 클래스별 겹침 비율을 같은 무게로 평균했다. 실제 자료에서는 클래스별 픽셀 수/무시 라벨·없는 클래스의 분모 0 처리와 집계 단위를 기록한다. 두 mask 모두 비어 합집합 0인 클래스를 자동으로 완벽 1이라고 채우지 않는다. 큰 배경이 대부분인 영상은 단순 정확도가 작은 물체/가는 차선의 실패를 가릴 수 있다.
영상과 mask를 같은 좌표로 변환한다
crop/resize/회전/뒤집기는 영상과 정답 mask에 같은 기하 대응을 적용해야 한다. class ID mask에 일반 색 영상처럼 선형 보간을 하면 0/1 사이에 0.5 같은 코드표 밖 값이 생길 수 있다. 범주 지도에는 nearest-neighbor 등 라벨을 보존하는 규약을 명시한다. 반면 연속 score/logit 지도를 보간한 뒤 argmax하는 파이프라인은 다른 설계이므로 무조건 같은 규칙으로 혼동하지 않는다.
OpenCV 변환 문서의 보간/경계·좌표 규약과 함께 크기/채널/라벨 ID를 확인한다. class 지도와 instance ID도 각각 보존해야 한다. 색을 섞어 시각적으로 부드러운 경계를 만든 것이 더 정확한 라벨이라는 뜻은 아니다. M12.02의 pixel-center/crop 계약에 맞춘 overlay를 통해 어긋남을 검사한다.
road 픽셀이 이동 허가는 아니다
카메라의 road 클래스는 영상 의미의 예측이다. 실제 통과 가능성에는 3차원 높이/경사·장애물/수면/노면 상태, 로봇 크기와 경로/동역학 조건이 더 필요하다. 예를 들어 도로로 분류된 어두운 구간이 그림자인지 구멍인지 영상만으로 불명확할 수 있다. 가림 뒤를 road라고 확장한 예측도 실제 빈 공간의 증거가 아니다. ‘검출되지 않음’과 ‘없음이 확인됨’을 나누어 기록한다.
차선도 마찬가지다. 마스크가 몇 픽셀 끊겼다고 실제 도로가 끊겼다고 단정하지 않고 가림/빛 반사·마모·해상도/전처리를 조사한다. 반대로 후처리로 끊긴 선을 이어 그렸다고 관측된 근거로 바꾸지 않는다. 원래 관측과 보간/추정 결과를 구분해 표시한다. 두 개의 차량 mask를 합치면 semantic IoU는 좋을 수 있어도 개체 수/거리 추정이 틀릴 수 있으므로 task에 맞는 instance 평가가 필요하다.
조건별 기록에는 조명/날씨·젖은 노면·가림/작은 물체, 카메라/해상도·시각·보정, 라벨/모델/후처리 개정과 실패 유형을 남긴다. 임계값/모형 선택은 검증 자료에서 하고 test는 분리한다. 기존 4.6 Domain Randomization의 장면 변화가 실제 조건을 모두 포함한다고 가정하지 않는다. 분할 품질·공간 정보·작업 성공은 서로 보완할 증거이며 아래 계산은 실제 주행 성과가 아니다.