Пример #1
0
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
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
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
Пример #7
0
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
Пример #8
0
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
Пример #9
0
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
Пример #10
0
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
Пример #11
0
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