VLM Image Benchmark
1. 프로젝트 소개
VLM Image Benchmark는 생성형 AI 이미지와 게임 에셋의 품질을 로컬 VLM으로 분석하고, 결과를 구조화된 JSON/Markdown 형태로 확인할 수 있는 이미지 품질 벤치마킹 도구입니다.
이미지를 업로드하면 LM Studio에서 실행 중인 로컬 VLM이 이미지의 객체, 스타일, 텍스트, 품질 점수, 문제점, 개선 프롬프트를 자동으로 분석합니다. 분석 결과는 벤치마크 이름 단위로 저장되어 모델별·실험별 결과를 다시 확인하고 비교할 수 있습니다.
| 항목 | 내용 |
|---|---|
| 프로젝트명 | VLM Image Benchmark |
| 유형 | 생성형 AI 이미지 품질 벤치마킹 도구 |
| 저장소 | VLM-Image-Benchmark |
| 핵심 키워드 | VLM, Image Benchmark, LM Studio, FastAPI, React, SQLite |
2. 개발 배경
생성형 AI 이미지 모델은 결과물이 빠르게 생성된다는 장점이 있지만, 실제 서비스나 게임 에셋 제작 환경에서는 단순히 “보기 좋은 이미지”보다 다음 요소가 중요합니다.
- 프롬프트 의도를 정확히 반영했는지
- 게임 에셋으로 활용 가능한 품질인지
- 이미지 내 텍스트나 오브젝트가 깨지지 않았는지
- 스타일이 일관적으로 유지되는지
- 모델별 결과를 동일한 기준으로 비교할 수 있는지
하지만 VLM이나 이미지 생성 모델마다 출력 형식과 평가 기준이 달라 결과를 비교하기 어렵고, 클라우드 API 기반 분석은 비용과 프라이버시 부담이 있습니다.
이 문제를 해결하기 위해 로컬 VLM 기반 이미지 분석, 고정 JSON 스키마, 벤치마크 단위 히스토리 저장 구조를 설계했습니다.
3. 핵심 기능
| 기능 | 설명 |
|---|---|
| 벤치마크 설정 | 평가 기준 이름과 VLM 모델을 선택한 뒤 이미지 분석 세션을 시작 |
| 다중 이미지 업로드 | 여러 이미지를 한 번에 업로드하고 미리보기 그리드에서 관리 |
| 커스텀 분석 프롬프트 | 기본 프롬프트 외에 사용자가 직접 평가 지시문 입력 가능 |
| 구조화된 VLM 분석 | 요약, 객체, 텍스트, 스타일, 카테고리, 품질 점수, 문제점, 개선 프롬프트 추출 |
| Markdown / JSON 결과 뷰 | 사람이 읽기 쉬운 Markdown과 원본 JSON을 탭으로 확인 |
| 파싱 실패 대응 | JSON 파싱 실패 시에도 원본 응답을 보존하여 디버깅 가능 |
| 히스토리 저장 | SQLite 기반으로 벤치마크별 분석 기록 저장 및 재조회 |
4. 시스템 아키텍처
5. 분석 처리 흐름
- 사용자가 벤치마크 이름과 VLM 모델을 선택합니다.
- 분석할 이미지를 업로드하고 프롬프트를 입력합니다.
- FastAPI가 이미지를 검증한 뒤 JPEG로 정규화합니다.
- Backend가 이미지를 base64 data URI로 변환해 LM Studio에 요청합니다.
- VLM 응답에서 JSON을 추출하고 Pydantic 스키마로 검증합니다.
- 분석 결과와 원본 응답을 SQLite에 저장합니다.
- Frontend에서 결과를 Markdown / JSON 형태로 표시합니다.
6. 주요 구현 포인트
6.1. 로컬 VLM 기반 이미지 분석
LM Studio의 OpenAI 호환 API를 활용하여 로컬 환경에서 VLM을 호출했습니다. 이를 통해 외부 API 비용 없이 다양한 오픈소스 VLM을 교체하며 이미지 분석 실험을 진행할 수 있도록 구성했습니다.
6.2. 고정 JSON 스키마 설계
VLM 응답을 비교 가능한 형태로 만들기 위해 분석 결과를 8개 필드로 표준화했습니다.
| 필드 | 설명 |
|---|---|
| summary | 이미지 전체 요약 |
| objects | 주요 객체 |
| text | 이미지 내 텍스트 |
| style | 시각 스타일 |
| category | 이미지 카테고리 |
| quality_score | 품질 점수 |
| issues | 문제점 |
| improvement_prompt | 개선 프롬프트 |
고정된 스키마를 사용해 모델별 응답을 동일한 기준으로 저장하고 비교할 수 있도록 했습니다.
6.3. 비정형 응답 처리
VLM은 항상 정확한 JSON만 반환하지 않기 때문에, 응답에서 코드블록과 중괄호 블록을 단계적으로 추출하는 파싱 로직을 구현했습니다.
파싱에 실패하더라도 raw_response를 저장하여 모델별 응답 특성이나 프롬프트 문제를 추적할 수 있도록 했습니다.
6.4. 이미지 포맷 정규화
LM Studio 환경에서 일부 이미지 MIME 타입이 정상 처리되지 않는 문제를 방지하기 위해, 업로드 이미지를 Pillow로 검증하고 JPEG로 재인코딩했습니다.
이를 통해 VLM 호출 시 data:image/jpeg;base64,... 형식으로 안정적으로 이미지를 전달할 수 있도록 했습니다.
6.5. 벤치마크 단위 히스토리 관리
분석 결과를 단순 로그가 아니라 benchmark_name 기준으로 저장했습니다.
이를 통해 동일한 이미지라도 모델, 프롬프트, 평가 기준이 다른 경우 실험 단위로 결과를 구분할 수 있습니다.
7. 기술 스택
| 영역 | 기술 |
|---|---|
| Frontend | React, TypeScript, Vite, Tailwind CSS, react-markdown |
| Backend | FastAPI, SQLAlchemy, SQLite, Pydantic |
| Image Processing | Pillow |
| VLM API | LM Studio, OpenAI Compatible API |
| HTTP Client | httpx |
8. 프로젝트 성과
- 로컬 VLM을 활용한 이미지 품질 분석 파이프라인 구현
- 이미지 업로드, VLM 분석, 결과 표시, 히스토리 저장까지 연결된 풀스택 구조 설계
- VLM의 비정형 응답을 JSON 스키마 검증과 예외 처리로 안정화
- 벤치마크 이름 기준으로 실험 결과를 저장하여 모델별 비교 기반 마련
- JPEG 정규화를 통해 로컬 VLM 호출 시 이미지 호환성 문제 개선
9. 학습 및 개선점
이 프로젝트를 통해 VLM 기반 이미지 분석에서는 단순히 모델을 호출하는 것보다 응답 형식 안정화, 스키마 설계, 실험 단위 관리가 중요하다는 점을 확인했습니다.
특히 로컬 VLM은 모델마다 JSON 준수율, 품질 점수 기준, 응답 시간이 다르기 때문에 분석 결과를 재현 가능하게 저장하는 구조가 필요했습니다.
향후에는 Ollama, Gemini, Claude, GPT 등 다양한 Provider를 추가하고, 동일 이미지에 대한 모델별 결과 비교 화면과 CSV/Markdown Export 기능을 확장할 수 있습니다.