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
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()