// Для определения размера диска используйте функцию DiskSize, объявленную в Sysutils.hpp. В параметрах функции диску А соответствует 1, диску В - 2, и т. д., 0 - текущий диск. Следующий код определит размер диска С в байтах.
// Для определения свободного пространства на диске используйте функцию DiskFree, объявленную в Sysutils.hpp. В параметрах функции диску А соответствует 1, диску В - 2, и т. д., 0 - текущий диск. Следующий код определит размер свободного пространства на диске С в байтах.
try
{
CreateMutex(NULL,true,"Trial");
int Res = GetLastError();
if(Res == ERROR_ALREADY_EXISTS)
{
if (Application->MessageBox("У вас уже запущена одна копия приложения \n Найдите её в системном трее, возле часов","Update AVG v 1.1",MB_OK +MB_TOPMOST+ MB_ICONWARNING)==IDOK)
{
Application->ShowMainForm=false;
Application->Terminate();
}
}
if(Res == ERROR_INVALID_HANDLE)
{
if (Application->MessageBox("Ошибка в имени mutex object","Update AVG v 1.1",MB_OK +MB_TOPMOST+ MB_ICONWARNING)==IDOK)
{
Application->Terminate();
}
}
ИЛИ
try
{
CreateMutex(NULL,true,"Trial");
int Res = GetLastError();
if(Res == ERROR_ALREADY_EXISTS)
{
if (Application->MessageBox("У вас уже запущена одна копия приложения \n Найдите её в системном трее, возле часов","Update AVG v 1.1",MB_OK +MB_TOPMOST+ MB_ICONWARNING)==IDOK)
{
Application->ShowMainForm=false;
Application->Terminate();
}
}
if(Res == ERROR_INVALID_HANDLE)
{
if (Application->MessageBox("Ошибка в имени mutex object","Update AVG v 1.1",MB_OK +MB_TOPMOST+ MB_ICONWARNING)==IDOK)
{
Application->Terminate();
}
}
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 можно использовать любые дифференцируемые функции активации, например TANSIG, LOGSIG, или PURELIN.
В качестве обучающей функции BTF можно использовать любые функции на основе алгоритма обратного распространения, например TRAINLM, TRAINBFG,TRAINRP, TRAINGD, и т.д
Следует обратить внимание, что функция 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('Исходное изображение');
Далее необходимо на изображении лица выбрать пиксели с характерным цветом, определить среднее значение их интенсивности и среднеквадратическое отклонение.
На основе знаний о значениях интенсивностей пикселей лица и их возможных вариациях проводится сегментация изображения.
%Сегментация на основе анализа цвета.
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('Исходное изображение после сегментации');
Целью сегментации было выделение лица на изображении. Однако, вполне естественно, что на изображении присутствовали и другие объекты, значения интенсивностей пикселей которых совпали с интенсивностью пикселей лица. В результате на сегментированном изображении кроме лица выделились и другие объекты. Теперь на сегментированном изображении предстоит найти изображение нужного объекта, т.е. лица. Критерии поиска могут быть разными. Это может быть площадь, форма и др. В данном примере в качестве критерия для поиска лица выберем площадь. Исходя из выбранного ранее способа сегментации, можно предположить, что лицо занимает наибольшую площадь. Поэтому выбор критерия для поиска лица на основе площади позволит удалить другие объекты, которые меньше за площадью.
%Удаление объектов, площадь которых меньше некоторой заданной величины (для удаления шума)
Здесь следует отметить, что выбранного нами критерия может быть недостаточно для достоверного определения объекта поиска, т.е. изображения лица. Такое может произойти в том случае, если на изображении присутствуют другие объекты с похожим цветом, лицо может быть в тени, быть под наклоном и т.п. Поэтому необходимо использовать также другие критерии для поиска изображения лица. Такие критерии могут базироваться на априорной информации о форме лица.
Таким образом, для повышения достоверности распознавания критерий поиска лица на изображении должен быть комплексным.
Далее проводим выделение выбранного лица, например, прямоугольником.
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);
Изображение меток
На основе анализа условий съемки и площадей отмеченных объектов определяем расположение лиц на изображении.
Конечно, для повышения достоверности определения лиц на изображении, нужно использовать также и другие критерии, которые могут базироваться на основе анализа формы изображения лица.
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;
Добавляешь на форму Edit-(сюда будешь вводить значения для поиска). ComboBox-(Поля БД для поиска). Любую кнопку (к примеру Button)
ADOTable1->Locate(ComboBox1->Text,Edit1->Text, TLocateOptions() << loCaseInsensitive);
Добавляешь на форму Edit-(сюда будешь вводить значения для поиска). ComboBox-(Поля БД для поиска). Любую кнопку (к примеру Button)
ADOTable1->Locate(ComboBox1->Text,Edit1->Text, TLocateOptions() << loCaseInsensitive);
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.CodeDom.Compiler;
using Microsoft.CSharp;
using System.IO;
namespace Compiler
{
publicpartialclass Form1 : Form
{
public Form1()
{
InitializeComponent();
}
privatevoid button1_Click(object sender, EventArgs e)
{
CSharpCodeProvider cs = new CSharpCodeProvider();
CompilerParameters param = new CompilerParameters();
//Указываем путь сборки.
param.OutputAssembly = "program.dll";
//Указываем путь к исхдному коду и компилируем.//Так же можно можно вместо "code.txt" указать массив строк.
cs.CompileAssemblyFromFile(param, "code.txt");
}
}
}
#include <iostream>
using namespace std;
int myAbs(int a){
int oldByte = (a >> 31)& 0x1;
return -a*(1+oldByte-1)-a*(oldByte-1);
}
int getMax(int a, int b) {
return (a + b + myAbs(a - b)) / 2;
}
int getMin(int a, int b) {
return (a + b - myAbs(a - b)) / 2;
}
int main() {
int arr[] = {34, 12, 24, 65, 63, 22};
int arraySize = (sizeof(arr) / sizeof(*arr));
int maxPosition = 0;
int maxElement = arr[0];
int minValue= arr[0];
for (int k = 0; k < arraySize; k++) {
for (int i = k; i < arraySize; i++) {
int newMax = getMax(maxElement, arr[i]);
minValue = getMin(minValue, arr[i]);
maxPosition =getMin((myAbs(newMax ^ maxElement) + 1) * (maxPosition + 1), (myAbs(newMax ^ arr[i]) + 1) * (i + 1)) -1;
maxElement = newMax;
}
int buf = arr[k];
arr[k] = maxElement;
arr[maxPosition] = buf;
maxElement = minValue;
}
for(int a:arr){
cout<<a<<endl;
}
return 0;
}
Ниже приведен код и небольшое описание того, как можно это осуществить.
Для того, чтобы можно было использовать обученую нейросети вне среды 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'.
The RichText widget displays text that uses multiple different styles. The text to display is described using a tree of TextSpan objects, each of which has an associated style that is used for that subtree. The text might break across multiple lines or might all be displayed on the same line depending on the layout constraints.
A paragraph of rich text.
The RichText widget displays text that uses multiple different styles. The text to display is described using a tree of TextSpan objects, each of which has an associated style that is used for that subtree. The text might break across multiple lines or might all be displayed on the same line depending on the layout constraints.
Text displayed in a RichText widget must be explicitly styled. When picking which style to use, consider using DefaultTextStyle.of the current BuildContext to provide defaults. For more details on how to style text in a RichText widget, see the documentation for TextStyle.
Consider using the Text widget to integrate with the DefaultTextStyle automatically. When all the text uses the same style, the default constructor is less verbose. The Text.rich constructor allows you to style multiple spans with the default text style while still allowing specified styles per span.
The Text widget displays a string of text with single style. The string might break across multiple lines or might all be displayed on the same line depending on the layout constraints.
The style argument is optional. When omitted, the text will use the style from the closest enclosing DefaultTextStyle. If the given style's TextStyle.inherit property is true (the default), the given style will be merged with the closest enclosing DefaultTextStyle. This merging behavior is useful, for example, to make the text bold while using the default font family and size.
Text(
'Hello, $_name! How are you?',
textAlign: TextAlign.center,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontWeight: FontWeight.bold),
)
Using the Text.rich constructor, the Text widget can display a paragraph with differently styled TextSpans. The sample that follows displays "Hello beautiful world" with different styles for each word.
In a material design application, consider using a FlatButton instead, or if that isn't appropriate, at least using an InkWell instead of GestureDetector.
An optional maximum number of lines for the text to span, wrapping if necessary. If the text exceeds the given number of lines, it will be truncated according to overflow. [...]