Tu as écrit un super script Python qui analyse des données ou utilise une IA. Il marche dans ton terminal. Mais personne d'autre ne peut l'utiliser — tes collègues, tes potes, ton patron. Ils ne vont pas ouvrir un terminal et taper `python3 mon_script.py`. Ce dont tu as besoin, c'est d'une interface. Et c'est exactement ce que Streamlit te permet de faire : transformer ton script Python en application web interactive, sans écrire une seule ligne de HTML, CSS ou JavaScript.
Dans ce tutoriel, on va construire ensemble une mini-application complète : un classifieur d'images par IA qui tourne directement dans ton navigateur. Tu vas écrire moins de 80 lignes de Python, et à la fin tu auras une vraie app web que tu pourras partager avec le monde entier.
Illustration suggérée : un écran splitté en deux — à gauche un terminal noir avec python3 script.py, à droite la même app transformée en page web colorée avec des widgets, des graphiques et un drag-and-drop d'image. Flèche entre les deux avec "Streamlit ".
1. C'est quoi Streamlit, concrètement ?
Streamlit est un framework Python open-source créé en 2019. Son concept est radicalement simple :
- Tu écris du Python normal.
- Streamlit transforme automatiquement tes variables en widgets interactifs.
- À chaque interaction utilisateur, ton script est réexécuté de haut en bas (mais intelligemment : avec un cache pour ne pas tout recalculer).
- Résultat : une app web qui tourne dans ton navigateur.
Pas de HTML. Pas de CSS. Pas de JavaScript. Pas de Flask, Django, ou FastAPI à configurer. Juste du Python.
Concrètement, voici ce que trois lignes de Streamlit produisent :
import streamlit as st
st.title("Ma première app")
st.write("Hello, le monde !")Et paf — une page web avec un titre et du texte. C'est tout.
2. Installation : prépare ton environnement
On va travailler proprement, dans un environnement virtuel. Tu vas avoir besoin de Python 3.8 minimum (vérifie avec python3 --version).
# Crée un dossier pour ton projet
mkdir mon-app-streamlit
cd mon-app-streamlit
# Crée un environnement virtuel
python3 -m venv venv
# Active-le
# Sur Linux/Mac :
source venv/bin/activate
# Sur Windows :
# venv\Scripts\activate
# Installe Streamlit
pip install streamlit
# Vérifie que tout est OK
streamlit --versionTu devrais voir quelque chose comme Streamlit, version 1.42.0. Parfait, on est prêts.
3. Ton premier fichier : hello.py
Crée un fichier app.py avec ce contenu minimal :
import streamlit as st
st.set_page_config(
page_title="Mon Classifieur IA",
page_icon="",
layout="centered"
)
st.title(" Classifieur d'images par IA")
st.markdown("Dépose une image et je te dis ce qu'elle contient !")Lance l'app avec :
streamlit run app.pyTon navigateur s'ouvre automatiquement sur http://localhost:8501. Tu vois ta première page Streamlit !
Ce que set_page_config fait : - page_title : le titre dans l'onglet du navigateur - page_icon : l'emoji dans l'onglet - layout="centered" : le contenu est centré (sinon utilise "wide" pour du plein écran)
4. Ajoute un upload d'image (drag-and-drop)
Modifie ton app.py pour ajouter un widget d'upload :
import streamlit as st
from PIL import Image
import io
st.set_page_config(
page_title="Mon Classifieur IA",
page_icon="",
layout="centered"
)
st.title(" Classifieur d'images par IA")
st.markdown("Dépose une image et je te dis ce qu'elle contient !")
# Widget d'upload
fichier = st.file_uploader(
"Choisis une image...",
type=["jpg", "jpeg", "png", "webp"],
help="Formats acceptés : JPG, PNG, WEBP"
)
if fichier is not None:
# Affiche l'image uploadée
image = Image.open(fichier)
st.image(image, caption="Image chargée ", use_container_width=True)
# Infos sur l'image
st.info(f" Dimensions : {image.size[0]}×{image.size[1]} pixels")Relance avec streamlit run app.py (ou laisse Ctrl+C puis relance, ou Streamlit détecte le changement auto si tu as st.rerun). Dépose une image — tu la vois s'afficher instantanément.
Ce que tu dois voir : une zone de drag-and-drop avec "Browse files", puis ton image qui s'affiche en dessous une fois chargée.
5. Branche l'IA : classification avec MobileNetV2
Maintenant, on va utiliser un vrai modèle d'IA pour classifier l'image. On utilise MobileNetV2 via PyTorch — c'est un modèle léger (14 Mo) qui reconnaît 1000 catégories d'objets, et il tourne même sur un laptop sans GPU.
Installe les dépendances :
pip install torch torchvision pillowPuis voici le code complet de app.py :
import streamlit as st
from PIL import Image
import torch
import torchvision.transforms as transforms
from torchvision.models import mobilenet_v2, MobileNet_V2_Weights
import io
# ─── CONFIG ────────────────────────────────────────
st.set_page_config(
page_title="Classifieur IA",
page_icon="",
layout="centered"
)
# ─── CHARGEMENT DU MODÈLE (avec cache) ────────────
@st.cache_resource
def charger_modele():
"""Charge MobileNetV2 pré-entraîné sur ImageNet."""
with st.spinner(" Chargement du modèle IA..."):
# Charge les poids et les labels ImageNet
weights = MobileNet_V2_Weights.IMAGENET1K_V1
modele = mobilenet_v2(weights=weights)
modele.eval() # Passe en mode évaluation (pas d'entraînement)
# Transformations pour préparer l'image
transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]
)
])
# Liste des labels ImageNet
labels = weights.meta["categories"]
return modele, transform, labels
modele, transform, labels = charger_modele()
# ─── INTERFACE ─────────────────────────────────────
st.title(" Classifieur d'images par IA")
st.markdown(
"Dépose une image et je te dis ce qu'elle contient, "
"grâce à un réseau de neurones qui tourne directement "
"**dans ton navigateur** (enfin, sur ton serveur local )."
)
fichier = st.file_uploader(
" Choisis une image...",
type=["jpg", "jpeg", "png", "webp"],
help="Formats acceptés : JPG, PNG, WEBP"
)
if fichier is not None:
# Affiche l'image
image = Image.open(fichier).convert("RGB")
col1, col2 = st.columns([1, 1])
with col1:
st.image(image, caption="Image chargée ", use_container_width=True)
with col2:
# Prédiction
with st.spinner(" Analyse en cours..."):
# Prépare l'image pour le modèle
tenseur = transform(image).unsqueeze(0) # Ajoute la dimension batch
# Inférence (pas de calcul de gradient)
with torch.no_grad():
predictions = modele(tenseur)
probabilites = torch.nn.functional.softmax(predictions[0], dim=0)
# Top 5 prédictions
top5_probs, top5_indices = torch.topk(probabilites, 5)
st.subheader(" Top 5 prédictions")
for i in range(5):
label = labels[top5_indices[i].item()]
prob = top5_probs[i].item() * 100
# Jauge de progression plus jolie
couleur = "" if prob > 50 else "" if prob > 20 else ""
st.write(f"{couleur} **{label}** — {prob:.1f}%")
st.progress(min(prob / 100, 1.0))
# ─── PIED DE PAGE ──────────────────────────────────
st.divider()
st.caption(
"Propulsé par MobileNetV2 (PyTorch) + Streamlit. "
"Ton image n'est jamais envoyée sur Internet — tout tourne en local."
)Sauvegarde et relance streamlit run app.py. Ça y est — tu as une application de classification d'images qui tourne !
6. Comment ça marche : décryptage ligne par ligne
Le cache magique `@st.cache_resource`
Streamlit réexécute ton script à chaque interaction. Sans cache, le modèle serait rechargé à chaque fois (3-5 secondes). @st.cache_resource dit à Streamlit : « Stocke le résultat en mémoire, et réutilise-le tant que le code ne change pas. »
`modele.eval()`
Passe le modèle en mode évaluation. Pas de dropout, pas de batch norm apprenante — le modèle est figé pour l'inférence.
`torch.no_grad()`
Désactive le calcul des gradients. Ça économise de la mémoire et accélère l'inférence, puisque tu n'entraînes pas le modèle.
Les colonnes `st.columns`
Tu crées une disposition en deux colonnes côte à côte. Pratique pour comparer l'image et les résultats.
`st.progress()`
Une barre de progression visuelle pour chaque probabilité. C'est plus parlant qu'un simple chiffre.
7. Va plus loin : 3 améliorations que tu peux coder en 5 minutes
7.1 Ajouter un seuil de confiance
seuil = st.slider("Seuil de confiance minimum", 0, 100, 10, help="Affiche uniquement les prédictions au-dessus de ce seuil")
# Dans la boucle d'affichage :
if prob >= seuil:
st.write(f"...")7.2 Permettre de prendre une photo avec la webcam
photo = st.camera_input("Ou prends une photo ")
if photo is not None:
image = Image.open(photo).convert("RGB")
# même traitement que pour fichier...7.3 Sauvegarder l'historique des prédictions
if "historique" not in st.session_state:
st.session_state.historique = []
# Après prédiction :
st.session_state.historique.append({
"fichier": fichier.name,
"top1": labels[top5_indices[0].item()],
"confiance": top5_probs[0].item()
})
# Afficher l'historique
with st.expander(" Historique des prédictions"):
for h in st.session_state.historique:
st.write(f"- **{h['top1']}** ({h['confiance']:.0%}) — *{h['fichier']}*")8. Mets ton app en ligne gratuitement
Tu veux que le monde entier puisse utiliser ton classifieur ? Utilise Streamlit Community Cloud, c'est gratuit :
# 1. Pousse ton code sur GitHub
git init
git add app.py requirements.txt
git commit -m "Mon classifieur IA avec Streamlit"
git push origin main
# 2. Crée un fichier requirements.txt
echo "streamlit
torch
torchvision
pillow" > requirements.txtPuis va sur share.streamlit.io, connecte ton compte GitHub, sélectionne ton dépôt, et Streamlit déploie ton app automatiquement en 30 secondes. Tu obtiens une URL publique du type https://ton-app.streamlit.app.
9. Pièges classiques — et comment les éviter
Piège | Symptôme | Solution |
**Oubli d'environnement virtuel** | `ModuleNotFoundError: No module named 'streamlit'` | Toujours `source venv/bin/activate` avant de lancer |
**Modèle rechargé à chaque interaction** | L'app est lente, 5 sec de latence à chaque clic | Utilise `@st.cache_resource` sur la fonction de chargement |
**Image non convertie en RGB** | `ValueError: pic should be 2/3 dimensional` | Fais `Image.open(fichier).convert("RGB")` |
**`st.session_state` non initialisé** | `AttributeError: st.session_state has no attribute...` | Vérifie l'existence avec `if "cle" not in st.session_state:` |
**Fichier trop gros pour Streamlit Cloud** | Déploiement qui timeout | Limite la RAM : les modèles légers (MobileNet, DistilBERT) sont tes amis. Pas de LLM 7B sur le free tier ! |
**App qui rame sur mobile** | Interface qui lag sur téléphone | Utilise `layout="centered"` plutôt que `"wide"`, et `use_container_width=True` pour les images |
10. Pour aller plus loin
Streamlit + Ollama — Branche Ollama (que tu as peut-être installé grâce au tutoriel précédent) pour créer un chatbot local avec interface web. Streamlit gère le chat, Ollama gère l'IA. Tout en local, tout gratuit.
Streamlit + LangChain — Construis une app RAG (Retrieval-Augmented Generation) avec une interface Streamlit. Upload un PDF, pose des questions dessus, vois les réponses.
Streamlit Components — La galerie officielle propose des dizaines de composants custom : cartes interactives, éditeurs de code, lecteurs PDF, graphiques 3D... Tu peux tout intégrer en deux lignes.
En résumé
Tu viens de construire une application web complète de classification d'images, en moins de 80 lignes de Python pur. Aucune ligne de HTML, CSS ou JavaScript. Streamlit a géré toute la partie web pour toi.
La recette est toujours la même : 1. `st.title()` → donne un titre 2. `st.file_uploader()` / `st.slider()` / etc. → crée des widgets 3. Ton code Python → traite les données 4. `st.write()` / `st.image()` / `st.progress()` → affiche les résultats
Et si tu veux partager ton app avec le monde, Streamlit Community Cloud la déploie gratuitement en 30 secondes.
À toi de jouer ! Prends n'importe quel script Python que tu utilises — analyse de données, prédiction IA, génération de texte — et donne-lui une interface en 20 minutes chrono. Le seul prérequis, c'est de savoir écrire du Python. Et ça, tu sais déjà le faire.

