Advertisement
11eimilia11

ijustwannasleeep

Feb 21st, 2019
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 16.39 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. from sklearn.decomposition import PCA
  14. import glob
  15. from sklearn.metrics import pairwise_distances_argmin_min
  16. from sklearn.ensemble import RandomForestClassifier
  17. from sklearn.metrics import accuracy_score
  18. from operator import itemgetter
  19. import math
  20. import os
  21.  
  22. # Carregando fotos da pasta
  23. def loadFiles(path, array):
  24.  
  25.     for i in glob.glob(path):
  26.  
  27.         img = cv2.imread(i)
  28.         array.append(img)
  29.  
  30.     return array
  31.  
  32. # Função que faz o filtro cinza nas fotos
  33. def grayConversion(arrayphotos):
  34.  
  35.     size = len(arrayphotos)
  36.     for x in range (0,size):
  37.         arrayphotos[x] = cv2.cvtColor(arrayphotos[x], cv2.COLOR_BGR2GRAY)
  38.  
  39.     return arrayphotos
  40.  
  41. # Função que aplic o filtro blur nas fotos do array
  42. def blurConversion(arrayphotos ,val1, val2):
  43.  
  44.     for x in range(len(arrayphotos)):
  45.         arrayphotos[x] = cv2.GaussianBlur(arrayphotos[x],(val1,val1), val2)
  46.  
  47.     return arrayphotos
  48.  
  49. #Função que faz a binarização das fotos
  50. def binaryConversion(arrayphotos,threshold,val1):
  51.  
  52.     for x in range(len(arrayphotos)):
  53.         arrayphotos[x] = cv2.adaptiveThreshold(arrayphotos[x],threshold,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,val1,10)
  54.  
  55.     return arrayphotos
  56.  
  57. #Função que inverte as fotos binárias
  58. def invertConversion(arrayphotos):
  59.  
  60.     for x in range(len(arrayphotos)):
  61.         arrayphotos[x] = cv2.bitwise_not(arrayphotos[x])
  62.  
  63.     return arrayphotos
  64.  
  65.  
  66. # função de normalização dos dados usando o modelo de
  67. # normalização por reescala
  68.  
  69. def normalizar(dados):
  70.     x = dados.values
  71.     min_max_scaler = preprocessing.MinMaxScaler()
  72.     x_scaled = min_max_scaler.fit_transform(x)
  73.     dados_norm = pd.DataFrame(x_scaled)
  74.     return dados_norm
  75.  
  76.  
  77. def geneticlabels(dataframe,centers):
  78.     return pairwise_distances_argmin_min(dataframe,centers,metric='minkowski')
  79.  
  80. def find_clusters(X, n_clusters, rng, max_it):
  81.  
  82.     i = rng.permutation(X.shape[0])[:n_clusters]
  83.     centers = X[i]
  84.  
  85.     max_iterator = 0
  86.     distances = []
  87.     while True:
  88.  
  89.         labels,distance = pairwise_distances_argmin_min(X,centers,metric='minkowski')
  90.         distances.append(distance)
  91.  
  92.         new_centers = np.array([X[labels == i].mean(0)
  93.                                 for i in range(n_clusters)])
  94.  
  95.  
  96.         if np.all(centers == new_centers) or max_iterator > max_it:
  97.             break
  98.         centers = new_centers
  99.         max_iterator += 1
  100.  
  101.     return centers, labels, distances
  102.  
  103. def accuracy_majority_vote(base, predict_labels, real_labels, n_clusters):
  104.  
  105.     classes = real_labels.unique()
  106.  
  107.     majority = []
  108.     groups = []
  109.     k = 0
  110.     for i in range(n_clusters):
  111.         group = []
  112.         for a in range(len(base)):
  113.             if predict_labels[a] == i:
  114.                 group.append(real_labels[a])
  115.         groups.append(group)
  116.         majority.append(initialize_dic_majority(classes))
  117.         for real_label in group:
  118.             majority[k][real_label] += 1
  119.         k += 1
  120.  
  121.     label_groups = []
  122.     for m in majority:
  123.         label_groups.append(max(m.items(), key=itemgetter(1))[0])
  124.  
  125.     pred_labels = []
  126.     true_labels = []
  127.     for g in range(len(groups)):
  128.         pred_labels = pred_labels + ([label_groups[g]]*len(groups[g]))
  129.         true_labels = true_labels + [a for a in groups[g]]
  130.  
  131.     return accuracy_score(pred_labels, true_labels)
  132.  
  133.  
  134. def find_clustersGENETIC(X, n_clusters, max_it, array):
  135.  
  136.     centers = array
  137.  
  138.     max_iterator = 0
  139.     distances = []
  140.     while True:
  141.  
  142.         labels,distance = pairwise_distances_argmin_min(X,centers,metric='minkowski')
  143.         distances.append(distance)
  144.  
  145.         new_centers = np.array([X[labels == i].mean(0)
  146.                                 for i in range(n_clusters)])
  147.  
  148.  
  149.         if np.all(centers == new_centers) or max_iterator > max_it:
  150.             break
  151.         centers = new_centers
  152.         max_iterator += 1
  153.  
  154.     return centers, labels, distances
  155.  
  156.  
  157. def WCSSgenetic(x, population):
  158.  
  159.     arrayint = []
  160.     for a in x:
  161.         arrayint.append(int(a))
  162.  
  163.     print(arrayint)
  164.     soma = 0
  165.     for b in arrayint:
  166.         labels, distances = pairwise_distances_argmin_min(population[b],population, metric='minkowski')
  167.         for x in distances:
  168.             soma += x**2
  169.     return soma
  170.  
  171.  
  172. def generatepopulation(X,numberpopu, K, rng):
  173.  
  174.     population = []
  175.  
  176.     for x in range(numberpopu):
  177.         first = rng.permutation(X.shape[0])[:K]
  178.         print(first)
  179.         population.append(np.concatenate(X[first]))
  180.  
  181.     return population
  182.  
  183.  
  184. def find_clustersgenetic(X, n_clusters, max_it, array):
  185.  
  186.     centers = array
  187.  
  188.     max_iterator = 0
  189.     distances = []
  190.     while True:
  191.  
  192.         labels,distance = pairwise_distances_argmin_min(X,centers,metric='minkowski')
  193.         distances.append(distance)
  194.  
  195.         new_centers = np.array([X[labels == i].mean(0)
  196.                                 for i in range(n_clusters)])
  197.  
  198.         if np.all(centers == new_centers) or max_iterator > max_it:
  199.             break
  200.         centers = new_centers
  201.         max_iterator += 1
  202.  
  203.     return centers, labels, distances
  204.  
  205.  
  206. #FUNÇÃO DE NORMALIZAÇÃO
  207.  
  208. def imgtoarray(arrayphotos):
  209.  
  210.     size = len(arrayphotos)
  211.     for x in range (0,size):
  212.         arrayphotos[x] = np.array(arrayphotos[x] , dtype=float)
  213.  
  214.     return arrayphotos
  215.  
  216. def gethumoments(arrayphotos):
  217.  
  218.     for x in range(len(arrayphotos)):
  219.  
  220.         arrayphotos[x] = cv2.HuMoments(cv2.moments(arrayphotos[x]), True).flatten()
  221.  
  222.     return arrayphotos
  223.  
  224. def WCSS2(distance):
  225.     soma = 0
  226.     for x in distance:
  227.         soma += x ** 2
  228.  
  229.     return soma
  230.  
  231.  
  232. def initialize_dic_majority(classes):
  233.     majority = {}
  234.     for c in classes:
  235.         majority[c] = 0
  236.  
  237.     return majority
  238.  
  239.  
  240. def extratorCaracteristicas(arrayimgs):
  241.  
  242.     squarescarac = []
  243.  
  244.  
  245.     for x in arrayimgs:
  246.  
  247.         aux = []
  248.  
  249.         im2, countours, hierachy = cv2.findContours(x, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  250.  
  251.         if len(countours) == 0:
  252.  
  253.             for b in range(0,45):
  254.  
  255.                 aux.append(0)
  256.  
  257.         elif len(countours) > 0:
  258.  
  259.             momentum = cv2.moments(x)
  260.             momentum = list(dict.values(momentum))  # momentos
  261.             for i in momentum:
  262.                 aux.append(i)
  263.  
  264.             moments = cv2.HuMoments(momentum, True).flatten()  # Hu moments
  265.  
  266.             for i in moments:
  267.                 aux.append(i)
  268.  
  269.             area = cv2.contourArea(countours[0])  # area
  270.             aux.append(area)
  271.  
  272.             peri = cv2.arcLength(countours[0], True)  # perimetro
  273.             aux.append(peri)
  274.  
  275.             if peri > 0:
  276.                 compactness = (4 * math.pi * area) / (peri ** 2)  # compacidade
  277.                 aux.append(compactness)
  278.             elif peri == 0:
  279.                 aux.append(0)
  280.  
  281.             aproxx = cv2.approxPolyDP(countours[0], 0.04 * peri, True)  # vertices
  282.             vertc = len(aproxx)
  283.             aux.append(vertc)
  284.  
  285.             histogram = get_histogram(aproxx)  # Frequencia de angulos
  286.  
  287.             for h in histogram:
  288.                 aux.append(h)
  289.  
  290.         squarescarac.append(aux)
  291.  
  292.  
  293.     return squarescarac
  294.  
  295. def niveisCinza(image):
  296.  
  297.     gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
  298.  
  299.     return gray
  300.  
  301.  
  302. def filtroGaussiano(image):
  303.  
  304.     gaussianb = cv2.GaussianBlur(image,(5,5),0)
  305.  
  306.     return gaussianb
  307.  
  308. def turnToBinary(image):
  309.  
  310.     binary = cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,31,10)
  311.  
  312.     return binary
  313.  
  314. def inverterCores(image):
  315.  
  316.     invert = cv2.bitwise_not(image)
  317.  
  318.     return invert
  319.  
  320. def resizeImages(images,width,height):
  321.  
  322.     i = len(images)
  323.     for x in range(0,i):
  324.  
  325.         images[x] = cv2.resize(images[x],(width,height))
  326.  
  327.     return images
  328.  
  329.  
  330. def angle3pt(a, b, c):
  331.     """Counterclockwise angle in degrees by turning from a to c around b
  332.        Returns a float between 0.0 and 360.0"""
  333.     ang = math.degrees(
  334.         math.atan2(c[1] - b[1], c[0] - b[0]) - math.atan2(a[1] - b[1], a[0] - b[0]))
  335.  
  336.     return ang + 360 if ang < 0 else ang
  337.  
  338. def get_vertices(imagem):
  339.  
  340.     im2, countours, hierachy = cv2.findContours(imagem, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  341.  
  342.     peri = cv2.arcLength(countours[0], True)  # perimetro
  343.  
  344.     aproxx = cv2.approxPolyDP(countours[0], 0.04 * peri, True)  # vertices
  345.  
  346.     return aproxx
  347.  
  348. def get_angle(p0, p1, p2):
  349.  
  350.     v0 = np.array(p0) - np.array(p1)
  351.     v1 = np.array(p2) - np.array(p1)
  352.  
  353.     angle = np.math.atan2(np.linalg.det([v0, v1]), np.dot(v0, v1))
  354.     return np.degrees(angle)
  355.  
  356.  
  357. def get_histogram(aproxx):
  358.     zero = []
  359.     zero.append(0)
  360.     zero.append(0)
  361.     zero.append(0)
  362.     zero.append(0)
  363.     zero.append(0)
  364.     zero.append(0)
  365.     zero.append(0)
  366.     zero.append(0)
  367.     zero.append(0)
  368.     zero.append(0)
  369.     zero.append(0)
  370.     #transformando em um array bidimensional
  371.     retornopollyDP = np.reshape(aproxx, (aproxx.shape[0], (aproxx.shape[1] * aproxx.shape[2])))
  372.  
  373.     #checando se não é uma linha
  374.     if (len(retornopollyDP) < 3):
  375.  
  376.         return zero
  377.  
  378.     arraysdeangulo = []
  379.  
  380.     for x in range(len(retornopollyDP)):
  381.         # caso especial : quando a primeira posição do array for o angulo central
  382.         if x == 0:
  383.  
  384.             bla3 = get_angle(retornopollyDP[x + 1], retornopollyDP[x], retornopollyDP[len(retornopollyDP) - 1])
  385.             arraysdeangulo.append(math.fabs(bla3))
  386.  
  387.         # caso especial : quando a última posição do array for o ângulo central
  388.         if x == len(retornopollyDP) - 1:
  389.  
  390.             bla4 = get_angle(retornopollyDP[x - 1], retornopollyDP[x], retornopollyDP[0])
  391.             arraysdeangulo.append(math.fabs(bla4))
  392.  
  393.         if x > 0 and x < len(retornopollyDP) - 1:
  394.  
  395.             bla5 = get_angle(retornopollyDP[x + 1], retornopollyDP[x], retornopollyDP[x - 1])
  396.             arraysdeangulo.append(math.fabs(bla5))
  397.  
  398.     hist, bins = np.histogram(arraysdeangulo, bins=[15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180])
  399.  
  400.     return hist
  401.  
  402.  
  403. # função que calcula os valores de média, moda , mediana e desvio padrão
  404. # para os vetores de acerto de um algoritmo, recebe como parâmetro o vetor
  405. # de acerto e o nome do algoritmo
  406.  
  407. def tendencia_central (nomeAlgoritmo, vetorAcerto, vetorTempo):
  408.     print('________________________________________________\n')
  409.     print(nomeAlgoritmo)
  410.     print('Tempo Média = ', np.mean(vetorTempo))
  411.     print('Tempo Desvio padrão = ', statistics.pstdev(vetorTempo))
  412.     print('Tempo Moda = ', stats.mode(vetorTempo, axis=None))
  413.     print('Tempo Mediana =', np.median(vetorTempo))
  414.     print('----------------------------------------------')
  415.     print('Acurácia Média = ', np.mean(vetorAcerto))
  416.     print('Acurácia Desvio padrão = ', statistics.pstdev(vetorAcerto))
  417.     print('Acurácia Moda = ', stats.mode(vetorAcerto, axis=None))
  418.     print('Acurácia Mediana = ', np.median(vetorAcerto))
  419.  
  420.     print('________________________________________________\n')
  421.  
  422. # funcão que seleciona num quantidade de imagens aleatoriamente
  423. # em um vetor e retorna um vetor auxiliar apenas com as imagens
  424. # selecionadas
  425.  
  426.  
  427. def seleciona_imagens (arrayImgs, num):
  428.     tamanho = len(arrayImgs)
  429.     selecionadas = []
  430.     nao_selecionadas = []
  431.     aux = []
  432.     var = 0
  433.  
  434.     for x in range(0, num):
  435.  
  436.         if x == 0:
  437.  
  438.             var = randint(0, tamanho - 1)
  439.             aux.append(var)
  440.             selecionadas.append(arrayImgs[var])
  441.  
  442.         elif x > 0:
  443.  
  444.             var = randint(0, tamanho - 1)
  445.  
  446.             while np.isin(var ,aux):
  447.  
  448.                 var = randint(0, tamanho - 1)
  449.  
  450.             selecionadas.append(arrayImgs[var])
  451.             aux.append(var)
  452.  
  453.     for x in range(0, tamanho):
  454.         if np.isin(x,aux):
  455.             continue
  456.         else:
  457.             nao_selecionadas.append(arrayImgs[x])
  458.  
  459.     return selecionadas, nao_selecionadas
  460.  
  461.  
  462. def is_similar(image1, image2):
  463.  
  464.     retorno = image1.shape == image2.shape and not(np.bitwise_xor(image1,image2).any())
  465.  
  466.     return retorno
  467.  
  468.  
  469. def create_folder(path):
  470.     x = 0
  471.     try:
  472.         os.mkdir(path)
  473.     except OSError:
  474.        x = -1
  475.     else:
  476.         x = 1
  477.     return x
  478.  
  479.  
  480. def save_images(images, path):
  481.     cont = 0
  482.  
  483.     for i in images:
  484.         y = str(cont)
  485.         cv2.imwrite(path + y + '.jpg', i)
  486.         cont += 1
  487.  
  488.     return 0
  489.  
  490. # checa se o elemento escolhido já existe no array aux para
  491. # evitar elementos duplicados
  492.  
  493. # var = randint(0, tamanho)
  494. #
  495. # for i in range(0, len(aux)):
  496. #     if is_similar(arrayImgs[var], aux[i]):
  497. #         duplicate = 1
  498. #
  499. # while duplicate == 1:
  500.  
  501. def delete_folder (path):
  502.     x = 0
  503.     try:
  504.         os.rmdir(path)
  505.     except OSError:
  506.         x = -1
  507.     else:
  508.         x = 1
  509.     return x
  510.  
  511. # função que retorna população de cromossomos e tem como parametros
  512. # tamanho da população (número de cromossomos) e tamanho dos cromossomos
  513. def create_population(size_population, size_chromossome):
  514.     population = []
  515.  
  516.     for y in range(0, size_population):
  517.         aux = []
  518.         for i in range(0, size_chromossome):
  519.             x = randint(0, 200)
  520.             if x % 2 == 0:
  521.                 aux.append(0)
  522.             elif x % 2 != 0:
  523.                 aux.append(1)
  524.         population.append(aux)
  525.  
  526.     return population
  527.  
  528. # função que identifica o tamanho do cromossomo e retorna o vetor de características correspondente
  529. def decode_chromossome(chromossome):
  530.     images = []
  531.     images_class = []
  532.  
  533.     if chromossome[0] == 0 and chromossome[1] == 0:
  534.         images = pd.read_csv('C:/Users/Auricelia/Desktop/DataSetsML/Images_16_s_NOCLASS.csv')
  535.         images = pd.DataFrame(images)
  536.         images_class = pd.read_csv('C:/Users/Auricelia/Desktop/DataSetsML/Images_16_s.csv')
  537.         images_class = pd.DataFrame(images_class)
  538.  
  539.     elif chromossome[0] == 0 and chromossome[1] == 1:
  540.         images = pd.read_csv('C:/Users/Auricelia/Desktop/DataSetsML/Images_32_sNOCLASS.csv')
  541.         images = pd.DataFrame(images)
  542.         images_class = pd.read_csv('C:/Users/Auricelia/Desktop/DataSetsML/Images_32_s.csv')
  543.         images_class = pd.DataFrame(images_class)
  544.  
  545.     elif chromossome[0] == 1 and chromossome[1] == 0:
  546.         images = pd.read_csv('C:/Users/Auricelia/Desktop/DataSetsML/Images_64_sNOCLASS.csv')
  547.         images = pd.DataFrame(images)
  548.         images_class = pd.read_csv('C:/Users/Auricelia/Desktop/DataSetsML/Images_64_s.csv')
  549.         images_class = pd.DataFrame(images_class)
  550.  
  551.     elif chromossome[0] == 1 and chromossome[1] == 1:
  552.         images = pd.read_csv('C:/Users/Auricelia/Desktop/DataSetsML/Images_128_sNOCLASS.csv')
  553.         images = pd.DataFrame(images)
  554.         images_class = pd.read_csv('C:/Users/Auricelia/Desktop/DataSetsML/Images_128_s.csv')
  555.         images_class = pd.DataFrame(images_class)
  556.  
  557.     return images, images_class
  558.  
  559.  
  560. #fucção que retorna as posições do array que
  561. #são usadas pelo cromossomo para a classificação
  562. def positions_chromossome(chromossome):
  563.  
  564.     selected_pos = []
  565.  
  566.     for c in range(2,len(chromossome)):
  567.         aux = []
  568.         if chromossome[c] == 1:
  569.             selected_pos.append(c)
  570.  
  571.         elif chromossome[c] == 0:
  572.             continue
  573.  
  574.     return selected_pos
  575.  
  576. # função que retorna o array com características selecionadas
  577. # pelo cromossomo passando as posicoes selecionadas
  578. # e o vetor com as características
  579. def caracteristicas_2(selected_pos,images):
  580.     arrayzao = []
  581.     for x in images:
  582.         aux = []
  583.         for y in selected_pos:
  584.             aux.append(x[y-1])
  585.  
  586.         arrayzao.append(aux)
  587.  
  588.     return arrayzao
  589.  
  590.  
  591. def carac_imagens(selected_position,array_images):
  592.     arrayzao = []
  593.     z = 0
  594.     for j in range(0,len(array_images)):
  595.         aux = []
  596.         for i in range(0,len(selected_position)):
  597.             z = selected_position[i]
  598.             aux.append(array_images[j][z])
  599.  
  600.         arrayzao.append(aux)
  601.  
  602.     return arrayzao
  603.  
  604. # funcao que retorna o array de acurácias dos cromossomos
  605. def fitness(cromossomos):
  606.     acuracias = []
  607.     for cromo in cromossomos:
  608.         positions = positions_chromossome(cromo)
  609.         imagens = decode_chromossome(cromo)
  610.         imagens = np.array(imagens)
  611.         caracteristicas = carac_imagens(positions,imagens)
  612.  
  613.     return 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement