Пример #1
0
	vector<int> Recoloring::MatchGaussians(CvEM& source_model, CvEM& target_model) {
		int num_g = source_model.get_nclusters();
		Mat sMu(source_model.get_means());
		Mat tMu(target_model.get_means());
		const CvMat** target_covs = target_model.get_covs();
		const CvMat** source_covs = source_model.get_covs();

		double best_dist = std::numeric_limits<double>::max();
		vector<int> best_res(num_g);
		vector<int> prmt(num_g); 

		for(int itr = 0; itr < 10; itr++) {
			for(int i=0;i<num_g;i++) prmt[i] = i;	//make a permutation
			randShuffle(Mat(prmt));

			//Greedy selection
			vector<int> res(num_g);
			vector<bool> taken(num_g);
			for(int sg = 0; sg < num_g; sg++) {
				double min_dist = std::numeric_limits<double>::max(); 
				int minv = -1;
				for(int tg = 0; tg < num_g; tg++) {
					if(taken[tg]) continue;

					//TODO: can save on re-calculation of pairs - calculate affinity matrix ahead
					//double d = norm(sMu(Range(prmt[sg],prmt[sg]+1),Range(0,3)),	tMu(Range(tg,tg+1),Range(0,3)));
					
					//symmetric kullback-leibler
					Mat diff = Mat(sMu(Range(prmt[sg],prmt[sg]+1),Range(0,3)) - tMu(Range(tg,tg+1),Range(0,3)));
					Mat d = diff * Mat(Mat(source_covs[prmt[sg]]).inv() + Mat(target_covs[tg]).inv()) * diff.t();
					Scalar tr = trace(Mat(
						Mat(Mat(source_covs[prmt[sg]])*Mat(target_covs[tg])) + 
						Mat(Mat(target_covs[tg])*Mat(source_covs[prmt[sg]]).inv()) + 
						Mat(Mat::eye(3,3,CV_64FC1)*2)
						));
					double kl_dist = ((double*)d.data)[0] + tr[0];
					if(kl_dist<min_dist) {
						min_dist = kl_dist;
						minv = tg;
					}
				}
				res[prmt[sg]] = minv;
				taken[minv] = true;
			}

			double dist = 0;
			for(int i=0;i<num_g;i++) {
				dist += norm(sMu(Range(prmt[i],prmt[i]+1),Range(0,3)),
							tMu(Range(res[prmt[i]],res[prmt[i]]+1),Range(0,3)));
			}
			if(dist < best_dist) {
				best_dist = dist;
				best_res = res;
			}
		}

		return best_res;
	}
Пример #2
0
bool RateAlgoDT::runAlgo(bool PhysicsBits[128],
                         L1Analysis::L1AnalysisRecoMuonDataFormat * mu,
                         L1Analysis::L1AnalysisGMTDataFormat      * gmt,
                         L1Analysis::L1AnalysisDTTFDataFormat     * dttf)
{

    float PTmax  = -1;
    TriggeredMuon tMuPtMax(0,-1,0);
    TriggeredMuons tMu(mu,gmt,dttf);

    if ( PhysicsBits[55] ) // CB single mu open
    {
        tMu.findMuons(controlPlotter_) && tMu.runGmtDttfMatching(controlPlotter_) && tMu.runDTTriggerMatching(controlPlotter_);

        triggeredMuonsIt tMuIt  = tMu.dt_trigger_muons.begin();
        triggeredMuonsIt tMuEnd = tMu.dt_trigger_muons.end();

        for (; tMuIt != tMuEnd; ++tMuIt)
        {

            int bx = tMuIt->gmt()->Bxdt[tMuIt->igmt()];
            if (bx != 0) continue;

            float eta= tMuIt->gmt()->Etadt[tMuIt->igmt()];
            if (fabs(eta) > trigEta_) continue;

            float pt = tMuIt->gmt()->Ptdt[tMuIt->igmt()];
            if ( pt > PTmax)
            {
                PTmax = pt;
                tMuPtMax = (*tMuIt);
            }
        }
    }

    if (plotter_ && PTmax >= trigPt_)
        plotter_->fill(gmt,-1,tMuPtMax.igmt(),-1,-1,-1,tMuPtMax);

    return (PTmax >= trigPt_) ? increment() : false ;

}
Пример #3
0
	void Recoloring::Recolor(Mat& _source, Mat& source_mask, Mat& _target, Mat& target_mask) {
		Mat source; _source.convertTo(source,CV_32F,1.0/255.0);
		Mat target; _target.convertTo(target,CV_32F,1.0/255.0);

		CvEM source_model,target_model;

		//cvtColor(target,target,CV_BGR2Lab);
		//cvtColor(source,source,CV_BGR2Lab);

		TrainGMM(source_model,source,source_mask);
		TrainGMM(target_model,target,target_mask);

		vector<int> match = MatchGaussians(source_model,target_model);
		

		Mat target_32f; 
		//if(target.type() != CV_32F)
		//	target.convertTo(target_32f,CV_32F,1.0/255.0);
		//else
		target.copyTo(target_32f);

		const CvMat** target_covs = target_model.get_covs();
		const CvMat** source_covs = source_model.get_covs();
		Mat sMu(source_model.get_means()); Mat sMu_64f; sMu.convertTo(sMu_64f,CV_64F);
		Mat tMu(target_model.get_means()); Mat tMu_64f; tMu.convertTo(tMu_64f,CV_64F);

		int num_g = target_model.get_nclusters();

		Mat pr; Mat samp(1,3,CV_32FC1);
		for(int y=0;y<target.rows;y++) {
			Vec3f* row = target_32f.ptr<Vec3f>(y);
			uchar* mask_row = target_mask.ptr<uchar>(y);
			for(int x=0;x<target.cols;x++) {
				if(mask_row[x] > 0) {
					memcpy(samp.data,&(row[x][0]),3*sizeof(float)); 
					float res = target_model.predict(samp,&pr);
					
					//cout << res << ":" << ((float*)pr.data)[0] << "," <<
					//	((float*)pr.data)[1] << "," <<
					//	((float*)pr.data)[2] << "," <<
					//	((float*)pr.data)[3] << "," <<
					//	((float*)pr.data)[4] << "," << endl;

					Mat samp_64f; samp.convertTo(samp_64f,CV_64F);

					//From Shapira09: Xnew = Sum_i { pr(i) * Sigma_source_i * (Sigma_target_i)^-1 * (x - mu_target) + mu_source }
					Mat Xnew(1,3,CV_64FC1,Scalar(0));
					for(int i=0;i<num_g;i++) {
						if(((float*)pr.data)[i] <= 0) continue;
						Mat A = /*Mat(*/
							//Mat(target_covs[i]) * 
							//Mat(source_covs[match[i]]).inv() *
							Mat(samp_64f - tMu_64f(Range(i,i+1),Range(0,3))).t();
						Mat B = sMu_64f(Range(match[i],match[i]+1),Range(0,3)).t();
						Xnew += Mat((A + B) * (double)(((float*)pr.data)[i])).t();
					}

					Mat _tmp; Xnew.convertTo(_tmp,CV_32F);

					//allow for mask with alpha
					float* _d = ((float*)_tmp.data);
					float alpha = mask_row[x] / 255.0f;
					for(int cl=0;cl<3;cl++)
						_d[cl] = _d[cl] * (alpha) + row[x][cl] * (1-alpha);
					
					memcpy(&(row[x][0]),_tmp.data,sizeof(float)*3);
				}
			}
		}

		//cvtColor(target,target,CV_Lab2BGR);
		//cvtColor(source,source,CV_Lab2BGR);
		//cvtColor(target_32f,target_32f,CV_Lab2BGR);

		if(!this->m_p.no_gui) {
			namedWindow("orig target");
			imshow("orig target",target);
			namedWindow("source orig");
			imshow("source orig",source);
			namedWindow("source masked");
			Mat _tmp_S; source.copyTo(_tmp_S,source_mask);
			imshow("source masked",_tmp_S);
			namedWindow("dest target");
			imshow("dest target",target_32f);

			waitKey(this->m_p.wait_time);
		}

		target_32f.convertTo(_target,CV_8UC3,255.0);
	}