Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
pathImg=strcat(pathFolder,'\',char(pathFile(kko)),'\',char(pathName(kko))
,num2str(ii),').jpg') %Concateno todo para tener la dirección de las
imágenes
Iyo=imread(pathImg); %Leo la imagen de acuerdo a la dirección asignada y
la guardo en Iyo
imshow(Iyo) %Vizualizo la imagen
Iy=imfilter(Iyo,fspecial('gaussian')); %Aplico un filtro para reducir los
bordes defectuosos generados por la iluminación de la imagen
Igrises=(255-Iy(:,:,1))*1.48; %La imagen filtrada , solo utilizo la capa
roja a la cual le multiplico un factor para que varíe la intensidad menor
sea mas oscuro se vizualira. Luego restarle 255, lo que significa que
invierto la imagen
I2=im2bw(Igrises); %A la imagen en escala de grises aplico la
binarizacion, en la cual se guarda en I2
Prop=regionprops(I2); %A la imagen binarizada le aplico la función
RegionProps para obtener el área, centroide y las coordenas de los
objetos detectados
%%
%Analizo en que carpeta me encuentro, para las imagenes de la primera
%carpeta busco las áreas comprendidas entre 5000 y 30000, el área
%encontrada significa el borde de la firma. En el caso de que no
encuentre,
%para la iteracion principal y sigue a la siguiente foto.
if kko==1
encontrar=find([Prop.Area]>8000 & [Prop.Area]<30000);
if isempty(encontrar)==1
continue
end
end
%%
%Analizo en que carpeta me encuentro, para las imágenes de la segunda
%carpeta busco las áreas comprendidas entre 10000 y 20000, el área
%encontrada significa el borde de la firma. En el caso de que no
encuentre,
%para la iteracion principal y sigue a la siguiente foto.
if kko==2
encontrar=find([Prop.Area]>10000 & [Prop.Area]<20000);
if isempty(encontrar)==1
continue
end
end
%%
%Analizo en que carpeta me encuentro, para las imagenes de la tercera
%carpeta busco las areas comprendidas entre 10000 y 40000, el area
%encontrada significa elborde de la firma. En el caso de que no
encuentre,
%para la iteracion principal y sigue a la siguiente foto.
if kko==3
encontrar=find([Prop.Area]>10000 & [Prop.Area]<40000);
if isempty(encontrar)==1
continue
end
end
%%
%Analizo en que carpeta me encuentro, para las imagenes de la cuarta
%carpeta busco las areas comprendidas entre 13500 y 30000, el area
%encontrada significa elborde de la firma. En el caso de que no
encuentre,
%para la iteracion principal y sigue a la siguiente foto.
if kko==4
encontrar=find([Prop.Area]>13500 & [Prop.Area]<30000);
if isempty(encontrar)==1
continue
end
end
%%
%Analizo en que carpeta me encuentro, para las imagenes de la quinta
%carpeta busco las areas comprendidas entre 7000 y 12000, el area
%encontrada significa elborde de la firma. En el caso de que no
encuentre,
%para la iteracion principal y sigue a la siguiente foto.
if kko==5
encontrar=find([Prop.Area]>7000 & [Prop.Area]<12000);
if isempty(encontrar)==1
continue
end
end
%%
%Analizo en que carpeta me encuentro, para las imagenes de la sexta
%carpeta busco las areas comprendidas entre 8000 y 20000, el area
%encontrada significa elborde de la firma. En el caso de que no
encuentre,
%para la iteracion principal y sigue a la siguiente foto.
if kko==6
encontrar=find([Prop.Area]>8000 & [Prop.Area]<20000);
if isempty(encontrar)==1
continue
end
end
%%
if(J(r,c)==1)
% calcular B %%
B = P(2)+P(3)+P(4)+P(5)+P(6)+P(7)+P(8)+P(9);
% calcular A %%
A=0;
if ( P(2)==0 & P(3)==1 )A=A+1; end
if ( P(3)==0 & P(4)==1 )A=A+1; end
if ( P(4)==0 & P(5)==1 )A=A+1; end
if ( P(5)==0 & P(6)==1 )A=A+1; end
if ( P(6)==0 & P(7)==1 )A=A+1; end
if ( P(7)==0 & P(8)==1 )A=A+1; end
if ( P(8)==0 & P(9)==1 )A=A+1; end
if ( P(9)==0 & P(2)==1 )A=A+1; end
CHANGE=CHANGE+1;
end
end
end
end
% SEGUNDA SUB-ITERACIÓN %%Modbus over serial line - RTU Slave Arduino
Sketch
J=K;
for r=2:H-1 %% fila
for c=2:W-1 %% columna
if(J(r,c)==1)
%% encontrar los 8 vecinos del pixel %%
P(9) = J(r-1,c-1); P(2) = J(r-1,c); P(3) = J(r-1,c+1);
P(8) = J(r,c-1); P(4) = J(r,c+1);
P(7) = J(r+1,c-1); P(6) = J(r+1,c); P(5) = J(r+1,c+1);
%% calcular B %%
B = P(2)+P(3)+P(4)+P(5)+P(6)+P(7)+P(8)+P(9);
%% calcular A %%
A=0;
if ( P(2)==0 & P(3)==1 )A=A+1; end
if ( P(3)==0 & P(4)==1 )A=A+1; end
if ( P(4)==0 & P(5)==1 )A=A+1; end
if ( P(5)==0 & P(6)==1 )A=A+1; end
if ( P(6)==0 & P(7)==1 )A=A+1; end
if ( P(7)==0 & P(8)==1 )A=A+1; end
if ( P(8)==0 & P(9)==1 )A=A+1; end
if ( P(9)==0 & P(2)==1 )A=A+1; end
J=K;
end %% FIN LOOP PRInciPAL
%AQUI TERMINA EL PROCESO DE ESQUELETIZACION: QUE COSNTA BASICAMENTE EN
%IDENTIFICAR LOS BORDES DE LA FIRMA USANDO LOS PIXELES VECINOS Y LA
MASCARA DE ENFOQUE %
%%
%INICIO DE PROCESO DE UBICACION DE LOS PUNTOS DE TERMINACION
%Bordes
figure(3),imshow(J) %VIZUALISO LA IMAGEN ESQUELETIZADA
isi=double(J)./double(max(J(:))); %A MI IMAGEN ESQUELETIZADA LE DIBIDO
CADA VALOR MAXIMO EN CADA PIXEL
kernel=[1 1 1;1 1 1; 1 1 1]; %SE CREA UNA MASCARA CON ESAS
CARACTERISTICAS , LAS CUALES SE EVALUARA 3X3 PIXELES
conv_imag=conv2(isi,kernel,'same'); %AGRUPARE EN UNA MATRIZ LOS VALORES
DE MI MASCARA Y EL RESULTADO DE isi
conv_imag2=conv_imag.*isi; %A DICHA MATRIZ LE MULTIPLICO EL VALOR DE isi
[y x]=find(conv_imag2==2); % BUSCO LOS VALORES QUE SEAN 2 Y LAS ASIGNO EN
[X Y], QUE SON LAS COORDENADAS DONDE SE ENCUENTRA MI PUNTO DE TERMINACION
coordenadas=cat(1,[x y]); %CONCATENO LAS COORDENADAS EN FILAS
numberPoints=length(x); %ATRAVEZ DE LA FUNCION LENGTH OBTENGO CUANTOS
PUNTOS SE HAN ENCONTRADO
%%
%ETAPA DE GRAFICACION DE LOS PUNTOS DE TERMINACION
for m=1:size(coordenadas,1) % DESDE 1 HASTA LA CANTIDAD DE PUNTOS QUE HA
ENCONTRADO
hold on
plot(coordenadas(m,1),coordenadas(m,2),'b*') %PLOTEO(DIBUJO) CADA
PUNTO, LLAMANDO A CADA COORDENADA Y LE ASIGNO UN COLOR AZUL
end
%%
%ETAPA DE PROCESO DE UBICACION DE LOS PUNTOS DE INTERSECCION
%Interseccion
isi1=double(J)./double(max(J(:))); %A MI IMAGEN ESQUELETIZADA LE DIBIDO
CADA VALOR MAXIMO EN CADA PIXEL
kernel=[1 1 1;1 1 1; 1 1 1]; %SE CREA UNA MASCARA CON ESAS
CARACTERISTICAS , LAS CUALES SE EVALUARA 3X3 PIXELES
conv_imag=conv2(isi1,kernel,'same'); %AGRUPARE EN UNA MATRIZ LOS VALORES
DE MI MASCARA Y EL RESULTADO DE isi1
conv_imag2=conv_imag.*isi1; %A DICHA MATRIZ LE MULTIPLICO EL VALOR DE
isi1
[y1 x1]=find(conv_imag2>4); % BUSCO LOS VALORES QUE SEAN MAYORES A 4 Y
LAS ASIGNO EN [X Y], QUE SON LAS COORDENADAS DONDE SE ENCUENTRA MI PUNTO
DE TERMINACION
coordenadas1=cat(1,[x1 y1]); %CONCATENO LAS COORDENADAS EN FILAS
numberPoints1=length(x1); %ATRAVEZ DE LA FUNCION LENGTH OBTENGO CUANTOS
PUNTOS SE HAN ENCONTRADO
%%
%ETAPA DE VIZUALISACION DE LOS PUNTOS DE INTERSECCION
for m=1:size(coordenadas1,1) % DESDE 1 HASTA LA CANTIDAD DE PUNTOS QUE HA
ENCONTRADO
hold on
plot(coordenadas1(m,1),coordenadas1(m,2),'rO')%PLOTEO(DIBUJO) CADA
PUNTO, LLAMANDO A CADA COORDENADA Y LE ASIGNO UN COLOR ROJO
end
[cA cH cV cD]=dwt2(I,'db2'); %APLICO LA FUNCION DE DOUSSCHEVIZZ(COMO SE
ESCRIBA), LA CUAL ME ENTREGA VALORES HORIZONTALES,VERTICALES Y LA
APROXIMACION EN PUNTOS A LA FIRMA
%%
%VIZUALIZO LOS VALORES ENTREGADOS POR LA FUNCION DE DOUSSCHEVIZZ
figure(4)
subplot(2,2,1);imshow(cA)
subplot(2,2,2);imshow(cH)
subplot(2,2,3);imshow(cV)
subplot(2,2,4);imshow(cD)
%%
%GUARDO LOS PUNTOS ENCONTRADOS EN MI VECTOR CARACTERIZTICA
Xcarac1=[Xcarac1 numberPoints];
Xcarac2=[Xcarac2 numberPoints1];
save('Caracteristicas.mat','Xcarac1','Xcarac2') %GUARDO MIS DATOS EN
CARACTERISTICAS.MAT
%%
%ASIGNACION DE LOS Fd A CADA CLASE
if kko==1 %PARA LA PRIMERA CARPETA LE ASIGNO QUE ES FALSA
Fd=0;
Carpeta1=[Carpeta1 Fd];
end
if kko==2 %PARA LA PRIMERA CARPETA LE ASIGNO QUE ES VERDADERA
Fd=1;
Carpeta2=[Carpeta2 Fd];
end
if kko==3 %PARA LA PRIMERA CARPETA LE ASIGNO QUE ES FALSA
Fd=0
Carpeta3=[Carpeta3 Fd]
end
if kko==4 %PARA LA PRIMERA CARPETA LE ASIGNO QUE ES VERDADERA
Fd=1;
Carpeta4=[Carpeta4 Fd];
end
if kko==5 %PARA LA PRIMERA CARPETA LE ASIGNO QUE ES VERDADERA
Fd=1;
Carpeta5=[Carpeta5 Fd];
end
if kko==6 %PARA LA PRIMERA CARPETA LE ASIGNO QUE ES FALSA
Fd=0;
Carpeta6=[Carpeta6 Fd];
end
end
end
save('Caracteristicas.mat','Xcarac1','Xcarac2')
Clasificar patrones con una red neuronal superficial
Además del ajuste de funciones, las redes neuronales también son buenas para reconocer
patrones.
Por ejemplo, suponga que desea clasificar un tumor como benigno o maligno, en función de la
uniformidad del tamaño de la célula, el grosor del grupo, la mitosis, etc. Tiene 699 casos de los
cuales tiene 9 datos y la clasificación correcta como benigno o maligno. .
Al igual que con el ajuste de funciones, hay dos formas de resolver este problema:
Use la nprtoolGUI, como se describe en Uso de la aplicación de reconocimiento de patrones de
red neuronal .
Use una solución de línea de comandos, como se describe en Uso de funciones de línea de
comandos .
En general, es mejor comenzar con la GUI y luego usar la GUI para generar automáticamente los
guiones de la línea de comandos. Antes de usar cualquiera de los métodos, el primer paso es
definir el problema seleccionando un conjunto de datos. La siguiente sección describe el formato
de los datos.
Definiendo un problema
A defina un problema de reconocimiento de patrones, organice un conjunto de vectores de
entrada Q como columnas en una matriz. Luego, organice otro conjunto de vectores
objetivo Q para que indiquen las clases a las que están asignados los vectores de entrada
(consulte “Estructuras de datos” para obtener una descripción detallada del formato de
datos para datos estáticos y de series de tiempo).
Cuando solo hay dos clases; establece cada valor objetivo escalar en 0 o 1, indicando a qué
clase pertenece la entrada correspondiente. Por ejemplo, puede definir el problema de
clasificación exclusiva o de dos clases de la siguiente manera:
entradas = [0 1 0 1; 0 0 1 1];
objetivos = [1 0 0 1; 0 1 1 0];
Cuando las entradas se clasifican en N clases diferentes, los vectores objetivo tienen N
elementos. Para cada vector objetivo, un elemento es 1 y los otros son 0. Por ejemplo, las
siguientes líneas muestran cómo definir un problema de clasificación que divide las
esquinas de un cubo de 5 por 5 por 5 en tres clases:
El origen (el primer vector de entrada) en una clase
La esquina más alejada del origen (el último vector de entrada) en una segunda clase
Todos los demás puntos en una tercera clase.
entradas = [0 0 0 0 5 5 5 5; 0 0 5 5 0 0 5 5; 0 5 0 5 0 5 0 5];
objetivos = [1 0 0 0 0 0 0 0; 0 1 1 1 1 1 1 0; 0 0 0 0 0 0 0 1];
Los problemas de clasificación que involucran solo dos clases se pueden representar usando
cualquiera de los dos formatos. Los objetivos pueden consistir en elementos escalares 1/0 o
vectores de dos elementos, con un elemento que es 1 y el otro elemento que es 0.
La siguiente sección muestra cómo entrenar una red para reconocer patrones, mediante la
aplicación de reconocimiento de patrones neuronales red nprtool. Este ejemplo utiliza el
conjunto de datos de cáncer provisto con la caja de herramientas. Este conjunto de datos
consta de 699 vectores de entrada de nueve elementos y vectores de destino de dos
elementos. Hay dos elementos en cada vector objetivo, porque hay dos categorías (benignas
o malignas) asociadas con cada vector de entrada.
Uso de la aplicación de reconocimiento de patrones de red neuronal
1. Si es necesario, abra la GUI de inicio de red neuronal con este comando:
2. nnstart
Los conjuntos de datos de validación y prueba se configuran cada uno al 15% de los
datos originales. Con estos ajustes, los vectores de entrada y los vectores de destino se
dividirán aleatoriamente en tres conjuntos de la siguiente manera:
o El 70% se utiliza para la formación.
o El 15% se usa para validar que la red se está generalizando y para detener el
entrenamiento antes del sobreajuste.
o El último 15% se utiliza como una prueba completamente independiente de la
generalización de la red.
(Consulte “Dividir los datos” para obtener más información sobre el proceso de división
de datos).
8. Haga clic en siguiente .
La red estándar que se utiliza para el reconocimiento de patrones es una red de avance
de dos capas, con una función de transferencia sigmoide en la capa oculta y una función
de transferencia de softmax en la capa de salida. El número predeterminado de neuronas
ocultas se establece en 10. Es posible que desee volver y aumentar este número si la red
no funciona tan bien como espera. El número de neuronas de salida se establece en 2,
que es igual al número de elementos en el vector objetivo (el número de categorías).
9. Haga clic en siguiente .
10. Haga clic en Tren .
La formación continúa durante 55 iteraciones.
11. En el panel Gráficos , haga clic en Confusión en la aplicación Reconocimiento de
patrones de red neuronal.
La siguiente figura muestra la confusión.matrices para entrenamiento, pruebas y
validación, y los tres tipos de datos combinados. Las salidas de la red son muy precisas,
como se puede ver por el alto número de respuestas correctas en los cuadrados verdes y
el bajo número de respuestas incorrectas en los cuadrados rojos. Los cuadrados azules
de la parte inferior derecha ilustran las precisiones generales.
12. Trazar la característica de operación del receptor (ROC) curva. En el panel Gráficos ,
haga clic en Características de operación del receptor en la aplicación
Reconocimiento de patrones de red neuronal.
Las líneas coloreadas en cada eje representan las curvas ROC. La curva ROC es un
gráfico de la tasa positiva verdadera (sensibilidad) versus la tasa positiva falsa
(especificidad 1) a medida que se varía el umbral. Una prueba perfecta mostraría puntos
en la esquina superior izquierda, con 100% de sensibilidad y 100% de
especificidad. Para este problema, la red funciona muy bien.
13. En la aplicación Reconocimiento de patrones de red neuronal, haga clic
en Siguiente para evaluar la red.
En este punto, puede probar la red con nuevos datos.
Si no está satisfecho con el rendimiento de la red en los datos originales o nuevos,
puede entrenarlos nuevamente, aumentar el número de neuronas o quizás obtener un
conjunto de datos de entrenamiento más amplio. Si el rendimiento en el conjunto de
entrenamiento es bueno, pero el rendimiento del conjunto de pruebas es
significativamente peor, lo que podría indicar un exceso de ajuste, la reducción del
número de neuronas puede mejorar sus resultados.
14. Cuando esté satisfecho con el rendimiento de la red, haga clic en Siguiente .
Use este panel para generar una función MATLAB o un diagrama de Simulink para
simular su red neuronal. Puede usar el código o diagrama generado para comprender
mejor cómo su red neuronal calcula las salidas de las entradas o implementa la red con
las herramientas del compilador MATLAB y otras herramientas de generación de
código MATLAB.
15. Haga clic en siguiente . Use los botones en esta pantalla para guardar sus resultados.
o Puede hacer clic en Simple Script o Advanced Script para crear
un código MATLAB ® que se puede usar para reproducir todos los pasos anteriores
desde la línea de comandos. La creación de código MATLAB puede ser útil si desea
aprender a usar la funcionalidad de línea de comandos de la caja de herramientas para
personalizar el proceso de capacitación. Al utilizar las funciones de la línea de
comandos , investigará los scripts generados con más detalle.
o También puede guardar la red como neten el área de trabajo. Puede realizar pruebas
adicionales en él o ponerlo a trabajar en nuevas entradas.
16. Cuando haya guardado los resultados, haga clic en Finalizar .
Uso de funciones de línea de comandos
La forma más sencilla de aprender a usar la funcionalidad de línea de comandos de la caja
de herramientas es generar scripts desde las GUI y luego modificarlos para personalizar la
capacitación de la red. Por ejemplo, mire la secuencia de comandos simple que se creó en el
paso 14 de la sección anterior.
% Resolver un problema Reconocimiento de Patrones con una red neuronal
% Script generado por NPRTOOL
%
% Este script asume estas variables se definen:
%
% cancerInputs - datos de entrada.
% cancerTargets - datos objetivo.
entradas = entradas de cáncer;
objetivos = cancerTargets; % Crear una red de reconocimiento de patrones
hiddenLayerSize = 10;
net = patternnet (hiddenLayerSize); % Configurar la División de Datos para
Entrenamiento, Validación, Pruebas
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100; % Train the Network
[net, tr] = train (red, entradas, objetivos); % De prueba de la red
Puede guardar el script y luego ejecutarlo desde la línea de comandos para reproducir los
resultados de la sesión GUI anterior. También puede editar el script para personalizar el
proceso de capacitación. En este caso, siga cada paso del guión.
1. El script asume que los vectores de entrada y los vectores de destino ya están cargados
en el espacio de trabajo. Si los datos no están cargados, puede cargarlos de la siguiente
manera:
2. [entradas, objetivos] = cancer_dataset;
Nota
Con estos ajustes, los vectores de entrada y los vectores objetivo se dividirán
aleatoriamente, con un 70% utilizado para entrenamiento, un 15% para validación y un
15% para prueba.
(Consulte “Dividir los datos” para obtener más información sobre el proceso de división
de datos).
8. Entrena la red. La red de reconocimiento de patrones utiliza
el trainscgalgoritmo predeterminado de Gradiente de conjugado escalado ( ) para la
capacitación. Para entrenar la red, ingrese este comando:
9. [net, tr] = tren (net, entradas, objetivos);
0.0257