Разработка искусственной нейронной сети для распознавания пола по фотографии

Разработка алгоритма и программы для распознавания пола по фотографии с использованием искусственной нейронной сети. Создание алгоритмов: математического, работы с приложением, установки весов, реализации функции активации и обучения нейронной сети.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 05.01.2013
Размер файла 1,0 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Содержание

Задание

Введение

1. Разработка алгоритма

1.1 Математический алгоритм

1.2 Разработка схемы алгоритма

2. Разработка программы

3. Вычислительный эксперимент

Заключение

Список литературы

Приложение

Задание

Разработать алгоритм и программу для распознавания пола по фотографии используя ИНС.

Введение

Разработанная программа для распознания пола по фотографии реализовывается на универсальной ЭВМ. Для корректной работы этой программы необходимо иметь операционную систему Windows XP (SP 2-3)/Vista (SP 1)/ Windows 7. Программа разработана в среде разработки программного обеспечения Microsoft Visual Studio 2010.

Целью работы являлась разработка искусственной нейронной сети по распознаванию пола на языке С#.

Искусственные нейронные сети (ИНС) -- математические модели, а также их программные или аппаратные реализации, построенные по принципу организации и функционирования биологических нейронных сетей -- сетей нервных клеток живого организма. ИНС представляют собой систему соединённых и взаимодействующих между собой простых процессоров (искусственных нейронов).

При обучении сети предлагаются различные образцы образов с указанием того, к какому классу они относятся. Образец, как правило, представляется как вектор значений признаков. При этом совокупность всех признаков должна однозначно определять класс, к которому относится образец. В случае, если признаков недостаточно, сеть может соотнести один и тот же образец с несколькими классами, что неверно. По окончании обучения сети ей можно предъявлять неизвестные ранее образы и получать ответ о принадлежности к определённому классу.

Топология такой сети характеризуется тем, что количество нейронов в выходном слое, как правило, равно количеству определяемых классов. При этом устанавливается соответствие между выходом нейронной сети и классом, который он представляет. Когда сети предъявляется некий образ, на одном из её выходов должен появиться признак того, что образ принадлежит этому классу.

1. Разработка алгоритма

В данном разделе представлены: математический алгоритм, алгоритм работы с приложением, алгоритм установки весов, алгоритм реализации функции активации и алгоритм обучения нейронной сети.

алгоритм программа нейронный сеть

1.1 Математический алгоритм

Пусть к синапсам поступают импульсы силы x1, x2, x3 соответственно, тогда после прохождения синапсов и дендритов к нейрону поступают импульсы w1x1, w2x2, w3x3. Нейрон преобразует полученный суммарный импульс x=w1x1+ w2x2+ w3x3 в соответствии с некоторой передаточной функцией f(x). Сила выходного импульса равна y=f(x)=f(w1x1+ w2x2+ w3x3). Таким образом, нейрон полностью описывается своими весами wk и передаточной функцией f(x). Получив набор чисел (вектор) xk в качестве входов, нейрон выдает некоторое число y на выходе. Схема нейрона приведена на рисунке 1.

Рисунок 1 - Схема нейрона

-- входные сигналы, совокупность всех входных сигналов нейрона образует вектор x;

-- весовые коэффициенты, совокупность весовых коэффициентов образует вектор весов w;

S - взвешенная сумма входных сигналов, значение NET передается на нелинейный элемент;

В качестве функции активации был выбрана функция гиперболический тангенс:

Под обучением понимается процесс адаптации сети к предъявляемым эталонным образцам путем модификации весовых коэффициентов связей между нейронами. Первоначально весовые коэффициенты устанавливаются каким-либо образом, например, случайно. На вход нейронной сети в определенном порядке подаются учебные примеры. Вычисляется ошибка для учебного примера и производится коррекция весов нейронной сети.

1.2 Разработка схемы алгоритма

Схема алгоритма работы с приложением приведена на рисунке 2

Рисунок 2 - Схема алгоритма работы с приложением

Схема алгоритма установки весов приведена на рисунке 3

Рисунок 3 - Схема алгоритма установки весов

Схема алгоритма реализации функции активации приведена на рисунке 4.

Рисунок 4 - Схема алгоритма реализации функции активации

Схема алгоритма обучения нейронной сети представлена на рисунке 5

Рисунок 5 -Схема алгоритма обучения нейронной сети

2. Разработка программы

В соответствии с математическим алгоритмом, с общей схемой алгоритма программы и алгоритмами предопределенных процессов написана программа, которая осуществляет распознавание пола по фотографии.

Программа написана на языке программирования C#, с помощью среды разработки Microsoft Visual Studio 2010.

Создание проекта:

1. Запустить среду разработки ПО Microsoft Visual Studio 2010.

2. File > New > Project.

3. Visual C# > Windows Forms Applications.

4. View> Toolbox.

Текст программы представлен на рисунках 5, 6, 7.

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO;

using set;

namespace Kurs

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

CleanImage = pictureBox1.Image;// при загрузке окна сохраняем изображение

Sloy1 = new Sloy1(2, (pictureBox1.Width - 20) * (pictureBox1.Height - 20));//создаем сеть

}

//создаем переменные

Sloy1 Sloy1;

Image CleanImage;

Point OldPoint, NewPoint;

public static Image resizeImage(Image imgToResize, Size size)//процедура изменения размера изображения (изображение к изменению размера, размер нужный)

{

//сохраняются ширина и высота картинки

int sourceWidth = imgToResize.Width;

int sourceHeight = imgToResize.Height;

float nPercent = 0;

Рисунок 5 - Содержимое файла Form1.cs

float nPercentW = 0;

float nPercentH = 0;

//проценты ширины и высоты = отношение новых к старым

nPercentW = ((float)size.Width / (float)sourceWidth);

nPercentH = ((float)size.Height / (float)sourceHeight);

if (nPercentH < nPercentW)

nPercent = nPercentH;

else

nPercent = nPercentW;

//создаем целевую ширину и высоту = исходные*процент

int destWidth = (int)(sourceWidth * nPercent);

int destHeight = (int)(sourceHeight * nPercent);

//создаем новое изобр

Bitmap b = new Bitmap(destWidth, destHeight);

Graphics g = Graphics.FromImage((Image)b);

g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

//рисуем изображение

g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);

g.Dispose();

return (Image)b;

}

private void button1_Click(object sender, EventArgs e)//кнопка 1

{

openFileDialog1.InitialDirectory = "";//начальная директория

openFileDialog1.Filter = "Image files (*.bmp,*.png,*.jpg)|*.bmp;*.png;*.jpg;*.JPG;*.jpeg|All files (*.*)|*.*";//типы файлов - фильтр

openFileDialog1.FilterIndex = 1;//установка фильтра по умолчанию

openFileDialog1.FileName = "";//имя файла по умолчанию

openFileDialog1.RestoreDirectory = true;//восстановление директории

openFileDialog1.ShowDialog();//открыть диалог

}

private void openFileDialog1_FileOk(object sender, CancelEventArgs e)//кнопка ок

{

pictureBox1.BackgroundImage = new Bitmap (openFileDialog1.FileName);//фон изображения вставляется картинка

}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)//движение мыши над картинкой

{

if (e.Button == MouseButtons.Left)//если нажатата левая кнопка при движении

{

if (OldPoint == NewPoint && checkBox1.Checked)//если старая точка совпадает с новой и стоит галка движение

{

NewPoint = e.Location;//текущее положение мыши присваивается в новую точку

// Create graphics object for alteration.

Graphics newGraphics;

try

{

newGraphics = Graphics.FromImage(pictureBox1.Image);

}

Catch

{

pictureBox1.Image = pictureBox1.BackgroundImage;

newGraphics = Graphics.FromImage(pictureBox1.Image);

}

// Draw image to screen.

newGraphics.DrawImage(pictureBox1.Image, NewPoint.X - OldPoint.X, NewPoint.Y - OldPoint.Y);

pictureBox1.Refresh();

// Dispose of graphics object.

OldPoint = NewPoint;

}

pictureBox1.Refresh();

}

}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)

{

NewPoint = e.Location;

}

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Left)

{

OldPoint = e.Location;

NewPoint = e.Location;

}

}

private void checkBox1_CheckedChanged(object sender, EventArgs e)

{

DialogResult result;

if (!checkBox1.Checked)

{

result = MessageBox.Show("Сохранить изменения?", "Сдвиг", MessageBoxButtons.OKCancel);

if (result == System.Windows.Forms.DialogResult.Cancel)

{

pictureBox1.Image = CleanImage;

}

else

{

pictureBox1.BackgroundImage = pictureBox1.Image;

pictureBox1.Image = CleanImage;

}

pictureBox1.Refresh();

}

}

private void button5_Click(object sender, EventArgs e)//выполнить

{

Bitmap bmp = new Bitmap(pictureBox1.BackgroundImage);

Color Col;

double[] temp = new double[(pictureBox1.Width - 20) * (pictureBox1.Height - 20)];

for (int i = 0; i < (pictureBox1.Width - 20); i++)

{

for (int j = 0; j < (pictureBox1.Height - 20); j++)

{

Col = bmp.GetPixel(i + 10, j + 10);

temp[i * (pictureBox1.Height - 20) + j] = (Convert.ToDouble(Col.B) / 255.0);

}

}

Sloy1.Neironu[0].setInput(temp);

Sloy1.Neironu[1].setInput(temp);

Sloy1.Activate();

string st = "";

for (int i = 0; i < 2; i++)

{

st += Sloy1.Neironu[i].getOutput().ToString() + ", ";

}

MessageBox.Show(st);

}

private void button6_Click(object sender, EventArgs e)//обучение

{

Bitmap bmp = new Bitmap(pictureBox1.BackgroundImage);

Color Col;

double[] temp = new double[(pictureBox1.Width - 20) * (pictureBox1.Height - 20)];

for (int i = 0; i < (pictureBox1.Width - 20); i++)

{

for (int j = 0; j < (pictureBox1.Height - 20); j++)

{

Col = bmp.GetPixel(i + 10, j + 10);

temp[i * (pictureBox1.Height - 20) + j] = (Convert.ToDouble(Col.B) / 255.0);

}

}

Sloy1.Neironu[0].setInput(temp);

Sloy1.Neironu[1].setInput(temp);

if (radioButton1.Checked)//проверка кружочка

Sloy1.Learning(1);

else

Sloy1.Learning(2);

} } }

Содержание файла Neuron1.cs представлено на рисунке 6

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace set

{

class Neuron1

{

public int n = 1;

public double lyambda;

public double[] input;

public double[] weight;

public double output;

public Neuron1()

{

this.weight = new double[1];

this.input = new double[1];

this.lyambda = 1;

}

public Neuron1(int n)

{

this.weight = new double[n];

this.input = new double[n];

this.lyambda = 1;

this.n = n;

}

public void Activate()

{

double sum = 0;

double net = 0;

for (int i = 0; i < n; i++)

{

sum += input[i] * weight[i];

}

net = lyambda * sum;

net = net / 1000;

output = (Math.Exp(net) - Math.Exp(-net)) / (Math.Exp(net) + Math.Exp(-net));

//output = 1 / (1 + Math.Exp(-lyambda * sum))-0.5;

output = Math.Floor(output * 10000) / 10000; }

/// Получение выхода нейрона.

/// </summary>

public double getOutput()

{

return output;

}

/// <summary>

/// Установка весов

/// </summary>

/// <param name="temp"></param>

public void setWeight()

{

for (int i = 0; i < n; i++)

{

weight[i] = 0.01;

}

}

public void setInput(double[] temp)

{

for (int i = 0; i < n; i++)

{

input[i] = temp[i];

}

}

public void setInput(double temp)

{

input[0] = temp;

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace set

{

class Sloy1

{

public Neuron1[] Neironu;

int n = 1;

double so = 0.01; // скорость обучения

public Sloy1() //создание сети

{

n = 1;

Neironu = new Neuron1[n];

for (int i = 0; i < n; i++)

{

Neironu[i] = new Neuron1();

Neironu[i].setWeight(); //установка весов по умолчанию

}

}

public Sloy1(int n, int vhodi) // перегрузка функции (с входными параметрами)

{

this.n = n;

Neironu = new Neuron1[n];

for (int i = 0; i < n; i++)

{

Neironu[i] = new Neuron1(vhodi);

Neironu[i].setWeight();

}

}

public void Activate()

{

for (int i = 0; i < n; i++)

{

Neironu[i].Activate();

}

}

public void Learning(int k)//обучение к=0,1,2 - номер нейрона который должен выиграть

{

for(int i=0;i<n;i++)//обходим нейроны все

{

if (i==k-1)

{

for (int j = 0; j<Neironu[i].n;j++)

{

Neironu[i].weight[j] += so * (0.75 - Neironu[i].getOutput()) * Neironu[i].input[j];//пересчет весов

}

}

else

{

for (int j = 0; j<Neironu[i].n;j++)

{

Neironu[i].weight[j] += so * (0.25 - Neironu[i].getOutput()) * Neironu[i].input[j];

}}

}

}

//вес += скорость_обучения * разница_между_выходом_нейрона_и_его_нужным_значением * вход_сети

public double[] poluchves()// получение весов для сохранения

{

int kol = Neironu[0].n * n;

double [] tmp = new double [kol];

for (int i = 0; i < n; i++)

{

for (int j = 0; j < Neironu[i].n; j++)

{

tmp[i * n + j] = Neironu[i].weight[j];

}

}

return tmp;

}

public void ustanves(double[] tmp) // установка весов после загрузки из файла

{

int kol = Neironu[0].n * n;

for (int i = 0; i < n; i++)

{

for (int j = 0; j < Neironu[i].n; j++)

{

Neironu[i].weight[j] = tmp[i * n + j];

}

}}}}

3. Вычислительный эксперимент

Для выполнения вычислительного эксперимента запускаем скомпилированный EXE файл или запускаем программу в среде разработки Microsoft Visual Studio 2010. После запуска программы и загрузки изображения появляется окно, представленное на рисунке 8.

Рисунок 8 - Результат вычислительного эксперимента

После обучения сети и нажатия кнопки "Результат" появляется окно, представленное на рисунке 9.

Рисунок 9 - Результат вычислительного эксперимента

Первое число в окне показывает вероятность принадлежности лица на фотографии к мужскому полу(0.1668), второе - к женскому( 0.9114)

При загрузке другого изображения и обучении сети результатом являются следующие показатели: вероятность того, что на изображении мужчина = 0.8274, вероятность что это женщина = 0.3948. Результат вычислительного эксперимента приведен на рисунке 10

Рисунок 10 - Результат вычислительного эксперимента

Заключение

Разработанная программа реализовывается на универсальной ЭВМ. Для корректной работы этой программы необходимо иметь операционную систему Windows XP (SP 2-3)/Vista (SP 1)/ Windows 7. Программа разработана в среде разработки программного обеспечения Microsoft Visual Studio 2010.

В ходе выполнения курсовой работы были разработаны математический алгоритм, общая схема алгоритма программы, текст программы на языке программирования С# и вычислительные эксперименты.

В результате выполнения курсовой работы были получены навыки по работе с искусственными нейронными сетями.

Список литературы

1. Каллан, Р. Основные концепции нейронных сетей.: Пер. с англ. -М.: Издат. дом "Вильямс", 2003. - 288с.

2. Круглов В.В., Борисов В.В. Искусственные нейронные сети. Теория и практика - Изд.: Горячая Линия - Телеком, 2001 г. - 386с.

3. Хайкин С. Нейронные сети: полный курс.- Изд.: Вильямс, 2006 - 1104с.

Приложение А

Руководство оператора

Искусственные нейронные сети (ИНС) -- математические модели, а также их программные или аппаратные реализации, построенные по принципу организации и функционирования биологических нейронных сетей -- сетей нервных клеток живого организма. Используются для прогнозирования чего- либо или распознавания.

Загружаемые изображения должны быть черно-белыми, с одним расширением из списка: .bmp, .png, .jpg, .bmp, .png, .jpg, .JPG, .jpeg.

При нажатии на кнопку "Подогнать" необходимо перетащить изображение таким образом, чтобы лицо было посередине рамки.

При процессе обучения необходимо выбрать пол, к которому принадлежит лицо на фотографии, и нажать кнопку "Обучить". После загрузки нескольких изображений и обучения сети, можно загрузить фотографию и нажать кнопку "Результат". В окне появится два числа: первое число показывает вероятность принадлежности лица к мужскому полу, второе - к женскому.

Для меньшей ошибки работы сети необходимо подбирать изображения с лицом в фас, с высокой четкостью. При возможности изображения должны иметь размер 350*420.

Приложение В

Руководство программиста

private void button1_Click (object sender, EventArgs e) - функция, которая выполняется при нажатии на кнопку "Открыть".

private void button5_Click(object sender, EventArgs e) - функция, которая выполняется при нажатии на кнопку "Результат".

private void button6_Click(object sender, EventArgs e) - функция, которая выполняется при нажатии на кнопку "Обучить".

private void checkBox1_CheckedChanged(object sender, EventArgs e) - функция, которая выполняется при появлении события CheckedChanged - это событие возникает при изменении параметра Checked объекта checkBox1. Если параметр Checked установлен (checked=true; (галочка поставлена)), то можно передвигать фотографию на нужное место.

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)- функция, которая выполняется при движении мыши над картинкой.

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.