Added Neural network code

This commit is contained in:
2017-12-20 12:21:17 +01:00
parent 8175417c23
commit 6c3eeac6fb
212 changed files with 5140 additions and 92 deletions
+148
View File
@@ -0,0 +1,148 @@
#include "Training.h"
using namespace cv;
using namespace std;
Training::Training()
{
}
Training::~Training()
{
}
void Training::CreateTrainingSet()
{
Camera cam = Camera(1);
bool running = true;
while (running)
{
string in;
cout << "Ready for next category" << endl;
cout << "Please specifiy name or type exit to stop: ";
cin >> in;
if (in == "exit")
{
running = false;
break;
}
bool takingPhotos = true;
int i = 0;
while (takingPhotos)
{
Mat image;
image = cam.getImage();
imshow("Live feed", image);
int key = waitKey(100);
switch (key)
{
case 32:
imwrite("training/" + in + "_" + to_string(i) + ".bmp", image);
cout << "Image taken #" << i << endl;
i++;
break;
case 27:
destroyWindow("Live feed");
takingPhotos = false;
running = false;
break;
case 110:
destroyWindow("Live feed");
takingPhotos = false;
default:
break;
}
}
}
}
void Training::LoadTrainingSet()
{
NeuralNetwork bpn;
Mat ITset = Mat_<double>();
Mat OTset = Mat_<double>();
vector<string> files;
string dir = "training/";
read_directory(dir, files);
cout << "Found " << files.size()-2 << " files in " << dir << endl;
random_shuffle(files.begin(), files.end());
for (string file : files)
{
string loc = dir + file;
Mat image;
image = imread(loc, CV_LOAD_IMAGE_COLOR);
if (!image.data)
continue;
cout << "Loaded " << file << endl;
string classname;
class_name(file, classname);
Mat gray_image, binaryImage;
cvtColor(image, gray_image, CV_BGR2GRAY);
threshold(gray_image, binaryImage, 200, 1, CV_THRESH_BINARY_INV);
//Extract Features
vector<Point> contour;
FeatureExtractor::findContour(gray_image, contour);
FeatureExtractor ftext = FeatureExtractor(contour);
Mat descriptors;
ftext.Extract(descriptors);
Mat output;
bpn.getClass(classname, output);
ITset.push_back<double>(descriptors);
OTset.push_back<double>(output);
}
destroyAllWindows();
cout << "Finished loading all files" << endl;
bpn.Train(ITset, OTset);
cout << "Training complete" << endl;
cin.ignore();
}
void Training::read_directory(const string& name, vector<string> &v)
{
string pattern = name;
pattern.append("\\*");
WIN32_FIND_DATA data;
HANDLE hFind;
if ((hFind = FindFirstFile(pattern.c_str() , &data)) != INVALID_HANDLE_VALUE) {
do {
v.push_back(data.cFileName);
} while (FindNextFile(hFind, &data) != 0);
FindClose(hFind);
}
}
void Training::class_name(const string& name, string& classname)
{
string::size_type const p(name.find_last_of('_'));
classname = name.substr(0, p);
}