close

Вход

Забыли?

вход по аккаунту

?

Otchet ITiPZ kursovoy (2)

код для вставкиСкачать
Министерство образования и науки РФ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
"Ижевский государственный технический университет
имени М. Т. Калашникова"
Кафедра "Мехатронные системы"
Отчет по курсовой работе
Дисциплина: "Интеллектуальные технологии и представление знаний"
Тема: "Разработка искусственной нейронной сети для распознавания возраста по фотографии"
Выполнил: студент гр. 7-05-3
Курдюмова Е.С.
Проверил: ст. преподаватель
Синицын А.Н.
Ижевск 2012
Содержание
Задание3
Введение3
1. Реализация нейронной сети и ее обучение4
2. Разработка алгоритма
3. Разработка программы 8 4. Вычислительный эксперимент 9 Заключение 12 Список литературы 13 Приложение А. Текст программы 14 Задание
Разработать алгоритм и программу для распознания возраста по фотографии (дети, взрослые) с использованием нейронной сети. Введение
Данная курсовая работа состоит из трех разделов и одного приложения, на 20 страницах. В ней приведены:
- схемы алгоритмов программы;
-текст программы;
-вычислительные эксперименты.
Разработанная программа для распознания возраста по фотографии реализовывается на универсальной ЭВМ. Для корректной работы этой программы необходимо иметь операционную систему Windows XP (SP 2-3)/Vista (SP 1)/ Windows 7. Программа разработана в среде разработки программного обеспечения Microsoft Visual Studio 2010.
Целью данной работы является разработка искусственной нейронной сети. Искусственные нейронные сети (НС) - совокупность моделей биологических нейронных сетей. Представляют собой сеть элементов - искусственных нейронов - связанных между собой синоптическими соединениями. Сеть обрабатывает входную информацию и в процессе изменения своего состояния во времени формирует совокупность выходных сигналов.
Большинство моделей НС требуют обучения. В общем случае, обучение - такой выбор параметров сети, при котором сеть лучше всего справляется с поставленной проблемой.
1 Реализация нейронной сети и ее обучение
Каждый нейрон в сети состоит из взвешенного сумматора и нелинейного элемента (рисунок 1). Рисунок 1 - Формальный нейрон
Функционирование нейрона определяется формулами:
NET=∑_i▒〖w_i x_i 〗,(1)
OUT=F(NET-θ), (2)
где x_i- входные сигналы, совокупность всех входных сигналов нейрона образует вектор x;
w_i- весовые коэффициенты, совокупность весовых коэффициентов образует вектор весов w;
NET - взвешенная сумма входных сигналов, значение NET передается на нелинейный элемент;
θ - пороговый уровень данного нейрона;
F - нелинейная функция, называемая функцией активации.
Нейрон имеет несколько входных сигналов x и один выходной сигнал OUT. Параметрами нейрона, определяющими его работу, являются: вектор весов w, пороговый уровень θ и вид функции активации F.
В качестве функции активации был выбрана функция гиперболический тангенс:
OUT=th(NET)=(e^NET-e^(-NET))/(e^NET+e^(-NET) )(3).
График этой функции представлен на рисунке 2.
Рисунок 2 - График функции гиперболический тангенс
Преимуществами этой функции являются гладкость, непрерывность и симметричность относительно точки (0,0), что играет важную роль в сетях с непрерывными сигналами. Задача обучения состоит в определении выражения:
〖NET〗_jl=∑_i▒〖w_ijl x_ijl 〗, y_j=F(〖NET〗_jl-θ_jl) или y_j=F(∑_i▒〖w_ijl x_ijl 〗-θ_jl) (4)
если отбросить ненужный индекс l=1, обозначающий слой.
На вход подается один вектор xs из обучающего множества. Рассчитаем выход и сравниваем полученный выходной вектор ys с эталоном: ds . При нахождении разницы между этими значениями, вводим коррекцию для весовых коэффициентов:
∆w_ij=ε(d_j^s-y_j^s)x_ij,
где ε - небольшое положительное число, характеризующее скорость обучения. Разница между выходом и эталоном (d_j^s-y_j^s ) и умножение на текущее значение входа x_ij обеспечивают правильное направление коррекций: если y_j^s < d_j^s, то выход должен увеличиться, и вес увеличивается, если x_ij > 0, и уменьшается, если x_ij< 0. Если x_ij=0 , то вес не меняем, т.к. он не влияет на выход.
2 Разработка алгоритма
В данном разделе приведены общая схема алгоритма распознавания возраста по фотографии с использованием искусственной нейронной сети, алгоритм замены цветов на оттенки серого и алгоритм обучения нейронной сети.
Общая схема алгоритма представлена на рисунке 3.
Рисунок 3 -Общая схема алгоритма программы распознавания возраста по фотографии
Схема алгоритма замены цветов на оттенки серого представлена на рисунке 4.
Рисунок 4 -Схема алгоритма замены цветов на оттенки серого
Схема алгоритма обучения нейронной сети представлена на рисунке 5.
Рисунок 5 -Схема алгоритма обучения нейронной сети
3 Разработка программы
В соответствии со схемой алгоритма программы написана программа, которая распознает возраст (дети, взрослые) по фотографии.
Программа написана на языке программирования C#, с помощью среды разработки Microsoft Visual Studio 2010. Программа распознавания возраста по фотографии содержит класс Form1 - класс, который создается автоматически при создании приложения Windows Forms.
Класс Form 1 содержит:
конструктор Form1;
определение констант и переменных;
функции Image resizeImage, button1_Click, trackBar1_ValueChanged , button2_Click, button3_Click, pictureBox1_MouseMove, checkBox1_CheckedChanged, checkBox2_CheckedChanged, button4_Click, button5_Click, button6_Click, button7_Click , button8_Click.
public Form1() - это конструктор формы, в нем создаются переменные, которые должны быть доступны в течении всего рабочего цикла программы.
public static Image resizeImage(Image imgToResize, Size size) - функция изменения размера изображения.
private void button1_Click(object sender, EventArgs e) - функция, которая выполняется при нажатии на кнопку "Открыть". private void button2_Click(object sender, EventArgs e) - функция, которая выполняется при нажатии на кнопку "Ок". private void button3_Click(object sender, EventArgs e) - функция, которая выполняется при нажатии на кнопку "Cancel". private void button4_Click(object sender, EventArgs e) - функция, которая выполняется при нажатии на кнопку "Оттенки серого". private void button5_Click(object sender, EventArgs e) - функция, которая выполняется при нажатии на кнопку "Выполнить". private void button6_Click(object sender, EventArgs e) - функция, которая выполняется при нажатии на кнопку "Обучить". private void button7_Click(object sender, EventArgs e) - функция, которая выполняется при нажатии на кнопку "Сохранить сеть". private void button8_Click(object sender, EventArgs e) - функция, которая выполняется при нажатии на кнопку "Загрузить сеть". private void trackBar1_ValueChanged(object sender, EventArgs e) - функция, которая выполняется при изменении масштаба. private void pictureBox1_MouseMove(object sender, MouseEventArgs e)- функция, которая выполняется при движении мыши над картинкой.
private void checkBox1_CheckedChanged(object sender, EventArgs e) - функция, которая выполняется при появлении события CheckedChanged - это событие возникает при изменении параметра Checked объекта checkBox1. Если параметр Checked установлен (checked=true; (галочка поставлена)), то можно передвигать фотографию на нужное место.
private void checkBox2_CheckedChanged(object sender, EventArgs e) - функция, которая выполняется при появлении события CheckedChanged - это событие возникает при изменении параметра Checked объекта checkBox1. Если параметр Checked установлен (checked=true; (галочка поставлена)), то в окне, куда вставляется фотография, появится область считывания данных.
Описание параметров функций button1_Click, button2_Click, button3_Click, button4_Click, button5_Click, button6_Click, button7_Click, button8_Click, checkBox1_CheckedChanged, checkBox2_CheckedChanged, trackBar1_ValueChanged:
- sender - хранит объект, вызвавший событие;
- e - содержит данные, которые должны быть использованы обработчиком события, т.е. это передаваемый параметр в функцию.
Текст программы распознавания возраста (дети, взрослые) по фотографии приведен в приложении А.
4 Вычислительный эксперимент
Для выполнения вычислительного эксперимента запускаем скомпилированный EXE файл или запускаем программу в среде разработки Microsoft Visual Studio 2010. После запуска программы появляется окно, представленное на рисунке 6.
Рисунок 6 - Окно, появляющееся при запуске программы
Выбираем нужное фото, изменяем его размер, изменяем цвета на оттенки серого и устанавливаем лицо в область для считывания. После чего обучаем сеть необходимым образом. При выполнении программа выдает два числа - первое вероятность того, что на фотографии изображен ребенок, второе - вероятность того, что на фотографии взрослый.
За эталон принято значение 0,75.
Вычислительные эксперименты №1, №2, №3 и №4 программы распознавания возраста (дети, взрослые) по фотографии представлены на рисунках 7,8,9,10.
Рисунок 7 - Результат вычислительного эксперимента №1.
В вычислительном эксперименте №1 нейронная сеть выдает такой результат: с вероятностью 0,6143 на фото изображен ребенок, с вероятностью 0,2607 - взрослый. Рисунок 8 - Результат вычислительного эксперимента №2.
В вычислительном эксперименте №2 нейронная сеть выдает такой результат: с вероятностью 0,715 на фото изображен взрослый, с вероятностью 0,2416 - ребенок. Рисунок 9 - Результат вычислительного эксперимента №3.
В вычислительном эксперименте №3 нейронная сеть выдает такой результат: с вероятностью 0,7479 на фото изображен взрослый, с вероятностью 0,3323 - ребенок. Рисунок 10 - Результат вычислительного эксперимента №4.
В вычислительном эксперименте №4 нейронная сеть выдает такой результат: с вероятностью 0,7274 на фото изображен ребенок, с вероятностью 0,2476 - взрослый. Заключение
Разработанная программа распознавания возраста по фотографии реализовывается на универсальной ЭВМ. Для корректной работы этой программы необходимо иметь операционную систему Windows XP (SP 2-3)/Vista (SP 1)/ Windows 7. Программа разработана в среде разработки программного обеспечения Microsoft Visual Studio 2010.
При выполнении курсовой работы были разработаны:
общая схема алгоритма программы;
схема алгоритма обработки фотографий;
схема алгоритма обучения нейронной сети;
текст программы.
Разработанная программа работает правильно, что подтверждается результатами вычислительных экспериментов.
Список литературы
Хайкин С. Нейронные сети: полный курс.- Изд.: Вильямс, 2006 - 1104с.
В.В.Круглов, В.В.Борисов. Искусственные нейронные сети. Теория и практика - Изд.: Горячая Линия - Телеком, 2001 г. - 386с.
Приложение А. Текст программы
В данном приложении представлена программа распознавания возраста по фотографии.
На рисунке ПА.1 представлено содержание файла Form1.cs.
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;
Graphics Pattern;
public static Image resizeImage(Image imgToResize, Size size)//процедура изменения размера изображения (изображение к изменению размера, размер нужный)
{
//сохраняются ширина и высота картинки
int sourceWidth = imgToResize.Width;
int sourceHeight = imgToResize.Height;
float nPercent = 0;
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 = "";//начальная директория Рисунок ПА.1 - Содержание файла Form1.cs
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);//фон изображения вставляется картинка
trackBar1.Enabled = true;//включить бегунок изменения масштаба
}
private void trackBar1_ValueChanged(object sender, EventArgs e)//изм масштаба
{
Size size = new Size(pictureBox1.BackgroundImage.Width * trackBar1.Value / 100 ,pictureBox1.BackgroundImage.Height * trackBar1.Value / 100);//получаем новые размеры
Image tmp = pictureBox1.BackgroundImage;//копир во временный файл картинку
tmp = resizeImage(pictureBox1.BackgroundImage, size);//сохраняем поверх временной новуб картинку
pictureBox1.Image = tmp;//отрисовываем новую картинку поверх старой
pictureBox1.Refresh();//обновить
}
private void button2_Click(object sender, EventArgs e)//кнопа 2 ОК
{
pictureBox1.BackgroundImage = pictureBox1.Image;//сохр изм-ния
pictureBox1.Image = CleanImage;
pictureBox1.Refresh();
button2.Enabled = false;//откл кнопки
button3.Enabled = false;
trackBar1.Value = 100;//восстанавливаем бегунок на 100 %
}
private void button3_Click(object sender, EventArgs e)//кнопа 3 Cancel
{
pictureBox1.Image = CleanImage;
pictureBox1.Refresh();
button2.Enabled = false;
button3.Enabled = false;
trackBar1.Value = 100;
}
private void trackBar1_MouseUp(object sender, MouseEventArgs e)//наводка мыши
{
if (trackBar1.Value != 100)//при имзменении масштаба активируются кнопоньки
{
button2.Enabled = true;
button3.Enabled = true;
}
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)//движение мыши над картинкой
{
if (e.Button == MouseButtons.Left)//если нажатата левая кнопка при движении
{
if (OldPoint == NewPoint && checkBox1.Checked)//если старая точка совпадает с новой и стоит галка движение
{
NewPoint = e.Location;//текущее полож. мыши присваив. в новую точку
Graphics newGraphics;
try
{
newGraphics = Graphics.FromImage(pictureBox1.Image);
}
catch Рисунок ПА.1 - Продолжение
{
pictureBox1.Image = pictureBox1.BackgroundImage;
newGraphics = Graphics.FromImage(pictureBox1.Image);
}
newGraphics.DrawImage(pictureBox1.Image, NewPoint.X - OldPoint.X, NewPoint.Y - OldPoint.Y);
pictureBox1.Refresh();
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 checkBox2_CheckedChanged(object sender, EventArgs e)
{
Color Col = Color.FromArgb(100, 255, 200, 255);
if (checkBox2.Checked)
{
pictureBox2.Visible = true;
}
else {
pictureBox1.Image = CleanImage;
pictureBox2.Visible = false;
} pictureBox1.Refresh();
}
private void button4_Click(object sender, EventArgs e)//эпично
{
{
try
{
Рисунок ПА.1 - Продолжение
Bitmap img = new Bitmap(pictureBox1.BackgroundImage);
Color c;
for (int i = 0; i < img.Width; i++)
{
for (int j = 0; j < img.Height; j++)
{
c = img.GetPixel(i, j);
int r = 0;
r = Convert.ToInt16(c.R);
int g = 0;
g = Convert.ToInt16(c.G);
int b = 0;
b = Convert.ToInt16(c.B);
int final = Convert.ToInt16(Math.Sqrt((r * r + g * g + b * b) / 3));
r = final;
g = final;
b = final;
c = Color.FromArgb(r, g, b);
img.SetPixel(i, j, c);
}
}
pictureBox1.BackgroundImage = img;
MessageBox.Show("Теперь фотография прокачана");
}
catch (Exception ex) { MessageBox.Show(ex.Message); }
}
}
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);
}
} Рисунок ПА.1 - Продолжение
Sloy1.Neironu[0].setInput(temp);
Sloy1.Neironu[1].setInput(temp);
if (radioButton1.Checked)//проверка кружочка
Sloy1.Learning(1);
else
Sloy1.Learning(2);
}
private void button7_Click(object sender, EventArgs e)//сохр
{
BinaryWriter bWriter = new BinaryWriter(new FileStream("set.set", FileMode.Create));
double[] tmp = Sloy1.poluchves();
int kol = tmp.GetLength(0);
for (int i = 0;i<kol;i++)
{
bWriter.Write(tmp[i]);//запись
}
bWriter.Close();
}
private void button8_Click(object sender, EventArgs e)//загр
{
FileInfo fi = new FileInfo("set.set");
BinaryReader bReader = new BinaryReader(new FileStream(fi.FullName, FileMode.Open));
double[] tmp = new double[fi.Length/8];
for (int i = 0; i < fi.Length / 8; i++)
{
tmp[i] = bReader.ReadDouble();//читать
}
bReader.Close();
}
}
}
Рисунок ПА.1 - Продолжение
На рисунке ПА.2 представлено содержание файла Neuron1.cs.
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;
}
Рисунок ПА.2 - Cодержание файла Neuron1.cs
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;
}
/// Получение выхода нейрона
public double getOutput()
{
return output;
}
/// Установка весов
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;
}
}
}
Рисунок ПА.2 - Продолжение
На рисунке ПА.3 представлено содержание файла Sloy1.cs.
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(); //установка весов по умолчанию
Рисунок ПА.3 - Cодержание файла Sloy1.cs
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)//обучение {
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 - Продолжение
2
Документ
Категория
Рефераты
Просмотров
28
Размер файла
1 093 Кб
Теги
kursovoy, itipz, otchet
1/--страниц
Пожаловаться на содержимое документа