301 lines
34 KiB
Text
301 lines
34 KiB
Text
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# TP1 KMEANS\n",
|
|
"\n",
|
|
"On nous propose de coder l'algorithme des kmeans afin de faire du clustering sur 2 classes puis plus de 2 classes.\n",
|
|
"Plus tard, on utilisera notre algorithme pour segmenter une image sur l'information de couleur."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 605,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import matplotlib.pyplot as plt\n",
|
|
"import numpy as np\n",
|
|
"import scipy.spatial\n",
|
|
"from skimage import io"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 606,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# mean = [1,2,3,4]\n",
|
|
"# sd = [0.25, 0.25, 0.1, 0.2]\n",
|
|
"clusters = 5\n",
|
|
"dim = 2\n",
|
|
"nb = 50\n",
|
|
"K= clusters\n",
|
|
"\n",
|
|
"path_image = \"fruits.jpg\"\n",
|
|
"# print(mean)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Fonctions à utiliser pour le clustering"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 607,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def gen_points(mean=1,sd=0.5, nb=100, dim=2, clusters=2):\n",
|
|
" size = []\n",
|
|
" mean = np.random.randint(5, size=clusters)\n",
|
|
" mean = mean.T * np.random.random(size=clusters)\n",
|
|
" sd = np.random.random(size=clusters)\n",
|
|
" # for i in range(0,dim):\n",
|
|
" size.append(nb)\n",
|
|
" size.append(dim)\n",
|
|
" points = np.random.normal(mean[0],sd[0],size=size)\n",
|
|
" for i in range(1,clusters):\n",
|
|
" points = np.concatenate((points,np.random.normal(mean[i],sd[i],size=size)),axis=0)\n",
|
|
" \n",
|
|
" return points"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 608,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def distance(points,Pc): \n",
|
|
" return scipy.spatial.distance.cdist(points[:,:], Pc[:,:])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 609,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def kmeans(points = [0,0], K = 1):\n",
|
|
" # Initialisation K prototypes\n",
|
|
" dim = points.shape[1]\n",
|
|
" N = points.shape[0]\n",
|
|
" iter = 0\n",
|
|
" eps = 0.1\n",
|
|
" Pc_index = []\n",
|
|
" Pc_save = np.zeros([K,dim])\n",
|
|
" clusters = []\n",
|
|
"\n",
|
|
" for i in range(0,K):\n",
|
|
" Pc_index.append(np.random.randint(0,N))\n",
|
|
" Pc = points[Pc_index,:]\n",
|
|
"\n",
|
|
" while (np.mean(distance(Pc,Pc_save)) > eps and iter < 5):\n",
|
|
" iter += 1\n",
|
|
" Pc_save = Pc\n",
|
|
" # print(Pc)\n",
|
|
" # print(points[:,:Pc.shape[0]])\n",
|
|
" dist = distance(points=points[:,:Pc.shape[1]],Pc=Pc)\n",
|
|
" clust = np.argmin(dist, axis=1)\n",
|
|
" clust = np.expand_dims(clust, axis=0)\n",
|
|
" points = np.append(points[:,:Pc.shape[1]], clust.T, axis=1)\n",
|
|
" # print(points)\n",
|
|
" Pc = np.zeros([K,dim])\n",
|
|
" index = np.array([])\n",
|
|
"\n",
|
|
" for n in range(0,N):\n",
|
|
" for k in range(0,K):\n",
|
|
" index = np.append(index, (clust==k).sum())\n",
|
|
" if points[n,-1] == k:\n",
|
|
" # print(points)\n",
|
|
" # print(Pc)\n",
|
|
" Pc[k,:] = np.add(Pc[k,:], points[n,:-1])\n",
|
|
"\n",
|
|
" for k in range(0,K):\n",
|
|
" Pc[k,:] = np.divide(Pc[k,:],index[k])\n",
|
|
"\n",
|
|
" # print(Pc)\n",
|
|
" index = points[:,-1]\n",
|
|
" points = points[:,:-1]\n",
|
|
" return Pc, index, points\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 610,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"colors=['red', 'green','yellow','blue','purple', 'orange']\n",
|
|
"def visualisation(points, index, Pc=[0,0], K=1):\n",
|
|
" if(points.shape[1]==2):\n",
|
|
" # for k in range(0,K):\n",
|
|
" for n in range(0,len(points)):\n",
|
|
" plt.plot(points[n,0], points[n,1], 'o', color=colors[int(index[n])])\n",
|
|
" plt.plot(Pc[:,0],Pc[:,1],'r+')\n",
|
|
" plt.grid(True)\n",
|
|
" plt.axis([min(mean)-1,max(mean)+1,min(mean)-1,max(mean)+1])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 611,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def img_2_mat(my_img):\n",
|
|
" mat = my_img.reshape(my_img.shape[0]*my_img.shape[1],my_img.shape[2])\n",
|
|
" return mat"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 612,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def mat_2_img(mat,my_img):\n",
|
|
" img_seg = mat.reshape(my_img.shape[0], my_img.shape[1], my_img.shape[2])\n",
|
|
" return img_seg"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 613,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def kmeans_image(path_image, K):\n",
|
|
" my_img = io.imread(path_image)\n",
|
|
" imgplot = plt.imshow(my_img)\n",
|
|
" Mat = img_2_mat(my_img)\n",
|
|
" \n",
|
|
" Pc, index, clusters = kmeans(Mat, K)\n",
|
|
"\n",
|
|
" for k in range(K):\n",
|
|
" Mat[k,:] = Pc[index[k],:]\n",
|
|
"\n",
|
|
" img_seg = mat_2_img(Mat, my_img)\n",
|
|
"\n",
|
|
" io.imsave(path_image.split('.')[0] + \"_%d.jpg\" % K, img_seg)\n",
|
|
" imgplot = plt.imshow(img_seg)\n",
|
|
" return Pc, index, img_seg\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 614,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"points = gen_points(nb,dim,clusters)\n",
|
|
"# print(points.shape)\n",
|
|
"# print(points.mean(axis=0))\n",
|
|
"# print(points)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 615,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"dist = distance(points,points)\n",
|
|
"# print(dist)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 616,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"Pc, index, clusters = kmeans(points,K=K)\n",
|
|
"# print(index)\n",
|
|
"# print(clusters)\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 617,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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+MO8+/T29uLMM88087Bj7rjjDqxcuXLs77///e84+eST0d/fb/hEyBvJZBI1NTXYtWsXotGo180hDTxHwcDz5H88R+JkWcbw8DBOOukkw31NBSK33XYbvvrVr+bd55RTTjHzkBNMnjwZkydPztk+ffp0nnSfi0ajPEc+x3MUDDxP/sdzJEa0A8FUIFJZWYnKykpLDSIiIiLK5liOSH9/P/bt24f+/n6kUils374dAHDaaafh2GOPdeqwREREFCCOBSI/+MEP8MQTT4z9/bnPfQ4A0NXVhQbBIgiTJ0/GqlWrNIdryB94jvyP5ygYeJ78j+fIGZIsMreGiIiIyAFca4aIiIg8w0CEiIiIPMNAhIiIiDzDQISIiIg8E5hA5O6778ZFF12EadOm4bjjjvO6OTTqkUceQV1dHaZMmYILL7wQf/jDH7xuEmXYsmULFi9ejJNOOgmSJOHXv/61102iDPfccw/OP/98lJeX4/jjj8eXvvQlvPXWW143izL85Cc/wWc+85mxImZz587Fc88953WzQiUwgciRI0dw9dVX49vf/rbXTaFRTz75JFauXIlVq1bhtddewznnnIPLL78cf/vb37xuGo06cOAAzjnnHDzyyCNeN4U0bN68GcuXL8crr7yCzs5OjIyMYMGCBThw4IDXTaNRsVgM9957L7Zt24ZXX30VX/jCF9DU1ITXX3/d66aFRuCm7z7++ONoaWnB3wOyOm2YXXjhhTj//PPxb//2bwCAdDqNmpoa3HLLLbj99ts9bh1lkyQJmzZtwpe+9CWvm0I69uzZg+OPPx6bN2/GpZde6nVzSMeMGTNw//334+tf/7rXTQmFwPSIkL8cOXIE27Ztw2WXXTa2raSkBJdddhm2bt3qYcuIgmv//v0AlAsd+U8qlcKGDRtw4MABzJ071+vmhIZjlVUp3Pbu3YtUKoUTTjhhwvYTTjgBb775pketIgqudDqNlpYWXHzxxTj77LO9bg5l2LFjB+bOnYuPP/4Yxx57LDZt2oSzzjrL62aFhqc9IrfffjskScr7w4saERWD5cuX489//jM2bNjgdVMoyxlnnIHt27fj97//Pb797W9j2bJleOONN7xuVmh42iNy22234atf/WrefU455RR3GkOmzJw5E5FIBB988MGE7R988AFOPPFEj1pFFEw333wzfvvb32LLli2IxWJeN4eyTJo0CaeddhoA4Nxzz8Uf//hHtLW14dFHH/W4ZeHgaSBSWVmJyspKL5tAFk2aNAnnnnsuXnzxxbHkx3Q6jRdffBE333yzt40jCghZlnHLLbdg06ZN6O7uxic/+Umvm0QC0uk0Dh8+7HUzQiMwOSL9/f3Yt28f+vv7kUqlsH37dgDAaaedhmOPPdbbxhWplStXYtmyZTjvvPNwwQUXoLW1FQcOHMD111/vddNo1EcffYS333577O+dO3di+/btmDFjBmpraz1sGQHKcMy6devwzDPPoLy8HO+//z4AYPr06Zg6darHrSMAuOOOO3DFFVegtrYWw8PDWLduHbq7u/H888973bTwkANi2bJlMoCcn66uLq+bVtQefvhhuba2Vp40aZJ8wQUXyK+88orXTaIMXV1dmv9vli1b5nXTSJY1zw0A+Ze//KXXTaNRX/va1+STTz5ZnjRpklxZWSl/8YtflF944QWvmxUqgasjQkREROHBOiJERETkGQYiRERE5BkGIkREROQZBiJERETkGQYiRERE5BkGIkREROQZBiJERETkGQYiRERE5BkGIkREROQZBiJERETkGQYiRERE5BkGIkREROSZ/x9EgNUIFp900wAAAABJRU5ErkJggg==",
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"visualisation(clusters, index, Pc, K=K)\n",
|
|
"# print(Pc)\n",
|
|
"# print(mean)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 618,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"Pc, index, img_seg = kmeans_image(path_image=path_image, K=K)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"(103230,)\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print(index.shape)"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3.8.10 64-bit",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.8.10"
|
|
},
|
|
"orig_nbformat": 4,
|
|
"vscode": {
|
|
"interpreter": {
|
|
"hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6"
|
|
}
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|