Couleurs des images
Fait partie de la section Apprentissage non supervisé du Journey Machine Learning de Coddy. Leçon 41 sur 51.
Un sérigraphe dispose de quelques encres, pas de millions de couleurs. k-means choisit les quelques couleurs les mieux adaptées à n’importe quelle image :
Une image couleur a la forme (lignes, colonnes, 3) : rouge, vert et bleu pour chaque pixel, chacun allant de 0 à 1. Un reshape transforme les pixels en données :
pixels = image.reshape(-1, 3)
km = KMeans(n_clusters=4, n_init=10, random_state=0).fit(pixels)
poster = km.cluster_centers_[km.labels_].reshape(image.shape)
ax.imshow(poster)Chaque centre correspond à une couleur. L’indexation des centres à l’aide des étiquettes donne à chaque pixel la couleur de son centre ; la remise en forme réassemble les lignes pour reformer une image.
Défi
MoyenUn atelier d’affiches imprime en sérigraphie un lac de montagne avec k encres. Le code de départ peint l’image de 40 sur 60, lit k et prépare un graphique avec un titre.
- Transforme l’image en une ligne par pixel et trouve
kcouleurs avec k-means. - Repeins chaque pixel avec la couleur de son centre et rassemble les lignes pour reformer une image.
- Affiche-la sur
ax, puis montre-la.
Comme ce coucher de soleil en 5 encres :
Ton programme n’affiche rien : Coddy décrit ton image et ses encres. Essaie ensuite d’autres valeurs de k : à partir de quand le bateau rouge obtient-il sa propre encre ?
Essayez vous-même
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# Peint un lac de montagne de 40 sur 60 : un ciel, un sommet enneigé, une forêt, de l’eau et un bateau rouge
def paint_lake():
image = np.zeros((40, 60, 3))
for r in range(40):
for c in range(60):
if 30 <= r <= 31 and 10 <= c <= 17 - (r - 30) * 2:
image[r, c] = [0.8, 0.15, 0.1]
elif r >= 27:
t = (r - 27) / 12
image[r, c] = [0.1, 0.45 - 0.2 * t, 0.65 - 0.2 * t]
elif r >= 21:
image[r, c] = [0.1, 0.35 + 0.05 * (c % 3), 0.15]
elif r >= abs(c - 34) + 4 and r < 10:
image[r, c] = [0.95, 0.95, 0.97]
elif r >= abs(c - 34) + 4:
image[r, c] = [0.45, 0.42, 0.45]
else:
image[r, c] = [0.55 + r / 50, 0.75 + r / 120, 0.95]
return np.round(image, 3)
# Ne modifiez pas les lignes ci-dessous
image = paint_lake()
k = int(input())
fig, ax = plt.subplots()
ax.set_title(f"{k} inks")
ax.axis("off")
# Écrivez votre code ci-dessous
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Apprentissage non supervisé
1Découvrir des groupes
Apprendre sans étiquettesMesurer la similaritéK-Means à la mainK-Means avec scikit-learnRécapitulatif : les membres de la salle de sport4Classification hiérarchique
Fusion étape par étapeModèles agglomératifsDendrogrammesRécapitulatif : races de chiens7L’ACP en pratique
Visualiser 64 dimensionsLes composantes comme motifsCompresser et reconstruireL’ACP avant un modèleRécapitulatif : scanner de visages10Projet : Explorateur de chiffres
Observer les chiffresRéduire avec la PCARegrouper les chiffresNommer les groupesRepérer les intrus2Choisir k
InertieLa méthode du coudeScores de silhouetteMettre à l’échelle avant le clusteringRécapitulatif : zones de livraison3Interpréter les clusters
Caractériser les clustersCentres dans les unités réellesClusters et étiquettes connuesQuand K-Means échoueRécapitulatif : dégustation de thé6Moins de dimensions
Trop de caractéristiquesProjectionsPCAVariance expliquéeRécapitulatif : chants d’oiseaux9Les clusters en action
Segments de clientèleLes clusters comme caractéristiquesCouleurs des imagesRécapitulatif : ambiances des playlistsEntraînez-vous par vous-même : Compilateur Python en ligne