guyshilo12/painting-style-recommender
๐จ Painting Recommender (Embeddings + Similarity)
A visual recommendation system that suggests the Top-3 most similar paintings from a dataset, based on CLIP image embeddings and cosine similarity.
โ Live Demo
Upload a painting image and click Recommend Top-3 to get similar artworks.
๐ฆ Dataset
Dataset: keremberke/painting-style-classification (Hugging Face) Modality: Images (paintings) Total size: 6,417 images
- Train: 4,493
- Validation: 1,295
- Test: 629
Labels: 27 painting styles (e.g., Cubism, Impressionism, Baroque, Fauvism, etc.) Image format: RGB Resolution (most images): 416ร416
Why this dataset?
The dataset includes diverse artistic styles with clear visual differences in color palettes, composition, and abstraction levels โ ideal for embedding-based similarity and clustering.
๐ Exploratory Data Analysis (EDA)
Basic sanity checks and statistics were performed:
- dataset split distribution
- number of styles (labels)
- label distribution (imbalanced but acceptable for similarity-based recommendation)
- visual samples across styles
๐ง Embeddings
Model: openai/clip-vit-base-patch32 (Hugging Face Transformers) Embedding size: 512-dim vectors
Why CLIP?
CLIP captures high-level visual semantics (style, composition, color patterns), making it suitable for similarity search and recommendation in visual domains.
Embeddings are L2-normalized, so cosine similarity can be computed efficiently using dot product.
๐งฉ Embeddings Analysis: Dimensionality Reduction + Clustering
To analyze the embedding space we used a balanced subset (up to ~100 images per style) to stay computationally efficient while preserving structure.
Dimensionality reduction: PCA โ UMAP (2D visualization) Clustering: K-Means (k=10)
Cluster interpretation
Clusters are generally coherent and group paintings by shared visual properties such as:
- abstraction level (abstract/cubist vs. classical)
- dominant color palettes
- composition/geometry
- texture/brushstroke patterns
Importantly, clusters do not perfectly replicate labels โ which is expected and desirable for a similarity-based recommender.
๐ฏ Recommendation Method
Input
- Image Upload (user provides an image)
Output
- Top-3 recommended paintings from the dataset
Steps
- Convert user image โ CLIP embedding
- Compute cosine similarity against stored dataset embeddings
- Retrieve the Top-3 highest similarity scores and return corresponding paintings
Example output includes similarity scores such as:
Style: Cubism | Similarity: 0.847Style: Fauvism | Similarity: 0.834Style: Cubism | Similarity: 0.833
๐พ Files in this Repo
app.pyโ Gradio applicationrequirements.txtโ dependenciespainting_embeddings.parquetโ saved embeddings for recommendation
๐ฅ Presentation Video
A 3โ5 minute presentation demonstrating:
- the working application
- dataset overview
- embeddings and clustering analysis
- recommendation logic
๐ Video link: https://drive.google.com/file/d/1TJnNUZmeUHltg9FOC5y1BRXugQL1Fbqi/view?usp=sharing
๐ Development Notebook
The full development process of the project is documented in the following Jupyter Notebook, including:
- dataset loading and exploratory data analysis (EDA)
- image embedding generation
- dimensionality reduction and clustering
- recommendation logic implementation
๐ Notebook link: https://huggingface.co/spaces/guyshilo12/painting-style-recommender/resolve/main/CopyofAssignment3Embeddings%2CRecSys%2CSpaces.ipynb
