4.3 KiB
title, created, updated, type, tags, confidence, contested, sources
| title | created | updated | type | tags | confidence | contested | sources | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Meme Search | 2026-06-08 | 2026-06-08 | app |
|
medium | false |
|
Meme Search 🐸
Moteur de recherche de mèmes par similarité visuelle, basé sur le machine learning (embeddings + CLIP).
| Métadonnée | Valeur |
|---|---|
| Site web | https://neonwatty.github.io/meme-search/ |
| GitHub | https://github.com/neonwatty/meme-search |
| License | MIT |
| Langage | Python + Ruby |
| Étoiles | 677 |
| Dernière MAJ | 2026-05-31 |
| Catégorie | cat-search-engines |
Description
Meme Search est un moteur de recherche par similarité sémantique spécialisé dans les mèmes et les images drôles. Plutôt que de chercher par mot-clé, l'utilisateur saisit une description (« chien qui regarde son maître manger ») et l'IA retrouve les mèmes visuellement similaires dans la collection, grâce à des modèles CLIP d'OpenAI combinés à un index vectoriel.
L'application est livrée avec une bibliothèque de mèmes pré-indexée (plusieurs milliers d'images) mais l'utilisateur peut y ajouter ses propres mèmes via téléversement. L'indexation locale utilise des embeddings de 512 dimensions stockés dans un fichier .npz (NumPy compressé), et la recherche est effectuée par cosine similarity en quelques millisecondes.
C'est un projet pédagogique amusant qui combine Python (backend ML, FastAPI), Ruby (probablement pour le script d'ingestion), et un frontend web léger. Idéal pour qui veut expérimenter avec CLIP / embeddings / vector search sur un cas d'usage concret, sans la complexité d'Elasticsearch ou Pinecone.
Installation
Docker Compose
services:
meme-search:
image: neonwatty/meme-search:latest
container_name: meme-search
build:
context: https://github.com/neonwatty/meme-search.git
environment:
- PORT=8000
- PYTHONUNBUFFERED=1
volumes:
- ./data:/app/data
- ./memes:/app/memes
ports:
- "8000:8000"
labels:
- traefik.enable=true
- traefik.http.routers.meme.rule=Host(`meme.example.com`)
- traefik.http.routers.meme.entrypoints=websecure
- traefik.http.routers.meme.tls.certresolver=letsencrypt
- traefik.http.services.meme.loadbalancer.server.port=8000
restart: unless-stopped
Local
git clone https://github.com/neonwatty/meme-search.git
cd meme-search && pip install -r requirements.txt
python app.py
Configuration
- Cloner le repo et installer les dépendances Python (PyTorch, FastAPI, Pillow, transformers).
- Téléverser vos mèmes dans le dossier
./memes/(PNG/JPG/GIF). - Lancer le script d'indexation :
python indexer.py --memes ./memes --out data/embeddings.npz. - Démarrer le serveur web :
uvicorn app:app --host 0.0.0.0 --port 8000. - Accéder à l'UI sur
http://localhost:8000et saisir une requête en langage naturel.
Alternatives
- Open source : app-meilisearch (recherche full-text généraliste), SearXNG Images, ImgOps, SauceNAO (anime), ASCIImoji, IconFinder, Hydrus Network (booru + tags), OpenBooru (booru + ML).
- Propriétaire : Google Lens (propriétaire, multimodal), TinEye (reverse image), Yandex Images, Pinterest Visual Search, Bing Visual Search.
Sécurité
- Modèle CLIP local : aucune image n'est envoyée à un cloud (OpenAI, Google, etc.).
- Pas d'auth intégrée : déployer derrière un reverse proxy avec Authelia si exposition publique.
- HTTPS obligatoire pour ne pas MITM les requêtes de l'utilisateur vers le serveur.
- Limiter l'upload à des formats d'image (PNG/JPG/WebP) et une taille max pour éviter l'amplification.
- Modèle de modération optionnel : classifier les NSFW avant indexation si la collection est mixte.
Ressources
- Code : https://github.com/neonwatty/meme-search
- Démo : https://neonwatty.github.io/meme-search/
- Documentation CLIP : https://github.com/openai/CLIP
- Issues : https://github.com/neonwatty/meme-search/issues
Pages Liées
- cat-search-engines — Catégorie parente
- app-meilisearch — Moteur de recherche full-text
- app-searxng — Méta-moteur de recherche
- recettes-docker-compose — Modèles de stacks