온디바이스 AI 사진 관리 서비스 (Broom)
갤러리 사진을 기기 안에서 분류·군집화하고 사용자 취향에 맞춰 정리하는 프라이버시 중심 Android 애플리케이션
프로젝트 개요
Broom은 많은 스마트폰 사진을 서버 업로드 없이 정리할 수 있도록 만든 개인 맞춤형 사진 관리 애플리케이션입니다. 이미지 전처리부터 TensorFlow Lite 추론, 유사도 분석, 앨범 정리까지 모든 과정을 Android 기기 안에서 수행해 사용자의 사진과 분류 결과가 외부로 전송되지 않습니다.
부산대학교 졸업과제로 3명이 함께 개발했으며, 공식 과제명은 컴퓨터 비전 기반의 개인 맞춤형 사진 관리 서비스 개발입니다. 2025년 9월 지도교수 최종심사를 통과했습니다.
주요 기능
- 통합 사진 분류: 하나의 모델로 흐릿한 사진, 채팅 스크린샷, 문서·영수증, 고대비 사진, 의미 있는 객체가 없는 사진을 분류합니다.
- 유사 사진 군집화: MobileNetV3 Small로 각 사진의 임베딩을 추출하고 코사인 유사도를 계산한 뒤, 서로 연결된 사진을 Disjoint Set(Union-Find) 알고리즘으로 그룹화합니다.
- 사용자 정의 앨범: 사용자가 10–100장의 예시 사진을 고르면 정규화한 평균 임베딩을 대표 벡터로 만들고, 시각적으로 유사한 사진을 찾아 원하는 앨범에 정리합니다.
- 갤러리 정리 워크플로: 분류 결과를 로컬 앨범에 반영하고 사진을 검토한 뒤 일괄 이동·삭제할 수 있습니다. 필요 없는 정리 기능은 끄거나 특정 앨범을 추론 대상에서 제외할 수 있습니다.
- 관리 대시보드: 저장 공간 사용량과 주간 사진 추이를 보여주며, 사진 상세 정보 확인과 외부 공유를 지원합니다.
모델 및 모바일 아키텍처
최종 분류기는 여러 개의 개별 모델 대신 MobileNetV2 기반 5-class 통합 모델로 설계했습니다. 같은 사진에서 특징을 여러 번 추출하는 연산과 여러 모델을 앱에 포함할 때의 용량 부담을 줄이기 위한 선택입니다. 먼저 백본을 동결하고 분류 헤드를 학습한 뒤, 낮은 학습률로 전체 모델을 미세 조정하는 2단계 전이 학습을 적용하고 모바일 최적화를 거쳐 TensorFlow Lite로 변환했습니다.
학습 데이터는 공개 데이터셋과 직접 수집한 이미지로 구성했습니다. 흐릿한 사진 700장, 채팅 화면 302장, 문서·영수증 1,132장, 고대비 사진 100장, 무객체 사진 155장을 사용했으며, 클래스 가중치와 데이터 증강으로 불균형을 보완했습니다. 추론 단계에서는 클래스마다 별도로 조정한 신뢰도 임계값을 적용해, 확신이 낮은 결과를 잘못된 앨범에 억지로 분류하지 않고 미분류로 남깁니다.
React Native 애플리케이션은 Expo Media Library로 로컬 사진을 읽고, React Native Skia로 이미지를 224×224 RGB 텐서로 디코딩·리사이즈한 뒤 react-native-fast-tflite로 동기 추론합니다. Worker Pool 방식으로 여러 사진을 제한된 동시성 안에서 처리해 대규모 갤러리 분석의 응답성을 확보했으며, 사진 메타데이터와 모델 결과도 기기 안에 보관합니다.
담당 역할
모델 실험부터 모바일 연동까지 컴퓨터 비전 파이프라인 전반을 담당했습니다.
- 모델 개발 환경을 구성하고 학습용 이미지 데이터를 수집·정제했습니다.
- 경량 이미지 처리·분류 모델을 탐색하고 초기 흐릿함·채팅 분류 모델을 개발했습니다.
- 개별 분류기를 최종 통합 모델로 결합하고 TensorFlow Lite로 변환해 갤러리 애플리케이션에 연동했습니다.
- 오탐을 줄이기 위한 클래스별 임계값을 테스트하고 적용했습니다.
- 임베딩, 코사인 유사도, Union-Find를 이용한 유사 사진 군집화 기능을 구현했습니다.
- 사용자 예시 사진을 바탕으로 동작하는 사용자 정의 앨범 추론 기능을 개발했습니다.
기술 스택
TensorFlow · Keras · TensorFlow Lite · MobileNetV2/V3 · Python · TypeScript · React Native · Expo · React Native Skia · AsyncStorage