-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathKMeans.py
More file actions
86 lines (75 loc) · 2.57 KB
/
KMeans.py
File metadata and controls
86 lines (75 loc) · 2.57 KB
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
import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
import time
import random
#Loading images
train_folder_path_cats = r"/afhq/train/cat"
train_folder_path_dogs = r"/afhq/train/dog"
train_folder_path_wild = r"/afhq/train/wild"
images, targets = load_images(train_folder_path_cats, [1,0,0])
res = load_images(train_folder_path_dogs, [0,1,0])
images.extend(res[0])
targets.extend(res[1])
res = load_images(train_folder_path_wild, [0,0,1])
images.extend(res[0])
targets.extend(res[1])
def load_images(folder_path, class_name = None, size=(64, 64)):
images = []
image_class = []
for filename in os.listdir(folder_path):
img = cv2.imread(os.path.join(folder_path, filename))
if img is not None:
img = cv2.resize(img, size) # Resize image
images.append(img)
image_class.append(class_name)
return images, image_class #targets
#Reducing image size
images = [cv2.resize(img, (8, 8)) for img in images]
#Convert to grayscale
images = [cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) for img in images]
#Number of means
k = 3
def kmeans(images, targets, k):
#Initialize means with random numbers in [0,256]
means = np.random.randint(0, 256, (k, 8, 8))
neighbors = np.zeros(len(images))
#Train
for epochs in range(10):
for i in range(len(images)):
img = images[i]
#Calculate distances
distances = np.zeros(k)
for j in range(k):
distances[j] = np.linalg.norm(img - means[j])
neighbors[i] = argmin(distances)
#Calculate new means
for i in range(k):
means[i] = np.mean(images[neighbors == i], axis=0)
#Test
for i in range(len(images)):
img = images[i]
#Calculate distances
distances = np.zeros(k)
for j in range(k):
distances[j] = np.linalg.norm(img - means[j])
neighbors[i] = argmin(distances)
#Print results
if (targets[neighbors[i]] == targets[i]):
print("Success")
else:
print("Error")
"""
if (targets[i] == [1,0,0]) and (neighbors[i] == 0):
print("Success")
elif (targets[i] == [0,1,0]) and (neighbors[i] == 1):
print("Dog detected successfully")
elif (targets[i] == [0,0,1]) and (neighbors[i] == 2):
print("Wild detected successfully")
else:
print("Error")
"""
kmeans(images, targets, k)
def argmin(array):
return np.argmin(array)