int annTrain::train(std::string imagesDir, int networkInputSize, float testRatio) { std::cout << "Reading training set..." << std::endl; uint64 start = ofGetElapsedTimeMillis(); std::vector<std::string> files = getFilesInDirectory(imagesDir); std::random_shuffle(files.begin(), files.end()); cv::Mat img; for (auto it = files.begin(); it != files.end(); ++it) { std::string filename = *it; //std::cout << "Reading image " << filename << "..." << std::endl; img = cv::imread(filename, 0); if (img.empty()) { std::cerr << "WARNING: Could not read image." << std::endl; continue; } std::string classname = getClassName(filename); cv::Mat descriptors = getDescriptors(img); processClassAndDesc(classname, descriptors); } std::cout << " Seconds : " << (ofGetElapsedTimeMillis() - start) / 1000.0 << std::endl; std::cout << "Creating vocabulary..." << std::endl; start = ofGetElapsedTimeMillis(); cv::Mat labels; cv::Mat vocabulary; // Use k-means to find k centroids (the words of our vocabulary) cv::kmeans(descriptorsSet, networkInputSize, labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 10, 0.01), 1, cv::KMEANS_PP_CENTERS, vocabulary); // No need to keep it on memory anymore descriptorsSet.release(); std::cout << " Seconds : " << (ofGetElapsedTimeMillis() - start) / 1000.0 << std::endl; // Convert a set of local features for each image in a single descriptors // using the bag of words technique std::cout << "Getting histograms of visual words..." << std::endl; int* ptrLabels = (int*)(labels.data); int size = labels.rows * labels.cols; for (int i = 0; i < size; i++) { int label = *ptrLabels++; ImageData* data = descriptorsMetadata[i]; data->bowFeatures.at<float>(label)++; } // Filling matrixes to be used by the neural network std::cout << "Preparing neural network..." << std::endl; std::set<ImageData*> uniqueMetadata(descriptorsMetadata.begin(), descriptorsMetadata.end()); for (auto it = uniqueMetadata.begin(); it != uniqueMetadata.end(); ) { ImageData* data = *it; cv::Mat normalizedHist; cv::normalize(data->bowFeatures, normalizedHist, 0, data->bowFeatures.rows, cv::NORM_MINMAX, -1, cv::Mat()); trainSamples.push_back(normalizedHist); trainResponses.push_back(getClassCode(classes, data->classname)); delete *it; // clear memory it++; } descriptorsMetadata.clear(); // Training neural network std::cout << "Training neural network..." << std::endl; start = ofGetElapsedTimeMillis(); mlp = getTrainedNeuralNetwork(trainSamples, trainResponses); std::cout << " Seconds : " << (ofGetElapsedTimeMillis() - start) / 1000.0 << std::endl; // We can clear memory now trainSamples.release(); trainResponses.release(); // Train FLANN std::cout << "Training FLANN..." << std::endl; start = ofGetElapsedTimeMillis(); flann = cv::Ptr<cv::FlannBasedMatcher>(new cv::FlannBasedMatcher()); flann->add(vocabulary); flann->train(); std::cout << " Seconds : " << (ofGetElapsedTimeMillis() - start) / 1000.0 << std::endl; // Reading test set std::cout << "Reading test set..." << std::endl; start = ofGetElapsedTimeMillis(); readImagesToTest(files.begin() + (size_t)(files.size() * testRatio), files.end()); std::cout << " Seconds : " << (ofGetElapsedTimeMillis() - start) / 1000.0 << std::endl; // Get confusion matrix of the test set std::vector<std::vector<int> > confusionMatrix = getConfusionMatrix(); // how accurate is our model std::cout << "Confusion matrix " << std::endl; printConfusionMatrix(confusionMatrix, classes); std::cout << "Accuracy " << getAccuracy(confusionMatrix) << std::endl; // now save everything std::cout << "saving models" << std::endl; saveModels(vocabulary, classes); return 0; }
void ModelPlotter::keyPressed(int key) { if(key == 'r') { _recordMode = !_recordMode; if (!_recordMode) { App::getInstance()->flagPageModelsChanged(); } } else if(key == 'L') { loadModels(); } else if(key == 'S') { saveModels(); } if(_recordMode) { // delete if(key == 127) { deleteSelectedModel(); } // right arrow else if (key == 358) { if(_selectedModel != DISABLED && _selectedPoint != DISABLED) { App::getInstance()->getPageModelByIndex(_selectedModel)->pts[_selectedPoint].x += 1; } } // left arrow else if (key == 356) { if(_selectedModel != DISABLED && _selectedPoint != DISABLED) { App::getInstance()->getPageModelByIndex(_selectedModel)->pts[_selectedPoint].x -= 1; } } // up arrow else if (key == 357) { if(_selectedModel != DISABLED && _selectedPoint != DISABLED) { App::getInstance()->getPageModelByIndex(_selectedModel)->pts[_selectedPoint].y -= 1; } } // down arrow else if (key == 359) { if(_selectedModel != DISABLED && _selectedPoint != DISABLED) { App::getInstance()->getPageModelByIndex(_selectedModel)->pts[_selectedPoint].y += 1; } } // d else if (key == 'd') { if(_selectedModel != DISABLED) { moveModel(true, +1); } } // a else if (key == 'a') { if(_selectedModel != DISABLED) { moveModel(true, -1); } } // w else if (key == 'w') { if(_selectedModel != DISABLED) { moveModel(false, -1); } } // s else if (key == 's') { if(_selectedModel != DISABLED) { moveModel(false, +1); } } } }