bool makeBOWModel(std::vector<BOWImg> &images, Mat &vocabulary, Mat &trainData, Mat &response) { // Load training images std::cout<<"--->Loading training images ... "<<std::endl; int numImages = imgRead(images); if(numImages < 0) return false; std::cout<<" "<<numImages<<" images loaded."<<std::endl; // Random shuffle samples std::random_shuffle (images.begin(), images.end()); /* Get the ROI of images. Feature detect and extract descriptors. */ printf("--->Extracting %s features ...\n", conf.extractor.c_str()); features(images, conf.extractor, conf.detector); BOWKMeansTrainer trainer(conf.numClusters,TermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,10,1.0)); for(std::vector<BOWImg>::iterator iter = images.begin();iter != images.end(); iter++) { Mat tmp = iter->descriptor; trainer.add(tmp); } std::cout<<"--->Constructing vocabulary list ..."<<std::endl; vocabulary = trainer.cluster(); std::cout<<"--->Extracting BOW features ..."<<std::endl; bowFeatures(images, vocabulary, conf.extractor); // Prepare traning data. Mat rawData; for(std::vector<BOWImg>::iterator iter = images.begin();iter != images.end(); iter++) { rawData.push_back(iter->BOWDescriptor); response.push_back(iter->label); } // PCA #ifdef _USE_PCA_ float factor = 1; int maxComponentsNum = static_cast<float>(conf.numClusters) * factor; PCA pca(rawData, Mat(),CV_PCA_DATA_AS_ROW, maxComponentsNum); Mat pcaData; for(int i = 0;i<rawData.rows;i++) { Mat vec = rawData.row(i); Mat coeffs = pca.project(vec); pcaData.push_back(coeffs); } trainData = pcaData; #else trainData = rawData; #endif return true; }
double* mitk::pa::Volume::GetData() const { mitk::ImageWriteAccessor imgRead(m_InternalMitkImage, m_InternalMitkImage->GetVolumeData()); return (double*)imgRead.GetData(); }
double test(cv::Mat &vocabulary, void *src) { // Test std::vector<BOWImg> images; conf.max_num = conf.max_num * 2; std::cout<<"--->Loading testing images ... "<<std::endl; int numImages = imgRead(images); std::cout<<" "<<numImages<<" images loaded."<<std::endl; if(numImages < 0) return -1; printf("--->Extracting %s features ...\n", conf.extractor.c_str()); features(images, conf.extractor, conf.detector); std::cout<<"--->Extracting BOW features ..."<<std::endl; bowFeatures(images, vocabulary, conf.extractor); cv::Mat rawData; for(std::vector<BOWImg>::iterator iter = images.begin();iter != images.end(); iter++) rawData.push_back(iter->BOWDescriptor); //PCA #ifdef _USE_PCA_ float factor = 1; int maxComponentsNum = static_cast<float>(conf.numClusters) * factor; cv::PCA pca(rawData, Mat(),CV_PCA_DATA_AS_ROW, maxComponentsNum); cv::Mat pcaData; for(int i = 0;i<rawData.rows;i++) { cv::Mat vec = rawData.row(i); cv::Mat coeffs = pca.project(vec); pcaData.push_back(coeffs); } cv::Mat testData = pcaData; #else cv::Mat testData = rawData; #endif std::cout<<"--->Executing predictions ..."<<std::endl; cv::Mat output; double ac = 0; double ac_rate = 0; if(conf.classifier == "BP") { CvANN_MLP *classifier = (CvANN_MLP *)src; classifier->predict(testData,output); cout<<"--->Predict answer: "<<std::endl; for(int i = 0;i < output.rows;i++) { float *p = output.ptr<float>(i); int k = 0; int tmp = 0; for(int j = 0;j < output.cols;j++) { if(p[j] > tmp ) { tmp = p[j]; k = j; } } std::cout<<" "<<images[i].imgName<<" ---- "<<conf.classes[k]<<endl; if(images[i].label == k+1) ac++; } ac_rate = ac / static_cast<double>(output.rows); } else if(conf.classifier == "SVM") { CvSVM *classifier = (CvSVM *)src; classifier->predict(testData,output); cout<<"--->Predict answer: "<<std::endl; for(int i = 0;i < output.rows;i++) { int k = (int)output.ptr<float>()[i]-1; std::cout<<" "<<images[i].imgName<<" ---- "<<conf.classes[k]<<endl; if(images[i].label == k+1) ac++; } ac_rate = ac / static_cast<double>(output.rows); } else { std::cout<<"--->Error: wrong classifier."<<std::endl; } return ac_rate; }