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]
示例#5
0
  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: