-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBagOfVW.py
117 lines (90 loc) · 3.87 KB
/
BagOfVW.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
__author__ = "Jose Flavio Quispe Irrazabal"
__copyright__ = "Copyright 2017, Laboratorio 4"
__license__ = "Apache"
__version__ = "1.0"
__email__ = "[email protected]"
__status__ = "Production"
import numpy as np
import cv2
from sklearn.svm import SVC
from Helpers import FileHelper
from Helpers import BOVHelper
from Helpers import ImageHelper
from matplotlib import pyplot as plt
class BagOfVW:
def __init__(self, numClusters, folder):
self.img_path = "img/"
self.numClusters = numClusters
self.file_helper = FileHelper(folder)
self.img_helper = ImageHelper()
self.algorithmHelper = BOVHelper(numClusters)
self.name_dict = {}
self.descList = []
self.clf = SVC()
self.train_labels = np.array([])
def trainModel(self, trainPath):
# leyendo imagenes
self.images, self.numImages = self.file_helper.getFiles(trainPath)
# extrayendo caracteristicas de cada imagen usando SIFT
label_count = 0
for word, imlist in self.images.items():
self.name_dict[str(label_count)] = word
print("Obteniendo caracteristicas para ", word)
for im in imlist:
#cv2.imshow("im", im)
#cv2.waitKey()
self.train_labels = np.append(self.train_labels, label_count)
keypoints, descriptors = self.img_helper.features(im)
self.descList.append(np.array(descriptors))
label_count += 1
bov_descriptor_stack = self.algorithmHelper.formatND(self.descList)
self.algorithmHelper.cluster()
# creando histograma
self.algorithmHelper.developVocabulary(n_images = self.numImages, descriptor_list=self.descList)
# normalizacion de caracteristicas
self.algorithmHelper.standardize()
# a entrenar el modelo
self.algorithmHelper.trainSVC(self.train_labels)
def recognize(self, test_img):
"""
Metodo para reconocer cada imagen
"""
kp, des = self.img_helper.features(test_img)
# generamos un vocabulario para las imagenes
vocab = np.array([0 for i in range(self.numClusters)])
# retorna los clusters mas cercanos con las caracteristicas parecidas
test_ret = self.algorithmHelper.kmeans_obj.predict(des)
for each in test_ret:
vocab[each] += 1
# obtenemos caracteristicas
vocab = vocab.reshape(1,-1)
vocab = self.algorithmHelper.scale.transform(vocab)
# predecimos la clase de la imagen
lb = self.algorithmHelper.supportVectorMachine.predict(vocab)
print ("La imagen es de la clase: ", self.name_dict[str(int(lb[0]))])
#print ("Pertenece a clase entrenada: " + str(lb))
return lb
def testModel(self, testPath):
"""
Para testear el clasificador
Obtendra todas las imagenes de la carpeta de testing elegida en el metodo init()
predict() obtiene la clase a la que pertenece cada imagen y la muestra en una interfaz grafica
"""
self.testImages, self.testImageCount = self.file_helper.getTestFiles(testPath)
predictions = []
for word, imlist in self.testImages.items():
# print("procesando ", word)
for im in imlist:
#se intento K nn pero no se logro, puedo ver el codigo del metodo en Helpers.py
#cl = self.algorithmHelper.classifyKnn(im)
cl = self.recognize(im)
predictions.append({
'imagen': im,
'clase': cl,
'nombre': self.name_dict[str(int(cl[0]))]
})
#print("Se testearon " + str(len(predictions))+" imagenes")
for each in predictions:
plt.imshow(cv2.cvtColor(each['imagen'], cv2.COLOR_GRAY2RGB))
plt.title(each['nombre'])
plt.show()