Разработка системы распознавания образов
Выбор типа и структуры нейронной сети. Подбор метода распознавания, структурная схема сети Хопфилда. Обучение системы распознавания образов. Особенности работы с программой, ее достоинства и недостатки. Описание интерфейса пользователя и экранных форм.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 14.11.2013 |
Размер файла | 3,0 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Курсовая работа
по дисциплине: Техническая кибернетика на транспорте
«Разработка системы распознавания образов»
ОГЛАВЛЕНИЕ
ВВЕДЕНИЕ
ПОСТАНОВКА ЗАДАЧИ
ФОРМАЛИЗАЦИЯ ЗАДАЧИ
Выбор типа и структуры нейронной сети
Выбор метода распознавания
ОБУЧЕНИЕ СИСТЕМ РАСПОЗНАВАНИЯ
РАЗРАБОТКА ПРОГРАММНО-МАТЕМАТИЧЕСКОГО ОБЕСПЕЧЕНИЯ
Описание работы с программой
Описание интерфейса пользователя, экранные формы
ЗАКЛЮЧЕНИЕ
ЛИТЕРАТУРА
ПРИЛОЖЕНИЕ
Введение
Работы по созданию интеллектуальных систем ведутся в двух направлениях. Сторонники первого направления, составляющие сегодня абсолютное большинство среди специалистов в области искусственного интеллекта, исходят из положения о том, что искусственные системы не обязаны повторять в своей структуре и функционировании структуру и протекающие в ней процессы, присущие биологическим системам. Важно лишь то, что теми или иными средствами удается добиться тех же результатов в поведении, какие характерны для человека и других биологических систем. Сторонники второго направления, считают, что на чисто информационном уровне этого не удастся сделать. Феномены человеческого поведения, его способность к обучению и адаптации, по мнению этих специалистов, есть следствие именно биологической структуры и особенностей ее функционирования.
В литературе приведены доказательства того, что для любого алгоритма существует нейронная сеть, которая его реализует. То есть нейронные сети являются универсальными вычислительными устройствами.
В процессе функционирования нейронная сеть формирует выходной сигнал Y в соответствии с входным сигналом X, реализуя некоторую функцию g: Y=g(X). Если архитектура сети задана, то вид функции g определяется значениями весов и смещений сети.
В настоящее время на рынке программного обеспечения имеется множество самых разнообразных программ для моделирования нейронных сетей. Для решения разных практических задач требуются различные модели нейронных сетей. Модель нейронной сети определяется моделями нейронов и структурой связей сети.
В зависимости от структуры связей можно выделить несколько групп нейронных сетей:
Многослойные нейронные сети. Нейроны в таких сетях делятся на группы с общим входным сигналом - слои. Различают несколько типов связей между слоями с номерами m и (m+s):
последовательные, если s=1,
прямые, если s>1,
обратные, если s<0.
Полносвязные нейронные сети. Каждый нейрон в полносвязных сетях связан со всеми остальными. На каждом такте функционирования сети на входы нейронов подается вешний входной сигнал и выходы нейронов предыдущего такта.
Нейронные сети с локальными связями. Нейроны в таких сетях располагаются в узлах прямоугольной решетки. Каждый нейрон связан с небольшим числом (4 или 8) своих топологических соседей.
Неструктурированные нейронные сети. К этой группе относятся все модели нейронных сетей, которые нельзя отнести ни к одной из предыдущих групп.
Для конкретной задачи как правило требуется разработка нейронной сети специальной конфигурации. Задача выбора конфигурации сети на данный момент почти не формализована. Выбор производится исходя из личного опыта разработчика, а также на основе проведенных экспериментов, целью которых является определение соответствия возможностей сети поставленной задаче.
Однако зачастую для несложных задач можно смело использовать простейшую нейронную сеть - персептроны.
В данной курсовой работе разработана программа для распознавания символов, основой которой и является нейронная сеть.
Постановка задачи
Распознавание образов (а часто говорят - объектов, сигналов, ситуаций, явлений или процессов) - самая распространенная задача, которую человеку приходится решать практически ежесекундно от первого до последнего дня своего существования. Для этого он использует огромные ресурсы своего мозга, которые мы оцениваем таким показателем как число нейронов, равное 1010.
С более общих позиций можно утверждать, и это вполне очевидно, что в повседневной деятельности человек постоянно сталкивается с задачами, связанными с принятием решений, обусловленных непрерывно меняющейся окружающей обстановкой. В этом процессе принимают участие: органы чувств, с помощью которых человек воспринимает информацию извне; центральная нервная система, осуществляющая отбор, переработку информации и принятие решений; двигательные органы, реализующие принятое решение. Но в основе решений этих задач лежит, в чем легко убедиться, распознавание образов.
В своей практике люди решают разнообразные задачи по классификации и распознаванию объектов, явлений и ситуаций (мгновенно узнают друг друга, с большой скоростью читают печатные и рукописные тексты, безошибочно водят автомобили в сложном потоке уличного движения, осуществляют отбраковку деталей на конвейере, разгадывают коды, древнюю египетскую клинопись и т.д.).
Формализация задачи
Выбор типа и структуры нейронной сети
Среди различных конфигураций искусственных нейронных сетей встречаются такие, при классификации которых по принципу обучения, строго говоря, не подходят ни обучение с учителем, ни обучение без учителя. В таких сетях весовые коэффициенты синапсов рассчитываются только однажды перед началом функционирования сети на основе информации об обрабатываемых данных, и все обучение сети сводится именно к этому расчету. С одной стороны, предъявление априорной информации можно расценивать, как помощь учителя, но с другой - сеть фактически просто запоминает образцы до того, как на ее вход поступают реальные данные, и не может изменять свое поведение, поэтому говорить о звене обратной связи с "миром" (учителем) не приходится. Из сетей с подобной логикой работы наиболее известны сеть Хопфилда и сеть Хэмминга, которые обычно используются для организации ассоциативной памяти.
Выбор метода распознавания
Структурная схема сети Хопфилда приведена на рис.1. Она состоит из единственного слоя нейронов, число которых является одновременно числом входов и выходов сети. Каждый нейрон связан синапсами со всеми остальными нейронами, а также имеет один входной синапс, через который осуществляется ввод сигнала. Выходные сигналы, как обычно, образуются на аксонах.
Рис. 1. Структурная схема сети Хопфилда
Задача, решаемая данной сетью в качестве ассоциативной памяти, как правило, формулируется следующим образом. Известен некоторый набор двоичных сигналов (изображений, звуковых оцифровок, прочих данных, описывающих некие объекты или характеристики процессов), которые считаются образцовыми. Сеть должна уметь из произвольного неидеального сигнала, поданного на ее вход, выделить ("вспомнить" по частичной информации) соответствующий образец (если такой есть) или "дать заключение" о том, что входные данные не соответствуют ни одному из образцов. В общем случае, любой сигнал может быть описан вектором X = {xi: i=0...n-1}, n - число нейронов в сети и размерность входных и выходных векторов. Каждый элемент xi равен либо +1, либо -1. Обозначим вектор, описывающий k-ый образец, через Xk, а его компоненты, соответственно, - xik, k=0...m-1, m - число образцов. Когда сеть распознает (или "вспомнит") какой-либо образец на основе предъявленных ей данных, ее выходы будут содержать именно его, то есть Y = Xk, где Y - вектор выходных значений сети: Y = { yi: i=0,...n-1}. В противном случае, выходной вектор не совпадет ни с одним образцовым.
Если, например, сигналы представляют собой некие изображения, то, отобразив в графическом виде данные с выхода сети, можно будет увидеть картинку, полностью совпадающую с одной из образцовых (в случае успеха) или же "вольную импровизацию" сети (в случае неудачи).
На стадии инициализации сети весовые коэффициенты синапсов устанавливаются следующим образом:
(1)
Здесь i и j - индексы, соответственно, предсинаптического и постсинаптического нейронов; xik, xjk - i-ый и j-ый элементы вектора k-ого образца.
Алгоритм функционирования сети следующий (p - номер итерации):
1. На входы сети подается неизвестный сигнал. Фактически его ввод осуществляется непосредственной установкой значений аксонов:
yi(0) = xi, i = 0...n-1, (2)
поэтому обозначение на схеме сети входных синапсов в явном виде носит чисто условный характер. Ноль в скобке справа от yi означает нулевую итерацию в цикле работы сети.
2. Рассчитывается новое состояние нейронов
, j=0...n-1 (3)
и новые значения аксонов
(4)
где f - активационная функция в виде скачка, приведенная на Рис. а.
Рис. 2. Активационные функции.
3. Проверка, изменились ли выходные значения аксонов за последнюю итерацию. Если да - переход к пункту 2, иначе (если выходы застабилизировались) - конец. При этом выходной вектор представляет собой образец, наилучшим образом сочетающийся с входными данными.
Как говорилось выше, иногда сеть не может провести распознавание и выдает на выходе несуществующий образ. Это связано с проблемой ограниченности возможностей сети. Для сети Хопфилда число запоминаемых образов m не должно превышать величины, примерно равной 0.15n. Кроме того, если два образа А и Б сильно похожи, они, возможно, будут вызывать у сети перекрестные ассоциации, то есть предъявление на входы сети вектора А приведет к появлению на ее выходах вектора Б и наоборот.
Очевидно, что все весовые коэффициенты синапсов одного слоя нейронов можно свести в матрицу W, в которой каждый элемент wij задает величину i-ой синаптической связи j-ого нейрона. Таким образом, процесс, происходящий в НС, может быть записан в матричной форме:
Y=F(XW) (5)
где X и Y - соответственно входной и выходной сигнальные векторы, F(V) - активационная функция, применяемая поэлементно к компонентам вектора V.
Теоретически число слоев и число нейронов в каждом слое может быть произвольным, однако фактически оно ограничено ресурсами компьютера или специализированной микросхемы, на которых обычно реализуется НС. Чем сложнее НС, тем масштабнее задачи, подвластные ей.
Обучение систем распознавания
нейронный сеть распознавание образ
Процесс функционирования НС, то есть сущность действий, которые она способна выполнять, зависит от величин синаптических связей, поэтому, задавшись определенной структурой НС, отвечающей какой-либо задаче, разработчик сети должен найти оптимальные значения всех переменных весовых коэффициентов (некоторые синаптические связи могут быть постоянными).
Этот этап называется обучением НС, и от того, насколько качественно он будет выполнен, зависит способность сети решать поставленные перед ней проблемы во время эксплуатации. На этапе обучения кроме параметра качества подбора весов важную роль играет время обучения. Как правило, эти два параметра связаны обратной зависимостью и их приходится выбирать на основе компромисса.
Обучение НС может вестись с учителем или без него. В первом случае сети предъявляются значения как входных, так и желательных выходных сигналов, и она по некоторому внутреннему алгоритму подстраивает веса своих синаптических связей. Во втором случае выходы НС формируются самостоятельно, а веса изменяются по алгоритму, учитывающему только входные и производные от них сигналы.
Существует великое множество различных алгоритмов обучения, которые однако делятся на два больших класса: детерминистские и стохастические. В первом из них подстройка весов представляет собой жесткую последовательность действий, во втором - она производится на основе действий, подчиняющихся некоторому случайному процессу.
Рис. 3. Единичный скачок
Из рисунка функции единичного скачка видно, что пороговое значение T, в общем случае, может принимать произвольное значение. Более того, оно должно принимать некое произвольное, неизвестное заранее значение, которое подбирается на стадии обучения вместе с весовыми коэффициентами. То же самое относится и к центральной точке сигмоидной зависимости, которая может сдвигаться вправо или влево по оси X, а также и ко всем другим активационным функциям. Это, однако, не отражено в формуле (1), которая должна была бы выглядеть так:
(6)
Дело в том, что такое смещение обычно вводится путем добавления к слою нейронов еще одного входа, возбуждающего дополнительный синапс каждого из нейронов, значение которого всегда равняется 1. Присвоим этому входу номер 0. Тогда
(7)
где w0 = -T, x0 = 1.
Обучение персептрона состоит в том, что на его вход подается образ и вычисляется выход К. Если К является правильным, то веса не меняются. Однако, если выход неправилен, то веса изменяются так, чтобы уменьшить ошибочный результат.
Это объяснение можно представить в виде следующего алгоритма обучения:
Подать образ Х на вход персептрона и вычислить, выход К.
а) Если выход Y правильный, то перейти к шагу 1.
б) Если выход Y неправильный и равен 0, то добавить все входы к соответствующим им весам;
в) Если выход К неправильный и равен 1, то вычесть вход из соответствующего ему веса.
Перейти к шагу 1.
Разработка программно-математического обеспечения
Описание работы с программой
При первом запуске выводится окно формы, в которой предлагается выбрать объект для распознавания. После выбора нужного образа следует нажать на кнопку «ОК» для того, чтобы программа приступила к процессу распознавания. После этого программа рассчитает веса входных значений и, в случае, если в памяти не нашлось похожего распределения весов, программа выдаст предупреждение, в котором предложит, согласиться либо отказаться от обучения.
В процессе обучения следует сопоставить символ с полученным распределением весов. Обучение персептрона состоит в том, что на его вход подается образ и вычисляется выход К. Если К является правильным, то веса не меняются. Однако, если выход неправилен, то веса изменяются так, чтобы уменьшить ошибочный результат.
Это объяснение можно представить в виде следующего алгоритма обучения:
Подать образ Х на вход персептрона и вычислить, выход К.
а) Если выход Y правильный, то перейти к шагу 1.
б) Если выход Y неправильный и равен 0, то добавить все входы к соответствующим им весам;
в) Если выход К неправильный и равен 1, то вычесть вход из соответствующего ему веса.
Перейти к шагу 1.
Описание интерфейса пользователя, экранные формы
Рисунок 4. Выбор образа для распознавания
Рисунок 5. Процесс распознавания
Рисунок 6. Режим обучения
Рисунок 7. Окончание процесса распознавания
Рисунок 8. Запрос на обучение
Заключение
В данной курсовой работе разработана программа для распознавания символов. Основой программы является нейронная сеть, использование которой дает программе ряд преимуществ:
гибкость;
способность обучаться;
нечувствительность к мелким погрешностям во входных данных.
К достоинствам программы можно отнести высокую скорость (за счет быстрых алгоритмов обучения нейронной сети и применяемых средств разработки), достаточную достоверность результатов, простоту в обращении.
К недостаткам программы можно отнести то, что качество распознавания зависит от объема входной информации, но так как на каждую единицу входной информации приходится по одному нейрону, то при больших объемах возникает проблема в размещении нейронов в памяти и выделении времени на их обработку.
Литература
А.И. Змитрович. Интеллектуальные информационные системы. Мн.: ТетраСистемс, 2007.
Л.Б. Емельянов-Ярославский. Интеллектуальная квазибиологическая система. Индуктивный автомат. М: Наука, 2011.
Приложение
Листинг программы
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Menus, FileCtrl, ComCtrls, RXCtrls;
type
TMainForm = class(TForm)
Image1: TImage;
Image2: TImage;
Image3: TImage;
FLB: TFileListBox;
Image4: TImage;
Image5: TImage;
PB: TProgressBar;
Timer1: TTimer;
RxLabel: TRxLabel;
EditLetter: TEdit;
procedure Image2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FLBClick(Sender: TObject);
procedure Image3Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure EditLetterKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
Type
let = record
FileN : string[255];
YesNo : boolean;
ASCIICode : string[1];
end;
Var
letter : array[1..200] of let;
f : File of let;
Flag : boolean;
Col : integer;
{$R *.DFM}
procedure TMainForm.Image2Click(Sender: TObject);
begin
MainForm.Close;
end;
procedure TMainForm.FormCreate(Sender: TObject);
Var
i : integer;
begin
FLB.Directory := 'C:\TEMP\Pictu';
AssignFile(f,'c:\temp\letter.ini');
reset(f);
i := 1;
while not EOF(f) do
begin
read(f,letter[i]);
i := i + 1;
end;
Flag := False;
RxLabel.Visible := False;
end;
procedure TMainForm.FLBClick(Sender: TObject);
begin
Image4.Picture.LoadFromFile(FLB.FileName);
Image5.Visible := False;
PB.Position := 0;
PB.Visible := False;
RxLabel.Visible := False;
end;
procedure TMainForm.Image3Click(Sender: TObject);
Var
i : integer;
begin
For i := 1 to 200 do
begin
if FLB.FileName = letter[i].FileN then
begin
Flag := True;
Col := i;
end;
end;
Timer1.Enabled := True;
PB.Visible := True;
RxLabel.Visible := True;
RxLabel.Caption := 'LфхЄ яЁюЎхёё Ёрёяючэртрэш...';
end;
procedure TMainForm.Timer1Timer(Sender: TObject);
Var
MyFile, s : string;
s1 : string[3];
i, k : integer;
a: real;
begin
PB.Position := PB.Position + 1;
if PB.Position > 99 then
begin
Timer1.Enabled := False;
MyFile := FLB.FileName;
s1 := '000';
s1[1] := MyFile[16];
s1[2] := MyFile[17];
s1[3] := MyFile[18];
if Flag then
begin
Flag := False;
MyFile[13] := 'a';
MyFile[15] := 'm';
Image5.Picture.LoadFromFile(MyFile);
Image5.Visible := True;
PB.Position := 0;
PB.Visible := False;
RxLabel.Visible := False;
s := '¦ЁюЎхёё Ёрёяючэртрэш чртхЁ°хэ єёях°эю! ¦рёяючэрэ ёшьтюы: ' + letter[Col].ASCIICode;
MessageDlg(s,mtConfirmation,[mbOK], 0);
end
else
if MessageDlg('-рээvщ юсЁрч ёшёЄхьх эхшчтхёЄхэ. ¦ЁютхёЄш яЁюЎхёё юсєўхэш ?',mtConfirmation,[mbYes, mbNo],0) = mrYes then
begin
i := 1;
Col := 1;
Flag := False;
while(letter[Col].FileN <> '') do
Col := Col + 1;
RxLabel.Visible := True;
EditLetter.Visible := True;
EditLetter.Text := '';
PB.Position := 0;
PB.Visible := False;
RxLabel.Caption := 'TтхфшЄх Ёрёяючэртрхьvщ ёшьтюы';
ActiveControl := EditLetter;
end;
end;
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
Var
i : integer;
begin
CloseFile(f);
rewrite(f);
i := 1;
while letter[i].FileN <> '' do
begin
write(f,letter[i]);
i := i + 1;
end;
CloseFile(f);
end;
procedure TMainForm.EditLetterKeyPress(Sender: TObject; var Key: Char);
Var
MyFile, s : string;
s1 : string[3];
i, k : integer;
a: real;
begin
if Key = #13 then
begin
letter[Col].FileN := FLB.FileName;
letter[Col].YesNo := True;
letter[Col].ASCIICode := EditLetter.Text;
EditLetter.Visible := False;
RxLabel.Visible := False;
MessageDlg('¦ЁюЎхёё юсєўхэш чртхЁ°хэ.',mtConfirmation,[mbOK],0);
end;
end;
end.
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, TeEngine, Series, ExtCtrls, TeeProcs, Chart;
type
TForm4 = class(TForm)
Chart1: TChart;
Series1: TLineSeries;
BitBtn1: TBitBtn;
Series2: TLineSeries;
Series3: TBarSeries;
procedure BitBtn1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form4: TForm4;
implementation
uses Unit2;
{$R *.DFM}
procedure TForm4.BitBtn1Click(Sender: TObject);
Var
mas : array[1..60] of Double;
axis : array[1..2,1..5] of integer;
i, k, s, s2 : integer;
begin
Series1.Clear;
Series2.Clear;
Series3.Clear;
for i := 1 to 60 do mas[i] := 0;
for i:=1 to 5 do
for k:=1 to 2 do axis[k][i] := 0;
for i := 1 to 2 do
for k := 1 to FrmProcess.SG1.RowCount - 1 do
begin
s := StrToInt(FrmProcess.SG1.Cells[i,k]);
axis[i][k] := s;
end;
for i := 1 to 2 do
begin
s := 1;
for s2 := 1 to 60 do mas[s2] := 0;
for k := -16 to 16 do
begin
//
if k <> (-axis[1][i]) then
begin
mas[s + round(((axis[1][1] + axis[2][1])/2))] := 3 - ln(abs(k + axis[1][i]));
s := s + 1;
end;
end;
if i = 1 then
Series1.AddArray(mas);
if i = 2 then
Series2.AddArray(mas);
end;
for s2 := 1 to 60 do mas[s2] := 0;
mas[StrToInt(frmProcess.SG2.Cells[1,1]) + 15] := 4;
mas[StrToInt(frmProcess.SG2.Cells[1,1]) + 16] := 0;
Series3.AddArray(mas);
end;
procedure TForm4.FormShow(Sender: TObject);
begin
Series1.Clear;
Series2.Clear;
Series3.Clear;
end;
end.
unit Enter;
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls;
type
TEnterSpecForm = class(TForm)
Bevel1: TBevel;
Label1: TLabel;
Label2: TLabel;
EditSpec: TEdit;
EditSpecGeneral: TEdit;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure EditSpecKeyPress(Sender: TObject; var Key: Char);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
EnterSpecForm: TEnterSpecForm;
implementation
uses SprSpec;
Var
FlagOnExitEnterSpecForm : integer;
{$R *.DFM}
procedure TEnterSpecForm.BitBtn1Click(Sender: TObject);
begin
FlagOnExitEnterSpecForm := 1;
end;
procedure TEnterSpecForm.BitBtn2Click(Sender: TObject);
begin
FlagOnExitEnterSpecForm := 0;
end;
procedure TEnterSpecForm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
if FlagOnExitEnterSpecForm = 1 then
begin
if EditSpec.Text = '' then
begin
ActiveControl := EditSpec;
CanClose := False;
end
else
if EditSpecGeneral.Text = '' then
begin
ActiveControl := EditSpecGeneral;
CanClose := False;
end
else
begin
if Caption = 'Tтюф ёяхЎшры№эюёЄш' then
SpravSpecForm.Table1.InsertRecord([EditSpec.Text, EditSpecGeneral.Text])
else
if (Caption = ')
and (FlagOnExitEnterSpecForm <> 0) then
FlagOnExitEnterSpecForm := 2;
SpravSpecForm.Table1.ApplyUpdates;
SpravSpecForm.Table1.CommitUpdates;
end;
end;
end;
procedure TEnterSpecForm.EditSpecKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
SelectNext(Sender as TWinControl, True, True);
Key := #0;
end;
end;
procedure TEnterSpecForm.FormShow(Sender: TObject);
begin
ActiveControl := EditSpec;
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, Buttons, ExtCtrls, Menus, RxGrdCpt;
type
TFrmProcess = class(TForm)
Panel1: TPanel;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
BitBtn1: TBitBtn;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
Panel2: TPanel;
SG1: TStringGrid;
StaticText1: TStaticText;
Panel3: TPanel;
StaticText2: TStaticText;
SG2: TStringGrid;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
procedure FormActivate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure N9Click(Sender: TObject);
procedure N10Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FrmProcess: TFrmProcess;
implementation
uses Unit3, Unit4;
{$R *.DFM}
procedure TFrmProcess.FormActivate(Sender: TObject);
var
n:integer;
begin
SG1.Cells[0,0]:='N\Vars';
SG2.Cells[0,1]:='Data:';
for n:=1 to SG1.RowCount-1 do SG1.Cells[0,n]:=IntToStr(n);
for n:=1 to SG1.ColCount do
begin
SG2.Cells[n,0]:='X'+IntToStr(n);
SG1.Cells[n,0]:='X'+IntToStr(n);
end;
SG1.Cells[SG1.ColCount-1,0]:='Clas';
SG2.Cells[SG1.ColCount-1,0]:='Clas';
end;
procedure TFrmProcess.BitBtn1Click(Sender: TObject);
var
n:integer;
begin
if (Edit1.Text<>'') and (Edit2.Text<>'') then
begin
SG1.ColCount:=StrToInt(Edit1.Text)+2;
SG2.ColCount:=StrToInt(Edit1.Text)+2;
SG1.RowCount:=StrToInt(Edit2.Text)+1;
for n:=1 to (SG1.RowCount-1) do
SG1.Cells[0,n]:=IntToStr(n);
for n:=1 to SG1.ColCount do
begin
SG2.Cells[n,0]:='X'+IntToStr(n);
SG1.Cells[n,0]:='X'+IntToStr(n);
end;
SG2.Cells[0,1]:='Data:';
SG1.Cells[SG1.ColCount-1,0]:='Clas';
SG2.Cells[SG1.ColCount-1,0]:='Clas';
end;
end;
procedure TFrmProcess.N3Click(Sender: TObject);
begin
N3.Default:=True;
N3.Checked:=True;
N2.Checked:=False;
N2.Default:=False;
N5.Checked:=False;
N5.Default:=False;
N6.Default:=False;
N6.Checked:=False;
N7.Default:=False;
N7.Checked:=False;
N8.Default:=False;
N8.Checked:=False;
N9.Default:=False;
N9.Checked:=False;
N10.Default:=False;
N10.Checked:=False;
end;
procedure TFrmProcess.N2Click(Sender: TObject);
begin
N3.Default:=False;
N3.Checked:=False;
N2.Checked:=True;
N2.Default:=True;
N5.Checked:=False;
N5.Default:=False;
N6.Default:=False;
N6.Checked:=False;
N7.Default:=False;
N7.Checked:=False;
N8.Default:=False;
N8.Checked:=False;
N9.Default:=False;
N9.Checked:=False;
N10.Default:=False;
N10.Checked:=False;
end;
procedure TFrmProcess.N4Click(Sender: TObject);
var
str:string;
n,m,coun:integer;
tmp_res,res:real;
begin
tmp_res:=0;
res:=60000000;
coun:=1;
for n:=1 to SG1.RowCount-1 do
begin
for m:=1 to SG1.ColCount-2 do
tmp_res:=tmp_res+(sqr(StrToInt(SG1.Cells[m,n]))-sqr(StrToInt(SG2.Cells[m,1])));
tmp_res:=sqrt(abs(tmp_res));
if (tmp_res<res) then
begin
res:=tmp_res;
coun:=n;
end;
end;
SG2.cells[SG2.ColCount-1,1]:=SG1.Cells[SG1.COlCount-1,coun];
if (frmProcess.N5.Checked) then
begin
frmAdapt.Show;
frmAdapt.Panel1.Caption:='¦ырёё ¦'+SG1.Cells[SG1.COlCount-1,coun]+' '
end;
if frmProcess.N7.Checked then
Form4.Show;
end;
procedure TFrmProcess.N5Click(Sender: TObject);
begin
N3.Default:=False;
N3.Checked:=False;
N2.Checked:=False;
N2.Default:=False;
N5.Checked:=True;
N5.Default:=True;
N6.Default:=False;
N6.Checked:=False;
N7.Default:=False;
N7.Checked:=False;
N8.Default:=False;
N8.Checked:=False;
N9.Default:=False;
N9.Checked:=False;
N10.Default:=False;
N10.Checked:=False;
end;
procedure TFrmProcess.N6Click(Sender: TObject);
begin
N3.Default:=False;
N3.Checked:=False;
N2.Checked:=False;
N2.Default:=False;
N5.Checked:=False;
N5.Default:=False;
N6.Default:=True;
N6.Checked:=True;
N7.Default:=False;
N7.Checked:=False;
N8.Default:=False;
N8.Checked:=False;
N9.Default:=False;
N9.Checked:=False;
N10.Default:=False;
N10.Checked:=False;
end;
procedure TFrmProcess.N7Click(Sender: TObject);
begin
N3.Default:=False;
N3.Checked:=False;
N2.Checked:=False;
N2.Default:=False;
N5.Checked:=False;
N5.Default:=False;
N6.Default:=False;
N6.Checked:=False;
N7.Default:=True;
N7.Checked:=True;
N8.Default:=False;
N8.Checked:=False;
N9.Default:=False;
N9.Checked:=False;
N10.Default:=False;
N10.Checked:=False;
end;
procedure TFrmProcess.N8Click(Sender: TObject);
begin
N3.Default:=False;
N3.Checked:=False;
N2.Checked:=False;
N2.Default:=False;
N5.Checked:=False;
N5.Default:=False;
N6.Default:=False;
N6.Checked:=False;
N7.Default:=False;
N7.Checked:=False;
N8.Default:=True;
N8.Checked:=True;
N9.Default:=False;
N9.Checked:=False;
N10.Default:=False;
N10.Checked:=False;
end;
procedure TFrmProcess.N9Click(Sender: TObject);
begin
N3.Default:=False;
N3.Checked:=False;
N2.Checked:=False;
N2.Default:=False;
N5.Checked:=False;
N5.Default:=False;
N6.Default:=False;
N6.Checked:=False;
N7.Default:=False;
N7.Checked:=False;
N8.Default:=False;
N8.Checked:=False;
N9.Default:=True;
N9.Checked:=True;
N10.Default:=False;
N10.Checked:=False;
end;
procedure TFrmProcess.N10Click(Sender: TObject);
Var
p1, p2, i, k : integer;
mas : array[1..20,1..20] of integer;
begin
N3.Default:=False;
N3.Checked:=False;
N2.Checked:=False;
N2.Default:=False;
N5.Checked:=False;
N5.Default:=False;
N6.Default:=False;
N6.Checked:=False;
N7.Default:=False;
N7.Checked:=False;
N8.Default:=False;
N8.Checked:=False;
N9.Default:=False;
N9.Checked:=False;
N10.Default:=True;
N10.Checked:=True;
p1 := round(random(9) + 1);
p2 := round(SG1.RowCount - 4);
MessageDlg('mtConfirmation,[mbOk],0);
for i := 1 to SG1.RowCount - 1 do
for k := 1 to SG1.ColCount - 1 do
mas[i][k] := StrToInt(SG1.Cells[k,i]);
SG1.RowCount := SG1.RowCount - p2;
for i := 1 to p2 do
begin
p1 := round(random(SG1.ColCount - 1) + 1);
for k := 1 to SG1.RowCount - 1 do
mas[p1][k] := 0;
end;
for i := 1 to 20 do
begin
if mas[i][k] <> 0 then
for k := 1 to 20 do
SG1.Cells[k,i] := IntToStr(mas[i][k]);
// round(SG1.RowCount - 2) +
end;
end;
end.
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;
type
TfrmAdapt = class(TForm)
Panel1: TPanel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmAdapt: TfrmAdapt;
implementation
uses Unit2;
{$R *.DFM}
procedure TfrmAdapt.Button1Click(Sender: TObject);
var
flag:boolean;
cor:TPoint;
n,m:integer;
coun1,coun2,xw,yw:integer;
mx,my,A,B:real;
res: array [1..2] of real;
center1,center2: array [1..2] of integer;
begin
res[2]:=66000000;
coun1:=1;
coun2:=1;
if (frmProcess.SG1.ColCount=4) then
begin
for n:=1 to frmProcess.SG1.RowCount-1 do
begin
xw:=StrToInt(frmProcess.SG1.Cells[1,n]);
yw:=StrToInt(frmProcess.SG1.Cells[2,n]);
if trim(frmProcess.SG1.Cells[frmProcess.SG1.ColCount-1,n])='1' then Canvas.Pen.color:=clRed else Canvas.Pen.color:=clGreen;
cor.x:=xw;
cor.y:=yw;
Canvas.PenPos:=cor;
Canvas.Ellipse(xw-2,yw-2,xw+2,yw+2);
end;
center1[1]:=StrToInt(frmProcess.SG1.cells[1,1]);
center1[2]:=StrToInt(frmProcess.SG1.cells[2,1]);
center2[1]:=StrToInt(frmProcess.SG1.cells[1,frmProcess.SG1.rowcount-1]);
center2[2]:=StrToInt(frmProcess.SG1.cells[2,frmProcess.SG1.rowcount-1]);
for n:=1 to frmProcess.SG1.RowCount-1 do
begin
xw:=StrToInt(frmProcess.SG1.Cells[1,n]);
yw:=StrToInt(frmProcess.SG1.Cells[2,n]);
res[1]:=sqrt(abs(((xw*xw-center1[1]*center1[1])+(yw*yw-center1[2]*center1[2]))));
res[2]:=sqrt(abs(((xw*xw-center2[1]*center2[1])+(yw*yw-center2[2]*center2[2]))));
if (res[1]<res[2]) then frmProcess.SG1.Cells[frmProcess.SG1. ColCount,n]:='1'
else frmProcess.SG1.Cells[frmProcess.SG1.ColCount,n]:='2';
end;
//
res[2]:=800000000;
for m:=1 to frmProcess.SG1.RowCount-1 do
begin
if trim(frmProcess.SG1.Cells[3,n])='1' then
begin
for n:=1 to frmProcess.SG1.RowCount-1 do
begin
if trim(frmProcess.SG1.Cells[3,n])='1' then
begin
center1[1]:=StrToInt(frmProcess.SG1.Cells[1,m]);
center1[2]:=StrToInt(frmProcess.SG1.Cells[2,m]);
xw:=StrToInt(frmProcess.SG1.Cells[1,n]);
yw:=StrToInt(frmProcess.SG1.Cells[2,n]);
res[1]:=res[1]+sqrt(abs(((xw*xw-center2[1]*center2[1])+(yw*yw-center2[2]*center2[2]))));
end;
end;
if res[1]<res[2] then begin res[2]:=res[1]; coun1:=m; end;
end;
end;
//
res[2]:=800000000;
for m:=1 to frmProcess.SG1.RowCount-1 do
begin
if trim(frmProcess.SG1.Cells[3,m])='2' then
begin
for n:=1 to frmProcess.SG1.RowCount-1 do
begin
if trim(frmProcess.SG1.Cells[3,n])='2' then
begin
center2[1]:=StrToInt(frmProcess.SG1.Cells[1,m]);
center2[2]:=StrToInt(frmProcess.SG1.Cells[2,m]);
xw:=StrToInt(frmProcess.SG1.Cells[1,n]);
yw:=StrToInt(frmProcess.SG1.Cells[2,n]);
res[1]:=res[1]+sqrt(abs(((xw*xw-center2[1]*center2[1])+(yw*yw-center2[2]*center2[2]))));
end;
end;
if res[1]<res[2] then begin res[2]:=res[1]; coun2:=m; end;
end;
end;
xw:=StrToInt(frmProcess.SG1.Cells[1,coun1]);
yw:=StrToInt(frmProcess.SG1.Cells[2,coun1]);
cor.x:=xw;
cor.y:=yw;
Canvas.Pen.Color:=clRed;
Canvas.PenPos:=cor;
Canvas.Ellipse(xw-4,yw-4,xw+4,yw+4);
xw:=StrToInt(frmProcess.SG1.Cells[1,coun2]);
yw:=StrToInt(frmProcess.SG1.Cells[2,coun2]);
cor.x:=xw;
cor.y:=yw;
Canvas.Pen.Color:=clGreen;
Canvas.PenPos:=cor;
Canvas.Ellipse(xw-4,yw-4,xw+4,yw+4);
canvas.LineTo(StrToInt(frmProcess.SG1.Cells[1,coun1]),StrToInt(frmProcess.SG1.Cells[2,coun1]));
Canvas.Pen.Color:=clBlack;
mx:= (StrToInt(frmProcess.SG1.Cells[1,coun1])+StrToInt(frmProcess.SG1. Cells[1,coun2]))/2;
my:= (StrToInt(frmProcess.SG1.Cells[2,coun1])+StrToInt(frmProcess.SG1. Cells[2,coun2]))/2;
A:=(StrToInt(frmProcess.SG1.Cells[1,coun1])-StrToInt(frmProcess.SG1. Cells[1,coun2]));
B:=(StrToInt(frmProcess.SG1.Cells[2,coun1])-StrToInt(frmProcess.SG1. Cells[2,coun2]));
xw:=StrToInt(frmProcess.SG2.Cells[1,1]);
yw:=StrToInt(frmProcess.SG2.Cells[2,1]);
cor.x:=xw;
cor.y:=yw;
Canvas.Pen.Color:=clWhite;
Canvas.PenPos:=cor;
Canvas.Ellipse(xw-5,yw-5,xw+5,yw+5);
end;
end;
end.
Размещено на Allbest.ru
Подобные документы
Описание структурной схемы искусственного нейрона. Характеристика искусственной нейронной сети как математической модели и устройств параллельных вычислений на основе микропроцессоров. Применение нейронной сети для распознавания образов и сжатия данных.
презентация [387,5 K], добавлен 11.12.2015Основные понятия теории распознавания образов и ее значение. Сущность математической теории распознавания образов. Основные задачи, возникающие при разработке систем распознавания образов. Классификация систем распознавания образов реального времени.
курсовая работа [462,2 K], добавлен 15.01.2014Понятие системы распознавания образов. Классификация систем распознавания. Разработка системы распознавания формы микрообъектов. Алгоритм для создания системы распознавания микрообъектов на кристаллограмме, особенности его реализации в программной среде.
курсовая работа [16,2 M], добавлен 21.06.2014Теоретические основы распознавания образов. Функциональная схема системы распознавания. Применение байесовских методов при решении задачи распознавания образов. Байесовская сегментация изображений. Модель TAN при решении задачи классификации образов.
дипломная работа [1019,9 K], добавлен 13.10.2017Методы распознавания образов (классификаторы): байесовский, линейный, метод потенциальных функций. Разработка программы распознавания человека по его фотографиям. Примеры работы классификаторов, экспериментальные результаты о точности работы методов.
курсовая работа [2,7 M], добавлен 15.08.2011Разработка алгоритма и программы для распознавания пола по фотографии с использованием искусственной нейронной сети. Создание алгоритмов: математического, работы с приложением, установки весов, реализации функции активации и обучения нейронной сети.
курсовая работа [1,0 M], добавлен 05.01.2013Появление технических систем автоматического распознавания. Человек как элемент или звено сложных автоматических систем. Возможности автоматических распознающих устройств. Этапы создания системы распознавания образов. Процессы измерения и кодирования.
презентация [523,7 K], добавлен 14.08.2013Обзор задач, возникающих при разработке систем распознавания образов. Обучаемые классификаторы образов. Алгоритм персептрона и его модификации. Создание программы, предназначенной для классификации образов методом наименьшей среднеквадратической ошибки.
курсовая работа [645,2 K], добавлен 05.04.2015Оптико-электронная система идентификации объектов подвижного состава железнодорожного транспорта. Автоматический комплекс распознавания автомобильных номеров. Принципы и этапы работы систем оптического распознавания. Особенности реализации алгоритмов.
дипломная работа [887,3 K], добавлен 26.11.2013Создание программного средства, осуществляющего распознавание зрительных образов на базе искусственных нейронных сетей. Методы, использующиеся для распознавания образов. Пандемониум Селфриджа. Персептрон Розенблатта. Правило формирования цепного кода.
дипломная работа [554,8 K], добавлен 06.04.2014