class Rtree2D(object): """Wrapper of `rtree.Index` for supporting friendly 2d operations. Also forces the uniqueness of the `id` parameter, which is different from the rtree module's behavior. """ def __init__(self): self._index = Rtree() self._locations = {} @staticmethod def to_coords(location): return (location[0], location[1], location[0], location[1]) def keys(self): return self._locations.keys() def get(self, id, objects=False): return self._locations.get(id) def set(self, id, location=None, state=None, obj=None): # Clean up previous value first if any old = self._locations.get(id) if old is not None: self._index.delete(id, self.to_coords(old[0])) if old and state is None: state = old[1] if old and location is None: location = old[0] self._locations[id] = (location, state) self._index.insert(id, self.to_coords(location), obj=obj) def update(self, id, state, obj=None): old = self._locations.get(id) if old is not None: self._index.delete(id, self.to_coords(old[0])) self._locations[id] = (old[0], state) self._index.insert(id, self.to_coords(old[0]), obj=obj) def remove(self, id): self._index.delete(id, self.to_coords(self._locations[id][0])) del self._locations[id] def nearest(self, location, count=1, objects=False, max_distance=None): ids = self._index.nearest(self.to_coords(location), num_results=count, objects=objects) if max_distance is not None: ids = [(id_, self._locations[id_][1]) for id_ in ids if distance(self._locations[id_][0], location) <= max_distance] return ids
hasData = property( lambda self: RTreePage.objects(name=self.name).first() is not None ) if __name__=='__main__': settings = Property() settings.writethrough= True settings.buffering_capacity=1 storage = MongoStorage('test') storage.clear() r = Rtree( storage, properties=settings) r.add(123,(0,0,1,1)) print "test 1 should be true" item = list(r.nearest((0,0), 1, objects=True))[0] print item.id print r.valid() print "test 2 should be true" r.delete(123, (0,0,1,1)) print r.valid() print "test 3 should be true" r.clearBuffer() print r.valid() del r print "test 4 should be false" storage.clear()
lambda self: RTreePage.objects(name=self.name).first() is not None) if __name__ == '__main__': settings = Property() settings.writethrough = True settings.buffering_capacity = 1 storage = MongoStorage('test') storage.clear() r = Rtree(storage, properties=settings) r.add(123, (0, 0, 1, 1)) print "test 1 should be true" item = list(r.nearest((0, 0), 1, objects=True))[0] print item.id print r.valid() print "test 2 should be true" r.delete(123, (0, 0, 1, 1)) print r.valid() print "test 3 should be true" r.clearBuffer() print r.valid() del r print "test 4 should be false" storage.clear()
def searching(feature_vectors_database, feature_vectors_retrieval, similarity_metric, image_paths, retrieval_number, file, list_of_parameters, feature_extraction_method, path_database): ''' feature_vectors: atriutos calculados labels: label de cada classe similarity_metric: qual medida utilizar recuperados as k imagens com menor distancia. Se k = 0, entao o valor eh setado como sendo o tamanho da classe da imagem ''' #name to save the pickle file parameters_name = "" for parameter in list_of_parameters: parameters_name = parameters_name + "_" + parameter file = path_database + "features/sortingRTree" + "_" + feature_extraction_method + parameters_name + '_' + similarity_metric feature_vectors_retrieval = preprocessing.scale(feature_vectors_retrieval) if not (os.path.isfile(file + '.dat')): #normalize signatures feature_vectors_database = preprocessing.scale( feature_vectors_database) # Create a N-Dimensional index p = index.Property() p.dimension = feature_vectors_database.shape[1] idx = index.Index(file, properties=p) # Create the tree for i, vector in enumerate(feature_vectors_database): idx.add(i, vector.tolist()) #save_format = idx.dumps(idx) #with open(file, 'wb') as handle: #pickle.dump(save_format, handle) else: # Create a N-Dimensional index p = index.Property() p.dimension = feature_vectors_database.shape[1] idx = Rtree(file, properties=p) #with open(file, 'rb') as handle: # idx = pickle.load(handle) # Find closests pair for the first N points ########### debug this part ########### small_distances = [] for id1, query in enumerate(feature_vectors_retrieval): nearest = list(idx.nearest(query.tolist(), retrieval_number)) small_distances.append(nearest) result = [] for cont1, i in enumerate(small_distances): aux = [] for j in i: aux.append(image_paths[j]) result.append(aux) return result