1 Background and motivation
Photo filenames rarely describe the reason a person remembers an image. Searching for a beach scene, a receipt, or a particular person requires information that directory names and timestamps may not contain. I built Image Search to index a local collection by its visual and textual content, making natural-language descriptions useful retrieval inputs.
2 Ingestion and representations
The ingestion pipeline computes CLIP embeddings so that images can be compared with text queries in a shared representation. It also extracts complementary signals: OCR captures visible text, object detection supplies labels, and face processing supports grouping people. The documented architecture includes caption and scene-enrichment stages, which add descriptions that are different from the raw embedding.
PostgreSQL stores metadata and relationships, while Qdrant holds the vectors used for similarity search. Separating these stores lets the application combine semantic retrieval with structured attributes. Most expensive processing happens during ingestion, allowing later searches to reuse the representations rather than rerun the full image-analysis pipeline.
3 Search and interaction
A FastAPI service exposes ingestion, image retrieval, and search operations to a Next.js interface. Gallery, people, and event views provide additional ways to navigate the collection when a text query is not sufficient. Ranked results and associated metadata help explain why a candidate may be relevant, while OCR makes screenshots and text-heavy images discoverable through words that appear inside them.
Different signals address different failure cases. A semantic embedding may retrieve a visually similar scene without matching the exact text on a sign, while OCR may find the sign but miss the broader scene. Keeping these representations available gives the application more than one way to connect a query with a stored image.
4 Constraints
Retrieval quality depends on the models, indexing coverage, and the images themselves. Face clusters or generated captions can be wrong, and a similarity score is a ranking signal rather than a calibrated statement of relevance. Although the collection can be stored locally, optional external captioning introduces a separate data boundary. The system is therefore best understood as a configurable search pipeline, with each enrichment stage carrying its own cost and limitations.