def get_labels(session, score, detection_filters, vehicle_filters,
               model, threshold):
    """Retrieves all possible detection-annotation pairings
       that satify the VOC criterion."""

    overlap_score = overlap(Detection, Vehicle)

    # pylint: disable-msg=E1101
    dist_x = (func.ST_X(func.ST_Transform(Detection.lla, 102718))
              - func.ST_X(func.ST_Transform(Vehicle.lla, 102718))) \
        * 0.3048
    dist_y = (func.ST_Y(func.ST_Transform(Detection.lla, 102718))
              - func.ST_Y(func.ST_Transform(Vehicle.lla, 102718))) \
        * 0.3048
    dist = func.sqrt(dist_x * dist_x + dist_y * dist_y)
    height_diff = func.abs(
        func.ST_Z(Detection.lla) - func.ST_Z(Vehicle.lla))

    labels = session.query(
        overlap_score.label('overlap'),
        Vehicle.id.label('vid'),
        Detection.id.label('did'),
        dist.label('dist'),
        height_diff.label('height_diff'),
        score.label('score')) \
        .select_from(Detection) \
        .join(Photo) \
        .join(Vehicle) \
        .join(Model) \
        .filter(Model.filename == model) \
        .filter(Photo.test == True) \
        .filter(overlap_score > 0.5) \
        .filter(score > threshold)
    # pylint: enable-msg=E1101

    for query_filter in detection_filters:
        labels = labels.filter(query_filter)

    for query_filter in vehicle_filters:
        labels = labels.filter(query_filter)

    labels = labels.order_by(desc(overlap_score)).all()

    return labels
Esempio n. 2
0
def nms(pid, model, method):
    """Preforms NMS on detections."""

    session = SESSION()

    logging.info((pid, model, method))

    try:

        scoring_method = scores.METHODS[method]

        set_nms = str(scoring_method.output).split('.')[-1]

        # pylint: disable-msg=E1101
        mid, = session.query(Model.id) \
            .filter_by(filename=model) \
            .one()

        todo, = session.query(func.count(Detection.id)) \
            .filter(Detection.pid == pid) \
            .filter(or_(*[m == None for m in scoring_method.inputs])) \
            .filter(Detection.mid == mid) \
            .one()
        # pylint: enable-msg=E1101

        if todo > 0:
            raise Exception('Some input was not yet computed')

        while True:
            # pylint: disable-msg=E1101
            result = session.query(Detection) \
                .filter(Detection.pid == pid) \
                .filter(scoring_method.output == None) \
                .filter(Detection.mid == mid)
            # pylint: enable-msg=E1101

            result = result \
                .order_by(desc(scoring_method.score)) \
                .first()

            if result is None:
                break

            setattr(result, set_nms, True)

            overlap = query_utils.overlap(result, Detection)
            covered = overlap > 0.3

            # pylint: disable-msg=E1101
            blacklist = session.query(Detection) \
                .filter(Detection.pid == pid) \
                .filter(scoring_method.output == None) \
                .filter(Detection.mid == mid) \
                .filter(covered)
            # pylint: enable-msg=E1101

            for elt in blacklist:
                setattr(elt, set_nms, False)

        session.commit()

        return pid
    except Exception:
        session.rollback()
        raise
    finally:
        session.close()
Esempio n. 3
0
def nms(pid, model, method):
    """Preforms NMS on detections."""

    session = SESSION()

    logging.info((pid, model, method))

    try:

        scoring_method = scores.METHODS[method]

        set_nms = str(scoring_method.output).split('.')[-1]

        # pylint: disable-msg=E1101
        mid, = session.query(Model.id) \
            .filter_by(filename=model) \
            .one()

        todo, = session.query(func.count(Detection.id)) \
            .filter(Detection.pid == pid) \
            .filter(or_(*[m == None for m in scoring_method.inputs])) \
            .filter(Detection.mid == mid) \
            .one()
        # pylint: enable-msg=E1101

        if todo > 0:
            raise Exception('Some input was not yet computed')

        while True:
            # pylint: disable-msg=E1101
            result = session.query(Detection) \
                .filter(Detection.pid == pid) \
                .filter(scoring_method.output == None) \
                .filter(Detection.mid == mid)
            # pylint: enable-msg=E1101

            result = result \
                .order_by(desc(scoring_method.score)) \
                .first()

            if result is None:
                break

            setattr(result, set_nms, True)

            overlap = query_utils.overlap(result, Detection)
            covered = overlap > 0.3

            # pylint: disable-msg=E1101
            blacklist = session.query(Detection) \
                .filter(Detection.pid == pid) \
                .filter(scoring_method.output == None) \
                .filter(Detection.mid == mid) \
                .filter(covered)
            # pylint: enable-msg=E1101

            for elt in blacklist:
                setattr(elt, set_nms, False)

        session.commit()

        return pid
    except Exception:
        session.rollback()
        raise
    finally:
        session.close()