def register_model(filename, a, b, thresh, viewpoint): session = SESSION() if viewpoint: model = pydro.io.LoadModel(filename) for i in xrange(16): model.start.rules[i].metadata = {"angle": (math.pi - i * math.pi / 8) % (2 * math.pi)} pydro.io.SaveModel(filename, model) model = Model(filename=filename, a=a, b=b, thresh=thresh, release="pydro") session.add(model) session.commit()
def register_model(filename, a, b, thresh, viewpoint): session = SESSION() if viewpoint: model = pydro.io.LoadModel(filename) for i in xrange(16): model.start.rules[i].metadata = { 'angle': (math.pi - i * math.pi / 8) % (2 * math.pi) } pydro.io.SaveModel(filename, model) model = Model( filename=filename, a=a, b=b, thresh=thresh, release='pydro', ) session.add(model) session.commit()
def detect(pid, model_filename): """Runs DPM and computes 3D pose.""" logger = logging.getLogger('detect') logger.info((pid, model_filename)) session = SESSION() try: # pylint: disable-msg=E1101 num_detections, = session.query(func.count(Detection.id)) \ .join(Model) \ .filter(Detection.pid == pid) \ .filter(Model.filename == model_filename) \ .one() if num_detections > 0: logger.info('Already computed') return pid model = session.query(Model) \ .filter_by(filename=model_filename) \ .one() photo = session.query(Photo) \ .options(joinedload('dataset')) \ .filter_by(id=pid) \ .one() vehicle_types = session.query(VehicleType) \ .filter(VehicleType.id.in_([202, 8, 150, 63, 123, 16])) pydro_model = pydro.io.LoadModel(model.filename) image = scipy.misc.imread( os.path.join(IMAGE_DIR, photo.filename)) pyramid = pydro.features.BuildPyramid(image, model=pydro_model) filtered_model = pydro_model.Filter(pyramid) parse_trees = list(filtered_model.Parse(model.thresh)) # make sure we use at least one entry so we know we tried if len(parse_trees) == 0: parse_trees = list( itertools.islice(filtered_model.Parse(-numpy.inf), 1)) assert len(parse_trees) > 0 bbox_tuple = namedtuple('bbox_tuple', 'x1,x2,y1,y2') for tree in parse_trees: bbox = bbox_tuple( x1=tree.x1 / image.shape[1], x2=tree.x2 / image.shape[1], y1=tree.y1 / image.shape[0], y2=tree.y2 / image.shape[0], ) score = tree.s angle = tree.child.rule.metadata.get('angle', None) if bbox.x1 > bbox.x2 or bbox.y1 > bbox.y2: continue car_pose_generator = compute_car_pose( photo, bbox, angle, vehicle_types ) for lla, geom, vehicle_type, world_angle in car_pose_generator: det = Detection( photo=photo, x1=float(bbox.x1), y1=float(bbox.y1), x2=float(bbox.x2), y2=float(bbox.y2), score=float(score), prob=float( 1.0 / (1.0 + math.exp(model.a * score + model.b))), model=model, angle=angle, lla=lla, geom=geom, world_angle=float(world_angle), vehicle_type=vehicle_type, ) session.add(det) session.commit() return pid except Exception: session.rollback() raise finally: session.close()