astrgan 2 Жалоба Опубликовано May 20, 2014 Здравствуйте. Подскажите какой-нибудь пример с использованием нейронных сетей из библиотеки OpenCV. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 20, 2014 Здравствуйте. Подскажите какой-нибудь пример с использованием нейронных сетей из библиотеки OpenCV. points_classifier.cpp из папки с примерами. Список классификаторов: #define _NBC_ 0 // normal Bayessian classifier #define _KNN_ 0 // k nearest neighbors classifier #define _SVM_ 0 // support vectors machine #define _DT_ 1 // decision tree // Это отключить #define _BT_ 0 // ADA Boost #define _GBT_ 0 // gradient boosted trees #define _RF_ 0 // random forest #define _ERT_ 0 // extremely randomized trees #define _ANN_ 0 // artificial neural networks // Это подключить #define _EM_ 0 // expectation-maximization Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
astrgan 2 Жалоба Опубликовано May 24, 2014 Если использовать нейросеть для распознавания изображений (с предварительной обработкой на OpenCV), то какой библиотекой лучше пользоваться? OpenCV или какой-нибудь другой? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано May 26, 2014 Попробуйте сначала то, что из opencv, т.к. ничего дополнительно подключать не надо и если у вас не какая то специфическая задача где надо дополнительной гибкости, то думаю за глаза хватит. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
astrgan 2 Жалоба Опубликовано June 5, 2014 Что-то не могу до конца разобраться. Может кто-нибудь покажет как например в opencv создать сеть решающею XOR? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано June 5, 2014 Это для XOR, если больше 0.5 - это TRUE если меньше - FALSE. #include <iostream> #include <stdio.h> #include "opencv2/opencv.hpp" #include <iostream> #include <fstream> using namespace std; using namespace cv; int main(void) { Mat trainSamples, trainClasses; // Матрица обучающих векторов 4 двухмерных вектора trainSamples=Mat::zeros(4,2,CV_32FC1); // Матрица желаемых откликов 1 одномерный вектор trainClasses=Mat::zeros(4,1,CV_32FC1); // Заполняем векторы для задачи XOR int N=0; for(int x=0;x<2;++x) { for(int y=0;y<2;++y) { trainSamples.at<float>(N,0)=x; trainSamples.at<float>(N,1)=y; trainClasses.at<float>(N,0)=x^y; N++; } } // Весовые коэффициенты входных векторов ("важность" каждого входного вектора) // Зададим равную важность всем векторам выборки Mat weights( 1, 4, CV_32FC1, Scalar::all(1) ); // Архитектура сети Mat layer_sizes( 1, 3, CV_32SC1 ); layer_sizes.at<int>(0) = 2; // Входной слой, по количеству измерений входного вектора layer_sizes.at<int>(1) = 3; // Скрытый слой layer_sizes.at<int>(2) = 1; // Выходной слой по количеству выходов сети // Создаем сеть CvANN_MLP ann( layer_sizes, CvANN_MLP::SIGMOID_SYM, 1, 1 ); // Обучаем сеть ann.train( trainSamples, trainClasses, weights); // ------------- // ТЕСТИРОВАНИЕ // ------------- // Тестовый пример Mat testSample; // Тут будет ответ Mat outputs( 1, 1, CV_32FC1); // Прогоняем по всей обучающей выборке, и смотрим реакцию for(int i=0;i<4;++i) { testSample=trainSamples.row(i); ann.predict( testSample, outputs ); cout << testSample << outputs << endl; } // Все, ждем кнопку ... getchar(); return 0; } И еще обучалка/вопрошалка классификатора циферок/буковок (в примере на 4 символа): #include "opencv2/opencv_modules.hpp" #include "opencv2/core/core.hpp" #include "opencv2/ml/ml.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/opencv.hpp" #include <windows.h> #include <stdio.h> using namespace std; using namespace cv; //---------------------------------------------------------------------- // Получаем список файлов из директории // Применение: // string ImagesDir=tmp+"C:\\Images\\*.jpg"; // vector<string> files=listFilesInDirectory(ImagesDir); //---------------------------------------------------------------------- vector<string> listFilesInDirectory(string directoryName) { WIN32_FIND_DATA FindFileData; HANDLE hFind = FindFirstFile(directoryName.c_str(), &FindFileData); vector<string> listFileNames; listFileNames.push_back(FindFileData.cFileName); while (FindNextFile(hFind, &FindFileData)) listFileNames.push_back(FindFileData.cFileName); return listFileNames; } //---------------------------------------------------------------------- // //---------------------------------------------------------------------- int main() { // Высота и ширина символа int digit_w=11; int digit_h=14; // Размерность вектора обучающей выборки const int image_area = digit_w*digit_h; // Директория в которой лежат поддиректории с картинками string DataDir="..\\data\\"; // Список названий поддиректорий с примерами vector<string> DirNames; DirNames.push_back("0"); DirNames.push_back("1"); DirNames.push_back("2"); DirNames.push_back("3"); // Формируем список путей к изображениям и заполняем метки классов int num_img=0; vector<string> files_plain_list; vector<int> files_label_list; for (int i=0;i<DirNames.size();++i) { DirNames[i]=DataDir+DirNames[i]+"\\"; vector<string> files_tmp(listFilesInDirectory(DirNames[i]+"*.png")); num_img+=files_tmp.size(); files_plain_list.insert(files_plain_list.end(), files_tmp.begin(), files_tmp.end()); for(int j=0;j<files_tmp.size();++j) { files_label_list.push_back(i); } } // Матрица обучающих векторов cv::Mat training_mat(num_img,image_area,CV_32FC1); // Матрица меток классов cv::Mat labels=Mat::zeros(num_img,DirNames.size(),CV_32FC1); // Временная матрица для преобразований cv::Mat tmp_img; int count = 0; string Dir; vector<string>::const_iterator i; for (i = files_plain_list.begin(); i != files_plain_list.end(); ++i) { // Узнали метку класса int class_label=files_label_list[i-files_plain_list.begin()]; // Узнали директорию, где лежат векторы этого класса Dir=DirNames[class_label]; // Номер метки для каждого входного вектора labels.at< float >(count, class_label) = 1; // Выведем что получилось (имена файлов с директориями) cout << Dir +*i << endl; // Считаем изображение tmp_img = cv::imread( Dir +*i, 0 ); // Ресайзим под заданный размер входного вектора cv::resize( tmp_img, tmp_img, Size(digit_w,digit_h) ); // Вытягиваем в одну строку tmp_img = tmp_img.reshape( 1, 1 ); // Переводим в тип float tmp_img.convertTo( training_mat.row(count), CV_32FC1 ); // Следующий ... ++count; } // Архитектура сети. Создадим трехслойную сеть. Mat layer_sizes1( 1, 3, CV_32SC1 ); // По размеру входного вектора layer_sizes1.at<int>(0) = image_area; // Ну, так мне захотелось layer_sizes1.at<int>(1) = image_area/10.0; // По количеству классов layer_sizes1.at<int>(2) = DirNames.size(); // Все векторы равнозначны, ущербных данных нет Mat weights( 1, training_mat.rows, CV_32FC1, Scalar::all(1) ); // Создаем и обучаем сеть CvANN_MLP ann( layer_sizes1, CvANN_MLP::SIGMOID_SYM, 1, 1 ); ann.train( training_mat, labels, weights ); // Сохраняем сеть ann.save("recog.xml"); // Тестируем сеть Mat outputs; ann.predict(training_mat,outputs); cout << outputs << endl; // Ждем кнопку ... getchar(); return 1; } 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
astrgan 2 Жалоба Опубликовано June 5, 2014 Smorodov Спасибо большое) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах