Advertisement
11eimilia11

functiONs

Feb 25th, 2019
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.45 KB | None | 0 0
  1. import pandas as pd
  2. from numpy import ndarray
  3. from sklearn import preprocessing
  4. from sklearn.neighbors import KNeighborsClassifier
  5. from scipy import stats
  6. from sklearn.naive_bayes import GaussianNB
  7. import statistics
  8. from sklearn.metrics import pairwise_distances_argmin_min
  9. import numpy as np
  10. from random import randint
  11. import matplotlib.pyplot as plt
  12. import cv2
  13. import glob
  14. import math
  15. import os
  16. import random
  17.  
  18.  
  19. '''
  20.  
  21. Funções para pré-processamento dos dados
  22.  
  23. '''
  24. # Carregando fotos da pasta
  25. def loadFiles(path, array):
  26.  
  27.     for i in glob.glob(path):
  28.  
  29.         img = cv2.imread(i)
  30.         array.append(img)
  31.  
  32.     return array
  33.  
  34. # Função que faz o filtro cinza nas fotos
  35. def grayConversion(arrayphotos):
  36.  
  37.     size = len(arrayphotos)
  38.     for x in range (0,size):
  39.         arrayphotos[x] = cv2.cvtColor(arrayphotos[x], cv2.COLOR_BGR2GRAY)
  40.  
  41.     return arrayphotos
  42.  
  43. # Função que aplic o filtro blur nas fotos do array
  44. def blurConversion(arrayphotos ,val1, val2):
  45.  
  46.     for x in range(len(arrayphotos)):
  47.         arrayphotos[x] = cv2.GaussianBlur(arrayphotos[x],(val1,val1), val2)
  48.  
  49.     return arrayphotos
  50.  
  51. #Função que faz a binarização das fotos
  52. def binaryConversion(arrayphotos,threshold,val1):
  53.  
  54.     for x in range(len(arrayphotos)):
  55.         arrayphotos[x] = cv2.adaptiveThreshold(arrayphotos[x],threshold,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,val1,10)
  56.  
  57.     return arrayphotos
  58.  
  59. #Função que inverte as fotos binárias
  60. def invertConversion(arrayphotos):
  61.  
  62.     for x in range(len(arrayphotos)):
  63.         arrayphotos[x] = cv2.bitwise_not(arrayphotos[x])
  64.  
  65.     return arrayphotos
  66.  
  67.  
  68. # função de normalização dos dados usando o modelo de
  69. # normalização por reescala
  70.  
  71. def normalizar(dados):
  72.     x = dados.values
  73.     min_max_scaler = preprocessing.MinMaxScaler()
  74.     x_scaled = min_max_scaler.fit_transform(x)
  75.     dados_norm = pd.DataFrame(x_scaled)
  76.     return dados_norm
  77.  
  78.  
  79.  
  80. def extratorCaracteristicas(arrayimgs):
  81.  
  82.     squarescarac = []
  83.  
  84.  
  85.     for x in arrayimgs:
  86.  
  87.         aux = []
  88.  
  89.         im2, countours, hierachy = cv2.findContours(x, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  90.  
  91.         if len(countours) == 0:
  92.  
  93.             for b in range(0,45):
  94.  
  95.                 aux.append(0)
  96.  
  97.         elif len(countours) > 0:
  98.  
  99.             momentum = cv2.moments(x)
  100.             momentum = list(dict.values(momentum))  # momentos
  101.             for i in momentum:
  102.                 aux.append(i)
  103.  
  104.             moments = cv2.HuMoments(momentum, True).flatten()  # Hu moments
  105.  
  106.             for i in moments:
  107.                 aux.append(i)
  108.  
  109.             area = cv2.contourArea(countours[0])  # area
  110.             aux.append(area)
  111.  
  112.             peri = cv2.arcLength(countours[0], True)  # perimetro
  113.             aux.append(peri)
  114.  
  115.             if peri > 0:
  116.                 compactness = (4 * math.pi * area) / (peri ** 2)  # compacidade
  117.                 aux.append(compactness)
  118.             elif peri == 0:
  119.                 aux.append(0)
  120.  
  121.             aproxx = cv2.approxPolyDP(countours[0], 0.04 * peri, True)  # vertices
  122.             vertc = len(aproxx)
  123.             aux.append(vertc)
  124.  
  125.             histogram = get_histogram(aproxx)  # Histograma da Frequencia de angulos
  126.  
  127.             for h in histogram:
  128.                 aux.append(h)
  129.  
  130.         squarescarac.append(aux)
  131.  
  132.  
  133.     return squarescarac
  134.  
  135.  
  136. def resizeImages(images,width,height):
  137.  
  138.     i = len(images)
  139.     for x in range(0,i):
  140.  
  141.         images[x] = cv2.resize(images[x],(width,height))
  142.  
  143.     return images
  144.  
  145.  
  146. def get_angle(p0, p1, p2):
  147.  
  148.     v0 = np.array(p0) - np.array(p1)
  149.     v1 = np.array(p2) - np.array(p1)
  150.  
  151.     angle = np.math.atan2(np.linalg.det([v0, v1]), np.dot(v0, v1))
  152.     return np.degrees(angle)
  153.  
  154.  
  155. def get_histogram(aproxx):
  156.     zero = []
  157.     zero.append(0)
  158.     zero.append(0)
  159.     zero.append(0)
  160.     zero.append(0)
  161.     zero.append(0)
  162.     zero.append(0)
  163.     zero.append(0)
  164.     zero.append(0)
  165.     zero.append(0)
  166.     zero.append(0)
  167.     zero.append(0)
  168.  
  169.     #transformando em um array bidimensional
  170.     retornopollyDP = np.reshape(aproxx, (aproxx.shape[0], (aproxx.shape[1] * aproxx.shape[2])))
  171.  
  172.     #checando se não é uma linha
  173.     if (len(retornopollyDP) < 3):
  174.  
  175.         return zero
  176.  
  177.     arraysdeangulo = []
  178.  
  179.     for x in range(len(retornopollyDP)):
  180.         # caso especial : quando a primeira posição do array for o angulo central
  181.         if x == 0:
  182.  
  183.             bla3 = get_angle(retornopollyDP[x + 1], retornopollyDP[x], retornopollyDP[len(retornopollyDP) - 1])
  184.             arraysdeangulo.append(math.fabs(bla3))
  185.  
  186.         # caso especial : quando a última posição do array for o ângulo central
  187.         if x == len(retornopollyDP) - 1:
  188.  
  189.             bla4 = get_angle(retornopollyDP[x - 1], retornopollyDP[x], retornopollyDP[0])
  190.             arraysdeangulo.append(math.fabs(bla4))
  191.  
  192.         if x > 0 and x < len(retornopollyDP) - 1:
  193.  
  194.             bla5 = get_angle(retornopollyDP[x + 1], retornopollyDP[x], retornopollyDP[x - 1])
  195.             arraysdeangulo.append(math.fabs(bla5))
  196.  
  197.     hist, bins = np.histogram(arraysdeangulo, bins=[0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180])
  198.  
  199.     return hist
  200.  
  201.  
  202. # funcão que seleciona num quantidade de imagens aleatoriamente
  203. # em um vetor e retorna um vetor auxiliar apenas com as imagens
  204. # selecionadas
  205.  
  206. def seleciona_imagens (arrayImgs, num):
  207.     tamanho = len(arrayImgs)
  208.     selecionadas = []
  209.     nao_selecionadas = []
  210.     aux = []
  211.     var = 0
  212.  
  213.     for x in range(0, num):
  214.  
  215.         if x == 0:
  216.  
  217.             var = randint(0, tamanho - 1)
  218.             aux.append(var)
  219.             selecionadas.append(arrayImgs[var])
  220.  
  221.         elif x > 0:
  222.  
  223.             var = randint(0, tamanho - 1)
  224.  
  225.             while np.isin(var ,aux):
  226.  
  227.                 var = randint(0, tamanho - 1)
  228.  
  229.             selecionadas.append(arrayImgs[var])
  230.             aux.append(var)
  231.  
  232.     for x in range(0, tamanho):
  233.         if np.isin(x,aux):
  234.             continue
  235.         else:
  236.             nao_selecionadas.append(arrayImgs[x])
  237.  
  238.     return selecionadas, nao_selecionadas
  239.  
  240.  
  241. #função que salva as imagens na pasta dada como parâmetro
  242. def save_images(images, path):
  243.     cont = 0
  244.  
  245.     for i in images:
  246.         y = str(cont)
  247.         cv2.imwrite(path + y + '.jpg', i)
  248.         cont += 1
  249.  
  250.     return 0
  251.  
  252.  
  253. # função que retorna população de cromossomos e tem como parametros
  254. # tamanho da população (número de cromossomos) e tamanho dos cromossomos
  255. def create_population(size_population, size_chromossome):
  256.     population = []
  257.  
  258.     for y in range(0, size_population):
  259.         aux = []
  260.         for i in range(0, size_chromossome):
  261.             x = randint(0, 200)
  262.             if x % 2 == 0:
  263.                 aux.append(0)
  264.             elif x % 2 != 0:
  265.                 aux.append(1)
  266.         population.append(aux)
  267.  
  268.     return population
  269.  
  270.  
  271. # função que identifica o tamanho do cromossomo e retorna o vetor de características correspondente
  272. def decode_chromossome(chromossome):
  273.  
  274.     images_class = []
  275.  
  276.     if chromossome[0] == 0 and chromossome[1] == 0:
  277.  
  278.         images_class = pd.read_csv('C:/Users/Auricelia/Desktop/DataSetsML/Images_16_s.csv')
  279.         images_class = pd.DataFrame(images_class)
  280.  
  281.     elif chromossome[0] == 0 and chromossome[1] == 1:
  282.         images_class = pd.read_csv('C:/Users/Auricelia/Desktop/DataSetsML/Images_32_s.csv')
  283.         images_class = pd.DataFrame(images_class)
  284.  
  285.     elif chromossome[0] == 1 and chromossome[1] == 0:
  286.  
  287.         images_class = pd.read_csv('C:/Users/Auricelia/Desktop/DataSetsML/Images_64_s.csv')
  288.         images_class = pd.DataFrame(images_class)
  289.  
  290.     elif chromossome[0] == 1 and chromossome[1] == 1:
  291.  
  292.         images_class = pd.read_csv('C:/Users/Auricelia/Desktop/DataSetsML/Images_128_s.csv')
  293.         images_class = pd.DataFrame(images_class)
  294.  
  295.     return images_class
  296.  
  297.  
  298. #fucção que retorna as posições do array que
  299. #são usadas pelo cromossomo para a classificação
  300. def positions_chromossome(chromossome):
  301.  
  302.     selected_pos = []
  303.  
  304.     for c in range(2,len(chromossome)):
  305.         aux = []
  306.         if chromossome[c] == 1:
  307.             selected_pos.append(c)
  308.  
  309.         elif chromossome[c] == 0:
  310.             continue
  311.  
  312.     return selected_pos
  313.  
  314.  
  315.  
  316. # função que retorna o array com características selecionadas
  317. # pelo cromossomo passando as posicoes selecionadas
  318. # e o vetor com as características
  319. def carac_imagens(selected_position,array_images):
  320.     arrayzao = []
  321.     z = 0
  322.     for j in range(0,len(array_images)):
  323.         aux = []
  324.         for i in range(0,len(selected_position)):
  325.             z = selected_position[i]
  326.             aux.append(array_images[j][z])
  327.  
  328.         arrayzao.append(aux)
  329.     arrayzao = pd.DataFrame(arrayzao)
  330.     return arrayzao
  331.  
  332.  
  333. #gera o conjunto dos dois melhores cromossomos para
  334. #garantir o elitismo no algoritmo genético
  335. def get_best_cromossomos(acuracias,cromossomos):
  336.     index = []
  337.     melhor = []
  338.     best_acuracia = []
  339.  
  340.     print('index antes',index)
  341.     index.append(acuracias.index(max(acuracias)))
  342.     print('index melhor',acuracias.index(max(acuracias)))
  343.     best_acuracia.append(max(acuracias))
  344.     print('best acc',max(acuracias))
  345.     acuracias[acuracias.index(max(acuracias))] = 0
  346.  
  347.  
  348.     index.append(acuracias.index(max(acuracias)))
  349.     print('index melhor',acuracias.index(max(acuracias)))
  350.     best_acuracia.append(max(acuracias))
  351.     print('best acc',max(acuracias))
  352.     acuracias[acuracias.index(max(acuracias))] = 0
  353.  
  354.     print('index dpeois',index)
  355.  
  356.     for i in range(0,len(index)):
  357.         melhor.append(cromossomos[index[i]])
  358.         cromossomos[index[i]] = 0
  359.         print('melhor',cromossomos[i])
  360.     # melhor.append(cromossomos[index[0]])
  361.     # melhor.append(cromossomos[index[1]])
  362.  
  363.     return melhor, best_acuracia, cromossomos
  364.  
  365.  
  366. # seleção por torneio gera aleatoriamente dois
  367. # cromossomos e retorna o melhor deles
  368. def tournament_selection(acuracias, cromossomos):
  369.     melhor = []
  370.     aux =[]
  371.     rand1 = randint(0,len(cromossomos)-1)
  372.     rand2 = randint(0,len(cromossomos)-1)
  373.  
  374.     while rand2 == rand1:
  375.         rand2 = randint(0,len(cromossomos)-1)
  376.  
  377.     aux.append(rand1)
  378.     aux.append(rand2)
  379.  
  380.  
  381.     if acuracias[rand1] > acuracias[rand2]:
  382.         melhor.append(cromossomos[rand1])
  383.         cromossomos[rand1] = 0
  384.  
  385.     elif acuracias[rand2] > acuracias[rand1]:
  386.         melhor.append(cromossomos[rand2])
  387.         cromossomos[rand2] = 0
  388.  
  389.  
  390.     return melhor, cromossomos
  391.  
  392.  
  393. #função que retorna o casal gerado a partir do torneio
  394. def generate_parents(melhores):
  395.     duplas = []
  396.     usados = []
  397.  
  398.     for i in range(int(len(melhores)/2)):
  399.         aux = []
  400.         rand = randint(0, len(melhores)-1)
  401.         if i == 0:
  402.  
  403.             aux.append(melhores[rand])
  404.             usados.append(rand)
  405.             rand2 = randint(0,len(melhores)-1)
  406.  
  407.             while usados.__contains__(rand2):
  408.                 rand2 = randint(0,len(melhores)-1)
  409.             aux.append(melhores[rand2])
  410.  
  411.             usados.append(rand2)
  412.             duplas.append(aux)
  413.  
  414.  
  415.         elif i > 0:
  416.  
  417.             while usados.__contains__(rand):
  418.                 rand = randint(0,len(melhores)-1)
  419.  
  420.             aux.append(melhores[rand])
  421.             usados.append(rand)
  422.  
  423.             rand2 = randint(0,len(melhores)-1)
  424.             while usados.__contains__(rand2):
  425.                 rand2 = randint(0,len(melhores)-1)
  426.             aux.append(melhores[rand2])
  427.  
  428.             usados.append(rand2)
  429.             duplas.append(aux)
  430.  
  431.  
  432.     return duplas
  433.  
  434.  
  435. #função que realiza o crossover entre os dois cromossomos
  436. #pais para a geração
  437. def crossover(taxa_crossover, parents):
  438.  
  439.     offspring = []
  440.     seed = random.uniform(0,1)
  441.  
  442.  
  443.     if seed < taxa_crossover:
  444.         cromo1_a = parents[0][:19]
  445.         cromo1_b = parents[0][19:]
  446.         cromo2_a = parents[1][:19]
  447.         cromo2_b = parents[1][19:]
  448.         offspring.append(cromo1_a+cromo2_b)
  449.         offspring.append(cromo2_a+cromo1_b)
  450.  
  451.     elif seed > taxa_crossover or seed == taxa_crossover :
  452.         offspring.append(parents[0].copy())
  453.         offspring.append(parents[1].copy())
  454.  
  455.     return offspring
  456.  
  457.  
  458. # função que inverte os bits de uma posição
  459. # do cromossomo caso a seed seja superior à taxa de mutação
  460. def mutation(taxa_mutation, offsp_1):
  461.     seed = 0
  462.     for i in range(0,len(offsp_1)):
  463.         seed = random.uniform(0,1)
  464.         if seed < taxa_mutation:
  465.  
  466.             if offsp_1[i] == 0:
  467.                 offsp_1[i] = 1
  468.  
  469.             elif offsp_1[i] == 1:
  470.                 offsp_1[i] = 0
  471.  
  472.         elif seed > taxa_mutation or seed == taxa_mutation:
  473.             continue
  474.  
  475.     return offsp_1,
  476.  
  477. # função que calcula os valores de média, moda , mediana e desvio padrão
  478. # para os vetores de acerto de um algoritmo, recebe como parâmetro o vetor
  479. # de acerto e o nome do algoritmo
  480.  
  481. def tendencia_central (nomeAlgoritmo, vetorAcerto, vetorTempo):
  482.     print('________________________________________________\n')
  483.     print(nomeAlgoritmo)
  484.     print('Tempo Média = ', np.mean(vetorTempo))
  485.     print('Tempo Desvio padrão = ', statistics.pstdev(vetorTempo))
  486.     print('Tempo Moda = ', stats.mode(vetorTempo, axis=None))
  487.     print('Tempo Mediana =', np.median(vetorTempo))
  488.     print('----------------------------------------------')
  489.     print('Acurácia Média = ', np.mean(vetorAcerto))
  490.     print('Acurácia Desvio padrão = ', statistics.pstdev(vetorAcerto))
  491.     print('Acurácia Moda = ', stats.mode(vetorAcerto, axis=None))
  492.     print('Acurácia Mediana = ', np.median(vetorAcerto))
  493.  
  494.     print('________________________________________________\n')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement