Broom — On-Device AI Photo Organizer
A privacy-first Android app that classifies, clusters, and organizes gallery photos entirely on the device
Overview
Broom is a personalized photo-management app that helps users clean up large smartphone galleries without uploading private photos to a server. It runs the entire pipeline—image preprocessing, TensorFlow Lite inference, similarity analysis, and album organization—on the Android device.
The project was developed by a three-person team as a Pusan National University graduation project. Its official title was Development of a Personalized Photo Management Service Based on Computer Vision, and it passed the final faculty review in September 2025.
What Broom Does
- Unified photo classification: A single model sorts disposable or hard-to-find images into five categories: blurred photos, chat screenshots, documents and receipts, high-contrast photos, and photos without a meaningful subject.
- Similar-photo clustering: MobileNetV3 Small extracts an embedding from each photo. Broom compares embeddings with cosine similarity and groups connected matches with a disjoint-set (Union-Find) algorithm.
- Personalized albums: A user selects 10–100 example photos. Their normalized mean embedding becomes a representative vector, which Broom uses to find and organize visually related photos.
- Gallery workflow: Classification results are written to local albums, where users can review photos and perform batch move or delete operations. Albums can be disabled or excluded from future scans.
- At-a-glance management: The app shows storage usage and weekly photo trends and supports photo metadata inspection and sharing.
Model and Mobile Architecture
The final classifier replaced separate task-specific models with one MobileNetV2-based, five-class model. This avoids repeatedly extracting features from the same image and reduces the app-size and latency overhead of shipping several models. The model was trained in two stages—first the classification head with the backbone frozen, then the full network at a lower learning rate—and exported to TensorFlow Lite with mobile optimization.
The training set combined public and directly collected images: 700 blurred photos, 302 chat screenshots, 1,132 document or receipt images, 100 high-contrast images, and 155 no-object images. Class weighting and augmentation helped compensate for the imbalance. At inference time, Broom applies a separately tuned confidence threshold to each class; low-confidence results remain unclassified instead of being forced into an incorrect album.
The React Native app uses Expo Media Library to access local photos, React Native Skia to decode and resize them to 224×224 RGB tensors, and react-native-fast-tflite for synchronous on-device inference. Concurrent worker pools keep gallery-scale analysis responsive, while local metadata and model outputs remain on the phone.
My Contributions
I was responsible for the computer-vision pipeline from experimentation through mobile integration:
- Set up the model-development environment and collected and curated training images.
- Evaluated lightweight image models and developed the initial blur and chat classifiers.
- Combined the task-specific classifiers into the final unified model, converted it to TensorFlow Lite, and integrated it with the gallery app.
- Tested and applied per-class thresholds to reduce false positives.
- Implemented similar-photo clustering with embeddings, cosine similarity, and Union-Find.
- Developed personalized inference for custom albums from user-selected examples.
Tech Stack
TensorFlow · Keras · TensorFlow Lite · MobileNetV2/V3 · Python · TypeScript · React Native · Expo · React Native Skia · AsyncStorage