-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathML-Projects.py
278 lines (227 loc) · 11.4 KB
/
ML-Projects.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
# # پروژه پایانی درس یادگیری ماشین
# ### استاد آهنگران - تهیه کننده : امین زایراومالی
# ***طبق تعریف پروژه سه تصویر نمونه داده شده بایستی توسط الگوریتم خوشه بندی کی مین برای تصاویر قطعه بندی شده رنگی به ازای مقادیر مختلف کا استفاده و اعمال گردد***
#
# الگوریتم : k-means
#
# مقادیر کا : k=2 , k=3 , k=5
#
# ***از مهمترین تکنیک های عملی داده کاوی که کاربرد زیادی در علوم مختلف دارد، می توان به خوشه بندی کی مین اشاره کرد
# خوشهبندی کی مین یک الگوریتم یادگیری ماشینی بدون نظارت است که هدف آن تقسیم تعداد مشخص مشاهدات به خوشههای کا است که در آن هر مشاهده متعلق به خوشهای با نزدیکترین میانگین است. خوشه به مجموعه ای از نقاط داده اشاره دارد که به دلیل شباهت های خاص با هم جمع شده اند. برای تقسیمبندی تصویر، خوشهها در اینجا رنگهای تصویر متفاوتی دارند.***
# ##### پیاده سازی پروژه با زبان پایتون انجام شد به شرح کدهای زیر می باشد
# ### مرحله اول : اضافه کردن کتابخانه های مورد نیاز
import cv2 as cv # کتابخانه opencv
import numpy as np # کتابخانه numpy
import matplotlib.pyplot as plt # کتابخانه matplotlib
import matplotlib.image as mpimg # کتابخانه Ipython تابع نمایش تصویر
# ### مرحله دوم : لود کردن اطلاعات تصاویر در متغیر های مربوط به خودشان
# خواندن سه تصویر و قرار دادن در متغیر مربوطه اش
Orginal_img1 = mpimg.imread('image-1.jpg')
Orginal_img2 = mpimg.imread('image-2.jpg')
Orginal_img3 = mpimg.imread('image-3.jpg')
# ### مرحله سوم : نمایش تصاویر اصلی
# نمایش ۳ تصویر داده شده
fig = plt.figure(figsize=(10, 7))
rows = 2
columns = 2
fig.add_subplot(rows, columns, 1)
plt.imshow(Orginal_img1)
plt.axis('off')
plt.title("First")
fig.add_subplot(rows, columns, 2)
plt.imshow(Orginal_img2)
plt.axis('off')
plt.title("Second")
fig.add_subplot(rows, columns, 3)
plt.imshow(Orginal_img3)
plt.axis('off')
plt.title("Third")
# ### مرحله چهارم : تبدیل تصاویر به صورت دو بعدی در فرمت سه رنگ آر جی بی RGB - 2 Dimention
# RGB - 2D تبدیل تصاویر به دو بعدی و ۳ رنگ اصلی آر جی بی
image1 = Orginal_img1.reshape((-1, 3))
image2 = Orginal_img2.reshape((-1, 3))
image3 = Orginal_img3.reshape((-1, 3))
# ### مرحله ششم : تبدیل اطلاعات تصاویر به نوع فلوت Float
image1 = np.float32(image1)
image2 = np.float32(image2)
image3 = np.float32(image3)
# ### مرحله هفتم : نمایش میزان پیکسل ردیف اطلاعات تصاویر
# نمایش میزان پیکس ردیف اطلاعات تصاویر
print("Image 1 : ", image1.shape)
print("Image 2 : ", image2.shape)
print("Image 3 : ", image3.shape)
# ### مرحله هشتم : تعیین تعداد خوشه بندی تصاویر برای سه میزان کا به تعداد ۲ و ۳ و ۵
k1 = 2
k2 = 3
k3 = 5
# ### مرحله نهم : انجام خوشه بندی با الگوریتم برای تعداد ۲ دسته
# این معیار خاتمه تکرار است. وقتی این معیار برآورده شد، تکرار الگوریتم متوقف می شود
# علت استفاده برای این است که در حلقه مینیمال بی پایان قرار نگیرد
criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 10, 1.0)
# خوشه بندی تصویر اول با سه مقدار کا تعیین شده
ret1_k1, label1_k1, center1_k1 = cv.kmeans(
image1, k1, None, criteria, 10, cv.KMEANS_RANDOM_CENTERS)
ret1_k2, label1_k2, center1_k2 = cv.kmeans(
image1, k2, None, criteria, 10, cv.KMEANS_RANDOM_CENTERS)
ret1_k3, label1_k3, center1_k3 = cv.kmeans(
image1, k3, None, criteria, 10, cv.KMEANS_RANDOM_CENTERS)
# خوشه بندی تصویر دوم با سه مقدار کا تعیین شده
ret2_k1, label2_k1, center2_k1 = cv.kmeans(
image2, k1, None, criteria, 10, cv.KMEANS_RANDOM_CENTERS)
ret2_k2, label2_k2, center2_k2 = cv.kmeans(
image2, k2, None, criteria, 10, cv.KMEANS_RANDOM_CENTERS)
ret2_k3, label2_k3, center2_k3 = cv.kmeans(
image2, k3, None, criteria, 10, cv.KMEANS_RANDOM_CENTERS)
# خوشه بندی تصویر سوم با سه مقدار کا تعیین شده
ret3_k1, label3_k1, center3_k1 = cv.kmeans(
image3, k1, None, criteria, 10, cv.KMEANS_RANDOM_CENTERS)
ret3_k2, label3_k2, center3_k2 = cv.kmeans(
image3, k2, None, criteria, 10, cv.KMEANS_RANDOM_CENTERS)
ret3_k3, label3_k3, center3_k3 = cv.kmeans(
image3, k3, None, criteria, 10, cv.KMEANS_RANDOM_CENTERS)
# ### مرحله دهم : تبدیل داده های خوشه بندی به تصاویر
# Now convert back into uint8, and make original image ایجاد عکسهای اورجینال از داده های خوشه بندی شده
# تبدیل تصویر اول به ازاری سه مقدار کا
center1_k1 = np.uint8(center1_k1)
center1_k2 = np.uint8(center1_k2)
center1_k3 = np.uint8(center1_k3)
# تبدیل تصویر دوم به ازاری سه مقدار کا
center2_k1 = np.uint8(center2_k1)
center2_k2 = np.uint8(center2_k2)
center2_k3 = np.uint8(center2_k3)
# تبدیل تصویر سوم به ازاری سه مقدار کا
center3_k1 = np.uint8(center3_k1)
center3_k2 = np.uint8(center3_k2)
center3_k3 = np.uint8(center3_k3)
# ### مرحله یازدهم : تبدیل ابعاد و ذخیره داده های تصاویر
# convert all pixels to the color of the centroids - تبدیل مرکز های خوشه بندی به رنگ بندی تصاویر
img1_k1 = center1_k1[label1_k1.flatten()]
img1_k2 = center1_k2[label1_k2.flatten()]
img1_k3 = center1_k3[label1_k3.flatten()]
img2_k1 = center2_k1[label2_k1.flatten()]
img2_k2 = center2_k2[label2_k2.flatten()]
img2_k3 = center2_k3[label2_k3.flatten()]
img3_k1 = center3_k1[label3_k1.flatten()]
img3_k2 = center3_k2[label3_k2.flatten()]
img3_k3 = center3_k3[label3_k3.flatten()]
# reshape back to the original image dimension - برگرداندن ابعاد تصاویر به ابعاد اصلی
img1_k1_2 = img1_k1.reshape((Orginal_img1.shape))
img1_k2_2 = img1_k2.reshape((Orginal_img1.shape))
img1_k3_2 = img1_k3.reshape((Orginal_img1.shape))
img2_k1_2 = img2_k1.reshape((Orginal_img2.shape))
img2_k2_2 = img2_k2.reshape((Orginal_img2.shape))
img2_k3_2 = img2_k3.reshape((Orginal_img2.shape))
img3_k1_2 = img3_k1.reshape((Orginal_img3.shape))
img3_k2_2 = img3_k2.reshape((Orginal_img3.shape))
img3_k3_2 = img3_k3.reshape((Orginal_img3.shape))
# ### مرحله دوازدهم : نمایش نتایج خوشه بندی تصویر اول بهمراه نمودار مقادیر درون خوشه ای و برون خوشه ای
# نمایش تصاویر خوشه بندی با میزان کا های مشخص شده برای تصویر اول
fig = plt.figure(figsize=(15, 20))
rows = 3
columns = 2
fig.add_subplot(rows, columns, 1)
plt.imshow(Orginal_img1)
plt.axis('off')
plt.title("Orginal")
fig.add_subplot(rows, columns, 2)
plt.imshow(img1_k1_2)
plt.axis('off')
plt.title("K=2")
fig.add_subplot(rows, columns, 3)
plt.imshow(img1_k2_2)
plt.axis('off')
plt.title("K=3")
fig.add_subplot(rows, columns, 4)
plt.imshow(img1_k3_2)
plt.axis('off')
plt.title("K=5")
# نمایش میزان تابع بهینه سازی برای خوشه بندی به ازای کا های مختلف
fig.add_subplot(rows, columns, 5)
# مقادیر کا ها در محور با ایکس
x = [2, 3, 5]
# مقادیر تابع بهینه سازی خوشه سازی J
y=[]
y[0] = ret1_k1
y[1] = ret1_k2
y[2] = ret1_k3
plt.plot(x, y)
plt.xlabel('K')
plt.ylabel('J')
plt.title('(J) Value for Optimization')
plt.show()
# ### مرحله دوازدهم : نمایش نتایج خوشه بندی تصویر دوم بهمراه نمودار مقادیر درون خوشه ای و برون خوشه ای
# نمایش تصاویر خوشه بندی با میزان کا های مشخص شده برای تصویر دوم
fig = plt.figure(figsize=(15, 20))
rows = 3
columns = 2
fig.add_subplot(rows, columns, 1)
plt.imshow(Orginal_img2)
plt.axis('off')
plt.title("Orginal")
fig.add_subplot(rows, columns, 2)
plt.imshow(img2_k1_2)
plt.axis('off')
plt.title("K=2")
fig.add_subplot(rows, columns, 3)
plt.imshow(img2_k2_2)
plt.axis('off')
plt.title("K=3")
fig.add_subplot(rows, columns, 4)
plt.imshow(img2_k3_2)
plt.axis('off')
plt.title("K=5")
# نمایش میزان تابع بهینه سازی برای خوشه بندی به ازای کا های مختلف
fig.add_subplot(rows, columns, 5)
# مقادیر کا ها در محور با ایکس
x = [2, 3, 5]
# مقادیر تابع بهینه سازی خوشه سازی J
y[0] = ret2_k1
y[1] = ret2_k2
y[2] = ret2_k3
plt.plot(x, y)
plt.xlabel('K')
plt.ylabel('J')
plt.title('(J) Value for Optimization')
plt.show()
# ### مرحله دوازدهم : نمایش نتایج خوشه بندی تصویر سوم بهمراه نمودار مقادیر درون خوشه ای و برون خوشه ای
# نمایش تصاویر خوشه بندی با میزان کا های مشخص شده برای تصویر دوم
fig = plt.figure(figsize=(15, 20))
rows = 3
columns = 2
fig.add_subplot(rows, columns, 1)
plt.imshow(Orginal_img3)
plt.axis('off')
plt.title("Orginal")
fig.add_subplot(rows, columns, 2)
plt.imshow(img3_k1_2)
plt.axis('off')
plt.title("K=2")
fig.add_subplot(rows, columns, 3)
plt.imshow(img3_k2_2)
plt.axis('off')
plt.title("K=3")
fig.add_subplot(rows, columns, 4)
plt.imshow(img3_k3_2)
plt.axis('off')
plt.title("K=5")
# نمایش میزان تابع بهینه سازی برای خوشه بندی به ازای کا های مختلف
fig.add_subplot(rows, columns, 5)
# مقادیر کا ها در محور با ایکس
x = [2, 3, 5]
# مقادیر تابع بهینه سازی خوشه سازی J
y[0] = ret3_k1
y[1] = ret3_k2
y[2] = ret3_k3
plt.plot(x, y)
plt.xlabel('K')
plt.ylabel('J')
plt.title('(J) Value for Optimization')
plt.show()
# # جمع بندی نتایج پروژه
# ### تصاویر را در متغیرهایی بارگذاری کردیم و سپس آن را به آرایه دو بعدی با رنگ بندی آر جی بی تغییر دادیم
# ### سپس با استفاده از الگوریتم کی مین برای سه مقدار ۲ و ۳ و ۵ خوشه بندی نمودیم
# ### سپس داده هایی که خوشه بندی کردیم را به تصاویر قابل مشاهده بازسازی یا تبدیل نمودیم
# ### به ازای کای مشخص آن نشان دادیم همچنین در پایان نیز میزان تابع مینیمم برای کاهای مختلف طبق خوشه بندی الگوریتم کی مین بروی نمودار نشان دادیم
# ## با تشکر فراون - تهیه کننده : امین زایراومالی - دانشجو کارشناسی ارشد مهندسی کامپیوتر نرم افزار
# ## استاد محترم : جناب دکتر آهنگران
# ## دانشگاه علوم وفنون مازندارن