Вівторок, 19.03.2024, 11:04
Гость

Мішатронік

Мобільна версія | Додати у вибране  | Мій профіль | Вихід | RSS |
Меню сайту
Категории раздела
Наше опитування
Чи працювали ви з мікроконтролером?
Всього відповідей: 5
Статистика

Онлайн всього: 1
Гостей: 1
Користувачів: 0


Главная » FAQ » Matlab


Синтаксис:

net = newff
net = newff(PR,[S1 S2...SNl],{TF1 TF2...TFNl},BTF,BLF,PF)

Описание:

net = newff создает новую сеть с использованием диалогового окна

NEWFF(PR, [S1 S2...SNl], {TF1 TF2...TFNl}, BTF, LF, PF) в качестве входных параметров использует:

  • PR - Rx2 матрица минимальных и максимальных значений строк входной матрицы с размерностью RxQ. Для получения матрицы PR можно использовать функцию minmax;
  • Si – количество нейронов в i – ом слое, N1 – количество слоев;
  • TFi - функция активации i - го слоя, по умолчанию = 'tansig';
  • BTF – обучающая функция обратного распространения, по умолчанию='trainlm';
  • BLF – алгоритм подстройки весов и смещений (обучающий алгоритм), по умолчанию = 'learngdm';
  • PF - функция оценки функционирования сети, по умолчанию = 'mse';

и возвращает однонаправленную сеть, состоящую из N слоев.

В качестве функций активации TFi можно использовать любые дифференцируемые функции активации, например TANSIGLOGSIG, или PURELIN.

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

Следует обратить внимание, что функция TRAINLM используется по умолчанию, поскольку она обеспечивает наиболее быстрое обучение. Но она требует много памяти. Поэтому, если Вы получаете сообщение "out-of-memory error”, необходимо попытаться выполнить одно из следующих действий:

(1) замедлить процедуру обучения TRAINLM, снизив требования к объему оперативной памяти путем установки параметра NET.trainParam.mem_reduc равным 2 или более (см. HELP TRAINLM )

(2) использовать функцию обучения TRAINBFG, которая работает медленнее, но требует меньше памяти, чем TRAINML.

(3) использовать функцию обучения TRAINRP, которая работает медленнее, но требует меньше памяти, чем TRAINBFG.

В качестве обучающей функции BLF можно использовать любые из алгоритмов обратного распространения. Например LEARNGD или LEARNGDM.

В качестве функции оценки функционирования сети могут быть использованы любые дифференцируемые функции, например MSE или MSEREG.

Примеры:

Имеем набор входных значений P и соответствующих им выходных эталонных значений T. Задача - создать сеть для нахождения выходных значений по входным.

P = [0 1 2 3 4 5 6 7 8 9 10];

T = [0 1 2 3 4 3 2 1 2 3 4];

Создаем двухслойную однонаправленную сеть. Диапазон входных значений от 0 до 10, первый слой состоит из 5 нейронов с функциями активации TANSIG, второй слой содержит один нейрон с функцией активации PURELIN. Для обучения используем функцию TRAINLM:

net = newff([0 10],[5 1],{'tansig','purelin'});

Моделируем сеть. Подаем на вход сети входные значения P. Получаем выходные значения Y:

Y = sim(net,P);

Строим график, демонстрирующий отклонения выходных значений Y от целевых значений T для необученной сети:

plot(P,T,P,Y,'o')

Обучаем (тренируем) сеть. Количество эпох тренировки – 50:

net.trainParam.epochs = 50;

net = train(net,P,T);

Снова моделируем (теперь уже обученную сеть):

Y = sim(net,P);

Строим график для обученной сети:

plot(P,T,P,Y,'o')

Алгоритм:

Однонаправленные нейронные сети состоят из Nl слоев, использующих весовую функцию DOTPROD, входную функцию сети NETSUM и выбранную функцию активации. Первый слой получает веса, приходящие с входа. Каждый последующий слой получает веса от предыдущего слоя. Все слои обладают смещениями. Последний слой является выходом сети. Веса и смещения каждого слоя инициализируются функцией INITNW. Адаптация выполняется с помощью функции TRAINS, которая подстраивает веса в соответствии с выбранной обучающей функцией. Тренировка сети выполнена с помощью выбранной функции. Оценка функционирования сети выполняется с помощью выбранной функции оценки.

 


 

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

Обнаружение лиц на основе цвета

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

Считаем некоторое исходное изображение в рабочее пространство Matlab.

clear;
%Считывание исходного изображения 
L=imread('im.jpg'); 
[N M s]=size(L);
L=double(L)./255;
figure, imshow(L);
title('Исходное изображение');

 

Далее необходимо на изображении лица выбрать пиксели с характерным цветом, определить среднее значение их интенсивности и среднеквадратическое отклонение.

[x,y,z]=impixel;
r=median(z(:,1)); std_r=std(z(:,1)); 
g=median(z(:,2)); std_g=std(z(:,2)); 
b=median(z(:,3)); std_b=std(z(:,3)); 

На основе знаний о значениях интенсивностей пикселей лица и их возможных вариациях проводится сегментация изображения.

%Сегментация на основе анализа цвета.
for i=1:N;
 disp(i);
 for j=1:M;
 if (abs(L(i,j,1)-r)<std_r)&(abs(L(i,j,2)-g)<std_g)&(abs(L(i,j,3)-b)«std_b);
 L1(i,j)=1;
 else
 L1(i,j)=0;
 end;
end;
end;
figure, imshow(L1);title('Исходное изображение после сегментации');

 

Целью сегментации было выделение лица на изображении. Однако, вполне естественно, что на изображении присутствовали и другие объекты, значения интенсивностей пикселей которых совпали с интенсивностью пикселей лица. В результате на сегментированном изображении кроме лица выделились и другие объекты. Теперь на сегментированном изображении предстоит найти изображение нужного объекта, т.е. лица. Критерии поиска могут быть разными. Это может быть площадь, форма и др. В данном примере в качестве критерия для поиска лица выберем площадь. Исходя из выбранного ранее способа сегментации, можно предположить, что лицо занимает наибольшую площадь. Поэтому выбор критерия для поиска лица на основе площади позволит удалить другие объекты, которые меньше за площадью.

%Удаление объектов, площадь которых меньше некоторой заданной величины (для удаления шума)

[mitka num]=bwlabel(L1,8);
feats=imfeature(mitka,'Area',8);
Areas=zeros(num);
for i=1:num;
 Areas(i)=feats(i).Area;
end;
idx=find(Areas>750);
L1=ismember(mitka,idx);
figure,imshow(L1);title('После удаления шума (небольших объектов)');

 

Удалим также и другие объекты на сегментированном изображении лица.

L1=1-L1;

[mitka num]=bwlabel(L1,8);
feats=imfeature(mitka,'Area',8);
Areas=zeros(num);
for i=1:num;
 Areas(i)=feats(i).Area;
end;
idx=find(Areas>750);
L1=ismember(mitka,idx);
L1=1-L1;
figure,imshow(L1);
title('После удаления шума (небольших объектов)');

 

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

Таким образом, для повышения достоверности распознавания критерий поиска лица на изображении должен быть комплексным.

Далее проводим выделение выбранного лица, например, прямоугольником.

MIN_i=N;MIN_j=M;MAX_i=0;MAX_j=0;
for i=1:N;
 disp(i);
 for j=1:M;
 if L1(i,j)==1; 
 if iMAX_i;
 MAX_i=i;
 end;
 if j>MAX_j;
 MAX_j=j; 
 end;
 end;
 end;
end;
 
figure, imshow(L);
line([MIN_j MAX_j],[MIN_i MIN_i]);hold on;
line([MAX_j MAX_j],[MIN_i MAX_i]);
line([MAX_j MIN_j],[MAX_i MAX_i]);
line([MIN_j MIN_j],[MIN_i MAX_i]);hold off;

 

Программа, реализующая приведенный выше метод:

%==========ОБНАРУЖЕНИЕ ЛИЦ НА ОСНОВЕ ЦВЕТА=======
clear;
%Считывание исходного изображения 
L=imread('im.jpg'); 
[N M s]=size(L);
L=double(L)./255;
figure, imshow(L);title('Исходное изображение');

%Выбор пикселей лица с характерным цветом
[x,y,z]=impixel;
r=median(z(:,1)); std_r=std(z(:,1)); 
g=median(z(:,2)); std_g=std(z(:,2)); 
b=median(z(:,3)); std_b=std(z(:,3)); 
 
%Сегментация на основе анализа цвета
for i=1:N;
 disp(i);
 for j=1:M;
 if (abs(L(i,j,1)-r)<std_r)&(abs(L(i,j,2)-g)<std_g)&(abs(L(i,j,3)-b)<std_b);
 L1(i,j)=1;
 else
 L1(i,j)=0;
 end;
end;
end;
figure, imshow(L1);title('Исходное изображение после сегментации');
 
%Удаление объектов, площадь которых меньше некоторой
 заданной величины (для удаления шума)
[mitka num]=bwlabel(L1,8);
feats=imfeature(mitka,'Area',8);
Areas=zeros(num);
for i=1:num;
 Areas(i)=feats(i).Area;
end;
idx=find(Areas>750);
L1=ismember(mitka,idx);
figure,imshow(L1);title('После удаления шума (небольших объектов)');
 
L1=1-L1;
 
[mitka num]=bwlabel(L1,8);
feats=imfeature(mitka,'Area',8);
Areas=zeros(num);
for i=1:num;
 Areas(i)=feats(i).Area;
end;
idx=find(Areas>750);
L1=ismember(mitka,idx);
L1=1-L1;
figure,imshow(L1);title('После удаления шума (небольших объектов)');
 
%STATS = regionprops(L1,'Eccentricity');
 
MIN_i=N;MIN_j=M;MAX_i=0;MAX_j=0;
for i=1:N;
 disp(i);
 for j=1:M;
 if L1(i,j)==1; 
 if iMAX_i;
 MAX_i=i;
 end;
 if j>MAX_j;
 MAX_j=j; 
 end;
 end;
 end;
end;
 
figure, imshow(L);
line([MIN_j MAX_j],[MIN_i MIN_i]);hold on;
line([MAX_j MAX_j],[MIN_i MAX_i]);
line([MAX_j MIN_j],[MAX_i MAX_i]);
line([MIN_j MIN_j],[MIN_i MAX_i]);hold off;

Если же на изображении присутствует несколько лиц одновременно, то рассмотренный выше метод необходимо модифицировать. Рассмотрим это более детально. Первые несколько шагов (считывание исходного изображения, выбор характерных пикселей, сегментация и фильтрация) аналогичны, как и в предыдущем методе, поэтому мы приведем только результаты выполнения этих операций.


Исходное изображение

 


Исходное изображение после сегментации

 


Изображение после фильтрации объектов, которые представлены пикселями со значениями равными 1.

 


Изображение после фильтрации объектов, которые представлены пикселями со значениями равными 0.

 

Далее необходимо проанализировать объекты на изображении. Сначала с помощью функции bwlabel определим общее количество объектов на изображении и отметим их.

Lmitky = bwlabel(L1,4);
figure,imshow(Lmitky);


Изображение меток

 

На основе анализа условий съемки и площадей отмеченных объектов определяем расположение лиц на изображении.

H=hist(Lmitky(:),max(max(Lmitky)));
Nomer=find(H>4000);

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

figure, imshow(L);
for r=2:length(Nomer);
 MIN_i=N;MIN_j=M;MAX_i=0;MAX_j=0; 
 for i=1:N;
 for j=1:M;
 if Lmitky(i,j)==Nomer(r);
 if iMAX_i;
 MAX_i=i;
 end;
 if j>MAX_j;
 MAX_j=j; 
 end; 
 end;
 end;
 end;
 line([MIN_j MAX_j],[MIN_i MIN_i]);hold on;
 line([MAX_j MAX_j],[MIN_i MAX_i]);
 line([MAX_j MIN_j],[MAX_i MAX_i]);
 line([MIN_j MIN_j],[MIN_i MAX_i]);hold off; 
end;


Результат

 

Приведем еще один пример, подтверждающий то, что при распознавании лиц на изображения, нужно использовать более надежные критерии распознавания, нежели просто площадь. Доказательством тому служит изображение, которое приведено внизу. Распознавание изображения лица по яркости и площади привело к тому, что кроме лиц, выделились также и руки. Как уже было отмечено выше, для недопущения таких ошибок необходимо использовать также другие критерии, например, анализировать форму.

 

Модифицированная программа для обнаружения нескольких лиц на изображении:

%==========ОБНАРУЖЕНИЕ ЛИЦ НА ОСНОВЕ ЦВЕТА=======
clear;
%Считывание исходного изображения 
L=imread('kids.bmp'); 
%L=imread('im.jpg'); 
[N M s]=size(L);
L=double(L)./255;
figure, imshow(L);title('Исходное изображение');

%Выбор пикселей лица с характерным цветом
[x,y,z]=impixel;
r=median(z(:,1)); std_r=std(z(:,1)); 
g=median(z(:,2)); std_g=std(z(:,2)); 
b=median(z(:,3)); std_b=std(z(:,3)); 
 
%Сегментация на основе анализа цвета
for i=1:N;
 disp(i);
 for j=1:M;
 if (abs(L(i,j,1)-r)<std_r)&(abs(L(i,j,2)-g)<std_g)&(abs(L(i,j,3)-b)<std_b);
 L1(i,j)=1;
 else
 L1(i,j)=0;
 end;
end;
end;
figure, imshow(L1);title('Исходное изображение после сегментации');
imwrite(L1,'Исходное изображение после сегментации.jpg');
 
%Удаление объектов, площадь которых меньше
 некоторой заданной величины (для удаления шума)
[mitka num]=bwlabel(L1,8);
feats=imfeature(mitka,'Area',8);
Areas=zeros(num);
for i=1:num;
 Areas(i)=feats(i).Area;
end;
idx=find(Areas>5750);
L1=ismember(mitka,idx);
figure,imshow(L1);title('После удаления шума (небольших объектов)');

L1=1-L1;
 
[mitka num]=bwlabel(L1,8);
feats=imfeature(mitka,'Area',8);
Areas=zeros(num);
for i=1:num;
 Areas(i)=feats(i).Area;
end;
idx=find(Areas>5750);
L1=ismember(mitka,idx);
L1=1-L1;
figure,imshow(L1);title('После удаления шума (небольших объектов)');

%STATS = regionprops(L1,'Eccentricity');
Lmitky = bwlabel(L1,4);
figure,imshow(Lmitky);
imwrite(Lmitky,'Изображение меток.jpg');
figure, imshow(L);
H=hist(Lmitky(:),max(max(Lmitky)));
Nomer=find(H>4000);
for r=2:length(Nomer);
 MIN_i=N;MIN_j=M;MAX_i=0;MAX_j=0; 
 for i=1:N;
 for j=1:M;
 if Lmitky(i,j)==Nomer(r);
 if iMAX_i;
 MAX_i=i;
 end;
 if j>MAX_j;
 MAX_j=j; 
 end; 
 end;
 end;
 end;
 line([MIN_j MAX_j],[MIN_i MIN_i]);hold on;
 line([MAX_j MAX_j],[MIN_i MAX_i]);
 line([MAX_j MIN_j],[MAX_i MAX_i]);
 line([MIN_j MIN_j],[MIN_i MAX_i]);hold off; 
end;

 


Ниже приведен код и небольшое описание того, как можно это осуществить.

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

Syntax

genFunction(net,pathname)
genFunction(___,'MatrixOnly','yes')
genFunction(___,'ShowLinks','no')

Description

 

genFunction(net,pathname) generates a complete stand-alone MATLAB® function for simulating a neural network including all settings, weight and bias values, module functions, and calculations in one file. The result is a standalone MATLAB function file. You can also use this function with MATLAB Compiler™ and MATLAB Coder™ tools.

 

genFunction(___,'MatrixOnly','yes') overrides the default cell/matrix notation and instead generates a function that uses only matrix arguments compatible with MATLAB Coder tools. For static networks, the matrix columns are interpreted as independent samples. For dynamic networks, the matrix columns are interpreted as a series of time steps. The default value is 'no'.

genFunction(___,'ShowLinks','no') disables the default behavior of displaying links to generated help and source code. The default is 'yes'.

 

Ниже приведён небольшой пример:

Для начала создадим и обучим нейросеть:

[x,t] = house_dataset;
houseNet = feedforwardnet(10);
houseNet = train(houseNet,x,t);
y = houseNet(x);

Дальше сгенерируем и протестируем MATLAB функцию. Последняя строка - это компиляция функции обученой нейросети в dll.

genFunction(houseNet,'houseFcn');
y2 = houseFcn(x);
accuracy2 = max(abs(y-y2))
mcc -W lib:libHouse -T link:lib houseFcn
  •  

Форма входа
Пошук
Друзі сайту