def create_tracks_graph(features, colors, matches, config): logging.debug('Merging features onto tracks') uf = UnionFind() for im1, im2 in matches: for f1, f2 in matches[im1, im2]: uf.union((im1, f1), (im2, f2)) sets = {} for i in uf: p = uf[i] if p in sets: sets[p].append(i) else: sets[p] = [i] tracks = [t for t in sets.values() if good_track(t, config.get('min_track_length', 2))] logging.debug('Good tracks: {}'.format(len(tracks))) tracks_graph = nx.Graph() for track_id, track in enumerate(tracks): for image_feature in track: image = image_feature[0] featureid = image_feature[1] x, y = features[image][featureid] r, g, b = colors[image][featureid] tracks_graph.add_node(image, bipartite=0) tracks_graph.add_node(str(track_id), bipartite=1) tracks_graph.add_edge(image, str(track_id), feature=(x,y), feature_id=featureid, feature_color=(float(r),float(g),float(b))) return tracks_graph
def create_tracks_graph(features, colors, matches, config): logger.debug('Merging features onto tracks') uf = UnionFind() for im1, im2 in matches: for f1, f2 in matches[im1, im2]: uf.union((im1, f1), (im2, f2)) sets = {} for i in uf: p = uf[i] if p in sets: sets[p].append(i) else: sets[p] = [i] tracks = [t for t in sets.values() if good_track(t, config.get('min_track_length', 2))] logger.debug('Good tracks: {}'.format(len(tracks))) tracks_graph = nx.Graph() for track_id, track in enumerate(tracks): for image_feature in track: image = image_feature[0] featureid = image_feature[1] x, y = features[image][featureid] r, g, b = colors[image][featureid] tracks_graph.add_node(image, bipartite=0) tracks_graph.add_node(str(track_id), bipartite=1) tracks_graph.add_edge(image, str(track_id), feature=(x, y), feature_id=featureid, feature_color=(float(r), float(g), float(b))) return tracks_graph
def create_tracks_manager(features, colors, matches, config): """Link matches into tracks.""" logger.debug('Merging features onto tracks') uf = UnionFind() for im1, im2 in matches: for f1, f2 in matches[im1, im2]: uf.union((im1, f1), (im2, f2)) sets = {} for i in uf: p = uf[i] if p in sets: sets[p].append(i) else: sets[p] = [i] min_length = config['min_track_length'] tracks = [t for t in sets.values() if _good_track(t, min_length)] logger.debug('Good tracks: {}'.format(len(tracks))) tracks_manager = pysfm.TracksManager() for track_id, track in enumerate(tracks): for image, featureid in track: if image not in features: continue x, y, s = features[image][featureid] r, g, b = colors[image][featureid] obs = pysfm.Observation(x, y, s, int(r), int(g), int(b), featureid) tracks_manager.add_observation(image, str(track_id), obs) return tracks_manager
def create_tags_graph(tag_matches, config): # tag track setup logger.debug('Merging tags into tracks') uf = UnionFind() for im1, im2 in tag_matches: for f1, f2, tagid in tag_matches[im1, im2]: uf.union((im1, tagid), (im2, tagid)) sets = {} for i in uf: p = uf[i] if p in sets: sets[p].append(i) else: sets[p] = [i] tag_tracks = [ t for t in sets.values() if good_track(t, config.get('min_track_length', 2)) ] logger.debug('Good tag tracks: {}'.format(len(tag_tracks))) # create feature tracks graph tags_graph = nx.Graph() for track_id, track in enumerate(tag_tracks): for image, tagid in track: if image not in tags_graph: tags_graph.add_node(image, bipartite=0) if tagid not in tags_graph: tags_graph.add_node(tagid, bipartite=1) tags_graph.add_edge(image, tagid) # return return tags_graph
def create_tracks_manager( features: t.Dict[str, np.ndarray], colors: t.Dict[str, np.ndarray], segmentations: t.Dict[str, np.ndarray], instances: t.Dict[str, np.ndarray], matches: t.Dict[t.Tuple[str, str], t.List[t.Tuple[int, int]]], min_length: int, ): """Link matches into tracks.""" logger.debug("Merging features onto tracks") uf = UnionFind() for im1, im2 in matches: for f1, f2 in matches[im1, im2]: uf.union((im1, f1), (im2, f2)) sets = {} for i in uf: p = uf[i] if p in sets: sets[p].append(i) else: sets[p] = [i] tracks = [t for t in sets.values() if _good_track(t, min_length)] logger.debug("Good tracks: {}".format(len(tracks))) NO_VALUE = pymap.Observation.NO_SEMANTIC_VALUE tracks_manager = pymap.TracksManager() for track_id, track in enumerate(tracks): for image, featureid in track: if image not in features: continue x, y, s = features[image][featureid] r, g, b = colors[image][featureid] segmentation, instance = ( segmentations[image][featureid] if image in segmentations else NO_VALUE, instances[image][featureid] if image in instances else NO_VALUE, ) obs = pymap.Observation( x, y, s, int(r), int(g), int(b), featureid, segmentation, instance ) tracks_manager.add_observation(image, str(track_id), obs) return tracks_manager
def create_tracks_graph(features, colors, matches, config): """Link matches into tracks.""" logger.debug('Merging features onto tracks') uf = UnionFind() for im1, im2 in matches: for f1, f2 in matches[im1, im2]: uf.union((im1, f1), (im2, f2)) sets = {} for i in uf: p = uf[i] if p in sets: sets[p].append(i) else: sets[p] = [i] min_length = config['min_track_length'] tracks = [t for t in sets.values() if _good_track(t, min_length)] logger.debug('Good tracks: {}'.format(len(tracks))) tracks_graph = nx.Graph() for track_id, track in enumerate(tracks): logger.debug('track: track_id: {} '.format(track_id)) for image, featureid in track: if image not in features: continue logger.debug( 'track: track_id: {}, image: {}, feature_id: {}'.format( track_id, image, featureid)) x, y, s = features[image][featureid] r, g, b = colors[image][featureid] tracks_graph.add_node(str(image), bipartite=0) tracks_graph.add_node(str(track_id), bipartite=1) tracks_graph.add_edge(str(image), str(track_id), feature=(float(x), float(y)), feature_scale=float(s), feature_id=int(featureid), feature_color=(float(r), float(g), float(b))) return tracks_graph
def create_tracks_manager(features, colors, segmentations, instances, matches, config): """Link matches into tracks.""" logger.debug("Merging features onto tracks") uf = UnionFind() for im1, im2 in matches: for f1, f2 in matches[im1, im2]: uf.union((im1, f1), (im2, f2)) sets = {} for i in uf: p = uf[i] if p in sets: sets[p].append(i) else: sets[p] = [i] min_length = config["min_track_length"] tracks = [t for t in sets.values() if _good_track(t, min_length)] logger.debug("Good tracks: {}".format(len(tracks))) NO_VALUE = pysfm.Observation.NO_SEMANTIC_VALUE tracks_manager = pysfm.TracksManager() for track_id, track in enumerate(tracks): for image, featureid in track: if image not in features: continue x, y, s = features[image][featureid] r, g, b = colors[image][featureid] segmentation, instance = ( segmentations[image][featureid] if segmentations[image] is not None else NO_VALUE, instances[image][featureid] if instances[image] is not None else NO_VALUE, ) obs = pysfm.Observation(x, y, s, int(r), int(g), int(b), featureid, segmentation, instance) tracks_manager.add_observation(image, str(track_id), obs) return tracks_manager
def create_tracks_graph(features, colors, matches, config): """Link matches into tracks.""" logger.debug('Merging features onto tracks') uf = UnionFind() for im1, im2 in matches: for f1, f2 in matches[im1, im2]: uf.union((im1, f1), (im2, f2)) sets = {} for i in uf: p = uf[i] if p in sets: sets[p].append(i) else: sets[p] = [i] min_length = config['min_track_length'] tracks = [t for t in sets.values() if _good_track(t, min_length)] logger.debug('Good tracks: {}'.format(len(tracks))) tracks_graph = nx.Graph() for track_id, track in enumerate(tracks): for image, featureid in track: if image not in features: continue x, y = features[image][featureid] r, g, b = colors[image][featureid] tracks_graph.add_node(str(image), bipartite=0) tracks_graph.add_node(str(track_id), bipartite=1) tracks_graph.add_edge(str(image), str(track_id), feature=(float(x), float(y)), feature_id=int(featureid), feature_color=(float(r), float(g), float(b))) return tracks_graph
def create_tracks_graph(features, colors, matches, config): """Link matches into tracks.""" logger.debug('Merging features onto tracks') uf = UnionFind() for im1, im2 in matches: if len(matches[im1, im2]) > 0 and matches[im1, im2].shape[1] == 5: for f1, f2, _, _, _ in matches[im1, im2]: uf.union((im1, int(f1)), (im2, int(f2))) elif len(matches[im1, im2]) > 0 and matches[im1, im2].shape[1] == 4: for f1, f2, _, _ in matches[im1, im2]: uf.union((im1, int(f1)), (im2, int(f2))) else: for f1, f2 in matches[im1, im2]: uf.union((im1, int(f1)), (im2, int(f2))) sets = {} for i in uf: p = uf[i] if p in sets: sets[p].append(i) else: sets[p] = [i] tracks = [ t for t in sets.values() if _good_track(t, config['min_track_length']) ] logger.debug('Good tracks: {}'.format(len(tracks))) tracks_graph = nx.Graph() for track_id, track in enumerate(tracks): for image, featureid in track: if image not in features: continue x, y = features[image][featureid] r, g, b = colors[image][featureid] tracks_graph.add_node(image, bipartite=0) tracks_graph.add_node(str(track_id), bipartite=1) tracks_graph.add_edge(image, str(track_id), feature=(x, y), feature_id=featureid, feature_color=(float(r), float(g), float(b))) return tracks_graph
def common_ratio(n1, n2, m, matches): """ calculates the ratio of # of common features of the triplet (n1, n2, m) to # of common features of the pair (n1, n2). the larger the ratio the more likely m is correctly related to n1, n2. :param n1: :param n2: :param m: :param matches: :return: """ uf = UnionFind() if (n1, n2) in matches: base_cnt = len(matches[n1, n2]) for f1, f2 in matches[n1, n2]: uf.union((n1, f1), (n2, f2)) else: base_cnt = len(matches[n2, n1]) for f1, f2 in matches[n2, n1]: uf.union((n2, f1), (n1, f2)) if (n1, m) in matches: for f1, f2 in matches[n1, m]: uf.union((n1, f1), (m, f2)) else: for f1, f2 in matches[m, n1]: uf.union((m, f1), (n1, f2)) if (n2, m) in matches: for f1, f2 in matches[n2, m]: uf.union((n2, f1), (m, f2)) else: for f1, f2 in matches[m, n2]: uf.union((m, f1), (n2, f2)) sets = {} for i in uf: p = uf[i] if p in sets: sets[p].append(i) else: sets[p] = [i] tracks = [t for t in sets.values() if _good_track(t, 3)] cnt = 0 fids = [] if (n1, n2) in matches: for f1, f2 in matches[n1, n2]: for track in tracks: if (n1, f1) in track and (n2, f2) in track: fids.append(f1) cnt += 1 break else: for f1, f2 in matches[n2, n1]: for track in tracks: if (n2, f1) in track and (n1, f2) in track: fids.append(f2) cnt += 1 break return cnt / base_cnt, fids
def create_tracks_graph(features, colors, matches, tag_features, tag_idx, tag_colors, tag_matches, tag_ids, config): # feature track setup logger.debug('Merging features onto tracks') uf = UnionFind() for im1, im2 in matches: for f1, f2 in matches[im1, im2]: uf.union((im1, f1), (im2, f2)) sets = {} for i in uf: p = uf[i] if p in sets: sets[p].append(i) else: sets[p] = [i] tracks = [ t for t in sets.values() if good_track(t, config.get('min_track_length', 2)) ] logger.debug('Good tracks: {}'.format(len(tracks))) #print '===== tracks =====' #print tracks # tag track setup if config.get('tag_tracks', False): logger.debug('Merging tag features into tracks') uf = UnionFind() for im1, im2 in tag_matches: for f1, f2, tag_id in tag_matches[im1, im2]: uf.union((im1, f1, tag_id), (im2, f2, tag_id)) sets = {} for i in uf: p = uf[i] if p in sets: sets[p].append(i) else: sets[p] = [i] tag_tracks = [t for t in sets.values()] logger.debug('Good tag feature tracks: {}'.format(len(tag_tracks))) #print '===== tag tracks =====' #print tag_tracks # create feature tracks graph print_one_track = 10 tracks_graph = nx.Graph() for track_id, track in enumerate(tracks): for image, featureid in track: if image not in features: continue x, y = features[image][featureid] #if print_one_track > 0: # print image,': x = ',str(x), '. y = ',str(y) r, g, b = colors[image][featureid] tracks_graph.add_node(image, bipartite=0) tracks_graph.add_node(str(track_id), bipartite=1) tracks_graph.add_edge(image, str(track_id), feature=(x, y), feature_id=featureid, feature_color=(float(r), float(g), float(b)), tag_feature=0, tag_id=0, corner_id=0) # if print_one_track >= 0: # print_one_track -= 1 #print '|' # add tag tracks to graph if config.get('tag_tracks', False): addt = len(tracks) print_one_track = True for track_id, track in enumerate(tag_tracks): for image, featureid, tagid in track: if image not in tag_features: continue tag_track_id = addt + track_id x, y = tag_features[image][featureid] #if print_one_track: # print image,': x = ',str(x), '. y = ',str(y) r, g, b = tag_colors[image][featureid] cid = tag_idx[image][featureid] if image not in tracks_graph: tracks_graph.add_node(image, bipartite=0) tracks_graph.add_node(str(tag_track_id), bipartite=1) tracks_graph.add_edge(image, str(tag_track_id), feature=(x, y), feature_id=featureid, feature_color=(float(r), float(g), float(b)), tag_feature=1, tag_id=tagid, corner_id=cid) # print_one_track = False # return return tracks_graph