示例#1
0
文件: factors.cpp 项目: caomw/partapp
  double eval_joint_factor_debug(const Joint &joint, const PartBBox& bbox_parent, const PartBBox &bbox_child, 
				 const double parent_scale, const double child_scale, 
				 double_vector &joint_pos_offset, double &joint_rot_offset, const double rot_step_size)
  {

    double rot_sigma = joint.rot_sigma;
    assert(rot_sigma >= 0);

    double child_rot = atan2(bbox_child.part_x_axis(1), bbox_child.part_x_axis(0));
    double parent_rot = atan2(bbox_parent.part_x_axis(1), bbox_parent.part_x_axis(0));
    cout << "child_rot = " << child_rot << endl;
    cout << "parent_rot = " << parent_rot << endl;
    cout << "rot_step_size = " << rot_step_size << endl;
    
    double_matrix Tgc = prod(hc::get_rotation_matrix(child_rot), hc::get_scaling_matrix(child_scale));
    double_vector offset_c_10 = hc::get_vector(joint.offset_c(0), joint.offset_c(1));
    double_vector offset_g_10 = prod(Tgc, offset_c_10);
    double_matrix Tjoint_c = hc::get_translation_matrix(offset_g_10(0), offset_g_10(1));
    double_matrix Tjoint2_c = prod(Tjoint_c,boost_math::identity_double_matrix(3));
    double x1_c, y1_c;
    hc::map_point(Tjoint2_c, bbox_child.part_pos(0), bbox_child.part_pos(1), x1_c, y1_c);
    
    double_matrix Tgp = prod(hc::get_rotation_matrix(parent_rot), hc::get_scaling_matrix(parent_scale));
    double_vector offset_p_01 = hc::get_vector(joint.offset_p(0), joint.offset_p(1));
    double_vector offset_g_01 = prod(Tgp, offset_p_01);
    double_matrix Tjoint_p = hc::get_translation_matrix(offset_g_01(0), offset_g_01(1));
    double_matrix Tjoint2_p = prod(Tjoint_p,boost_math::identity_double_matrix(3));
    double x1_p, y1_p;
    hc::map_point(Tjoint2_p, bbox_parent.part_pos(0), bbox_parent.part_pos(1), x1_p, y1_p);
    
//     assert(child_scale == 1.0);
//     assert(parent_scale == 1.0);

    double_vector joint_pos_child = bbox_child.part_pos + 
      child_scale * bbox_child.part_x_axis * joint.offset_c(0) + 
      child_scale * bbox_child.part_y_axis * joint.offset_c(1);

    double_vector joint_pos_parent = bbox_parent.part_pos + 
      parent_scale * bbox_parent.part_x_axis * joint.offset_p(0) + 
      parent_scale * bbox_parent.part_y_axis * joint.offset_p(1);
    
    cout << "round part positions" << endl;
    joint_pos_child(0) = round(joint_pos_child(0));
    joint_pos_child(1) = round(joint_pos_child(1));
    joint_pos_parent(0) = round(joint_pos_parent(0));
    joint_pos_parent(1) = round(joint_pos_parent(1));    
    
    joint_pos_offset = joint_pos_child - joint_pos_parent;
    
    cout << round(y1_c) << " " << round(x1_c) << endl;
    cout << joint_pos_child(1) << " " << joint_pos_child(0) << endl;
    cout << endl;
    cout << round(y1_p) << " " << round(x1_p) << endl;
    cout << joint_pos_parent(1) << " " << joint_pos_parent(0) << endl;
    
    double rot_mean = joint.rot_mean;
    if (rot_step_size > 0 && rot_step_size <= M_PI){
      cout << "round joint mean" << endl;
      rot_mean = boost_math::round(joint.rot_mean / rot_step_size) * rot_step_size;
    }
    joint_rot_offset = (child_rot - parent_rot) - rot_mean;
    /*
    while (joint_rot_offset < -M_PI)
      joint_rot_offset += M_PI;

    while (joint_rot_offset > M_PI)
      joint_rot_offset -= M_PI;
    
    assert(joint_rot_offset >= -M_PI && joint_rot_offset <= M_PI);
    */
    double detC1 = joint.detC;
    assert(detC1 > 0);

    double avg_scale = 0.5*(parent_scale + child_scale);
    //double avg_scale = std::max(parent_scale,child_scale);
    double_matrix inv_scaleC1 = joint.invC / square(avg_scale);
    
    //double d_pos = inner_prod(joint_pos_offset, ublas::prod<double_vector>(invC1, joint_pos_offset));
    double d_pos = inner_prod(joint_pos_offset, ublas::prod<double_vector>(inv_scaleC1, joint_pos_offset));
    double d_rot = square(joint_rot_offset) / square(rot_sigma);

    double p_joint;
      

    p_joint = exp(-0.5*(d_pos + d_rot)) / (2*M_PI*sqrt(2*M_PI) * sqrt(detC1) * rot_sigma);

    //assert(p_joint >= 0);
    return p_joint;
  }
示例#2
0
文件: factors.cpp 项目: caomw/partapp
  double eval_joint_factor(const Joint &joint, const PartBBox& bbox_parent, const PartBBox &bbox_child, 
			   const double parent_scale, const double child_scale, 
			   double_vector &joint_pos_offset, double &joint_rot_offset, const double rot_step_size)
  {

    double rot_sigma = joint.rot_sigma;
    assert(rot_sigma >= 0);
    /*
    if (rot_sigma <= 0) {
      rot_sigma = 5*M_PI / 180.0;
    }
    */
    double child_rot = atan2(bbox_child.part_x_axis(1), bbox_child.part_x_axis(0));
    double parent_rot = atan2(bbox_parent.part_x_axis(1), bbox_parent.part_x_axis(0));

//     assert(child_scale == 1.0);
//     assert(parent_scale == 1.0);

    double_vector joint_pos_child = bbox_child.part_pos + 
      child_scale * bbox_child.part_x_axis * joint.offset_c(0) + 
      child_scale * bbox_child.part_y_axis * joint.offset_c(1);

    double_vector joint_pos_parent = bbox_parent.part_pos + 
      parent_scale * bbox_parent.part_x_axis * joint.offset_p(0) + 
      parent_scale * bbox_parent.part_y_axis * joint.offset_p(1);
    
    /* need to discretize the values as work on integer grid */
    joint_pos_child(0) = round(joint_pos_child(0));
    joint_pos_child(1) = round(joint_pos_child(1));
    joint_pos_parent(0) = round(joint_pos_parent(0));
    joint_pos_parent(1) = round(joint_pos_parent(1));    
    
    joint_pos_offset = joint_pos_child - joint_pos_parent;
    
    /* discretize rotation mean */
    double rot_mean = joint.rot_mean;
    if (rot_step_size > 0 && rot_step_size <= M_PI){
      rot_mean = boost_math::round(joint.rot_mean / rot_step_size) * rot_step_size;
    }
    joint_rot_offset = (child_rot - parent_rot) - rot_mean;
    
    /*
    while (joint_rot_offset < -M_PI)
      joint_rot_offset += M_PI;

    while (joint_rot_offset > M_PI)
      joint_rot_offset -= M_PI;
    */
    /*
    while (joint_rot_offset < -M_PI)
      joint_rot_offset += 2*M_PI;

    while (joint_rot_offset > M_PI)
      joint_rot_offset -= 2*M_PI;
    */
    /*
    while (joint_rot_offset < -2*M_PI)
      joint_rot_offset += 2*M_PI;

    while (joint_rot_offset > 2*M_PI)
      joint_rot_offset -= 2*M_PI;
    */
    /*
    while (joint_rot_offset < 0)
      joint_rot_offset += 2*M_PI;

    while (joint_rot_offset > 2*M_PI)
      joint_rot_offset -= 2*M_PI;
    */
    
    //assert(joint_rot_offset >= -M_PI && joint_rot_offset <= M_PI);
    // no wraparound
    
    //assert(joint_rot_offset >= -2*M_PI && joint_rot_offset <= 2*M_PI);
    
    /**
       how to estimate the vairance for parts at different scales ?
       
       MA: for now use the average scale
     */
    
    double detC1 = joint.detC;
    assert(detC1 > 0);
    
    double avg_scale = 0.5*(parent_scale + child_scale);
    //double avg_scale = std::max(parent_scale,child_scale);
    double_matrix inv_scaleC1 = joint.invC / square(avg_scale);

    //double d_pos = inner_prod(joint_pos_offset, ublas::prod<double_vector>(invC1, joint_pos_offset));
    double d_pos = inner_prod(joint_pos_offset, ublas::prod<double_vector>(inv_scaleC1, joint_pos_offset));
    double d_rot = square(joint_rot_offset) / square(rot_sigma);

    double p_joint;
    
    /** 
	MA: this is supposed to be comparable accross scales 

	the normalization constant does not depend on scales since we have implicitly rescaled positions to training scale
     */
    p_joint = exp(-0.5*(d_pos + d_rot)) / (2*M_PI*sqrt(2*M_PI) * sqrt(detC1) * rot_sigma);
    /*
    cout << "d_pos: " << d_pos << endl;  
    cout << p_joint << endl;
    cout << detC1 << endl;
    cout << rot_sigma << endl;
    */
    //p_joint = exp(-(d_pos + d_rot)); // (2*M_PI*sqrt(2*M_PI) * sqrt(detC1) * rot_sigma);
    /*
     cout << "rot_sigma: "  << rot_sigma << endl;
     cout << "joint.C:" << endl;
     boost_math::print_matrix(joint.C);
     //cout << "invC:" << endl; 
     //boost_math::print_matrix(invC1);
     cout << "d_pos: " << d_pos << endl;  
     cout << "d_rot: " << d_rot << endl; 
     cout << "p_joint: "  << p_joint << endl;
    */
    
    //assert(p_joint >= 0);
    return p_joint;
  }