Classification non-supervisé de pixel : application des kmeans
Le but de cette exercice est de montrer l'utilisation de kmeans sur un cas « concret » appliquer à de l'analyse d'image. On souhaite ici quantifier le nombre de teinte/cluster nécéssaire pour représenter une image sans trop la dégradé. On charge alors une image quelqonque en matrice de couleur et on fait une première transformation en HSV (Teinte, Saturation, Valeur) dont on ne garde que la teinte, le tout ranger dans un tableau 1D en gardant un ordre sur les données de la forme [i*height +j] pour avoir une correspondance avec les coordonnées de la matrice de l’image. De cette façon nous pouvons juste utiliser l’algorithme kmeans que nous avons développez précédement qui permettait déjà de traiter un problème en n-dimensions. Pour initialiser les centres, on découpe l’espace des teintes en n valeurs pour maximiser les chances de trouver toutes les couleurs peu importe l’environnent sur lequel est traitée l’information.
↓
if K==1:
centers = [0.5]
elif K==2:
centers=[0., 1.]
else:
centers = list(zeros(K))
for groupe in range(K):
centers[groupe] = (groupe)/(K-1)
centers[K-1]=1.
Application des kmeans
Lors de l’exécution de l’algorithme les teintes sous-représentées vont se décaler, faire des spectres plus visibles. C’est comme si on prenait un histogramme et que l’on ne prenait que les n plus fortes teintes représentées pour ensuite affecter les autres teintes aux teintes les plus proches (les centres), cette algorithme peut donc être utilisé pour de la compression d'image :
Pour les échantillons de l’image « matisse.jpg » nous avons constaté que les feuilles de teinte jaune ou orange sont très difficiles à être trouvées car elles sont largement sous-représentées en nombre de pixels il faut donc compter 14 teintes minimum ou 35 pour avoir les deux teintes de feuilles proches de l’original
Bonne représentation de l’image « miro.jpg » à partir de 6 teintes, après les contours sont plus lisses donc visuellement plus propres
Illustration de la progression de classement sur le nombre de classes (ie : nombre de teintes) comme ce tableau a des zones de couleur bien distinctes et que le nombre de couleurs est limité la détection est facile et bien opérée.
Comment évaluer la classification produite ?
On peu comparer visuellement si le paramètre K(nombre de teintes) est trop faible il y a forcement des zones mal classées, et lorsque certaines composantes sont sous-représentées également mais ces dernières n’introduisent pas une grosse marge d’erreur. Mais la mise en place de mesure est toujours à privilégier plutöt que l'oeil humain qui reste subjectif et imprécis. Pour cela il y a plusieurs approches possible que vous pouvez implémenté est tester, par exemple :
- on soustrait la teinte de l’image originelle et la teinte de l’image « classifiée »
- on fait un histogramme, les classes mal classées sont plus représentées
- on fait la moyenne des erreurs de classement
- on compare à un seuil fixe