// represents and OR search free for AStar
  SearchTree train_search_tree_agglomerative(map<string,NNTemplateType>&allTemplates)
  {
    SearchTree search_tree_root;

    // initiailize the bottom layer
    unordered_map<int, unordered_map<int,double> > costs;    
    list<SearchTree > clusters(allTemplates.size());
    function<void (SearchTree&node)> update_dists_for_node = [&](SearchTree&node)
    {
      static atomic<int> completed(0);
      log_once(printfpp("++computed distance %d",completed++));
      for(auto & node_k : clusters)
      {
	double cost = node.Templ.merge_cost(node_k.Templ);
	static mutex m; lock_guard<mutex> l(m);
	costs[node.id][node_k.id] = cost;
	costs[node_k.id][node.id] = cost;
      }
      
    };
    auto iter = allTemplates.begin();
    for(int cter = 0; iter != allTemplates.end(); ++cter, ++iter)
    {
      auto jter = clusters.begin();
      std::advance(jter,cter);
      SearchTree&curTree = *jter;
      curTree.Templ = iter->second;
      curTree.id = seq_id++;
      curTree.pose_uuid = iter->first;
    }
    TaskBlock compute_init_dists("compute_init_dists");
    log_once(printfpp("++Computing Initial Distances for %d clusters",(int)clusters.size()));
    for(auto & curTree : clusters)
    {
      SearchTree*tp = &curTree;
      compute_init_dists.add_callee([&,tp]()
      {
	update_dists_for_node(*tp);
      });
    }
    compute_init_dists.execute();
    log_once(printfpp("--Computing Initial Distances for %d clusters",(int)clusters.size()));
    
    // merge layers until we get the root
    merge_clusters_agglom(seq_id,clusters,costs,update_dists_for_node);
    
    // store the root
    search_tree_root = clusters.front();
    
    // print the search tree
    log_search_tree(search_tree_root);

    return search_tree_root;
  }
Esempio n. 2
0
void message(int level, const char *format, ...)
{
    va_list args;

    if (level >= logLevel) {
        va_start(args, format);
        log_once(stderr, level, format, args);
        va_end(args);
    }

    if (messageFile != NULL) {
        va_start(args, format);
        log_once(messageFile, level, format, args);
        va_end(args);
    }

#ifdef HAVE_VSYSLOG
    if (_logToSyslog) {
        int priority = LOG_USER;

        switch(level) {
            case MESS_REALDEBUG:
                priority |= LOG_DEBUG;
                break;
            case MESS_DEBUG:
            case MESS_VERBOSE:
            case MESS_NORMAL:
                priority |= LOG_INFO;
                break;
            case MESS_ERROR:
                priority |= LOG_ERR;
                break;
            case MESS_FATAL:
                priority |= LOG_CRIT;
                break;
            default:
                priority |= LOG_INFO;
                break;
        };

        va_start(args, format);
        vsyslog(priority, format, args);
        va_end(args);
    }
#endif

    if (level == MESS_FATAL)
        exit(1);
}
Esempio n. 3
0
Image *Resources::get_library_image(Atom library_name, int image_num) {
    static std::unordered_set<Atom> library_warnings;
    static std::unordered_set<std::pair<Atom, int>> library_image_warnings;

    ImageLibraryResource *lib = get_image_library(library_name);
    if (!lib) {
        log_once(warning, library_warnings, library_name, "No image library: " << library_name);
        return nullptr;
    }
    auto found = lib->images.find(image_num);
    if (found == lib->images.end()) {
        log_once(warning, library_image_warnings, std::make_pair(library_name, image_num), "No image at position " << image_num << " in library " << library_name);
        return nullptr;
    }
    return found->second.get();
}
  void log_search_tree(SearchTree&tree_root)
  {
    if(not g_params.option_is_set("NN_LOG_TREE"))
      return;

    // for calcing the branching factor
    int internal_nodes = 0;
    int internal_node_children = 0;

    function<void (SearchTree&,string)> expandFn = [&](SearchTree&node,string prefix) -> void
    {
      Mat RGB = imageeq("",node.Templ.getTIm(),false,false);
      string filename = string("bound") + uuid() + ".jpg";
      imwrite(prefix + "/" + filename,RGB);
      
      if(node.children.size() > 0)
      {
	internal_nodes++;
	internal_node_children += node.children.size();
      }

      for(auto & child : node.children)
      {
	string new_dir = printfpp("%s/%d",prefix.c_str(),child->id);
	assert(boost::filesystem::create_directory(new_dir));
	expandFn(*child,new_dir);
      }
    };
    
    // traverse the tree.
    expandFn(tree_root,params::out_dir());

    double mean_branching_factor = static_cast<double>(internal_node_children)/internal_nodes;
    log_once(safe_printf("mean_branching_factor = %",mean_branching_factor));
  }
  /// SECTION: Combo with RGB and Depth
  ComboComputer_RGBPlusDepth::ComboComputer_RGBPlusDepth(Size win_size, Size block_size, Size block_stride, Size cell_size): 
    FeatureBinCombiner(win_size, block_size, block_stride, cell_size)
  {
    computers.clear();
    
    // for now, use ZHOG and ZAREA
    computers.push_back(shared_ptr<DepthFeatComputer>(
      new HOGComputer18p4_General(selectDepthFn,win_size,block_size,block_stride,cell_size)));
    //computers.push_back(shared_ptr<DepthFeatComputer>(
      //new HOGComputer_Area(win_size,block_size,block_stride,cell_size)));
    computers.push_back(shared_ptr<DepthFeatComputer>(
      new HOGComputer18p4_General([](const ImRGBZ&im)-> const Mat&{return im.gray();},win_size,block_size,block_stride,cell_size)));
    //computers.push_back(shared_ptr<DepthFeatComputer>(
      //new FaceFeature(win_size,block_size,block_stride,cell_size)));
    // skin
    //computers.push_back(shared_ptr<DepthFeatComputer>(
      //new SkinFeatureComputer(win_size,block_size,block_stride,cell_size)));
    
    normalize_weights();
    
    //weights[1] *= HOA_IMPORTANCE; // double the weight of HoA
    //assert(std::dynamic_pointer_cast<HOGComputer_Area>(computers[1]));
    //weights[3] = 1; // don't normalize the face feature weight.
    
    for(int iter = 0; iter < computers.size(); ++iter)
      log_once(printfpp("ComboComputer_RGBPlusDepth:%d weight = %f",
			   iter,weights[iter]));
  }
  static void suppress_most_common_pixel_hack(Mat&z,Rect handBB)
  { 
    // hack, remove the most common pixel
    std::map<float,double> counts;
    Rect imBB(Point(0,0),z.size());

    for(int yIter = 0; yIter < z.rows; ++yIter)
      for(int xIter = 0; xIter < z.cols; ++xIter)
	if(!handBB.contains(Point(xIter,yIter)))
	{
	  float zz = z.at<float>(yIter,xIter);
	  if(goodNumber(zz) && params::MIN_Z() <= zz && zz <= params::MAX_Z())
	    counts[zz] ++;
	}

    // find the larget count
    float common_z, common_zs_count = -inf;
    for(auto & pair : counts)
      if(pair.second > common_zs_count)
      {
	common_z = pair.first;
	common_zs_count = pair.second;
      }
    log_once(safe_printf("note: suppressing % %",common_z,common_zs_count));	     

    // suppress!
    for(int yIter = 0; yIter < z.rows; ++yIter)
      for(int xIter = 0; xIter < z.cols; ++xIter)
	if(!handBB.contains(Point(xIter,yIter)))
	{
	  float&zz = z.at<float>(yIter,xIter);
	  if(zz == common_z)
	    zz = inf;
	}	  
  }
  LibHandMetadata::LibHandMetadata(
    string filename, 
    const Mat& RGB, const Mat& Z, 
    const Mat& segmentation, const Mat&semantics,
    Rect handBB,
    libhand::HandRenderer::JointPositionMap& joint_positions,
    CustomCamera camera, bool read_only) : 
    filename(filename), RGB(RGB), Z(Z), joint_positions(joint_positions), 
    handBB(handBB), camera(camera), read_only(read_only)
  {
    // export for Greg
    if(!read_only)
    {
      int id = getId(filename);
      string save_dir = boost::filesystem::path(filename).parent_path().string();
      log_once(printfpp("save_dir = %s",save_dir.c_str()));
      export_annotations(printfpp(
			   (save_dir + "/gen%d.annotations").c_str(),id));
      imwrite(printfpp((save_dir +"/gen%d.jpg").c_str(),id),RGB);
      imwrite(printfpp((save_dir +"/segmentation%d.jpg").c_str(),id),segmentation);
      imwrite(printfpp((save_dir +"/semantics%d.png").c_str(),id),semantics);
    }
    else
      unlink(filename.c_str());

    log_metric_bb();
  }
///
/// SECTION: Pedestrian Model
///
DetectionSet StackedModel::detect_dpm2occ(const ImRGBZ& im, DetectionFilter filter) const
{
    DetectionFilter part_fitler = filter;
    part_fitler.nmax = numeric_limits<int>::max();
    part_fitler.thresh = -inf;
    DetectionSet occ_dets = occ_model->detect(im,part_fitler);
    DetectionSet dpm_dets = dpm_model->detect(im,part_fitler);

    DetectionSet merged_dets;
    for(int iter = 0; iter < dpm_dets.size(); ++iter)
    {
        DetectorResult dpm_det = dpm_dets[iter];
        DetectorResult new_det;
        //DetectorResult occ_det = nearest_neighbour(occ_dets,dpm_det->BB);
        for(DetectorResult occ_det : occ_dets)
        {
            double sf = std::sqrt(occ_det->BB.area()/dpm_det->BB.area());
            if(
                occ_det->real >= .5 &&
                rectIntersect(occ_det->BB,dpm_det->BB) > BaselineModel_ExternalKITTI::BB_OL_THRESH &&
                clamp<double>(.5,sf,2) == sf)
            {
                // update the resp
                double new_resp = dpm_det->resp; //dpm_platt->prob();// * occ_platt->prob(occ_det->resp);
                if(!new_det or new_det->resp < new_resp)
                {
                    new_det.reset(new Detection(*dpm_det));
                    new_det->resp = new_resp;
                }
            }
            if(new_det)
                merged_dets.push_back(new_det);
        }
    }

    log_once(printfpp("merged %d of %d dets",(int)merged_dets.size(),(int)dpm_dets.size()));
    //filter.apply(merged_dets);
    log_once(printfpp("filt 2 %d of %d dets",(int)merged_dets.size(),(int)dpm_dets.size()));
    return merged_dets;
}
DetectionSet StackedModel::detect_occ2dpm(const ImRGBZ& im, DetectionFilter filter) const
{
    DetectionFilter part_fitler = filter;
    part_fitler.nmax = numeric_limits<int>::max();
    part_fitler.thresh = -inf;
    DetectionSet occ_dets = occ_model->detect(im,part_fitler);
    DetectionSet dpm_dets = dpm_model->detect(im,part_fitler);

    DetectionSet merged_dets;
    for(int iter = 0; iter < occ_dets.size(); ++iter)
    {
        DetectorResult occ_det = occ_dets[iter];
        auto occFeatFn = occ_det->feature;
        DetectorResult dpm_det = nearest_neighbour(dpm_dets,occ_det->BB);
        decltype(occFeatFn) dpmFeatFn;
        if(rectIntersect(occ_det->BB,dpm_det->BB) > BaselineModel_ExternalKITTI::BB_OL_THRESH)
        {
            occ_det->resp = dpm_det->resp + learner->getB();
            //occ_det->resp = ;//dpm_platt->prob(dpm_det->resp) * occ_platt->prob(occ_det->resp);
            dpmFeatFn = dpm_det->feature;
        }
        else
        {
            occ_det->resp = -inf; //dot(dpm_model->getW(),BaselineModel_ExternalKITTI::minFeat()) + learner->getB();
            dpmFeatFn = []() {
                return vector<double> {BaselineModel_ExternalKITTI::minFeat()};
            };
        }

        occ_det->feature = [this,occFeatFn,dpmFeatFn]()
        {
            map<string,SparseVector> feats{
                {"dpm_model",dpmFeatFn()},
                {"occ_model",occFeatFn()}};

            return feat_interpreation->pack(feats);
        };

        merged_dets.push_back(occ_det);
    }

    log_once(printfpp("merged %d of %d dets",(int)merged_dets.size(),(int)occ_dets.size()));
    //filter.apply(merged_dets);
    return merged_dets;
}
  map< string, AnnotationBoundingBox > Metadata_Simple::get_positives()
  {
    map<string,AnnotationBoundingBox> implicit_abbs = MetaData::get_essential_positives(HandBB_RGB);
    for(auto && pair : explicit_abbs)
    {
      auto found = implicit_abbs.find(pair.first);
      if(found == implicit_abbs.end() or static_cast<Rect_<double>>(found->second) == Rect_<double>())
      {
	implicit_abbs[pair.first] = pair.second;
      }
      else
      {
	implicit_abbs[pair.first] = pair.second;
	log_once(safe_printf("Metadata_Simple::get_positives % overwrite for part %",filename,pair.first));
      }
    }
    return implicit_abbs;
  }
DetectionSet StackedModel::detect_dpmThenOcc(const ImRGBZ& im, DetectionFilter filter) const
{
    // get the detections from the DPM
    DetectionFilter part_fitler = filter;
    part_fitler.nmax = numeric_limits<int>::max();
    part_fitler.thresh = -inf;
    DetectionSet dpm_dets = dpm_model->detect(im,part_fitler);
    DetectionSet dets;

    float min_world_area, max_world_area;
    area_model->validRange(params::world_area_variance,true,min_world_area,max_world_area);

    for(auto & dpm_det : dpm_dets)
    {
        AnnotationBoundingBox abb;
        abb.write(dpm_det->BB);

        // consider these depths...
        bool could_be_real = false;
        vector<float> depths = manifoldFn_prng(im,abb,50);
        for(float depth : depths)
        {
            // check the box's depth
            double bb_world_area = im.camera.worldAreaForImageArea(depth,abb);
            if(bb_world_area < min_world_area || bb_world_area > max_world_area)
                continue;

            // check that the box is real
            abb.depth = depth;
            auto info = occ_model->extract(im, abb,false);
            //cout << printfpp("%real = %f\n",real);
            if(info.occ <= .80 && info.bg <= .5)
                could_be_real = true;
        }

        if(could_be_real)
            dets.push_back(dpm_det);
    }

    log_once(printfpp("areaModel filtered %d => %d",(int)dpm_dets.size(),(int)dets.size()));
    return dets;
}
  ComboComputer_Depth::ComboComputer_Depth(Size win_size, Size block_size, Size block_stride, Size cell_size): FeatureBinCombiner(win_size, block_size, block_stride, cell_size)
  {
    computers.clear();
    
    // for now, use ZHOG and ZAREA
    // Depth HOG
    computers.push_back(shared_ptr<DepthFeatComputer>(
      new HOGComputer18p4_General(selectDepthFn,win_size,block_size,block_stride,cell_size)));
    // HoA
    //computers.push_back(shared_ptr<DepthFeatComputer>(
      //new HOGComputer_Area(win_size,block_size,block_stride,cell_size)));
    
    normalize_weights();
    
    // update the normalized weights
    //weights[1] *= HOA_IMPORTANCE; 
    //assert(std::dynamic_pointer_cast<HOGComputer_Area>(computers[1]));
    
    for(int iter = 0; iter < computers.size(); ++iter)
      log_once(printfpp("ComboComputer_Depth:%d weight = %f",
			   iter,weights[iter]));
  }
  MetaData_YML_Backed* load_ICL(string base_path,string annotation,bool training)
  {
    // parse the annotation
    vector<double> labels;
    istringstream iss(annotation);
    string filename; iss >> filename; // discard.
    cout << "annotation " << annotation << endl;
    cout << "filename " << filename << endl;
    while(iss)
    {
      double v; iss >> v;
      labels.push_back(v);
    }    

    // calc the name for this metadata    
    string metadata_filename = base_path + filename;

    // load the raw data
    float active_min = training?0:params::MIN_Z();
    string frame_file = base_path + filename;
    Mat depth = imread(frame_file,-1);
    assert(!depth.empty());
    CustomCamera pxc_camera(params::H_RGB_FOV,params::V_RGB_FOV, depth.cols,depth.rows);
    depth.convertTo(depth,DataType<float>::type);
    depth /= 10;
    for(int rIter = 0; rIter < depth.rows; ++rIter)
      for(int cIter = 0; cIter < depth.cols; ++cIter)
      {
	float & d = depth.at<float>(rIter,cIter);
	if(d <= active_min)
	  d = inf;
      }
    //depth = pointCloudToDepth(depth,pxc_camera);
    
    if(depth.empty())
    {
      log_once(printfpp("ICL_Video cannot load %s",metadata_filename.c_str()));
      log_once(printfpp("Couldn't open %s",frame_file.c_str()));
      return nullptr;
    }
    //Mat RGB (depth.rows,depth.cols,DataType<Vec3b>::type,Scalar(122,150,233));
    Mat RGB = imageeq("",depth,false,false);
    for(int rIter = 0; rIter < RGB.rows; rIter++)
      for(int cIter = 0; cIter < RGB.cols; cIter++)
	RGB.at<Vec3b>(rIter,cIter)[2] = 255;

    // create an image    
    shared_ptr<ImRGBZ> im =
      make_shared<ImRGBZ>(RGB,depth,metadata_filename + "image",pxc_camera);

    // create the metadata object
    Metadata_Simple* metadata = new Metadata_Simple(metadata_filename+".yml",true,true,false);
    metadata->setIm(*im);

    Point2d hand_root(labels[0 + 0*3],labels[1 + 0*3]);
    suppress_flood_fill_hack(im->Z,hand_root);
    metadata->setIm(*im);
    Rect handBB = set_annotations(metadata,labels,im);
    suppress_most_common_pixel_hack(im->Z,handBB);    
    metadata->setIm(*im);
    
    log_im_decay_freq("ICL_loaded",[&]()
		      {
			return image_datum(*metadata);
		      });

    return metadata;
  }