def clusterizza(self, v, path ): siq = v[0] #uso sift? shq = v[1] #uso shape? orq = v[2] #uso orb? classi = v[3] car = accessoCartella() #leggo tutto quelloche c e nella cartella, per farlo uso classe accessoCartella vet = [] #vettore tutte le immagini senza path, solo nome vet=car.leggi(path) k=len(vet) #quante sono le immagini vettore = [0]*k#con path for i in range(0,k): vettore[i]=path+'/'+vet[i] vetSiftFeatures = [] vetOrbFeatures = [] vetShapeFeatures = [] vettoreGenerale = [] # dove i e l indice dell immagine for i in range(0,k):#per ogni immagine features1immagine = []#vettore con features di 1 singola immagine, contiene matrici filate in vettori if (siq==1):#se usi sift lettoreSi = leggiSIFT() vetSiftFeatures.append(lettoreSi.leggi(vettore[i])) features1immagine = features1immagine + vetSiftFeatures[i] if (orq==1):#se usi orb lettoreOr = leggiORB() vetOrbFeatures.append(lettoreOr.leggi(vettore[i])) features1immagine = features1immagine + vetOrbFeatures[i] if (shq==1):#se usi shape lettoreShape = leggiShape() # shape ha bisogno di 1 solo parametro vetShapeFeatures.append(lettoreShape.leggi(vettore[i],0)) features1immagine = features1immagine + vetShapeFeatures[i] vettoreGenerale.append(features1immagine)#matrice generale con tutte le features di tutte le immagini, ogni riga e un immagine #non e detto che tutte le righe abbiano la stessa lunghezza, alcune immagini potrebbero avere meno punti chiave, quindi si normalizza #la lunghezza dei vari vettori per renderla uguale vettoreGenerale = np.array(vettoreGenerale) lengths = [len(line) for line in vettoreGenerale] #print lengths minimo = min(lengths) indice = len(vettoreGenerale) nuovo = [] for riga in range(0,indice): #print "indice:" + str(riga) nuovo.append(vettoreGenerale[riga][0:minimo]) #lengths = [len(line) for line in nuovo] #print lengths #print nuovo #print "----------------------------------------------------------------------" #KMeans gestisce la clusterizzazione n_clusters_ = 0 vetClass = [0] neps = 3000 while n_clusters_ < 1 or n_clusters_ >= (len(vet)/2): neps = neps + 100 db = DBSCAN(eps=neps, min_samples=1).fit(nuovo) vetClass = db.labels_ n_clusters_ = len(set(vetClass)) - (1 if -1 in vetClass else 0) print "numero di cluster ottenuti: " + str(n_clusters_) vettoreDistanze = [-1.0]*len(vet) for i in range (0,len(vet)): print str(vet[i]) print "classe:" + str(vetClass[i]) + " somiglianza:" + str(vettoreDistanze[i]) print "" return [vet,vettoreDistanze,vetClass]
def clusterizza(self, v, path ): siq = v[0] #uso sift? shq = v[1] #uso shape? orq = v[2] #uso orb? classi = v[3] car = accessoCartella() #leggo tutto quelloche c e nella cartella, per farlo uso classe accessoCartella vet = [] #vettore tutte le immagini senza path, solo nome vet=car.leggi(path) k=len(vet) #quante sono le immagini vettore = [0]*k#con path for i in range(0,k): vettore[i]=path+'/'+vet[i] vetSiftFeatures = [] vetOrbFeatures = [] vetShapeFeatures = [] vettoreGenerale = [] # dove i e l indice dell immagine for i in range(0,k):#per ogni immagine features1immagine = []#vettore con features di 1 singola immagine, contiene matrici filate in vettori if (siq==1):#se usi sift lettoreSi = leggiSIFT() vetSiftFeatures.append(lettoreSi.leggi(vettore[i])) features1immagine = features1immagine + vetSiftFeatures[i] if (orq==1):#se usi orb lettoreOr = leggiORB() vetOrbFeatures.append(lettoreOr.leggi(vettore[i])) features1immagine = features1immagine + vetOrbFeatures[i] if (shq==1):#se usi shape lettoreShape = leggiShape() # shape ha bisogno di 1 solo parametro vetShapeFeatures.append(lettoreShape.leggi(vettore[i],0)) features1immagine = features1immagine + vetShapeFeatures[i] vettoreGenerale.append(features1immagine)#matrice generale con tutte le features di tutte le immagini, ogni riga e un immagine #non e detto che tutte le righe abbiano la stessa lunghezza, alcune immagini potrebbero avere meno punti chiave, quindi si normalizza #la lunghezza dei vari vettori per renderla uguale vettoreGenerale = np.array(vettoreGenerale) lengths = [len(line) for line in vettoreGenerale] #print lengths minimo = min(lengths) indice = len(vettoreGenerale) nuovo = [] for riga in range(0,indice): #print "indice:" + str(riga) nuovo.append(vettoreGenerale[riga][0:minimo]) lengths = [len(line) for line in nuovo] #print lengths #KMeans gestisce la clusterizzazione km = KMeans(n_clusters=classi, init='k-means++', n_init=10, max_iter=600, tol=0.0001, precompute_distances='auto', verbose=0, random_state=None, copy_x=True, n_jobs=1) vetClass = km.fit_predict(nuovo) vetCentri = km.cluster_centers_ #print len(vetCentri) vettoreDistanze = []#vettore con 1 distanza(rispetto al relativo centroide) per ogni immagine for i in range(0,k):#per ogni immagine vettoreImm = nuovo[i]#vettode features di ogni immagine vettoreCentroide = []#vettore del centroide di quella classe #print len(vettoreImm) for cl in range(0,classi):#trovo vettore centroide di quella classe if vetClass[i]==cl: vettoreCentroide = vetCentri[cl] #print "classe:" + str(cl) #print vettoreCentroide #print "----------------------------------------------" diff = []#differenza tra vettore dell immagine e della classe: for indice in range(0,minimo):#la calcolo diff.append(abs(vettoreImm[indice]-vettoreCentroide[indice])) diffTot = 0#differenza totale for indice in range(0,minimo): diffTot = diffTot + diff[indice] vettoreDistanze.append(diffTot) for i in range(0,len(vettoreDistanze)): #normalizzo a 100 e lo rendo una percentuale di somiglianza vettoreDistanze[i]=1-float(float(vettoreDistanze[i])/float(max(vettoreDistanze))) print vettoreDistanze for classe in range (0,classi): print "CLASSE " + str(classe) + ":" for i in range(0,k): if(vetClass[i]==classe): print " " + str(vet[i]) return [vet,vettoreDistanze,vetClass]