사용자가 보기 전에 AI 생성된 모든 실내 렌더링을 확인하는 방법
요약
AI가 생성한 실내 렌더링의 신뢰성을 높이는 방법을 다룹니다. 가구는 변경 가능하지만 벽, 창문 등 구조적 요소는 원본과 일치해야 하므로, 모든 렌더링은 세 가지 게이트를 통과하는 자동 검사 과정을 거칩니다.
핵심 포인트
- AI 생성 이미지의 신뢰성 확보가 중요합니다.
- 세 개의 병렬 게이트(비전 모델 심사관 등)로 검증됩니다.
- 구조적 요소(창문, 벽, 문)는 원본과 일치해야 합니다.
- 검증 과정은 구조화된 출력(Structured Output)을 사용합니다.
이미지 모델은 방의 스타일을 변경하는 데는 매우 능숙하지만, 방 자체를 그대로 두는 것에는 다소 서툽니다. '일본풍(Japandi)' 거실을 요청하면 아름다운 가구를 얻지만, 때로는 다음과 같은 문제도 발생합니다:
- 사진상 단단한 벽이었던 주방 싱크대 위로 이동하거나 축소되거나 나타난 창문;
- 옷장 문이 커튼이나 슬라이딩 스크린, 또는 평평한 벽으로 바뀌어 나온 경우;
- 유일한 아치형 통로를 가로막고 놓인 소파;
- 프레임 가장자리에 새로운 출입구가 생기거나 평평한 벽에 니치(niche)가 파여 있는 경우;
- 옆으로 미끄러진 카메라 각도;
- 또는 그 반대: 업로드한 사진과 거의 완전히 똑같은 그림.
저희 사용자들은 이러한 이미지를 부동산 매물 목록에 사용합니다. 이 경우, 연출된 사진이 가구는 바꿀 수 있어도 창문, 벽, 문은 변경하지 않기 때문입니다(왜 해당 규정이 존재하는지). 따라서 모든 렌더링은 누군가 보기 전에 자동으로 검사됩니다. 그 방법과 이 과정을 통해 저희가 배운 점을 소개합니다.
한눈에 보는 파이프라인
실내 공간의 경우, 각 렌더는 세 개의 게이트를 병렬로 통과해야 합니다:
- 비전 모델 심사관(vision-model judge): 원본 사진과 렌더링을 비교하여 고정된 목록의 예/아니오 질문에 답합니다.
- 기계적 카메라 검사(mechanical camera check): 언어 모델(language model)을 사용하지 않고 시점 이동 여부를 측정합니다.
- 크롭 레벨 존재 확인(crop-level presence check): 원본에서 발견된 모든 문, 창문, 계단을 전체 해상도로 살펴봅니다.
세 가지 모두 통과하면 렌더링이 제공됩니다. 그렇지 않으면 재시도하고, 아무것도 통과하지 못하면 사용자에게 가장 좋은 시도를 '초안'으로 명확하게 표시하여 보여줍니다.
게이트 1: 부울 값만 답변하는 심사관
심사관은 원본 이미지와 렌더링 이미지를 각각 다운스케일(downscale) 받은 것을 받으며, 고정된 JSON 객체를 반환해야 합니다. 따라서 구조화된 출력(structured output)과 스키마를 사용하기 때문에 산문 형식으로 답변할 수 없습니다. 이전 버전에서는
- 개구부 (Openings): 모든 문은 여전히 열 수 있는 문이어야 하며, 모든 통로는 걸어 다닐 수 있도록 바닥이 확보되어야 합니다.
- 창문 (Windows): 개수, 위치, 크기 및 모양이 동일해야 합니다. 새로 만들어진 창문은 안 되며, 키가 큰 옷장 뒤에 숨겨져 있거나, 외부의 전망이 달라지면 안 됩니다.
- 방 구조 (The room shell): 천장, 벽난로, 조각된 벽감(niches) 없음, 특징적인 벽면 요소들, 동일한 벽 프레임 가장자리, 새로운 방이나 복도는 없어야 합니다.
- 마감 일관성 (Finish consistency): 부분적으로 다시 칠해진 방은 안 됩니다.
- 콘텐츠 규칙 (Content rules): 사람(people)이 없어야 하며, 벽 예술 작품에 사람이 담긴 사진이나 사실적인 초상화가 있어서도 안 됩니다.
- 카메라: 동일한 시점과 같은 방의 깊이를 유지해야 합니다.
외부: 건물, 울타리 라인 및 문, 지형(새로운 수영장 제외), 성숙한 나무, 배경, 그리고 사용 가능한 진입로가 있어야 합니다.
간소화되고 설명적인 판정 기준:
{
"doors_preserved": true,
"openings_clear": false,
...
}
렌더링은 계산된 모든 부울(boolean) 값이 참일 때만 통과합니다. 그 이유들은 로그와 재시도 프롬프트에 기록됩니다. 작업의 대부분은 문구 작성에 할애되었습니다:
통과해야 하는 것을 명시할 것. 리스타일링이 제품이기 때문에, 지침 목록에는 무엇이 예상되는지(새 바닥, 페인트, 벽지, 설비물) 나열하고
문구(Wording)는 측정 가능합니다. 이전의 벽 장식 문구는 좋은 프레임 16개 중 10개를 잘못 판별했습니다 (스타일화된 선 그림은 얼굴로 간주). 재작성된 문구는 16개 중 0개를 실패했으며 여전히 실제 초상화 5개를 모두 포착했습니다.
게이트 2: 질문하는 대신 카메라를 측정하기
초기에는 비전 모델이 시점 변화에 거의 눈이 멀어 있었습니다. 눈에 띄게 다른 장소에서 촬영된 렌더링은 모든 신경망 검사를 통과했습니다. 나중에 더 강력한 판별자는 반대의 문제를 가졌습니다. 카메라가 움직이지 않은 43개의 렌더링에서, 이 모델은 13번 이동했다고 말했습니다. 따라서 실내에서는 판별자의 카메라 답변이 더 이상 합격 또는 불합격을 결정하지 않습니다. 측정값이 두 개의 채널을 통해 그렇게 합니다:
- 천장선(Ceiling line). 벽/천장 경계를 곡선으로 추적합니다 (수직 밝기 기울기를 이용한 동적 계획법, dynamic programming over the vertical brightness gradient) 그리고 원본의 곡선과 렌더링의 곡선을 비교합니다.
- 깊이 프로파일(Depth profile). 단안 깊이 모델(monocular depth model)이 두 이미지 모두를 추정합니다. 열(column)별로 먼 벽이 얼마나 멀리 보이는지 측정하고, 그 다음 프로파일을 견고한 적합도(robust fit), 순위 상관관계(rank correlation), 그리고 측면 이동 탐색으로 비교합니다.
각 채널은 서로 다른 것에 속습니다. 페인트는 천장선을 속입니다 (어두운 빔, 벽난로 위의 예술 작품). 유리는 깊이를 속입니다 (창문과 거울은 매번 다르게 추정됩니다). 페인트는 깊이에서 평평하고, 유리는 천장선을 움직이지 않기 때문에, 둘 다 동의할 때만 이동을 플래그 지정합니다: 두 정규화된 점수 중 최소값입니다.
2개의 방에서 수동으로 라벨링한 24쌍에 대해, 이것은 0개의 오탐지(false flags)로 실제 이동 5개를 모두 포착했습니다. 여유 공간이 좁았기 때문에, 실패가 아닌 임계값 주변의 회색 영역이 기록됩니다. 실외에는 추적할 천장이 없으므로, 기계적 검사는 비활성화되고 판별자의 카메라 질문이 주도권을 유지합니다.
게이트 3: 자르기(crops), 왜냐하면 문은 너비가 80픽셀이기 때문입니다
심사관의 판단에 따르면 현관문은 얇은 줄무늬입니다. 따라서 문, 창문, 계단은 업로드 시 감지되며, 각 렌더링 후 모델에게 모든 크롭(crop)을 전체 해상도로 검사하도록 요청합니다. 여전히 그 자리에 있는지 확인하는 것입니다. 기계적 채널은 또한 창문이 이동했거나 넓어졌는지 측정합니다. 레이블링된 87쌍의 경우, 크롭 심사관은 10개의 깨진 렌더 중 7개를 포착했으며, 75개의 정상적인 경우에는 오탐지(false alarms)가 없었습니다. 기계적 채널이 나머지 3개를 포착했습니다.
렌더링 실패 시
재시도는 결함의 종류에 따라 달라집니다.
- 배치 결함 (Placement defects) (막힌 통로, 예술 작품 속 얼굴, 반쯤 칠해진 벽)은 심사관의 이유가 프롬프트에 추가된 상태로 동일한 이미지 모델에서 재시도됩니다.
- **기하학적 결함 (Geometry defects)**은 두 번째이고 더 비싼 이미지 모델로 전달됩니다. 우리는 같은 모델을 사용한 재시도로 깨진 기하학 구조를 수정하는 비율이 5번에 한 번 정도임을 측정했습니다. 이전의 배틀에서는 두 모델 모두 20개의 렌더 중 각각 18개와 17개가 정상이었고, 합치면 20개 중 19개가 정상이었습니다. 즉, 실패 사례가 거의 겹치지 않았습니다.
기하학적 재시도는 고정된 카운트 기반 지침(
처음에는 '최선의 시도(best attempt)'가 실패한 검사 횟수가 가장 적은 것을 의미했습니다. 가장 적게 깨지는 시도는 종종 모델이 거의 아무것도 하지 않은 경우였습니다. 실제 사례 중 하나에서는 첫 번째 시도가 기하학적으로 실패했지만 설득력 있는 산업적 리스타일링이었고, 사용자에게는 두 번째 시도(오래된 방과 오래된 벽지 등)와 램프 한 쌍을 제공했습니다. 순위 매기기는 모델이 아무것도 하지 않은 것에 대해 비용을 지불하는 것이었습니다.
해결책은 '변경 측정기(change meter)'입니다. 두 이미지를 작은 썸네일로 축소하여 프레임에서 눈에 띄게 얼마나 많이 변경되었는지 계산합니다. 모델 호출 없이, 우리는 110개의 실제 렌더링과 10개의 합성 근사본(재압축, 흐림 처리, 밝기 조절, 이동, 램프 크기의 패치 몇 개)을 사용하여 이를 보정했습니다. 이제 순위는 다음과 같습니다:
// 간소화됨
function draftRank(a: Attempt): number {
if (a.checkerErrored) return LAST;
...
가벼운 재배치(light restage)는 면제됩니다. 왜냐하면 그 경우 사용자가 방을 유지하도록 요청했기 때문입니다.
평가 모델 선택 및 보정 세트 활용
평가는 모든 시도에 대해 실행되므로, 저렴한 모델이 매력적입니다. 우리는 31개의 수동으로 레이블링된 프레임의 보정 세트를 유지하고 모든 후보 모델을 이 세트로 두 번 실행합니다. 호출당 비용이 절반 이하인 더 저렴한 모델은 현재 평가 모델이 한 번에 발견하는 3개 대비 6개의 결함을 놓쳤습니다. 눈으로 8개의 결함이 표시된 46개의 라이브 렌더링에서, 이 모델은 두 번의 실행 동안 0개와 1개를 포착했지만, 현재 평가 모델은 6개를 포착했습니다. 더 새로운 모델도 명확하게 더 좋지는 않았습니다. 놓친 결함은 적었지만(2개 대 3개), 오탐지율은 두 배였습니다(4개 대 2개). 우리는 현재의 평가 모델을 유지하기로 했습니다.
시사점
- '이것이 좋은가?'와 같은 광범위한 질문 대신, 평가 모델에게 좁고 예/아니오 질문을 하세요.
- 기하학적 측정이 가능한 곳에서는 실패 모드가 중복되지 않는 채널을 사용하여 측정하세요.
- 모든 문구 변경과 모델 교체는 레이블링된 세트에서 두 번 보정하세요.
- 검사만큼이나 실패 경로를 신중하게 설계하세요: 순위 매기기, 초안 레이블, 누가 비용을 지불하는가.
- '가장 적게 망가진(least broken)'은 '가장 적게 변경된(least changed)'을 의미할 수 있습니다. 변화 자체를 직접 측정하세요.
저희는 AI Flip Room에서 이것을 구축하고 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기