실내 도면 이미지를 AI로 분석하여 노드, 엣지, POI 후보를 추출하는 FastAPI 서버입니다. 백엔드(Spring Boot)로부터 분석 요청을 받아 결과를 JSON으로 반환합니다.
Insideout 프로젝트를 이끈 양양양말을 소개합니다.
| 차승은 | 이민지 | 김민준 | 김세현 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 🔹 Hybrid Navigation 사용자 웹 - BE, FE |
🔹 Auth, Search, Infra 사용자 웹 - BE, FE |
🔹 AI Map Builder 관리자 웹 - AI, FE |
🔹 Map Editor 관리자 웹 - BE, FE |
실내 도면 이미지를 입력받아 벽, 공간, 복도(통행로), 출입구, 상점명 등 주요 객체를 자동으로 인식합니다. 도면의 해상도와 표기 방식이 달라도 최대한 일관된 분석 결과를 얻을 수 있도록 전처리와 후처리 과정을 함께 적용했습니다.
- 도면 이미지 전처리
- 객체 탐지 및 구조물 추출
- 텍스트 OCR 인식
- 분석 결과 JSON 반환
AI 분석 결과를 기반으로 관리자 웹에서 사용할 수 있는 길찾기 후보 데이터를 생성합니다. 단순 이미지 인식이 아니라, 실제 실내 경로 그래프 구축에 필요한 구조로 데이터를 정리합니다.
- POI 후보 추출
- 노드 후보 추출
- 엣지 후보 추출
- 관리자 편집용 초안 데이터 생성
AI가 만든 초안은 그대로 운영 데이터로 쓰지 않고, 백엔드와 관리자 웹의 맵 에디터가 활용할 수 있도록 전달됩니다. 관리자는 이 결과를 검토하고 수정한 뒤 최종 배포할 수 있습니다.
- Draft 초기화용 데이터 제공
- 맵 에디터 연동용 응답 포맷 통일
- 텍스트, 오브젝트, POI, 노드/엣지 결과 분리 반환
실내 도면뿐 아니라 단지 또는 캠퍼스 형태의 이미지 분석도 지원하여, 건물 단위와 캠퍼스 단위의 초기 맵 구축을 보조합니다.
- 건물 도면 분석
- 캠퍼스 지도 분석
- 분석 타입별 결과 분기 처리
flowchart LR
A["도면 이미지 업로드"] --> B["이미지 전처리"]
B --> C["객체 탐지"]
B --> D["OCR 텍스트 추출"]
C --> E["노드/엣지/POI 후보 생성"]
D --> E
E --> F["결과 정규화"]
F --> G["JSON 응답 반환"]
G --> H["Spring Boot 백엔드 저장"]
H --> I["관리자 웹 맵 에디터 반영"]
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/v1/ai/floorplans/{floorplanId}/analyze | 실내 도면 AI 분석 요청 |
| GET | /api/v1/ai/floorplans/{floorplanId}/detections | 실내 도면 분석 결과 조회 |
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/v1/ai/campuses/{campusMapId}/analyze | 캠퍼스 지도 AI 분석 요청 |
| GET | /api/v1/ai/campuses/{campusMapId}/detections | 캠퍼스 지도 분석 결과 조회 |
- 문제: 도면마다 해상도, 축척, 표기 방식이 달라 동일한 모델을 적용해도 결과가 일관되지 않았습니다.
- 해결: 전처리 단계에서 이미지 특성을 보정하고, 후처리 단계에서 결과를 정규화하여 관리자 웹에서 활용 가능한 형태로 변환했습니다.
- 문제: 실내 지도는 단순 객체 탐지뿐 아니라 매장명, 층수, 출입구 표시 같은 텍스트 정보도 중요합니다.
- 해결: OCR 결과와 객체 탐지 결과를 분리해서 수집한 뒤, 하나의 JSON 구조로 합쳐 맵 에디터 초기 데이터로 사용할 수 있게 했습니다.
- 문제: 탐지 결과에는 오탐이나 누락이 존재할 수 있어 그대로 서비스에 반영하면 경로 오류가 발생할 수 있습니다.
- 해결: AI 결과를 초안 데이터로만 사용하고, 관리자 웹에서 검토 및 수정 후 배포하는 구조로 설계했습니다.
- 문제: AI 서버가 다양한 분석 타입을 반환하더라도 백엔드가 일관되게 처리할 수 있어야 했습니다.
- 해결: Pydantic 기반 응답 모델을 사용해 타입별 결과 형식을 통일하고, 백엔드가 안정적으로 저장할 수 있도록 했습니다.



