Skip to content

Commit

Permalink
proyecto en estado final ciber 3
Browse files Browse the repository at this point in the history
  • Loading branch information
daniel committed Nov 10, 2021
1 parent 4eaf601 commit ef116c2
Show file tree
Hide file tree
Showing 62 changed files with 1,846 additions and 270 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
2021-04-17_Image_Processing_Made_Easy_Demos/
2021-08-17_contador_rayos_logica_difusa.m
23 changes: 18 additions & 5 deletions FuzzyLogicCounter.m
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@
%% Fuzzy logic definition
warning('off')
%Fuzzy logic system call
sistema=fuzzySystemStaticConf3;
%sistema=fuzzySystemStaticConf3;
%fuzzy(sistema)
%sistema = readfis('Lightning_strike_counter_GA_optimized_4.fis');
sistema = readfis('optimizacion6Conf3.fis');

%% Get statistical data from training data
superStructure=getImagesInformation(imdsTrain);
Expand All @@ -39,7 +39,8 @@
output_fis = zeros (superStructure(j).numObj, 2);
for h=1:superStructure(j).numObj
cuadro = [superStructure(j).numObj ...
superStructure(j).imgStats(h).Area];
superStructure(j).imgStats(h).Area ...
superStructure(j).imgStats(h).Eccentricity];
Y = evalfis(cuadro, sistema);
output_fis(h) = Y;
end
Expand All @@ -57,5 +58,17 @@
YPred = comparationMatrix(:,1);
YTest = comparationMatrix(:,2);
accuracy = sum(YPred == YTest)/total
error = 1 - accuracy
mse = 1/total*sum((YPred-YTest).^2)


figure
t = [1:total];
plot(t,comparationMatrix(:,1),t,comparationMatrix(:,2))
legend('Reales', 'Simulados')
title('Comparación')
xlabel('# de imagen'); ylabel('Cantidad de rayos')

figure
plot(t, YPred - YTest)
title('Error')
xlabel('# de imagen'); ylabel('Error en cantidad de rayos')

49 changes: 0 additions & 49 deletions Lightning_strike_counter_GA_optimized_2.fis

This file was deleted.

49 changes: 0 additions & 49 deletions Lightning_strike_counter_GA_optimized_3.fis

This file was deleted.

41 changes: 0 additions & 41 deletions Lightning_strike_counter_GA_optimized_4.fis

This file was deleted.

8 changes: 4 additions & 4 deletions OptimizedCounterAG.m
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@


%% Optimización con algoritmos genéticos
% optionsga = gaoptimset('Display','iter');
optionsga = gaoptimset('PopulationSize',50,'Generations',10,'PopInitRange',...
%optionsga = gaoptimset('Display','iter');
optionsga = gaoptimset('PopulationSize',50,'Generations',20,'PopInitRange',...
[-0.5;2],'EliteCount',2,'CrossoverFraction',0.8,'PopulationType','doubleVector','TimeLimit',2000,'Display','iter');

%Opciones del algoritmo genético
X = ga(@fobj,27,optionsga)
X = ga(@fobj,33,optionsga)
%[mejor,fval,reason,output,poblacion] = ga(@fobj,33,optionsga);
%% Sistema difuso optimizado
sistema = generafisConf3(X);
sistema = generafisConf5(X);
fuzzy(sistema)
%[t,x,e] = sim('SistemaControlPR16');
%ys = x(:,2);
Expand Down
24 changes: 23 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,23 @@
# Lightning-strike-counter
# Contador de rayos
Cuenta cuantos rayos hay en imagenes de tormentas eĺetricas usando dos tipos de algoritmos, redes neuronales convolucionales y un algoritmo de lógica difusa optimizado con tecnicas de algoritmos geneticos.

## ¿Para que sirve?
Las tormentas electricas son uno de los fenomenos naturales mas devastadores que existen, cada año se pieden millones de dolares en reparar los daños que causan los rayos en las zonas donde caen, ya sea por perdida de equipos, infraestructura o mismos daños a la naturaleza que se requieren mitigar, como es el caso de los incendios forestales.

Este contador de rayos tiene como proposito ser implementado en un dispositivo IoT que capture fotos de tormentas electricas, para que sea capaz de determinar la cantidad de rayos que han caido en cierto momento, y de esta manera servir como complemento a las soluciones meteorologicas ya en uso.

## ¿Que tipo de imagenes evalua?
La entrada son imgenes binarias de 150x150 px de tamaño. Para obtener el conjunto de iomagenes se pasaron imagenes de internet por un procesamiento de imagenes que las volvía en formato binario y luego se recortaron segmentos del tamaño especificado para luego pasarlos por el algoritmo de lógica difusa o RNN.

* Conjunto de imagenes originales en la carpeta `imgOriginal`.
* Conjunto de imagenes binarias en la carpeta `imgOriginalBinary`.
* Conjunto de imagenes binarias de 150x150 px en la carpeta `imgBinary`.

## Procesamiento de imagenes
El algoritmo de procesamiento de imagenes consiste en tomar como entrada alguna de las imagenes de la carpeta `imgOriginal`, cambiarla a escala de grises, luego a binaria y pasarla por dos llenados de agujeros. El código de esto se encuentra en el archivo `generateBinaryImage.m`.

## Entrenamiento con redes neuronales convolucionales (RNC)
El el archivo `contadorRNC.m` contiene el algoritmo para el entrenamiento de una red neuronal, que tiene como capa de entrada una imagen de la carpeta `imgBinary`, luego una capa convolucional que analiza una matriz de 5x5 px. La explicación a profundidad de este algoritmo se encuentra el el poster que está en la carpeta `documentacion`.

## Alagoritmo de lógica difusa
Este consiste en obtener unas estadisticas de las imagenes de la carpeta `imgBinary` (cuyo código está en `getImagesInformation`), luego pasar esta información por un sistema de lógica difusa (que se puede ver tanto en el archivo `FuzzyLogicIndividualCounter.m`, `FuzzyLogicCounter.m`, cualquiera de los archivos `fuzzySystemSaticConfX.m`, o `generaFisConfX.m` para el caso de la optimización con algoritmo genetico). Mas información se puede encontrar en el paper escrito que se encuentra en la carpeta `documentacion`.
33 changes: 0 additions & 33 deletions ResultadosPruebaConceptoAG2.txt

This file was deleted.

2 changes: 1 addition & 1 deletion NNCounter.m → contadorRNC.m
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
clear all
clc

imgFolder = 'img';
imgFolder = 'imgBinary';
imds = imageDatastore(imgFolder,...
'IncludeSubFolders', true, 'LabelSource', 'foldernames');

Expand Down
Binary file not shown.
Binary file added documentacion/2021-04-18_prueba_concepto_gr3.pdf
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
5 changes: 3 additions & 2 deletions fobj.m
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
global sistema
global imdsTrain imdsValidation imdsTest
%Controlador difuso
sistema = generafisConf3(P);
sistema = generafisConf5(P);

%% Get statistical data from training data
superStructure=getImagesInformation(imdsTrain);
Expand All @@ -17,7 +17,8 @@
output_fis = zeros (superStructure(j).numObj, 2);
for h=1:superStructure(j).numObj
cuadro = [superStructure(j).numObj ...
superStructure(j).imgStats(h).Area];
superStructure(j).imgStats(h).Area ...
superStructure(j).imgStats(h).Eccentricity];
Y = evalfis(cuadro, sistema);
output_fis(h) = Y;
end
Expand Down
4 changes: 2 additions & 2 deletions generafis.m
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@


%Variable de entrada: Area
sistema=addvar(sistema,'input','Area', [0 1500]);
sistema=addvar(sistema,'input','Area', [0 200]);
sistema=addmf(sistema,'input',2,'pequena','gbellmf', [x(10) x(11) x(12)]);
sistema=addmf(sistema,'input',2,'media','gbellmf', [x(13) x(14) x(15)]);
sistema=addmf(sistema,'input',2,'grande','gbellmf', [x(16) x(17) x(18)]);
Expand All @@ -25,7 +25,7 @@
%plotmf(sistema,'input',3)
%}
%Variable de salida: Numero rayos
sistema=addvar(sistema,'output','numero_rayos',[0 2.5]);
sistema=addvar(sistema,'output','numero_rayos',[0 2]);
sistema=addmf(sistema,'output',1, '0 rayos','gbellmf', [x(19) x(20) x(21)]);
sistema=addmf(sistema,'output',1, '1 rayo','gbellmf', [x(22) x(23) x(24)]);
sistema=addmf(sistema,'output',1, '2 rayos','gbellmf', [x(25) x(26) x(27)]);
Expand Down
72 changes: 72 additions & 0 deletions generafisConf5.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
function CdifusoPD = generafisConf5(x)

sistema=newfis('Lightning_strike_counter');

%Variable de entrada: Número de objetos
sistema=addvar(sistema,'input','#Objetos',[0 50]);

%{
% Configuración 1
sistema=addmf(sistema,'input',1,' entre_0_y_20','gaussmf', [35.4 20]);
sistema=addmf(sistema,'input',1,' entre_20_y_100','gaussmf',[35.4 100]);
sistema=addmf(sistema,'input',1,' mas_de_100','gaussmf',[35.37 200]);
%plotmf(sistema,'input',1)
%}
% Configuración 2
sistema=addmf(sistema,'input',1, 'entre 0 y 4','gbellmf', [x(1) x(2) x(3)]);
sistema=addmf(sistema,'input',1, 'entre 4 y 12','gbellmf',[x(4) x(5) x(6)]);
sistema=addmf(sistema,'input',1, 'mas de 12','gbellmf',[x(7) x(8) x(9)]);


%Variable de entrada: Area
sistema=addvar(sistema,'input','Area', [0 1500]);
%{
% Configuración 1
sistema=addmf(sistema,'input',2,'pequena','trapmf', [-1.64e+04 -6130 2800 4915]);
sistema=addmf(sistema,'input',2,'media','gaussmf', [6677 1.534e+04]);
sistema=addmf(sistema,'input',2,'grande','trapmf', [1.312e+04 2.977e+04 5.057e+04 5.067e+04]);
%plotmf(sistema,'input',2)
%}
% Configuración 2
sistema=addmf(sistema,'input',2,'pequena','gbellmf', [x(10) x(11) x(12)]);
sistema=addmf(sistema,'input',2,'media','gbellmf', [x(13) x(14) x(15)]);
sistema=addmf(sistema,'input',2,'grande','gbellmf', [x(16) x(17) x(18)]);

%Variable de entrada: excentricidad
sistema=addvar(sistema,'input','excentricidad', [0 1]);

%{
% Configuración 1
sistema=addmf(sistema,'input',3,'no_excentrico','gaussmf', [0.289 0.261]);
sistema=addmf(sistema,'input',3,'si_excentrico','gaussmf', [0.177 0.9746]);
%plotmf(sistema,'input',3)
%}
% Configuración 2
sistema=addmf(sistema,'input',3,'no excentrico','gbellmf', [x(19) x(20) x(21)]);
sistema=addmf(sistema,'input',3,'si excentrico','gbellmf', [x(22) x(23) x(24)]);


%Variable de salida: Numero rayos
sistema=addvar(sistema,'output','numero_rayos',[0 2.5]);

%Funciones de pertenencia
sistema=addmf(sistema,'output',1, '0 rayos','gbellmf', [x(25) x(26) x(27)]);
sistema=addmf(sistema,'output',1, '1 rayo','gbellmf', [x(28) x(29) x(30)]);
sistema=addmf(sistema,'output',1, '2 rayos','gbellmf', [x(31) x(32) x(33)]);
%plotmf(sistema,'output',1)

%Reglas de inferencia
ruleList=[
1 1 1 1 1 2 % 0 rayos
1 1 2 1 1 2 % 0 rayos
2 3 2 2 1 2 % 1 rayos
3 2 2 3 1 2]; % 2 rayos

sistema = addrule(sistema,ruleList);


%fuzzy(sistema)
%Actualizando la salida de la funci�n
CdifusoPD=sistema;

end
2 changes: 1 addition & 1 deletion GenerateBinaryImage.m → generateBinaryImage.m
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
clc

%% Step 1: load image you want to transform
imgDir = 'img/30.jpg'; % route to the image folder with image name
imgDir = 'imgOriginal/30.jpg'; % route to the image folder with image name
img2c = '30-2C.png'; % new image name
I = imread(imgDir);
%imshow(I);
Expand Down
Loading

0 comments on commit ef116c2

Please sign in to comment.