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

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    669,9 Кб
  • Опубликовано:
    2012-12-15
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

Содержание

Задание

Введение

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

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

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

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

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

Заключение

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

Приложение

Задание

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

Введение

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

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

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

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

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

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

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

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

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 передается на нелинейный элемент;


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


 


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2.       File → New → Project.

3.       Visual C# → Windows Forms Applications.

.        View→ Toolbox.

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

System;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Text;System.Windows.Forms;System.IO;set;Kurs

{partial class Form1 : Form

{Form1()

{();= pictureBox1.Image;// при загрузке окна сохраняем изображение= new Sloy1(2, (pictureBox1.Width - 20) * (pictureBox1.Height - 20));//создаем сеть

}

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

{

//сохраняются ширина и высота картинкиsourceWidth = imgToResize.Width;sourceHeight = imgToResize.Height;nPercent = 0;

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

float nPercentH = 0;

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

nPercentW = ((float)size.Width / (float)sourceWidth);= ((float)size.Height / (float)sourceHeight);(nPercentH < nPercentW)= nPercentH;

else= nPercentW;

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

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

//создаем новое изобрb = new Bitmap(destWidth, destHeight);g = Graphics.FromImage((Image)b);.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

//рисуем изображение.DrawImage(imgToResize, 0, 0, destWidth, destHeight);.Dispose();(Image)b;

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

{.InitialDirectory = "";//начальная директория.Filter = "Image files (*.bmp,*.png,*.jpg)|*.bmp;*.png;*.jpg;*.JPG;*.jpeg|All files (*.*)|*.*";//типы файлов - фильтр

openFileDialog1.FilterIndex = 1;//установка фильтра по умолчанию.FileName = "";//имя файла по умолчанию.RestoreDirectory = true;//восстановление директории.ShowDialog();//открыть диалог

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

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

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

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

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

// Create graphics object for alteration.newGraphics;

{= Graphics.FromImage(pictureBox1.Image);

}

{.Image = pictureBox1.BackgroundImage;= Graphics.FromImage(pictureBox1.Image);

}

// Draw image to screen..DrawImage(pictureBox1.Image, NewPoint.X - OldPoint.X, NewPoint.Y - OldPoint.Y);.Refresh();

// Dispose of graphics object.= NewPoint;

}.Refresh();

}

}void pictureBox1_MouseUp(object sender, MouseEventArgs e)

{= e.Location;

}void pictureBox1_MouseDown(object sender, MouseEventArgs e)

{(e.Button == MouseButtons.Left)

{= e.Location;= e.Location;

}

}void checkBox1_CheckedChanged(object sender, EventArgs e)

{result;(!checkBox1.Checked)

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

{.Image = CleanImage;

}

{.BackgroundImage = pictureBox1.Image;.Image = CleanImage;

}.Refresh();

}

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

{bmp = new Bitmap(pictureBox1.BackgroundImage);Col;[] temp = new double[(pictureBox1.Width - 20) * (pictureBox1.Height - 20)];(int i = 0; i < (pictureBox1.Width - 20); i++)

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

{

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

}

}.Neironu[0].setInput(temp);.Neironu[1].setInput(temp);.Activate();st = "";(int i = 0; i < 2; i++)

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

}.Show(st);

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

{bmp = new Bitmap(pictureBox1.BackgroundImage);Col;[] temp = new double[(pictureBox1.Width - 20) * (pictureBox1.Height - 20)];(int i = 0; i < (pictureBox1.Width - 20); i++)

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

{= bmp.GetPixel(i + 10, j + 10);[i * (pictureBox1.Height - 20) + j] = (Convert.ToDouble(Col.B) / 255.0);

}

}.Neironu[0].setInput(temp);.Neironu[1].setInput(temp);(radioButton1.Checked)//проверка кружочка.Learning(1);

else.Learning(2);

} } }

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

System;System.Collections.Generic;System.Linq;System.Text;set

{Neuron1

{int n = 1;double lyambda;double[] input;double[] weight;double output;Neuron1()

{.weight = new double[1];.input = new double[1];.lyambda = 1;

}Neuron1(int n)

{.weight = new double[n];.input = new double[n];.lyambda = 1;.n = n;

}void Activate()

{sum = 0;net = 0;(int i = 0; i < n; i++)

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

}= lyambda * sum;= net / 1000;= (Math.Exp(net) - Math.Exp(-net)) / (Math.Exp(net) + Math.Exp(-net));

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

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

/// </summary>double getOutput()

{output;

}

/// <summary>

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

/// </summary>

/// <param name="temp"></param>void setWeight()

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

{[i] = 0.01;

}

}void setInput(double[] temp)

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

{[i] = temp[i];

}

}void setInput(double temp)

{[0] = temp;

}

}

using System;System.Collections.Generic;System.Linq;System.Text;set

{Sloy1

{Neuron1[] Neironu;n = 1;

double so = 0.01; // скорость обученияSloy1() //создание сети

{= 1;= new Neuron1[n];(int i = 0; i < n; i++)

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

}

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

{.n = n;= new Neuron1[n];(int i = 0; i < n; i++)

{[i] = new Neuron1(vhodi);[i].setWeight();

}

}void Activate()

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

{[i].Activate();

}

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

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

{(i==k-1)

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

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

}

}

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

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

}}

}

}

//вес += скорость_обучения * разница_между_выходом_нейрона_и_его_нужным_значением * вход_сетиdouble[] poluchves()// получение весов для сохранения

{kol = Neironu[0].n * n;[] tmp = new double [kol];(int i = 0; i < n; i++)

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

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

}

}tmp;

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

{kol = Neironu[0].n * n;(int i = 0; i < n; i++)

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

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

}

}}}}

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

Для выполнения вычислительного эксперимента запускаем скомпилированный 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с.

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

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

Приложение А

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

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

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

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

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

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

Приложение В

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

private void button5_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)- функция, которая выполняется при движении мыши над картинкой.

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

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!