Перейти к содержимому
Compvision.ru
astrgan

нейроные сети в OpenCV

Recommended Posts

Здравствуйте.

Подскажите какой-нибудь пример с использованием нейронных сетей из библиотеки OpenCV.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте.

Подскажите какой-нибудь пример с использованием нейронных сетей из библиотеки 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если использовать нейросеть для распознавания изображений (с предварительной обработкой на OpenCV), то какой библиотекой лучше пользоваться?

OpenCV или какой-нибудь другой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Попробуйте сначала то, что из opencv, т.к. ничего дополнительно подключать не надо и если у вас не какая то специфическая задача где надо дополнительной гибкости, то думаю за глаза хватит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Что-то не могу до конца разобраться.

Может кто-нибудь покажет как например в opencv создать сеть решающею XOR?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это для 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;
}

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×