def go(self,query, path, numImm, googleIndex): vBaseUrls = createUrls(query) if not os.path.exists(path): os.makedirs(path) imageFolder=accessoCartella() # Google's start query string parameter for pagination. urlVec=[] k=len(imageFolder.leggi(path)) baseWidth=500 ciclo=0 start=googleIndex print "start Iniziale: " + str(start) j=k while k<numImm: vector=[] vetr = createRequests(vBaseUrls,start) for i in range(0,3): quale = vetr[i]; for image_info in json.loads(quale.text)['responseData']['results']: print "start ciclo: " + str(start) url = image_info['unescapedUrl'] if(url in urlVec): start+=0 else: urlVec.append(url) try: image_r = requests.get(url) except ConnectionError, e: print 'could not download %s' % url j-=1 continue title = setTitle(query,j) j+=1 FILE_PATH=os.path.join(path, '%s.jpg') % title file = open(FILE_PATH, 'wb') try: image=Image.open(StringIO(image_r.content)) image=dimensiona(image) image.save(file, 'JPEG') except IOError, e: # Throw away some gifs...blegh. print 'could not save %s' % url #start+=1 j-=1 continue finally: file.close()
def clusterizza(self, v, path ): siq = v[0] #uso sift? shq = v[1] #uso shape? orq = v[2] #uso orb? soSh = 0.7 #soglia alta shape (oltre la quale e di classe 3) sorb = 0.35 #soglia alta orb sosi = 0.35 #soglia alta sift bsoSh = 0.35 #soglia bassa shape (sotto la quale e di classe 1) bsorb = 0.20 #soglia bassa orb bsosi=0.20 #soglia bassa sift lisi = 300 #parametro di sift lior = 60 #paramentro di orb itsh = 1 #paramentro iterazioni di shape sesh = 5 #paramentro sessioni di shape minImage = 0.3 #quale percentuale normalizzata a 1 e necessaria perche il gruppo principale risulti #sufficentemente grande (altrimenti ripeto il ciclo) cont3=0 ##leggo da certella shoe e metto in vettore su cui poi si lavora 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 = [0]*k vetOrbFeatures = [0]*k vetShapeFeatures = [0]*k #per ogni features leggo le caratteristiche e le metto in un vettore (spesso vettore di matrici) #poi il confronto si fara solo tra vettori per non dover rileggere le immagini for i in range(0,k): lettoreSi = leggiSIFT() vetSiftFeatures[i] = lettoreSi.leggi(vettore[i]) lettoreOr = leggiORB() vetOrbFeatures[i] = lettoreOr.leggi(vettore[i]) lettoreShape = leggiShape() # shape ha bisogno di 2 parametri vetShapeFeatures[i] = lettoreShape.leggi(vettore[i],sesh,itsh) #print vetSiftFeatures #print vetOrbFeatures #print vetShapeFeatures j=0 # Contatore per fermare la selezione casuale dell'immagine while float(cont3)/float(k)<minImage and j<k: #ripeti finche il gruppo principale non e abbastanza grosso rispetto a un parametro settato (minImage) j=j+1 images = vettore # immagini scaricate dal db e lette imRif = randint(0,k-1) #immagine casuale di riferimento print images[imRif] #il confronto e in base ad un immagine casuale (ad ogni giro di while e diversa) vettorePeggiori = [] vetClSh = [] #vettore classi secondo shape vetClSi = [] #vettore classi secondo sift vetClOr = [] #vettore classi secondo orb #vettore = [] #vettore path completi vettorePeggiori = [0]*k vetClSh = [0]*k #vettore classi secondo shape vetClSi = [0]*k #vettore classi secondo sift vetClOr = [0]*k #vettore classi secondo orb #vettore = [0]*k #vettore path completi #inizializzo le classi sh = Shape() si = confrontaSIFT() orb = confrontaORB() cont3=0 vetSh = [0]*k #3 vettori dei valori numerici percentuali di somiglianza rispetto alle 3 features vetSi = [0]*k vetOr = [0]*k #imagesSel = []#disuso #FILTRO SHAPE, filtra le immagini con shape, estrae il valore di somiglianza, assegna la classe secondo shape di conseguenza if shq==1: risps=[0]*(len(images)) for i in range(0,len(images)): risps[i]=sh.shapeControl(vetShapeFeatures[imRif],vetShapeFeatures[i],sesh) vetSh[i] = round(risps[i], 2) if vetSh[i]<bsoSh: vetClSh[i]=1 if vetSh[i]>=bsoSh: if vetSh[i]>soSh: vetClSh[i]=3 else: vetClSh[i]=2 #print vetClSh #FILTRO SIFT if siq==1: risps=[0]*(len(images)) for i in range(0,len(images)): risps[i]=si.siftControl(vetSiftFeatures[imRif],vetSiftFeatures[i],lisi) vetSi[i] = round(risps[i], 2) if vetSi[i]<bsosi: vetClSi[i]=1 if vetSi[i]>=bsosi: if vetSi[i]>sosi: vetClSi[i]=3 else: vetClSi[i]=2 #print vetClSi #FILTRO ORB if orq==1: risps=[0]*(len(images)) for i in range(0,len(images)): risps[i]=orb.orbControl(vetOrbFeatures[imRif],vetOrbFeatures[i],lior) vetOr[i] = round(risps[i], 2) if vetOr[i]<bsorb: vetClOr[i]=1 if vetOr[i]>=bsorb: if vetOr[i]>sorb: vetClOr[i]=3 else: vetClOr[i]=2 #print vetClOr vetSum = [0]*k #vettore somma delle classi assegnate da ogni features for i in range(0,k): vetSum[i] = vetSum[i] + vetClSh[i] vetSum[i] = vetSum[i] + vetClSi[i] vetSum[i] = vetSum[i] + vetClOr[i] vetSum[i] = float(vetSum[i]/float(siq+orq+shq)) #divido per 3 perche sono 3 features vetClass = [0]*k #vettore della classificazione generale for i in range(0,k): #assegna la classificazione generale con un po di fantasia if vetSum[i]<2: vetClass[i]=1 else: if vetSum[i]<2.3: vetClass[i]=2 else: vetClass[i]=3 for i in range(0,k): if vetClass[i]==3: cont3=cont3+1 if(j>=k): print """\nNon ho trovato nulla che soddisfi i requisiti, saranno restituiti gli ultimi risultati calcolati.\nRivedere i parametri per la parola cercata\n""" for i in range(0,k): print vet[i] + " classe: " + str(vetClass[i])+"\n" return [vet,vet,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 #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]
def main(self): # Dati per accesso e uso DB e tabelle host="127.0.0.1" user='******' password='' dbName="imageRecognize" # Nome del database mainTable="mainTable" inputTable="inputTable" clustTable="clustTable" imm="imm" mn=Main() mySql = sqlQuery() imageFolder=accessoCartella() mySql.createDB(host, user, password, dbName) # Crea il database se non esiste conn = mySql.connectMySql(host, user, password, dbName) #Apertura connessione al database if(conn!=None): #*********************** CREAZIONE TABELLE **************************** mySql.createMainTable(conn, mainTable) mySql.createClustTable(conn, clustTable) mySql.createInputTable(conn, inputTable) # Questa non dovrà essere creata da qui ma da interfaccia "insertInputTable e updateInputTable Servono solo fintanto che manca interfaccia Web" #toSearch="fish" # Parola da cercare #numImm=30 # Quante immagini scaricare #deleteSearch=0 # 0- non cancellare nulla (default); 1- cancella tutte le informazioni precedenti per una data ricerca! #deleteAll=0 # 0- non cancellare nulla (default); 1- cancella, Database con il nome, cancella tutte le immagini nella cartella con path #algoritmo1=1 # Uso Sift 0-NO, 1-SI #algoritmo2=1 # Uso Shape 0-NO, 1-SI #algoritmo3=1 # Uso Orb 0-NO, 1-SI #selezionaClust=0 # 0: Default dv Scan, 1: KMeans, 2: Binario! #numClassi=5 # numero di classi #mySql.insertInputTable(conn, inputTable, toSearch, numImm, deleteSearch, deleteAll, selezionaClust, algoritmo1, algoritmo2, algoritmo3, numClassi) # Inserisce se la tabella e' appena stata creata #mySql.updateInputTable(conn, inputTable, toSearch, numImm, deleteSearch, deleteAll, selezionaClust, algoritmo1, algoritmo2, algoritmo3, numClassi) # Aggiorna # ********************************** LETTURA DATI DALLA TABELLA DI INPUT ********************************************************************** dataClust=mySql.readInputParams(conn, inputTable) # dataClust contiene i dati da mandare in input a clusterizza come restituiti da cursor.fetchAll arrayDataClust=mn.fetchAllToArray(dataClust) dataSearch=mySql.readInputDownload(conn, inputTable)# dataSearch contiene i dati da mandare in input a Download e alle varie query (dove necessario) come restituiti da cursor.fetchAll arrayDataSearch=mn.fetchAllToArray(dataSearch) #Assegnamento Dati Input toSearchDownload=arrayDataSearch[0] #La parola che useremo per il download delle immagini cosi come arriva da interfaccia web toSearch=toSearchDownload.replace(' ','_') #La parola che useremo per tutte le operazioni sul database, e la creazione delle cartelle! numImm=arrayDataSearch[1] #Numero delle immagini da scaricare deleteSearch=arrayDataSearch[2] # 0- non cancellare nulla (default); 1- cancella tutte le informazioni precedenti per una data ricerca! deleteAll = arrayDataSearch[3] # 0- non cancellare nulla (default); 1- cancella, cancella righe corrispondente a toSearch da mainTable e clustTable, cancella tutte le immagini nella cartella con path (Metodo AP) selezionaClust=arrayDataSearch[4] PATH = os.path.abspath(os.path.join(imm, toSearch)) #PATH della cartella contenente le immagini scaricate per la parola toSearchDownload pathImm = os.path.abspath(imm) # Path della cartella imm print("\n\n ********************* LETTURA DATI INPUT ************************* \n") mySql.deleteAllClustTable(conn, clustTable) # Ad ogni esecuzione svuota la clustTable if(deleteAll>0): mySql.deleteAllMainTable(conn, mainTable) mySql.deleteAllClustTable(conn, clustTable) imageFolder.cancella(pathImm) print ("\n ************** CANCELLATO TUTTO ***************** \n") elif(deleteSearch>0 and ((len(imageFolder.leggi(PATH))>0) or len(mySql.selectObjectMainTable(conn, mainTable, toSearch)))): imageFolder.cancella(PATH) mySql.deleteRowMainTable(conn, mainTable, toSearch) print ("\n ************** CANCELLA RICERCA PRECEDENTE ***************** \n") # Crea la cartella imm/toSearch if not os.path.exists(PATH): os.makedirs(PATH) # Se la ricerca non è nella main table la inserisce con googleIndex = 0 mySql.insertMainTable(conn, mainTable, toSearch, numImm, 0, PATH) # Se la cartella contiene meno immagini di quelle da scaricare, scarica le restanti if(len(imageFolder.leggi(PATH))<numImm): googleIndexArray=mn.fetchAllToArray(mySql.selectGoogleIndexMainTable(conn, mainTable, toSearch)) googleIndex=googleIndexArray[0] scarica=Download() googleIndex=scarica.go(toSearch, PATH, numImm, googleIndex) mySql.updateGoogleIndexNumImmMainTable(conn, mainTable, toSearch, len(imageFolder.leggi(PATH)), googleIndex) print ("\n\n *************************** FINE DOWNLOAD ********************************* \n\n") """ Se il numero di immagini nella cartella è maggiore del numero di immagini da scaricare quando il numero di immagini da scaricare è diverso da 0 allora cancella gli elementi in eccesso! """ vet=imageFolder.leggi(PATH) if(len(vet)>numImm and numImm!=0): googleIndexArray=mn.fetchAllToArray(mySql.selectGoogleIndexMainTable(conn, mainTable, toSearch)) googleIndex=googleIndexArray[0] googleIndex=googleIndexArray[0] - (len(vet)-numImm) for i in range(numImm, len(vet)): imageFolder.cancellaFile(PATH, vet[i]); print ("\n\n ****************** IMMAGINI IN PIU' CANCELLATE *************************** \n\n") mySql.updateGoogleIndexNumImmMainTable(conn, mainTable, toSearch, len(imageFolder.leggi(PATH)), googleIndex) #Inserimento nella clustTable vet=imageFolder.leggi(PATH) if((len(vet)>0)): for i in range (0, len(vet)): mySql.insertInClustTable(conn, clustTable, toSearch, vet[i], '0.00','0') #vet=imageFolder.leggi(PATH) if (len(vet)!=0): if(selezionaClust==0): print("\n\n ***************** CLUSTERIZZAZIONE : DBScan *********************** \n") cl=clusterizzaDBScan() elif (selezionaClust==1): print("\n\n ***************** CLUSTERIZZAZIONE : KMeans *********************** \n") cl=clusterizzaKMeans() else: print("\n\n **************** CLUSTERIZZAZIONE : Binario *********************** \n") cl=clusterizzaBinario() allVectors=cl.clusterizza(arrayDataClust, PATH) #allVectors contiene alla posizione: 0 - vettore nomi immagini; 1-vettore valori Rank; 2-vettore classificazione print("\n\n **************************** FINE CLUSTERIZZAZIONE *********************** \n") if allVectors!=None: for i in range(0, len(allVectors[0])): mySql.updateClustTable(conn, clustTable, toSearch, allVectors[0][i], allVectors[1][i], allVectors[2][i]) else: print("Non ci sono immagini nella cartella!") conn.close()
def go(self,query, path, numImm, googleIndex): """Download full size images from Google image search. Don't print or republish images without permission. I used this to train a learning algorithm. """ BASE_URL = 'https://ajax.googleapis.com/ajax/services/search/images?'\ 'v=1.0&q=' + query + '&start=%d' if not os.path.exists(path): os.makedirs(path) imageFolder=accessoCartella() # Google's start query string parameter for pagination. urlVec=[] k=len(imageFolder.leggi(path)) baseWidth=500 ciclo=0 start=googleIndex print "start Iniziale: " + str(start) j=k while k<numImm: vector=[] #while start < numImm: # Google will only return a max of 56 results. r = requests.get(BASE_URL % start) for image_info in json.loads(r.text)['responseData']['results']: print "start ciclo: " + str(start) url = image_info['unescapedUrl'] if(url in urlVec): start+=1 else: urlVec.append(url) try: image_r = requests.get(url) except ConnectionError, e: print 'could not download %s' % url j-=1 continue if(j<10): title=query+"00"+str(j) elif(j<100): title=query+"0"+str(j) else: title=query+str(j) j+=1 FILE_PATH=os.path.join(path, '%s.jpg') % title file = open(FILE_PATH, 'wb') try: image=Image.open(StringIO(image_r.content)) wpercent=(baseWidth/float(image.size[0])) hsize = int(float(image.size[1])*float(wpercent)) image=image.resize((baseWidth, hsize), Image.ANTIALIAS) image.save(file, 'JPEG') except IOError, e: # Throw away some gifs...blegh. print 'could not save %s' % url start+=1 j-=1 continue finally: