-
Notifications
You must be signed in to change notification settings - Fork 0
/
K_Fold.py
130 lines (91 loc) · 4.85 KB
/
K_Fold.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# -*- coding: utf-8 -*-
"""
Created on Mon Apr 5 15:48:56 2021
@author: fabio
"""
import arquivo
import impressao
from tqdm import tqdm
# classe K_Fold
class K_Fold:
def __init__(self, base_origem, diretorio_destino, k, classes):
#função executada ao inicializar a classe
self.k = k
self.classes = classes
self.base_origem = base_origem
self.diretorio_destino = diretorio_destino
self.diretorio_treino = []
self.diretorio_teste = []
self.endereco_imagens = []
def criar_pastas(self):
#cria as pastas das bases do K_fold.
test = "\\test\\"
train = "\\train\\"
self.excluir_pasta_k_fold()
for x in range (self.k):
sub_pasta = "\\" + str(x+1)
self.diretorio_teste.append(self.diretorio_destino + sub_pasta + test)
self.diretorio_treino.append(self.diretorio_destino + sub_pasta + train)
for classe in self.classes:
arquivo.cria_diretorio(self.diretorio_destino + sub_pasta + test + classe)
arquivo.cria_diretorio(self.diretorio_destino + sub_pasta + train + classe)
def excluir_pasta_k_fold(self):
#exclui pasta
arquivo.exclui_diretorio(self.diretorio_destino)
def buscar_arquivos_base(self):
# busca todos os arquivos de um diretorio (apenas imagens)
for classe in self.classes:
diretorio = self.base_origem + "\\" + classe
lista_arquivos = arquivo.buscar_nome_arquivos_de_imagem(diretorio)
self.endereco_imagens.append(lista_arquivos)
def criar_bases_K_Fold(self):
# divide a base original em k bases.
divisao_classe = []
for y in range(self.k):
# laço que anta k passos
test = "\\test"
train = "\\train"
lista = None
k =[]
for i in range(self.k):
k.append(i)
for z in tqdm(k):
# laço que anta k passos
for x in range(len(self.classes)):
# divide a base original em partes
divisao_classe.append(int(len(self.endereco_imagens[x]) / self.k))
# define diretorios para a nova base
origem = self.base_origem + "\\" + self.classes[x]
destino_teste = self.diretorio_destino + "\\" + str(y+1) + test + "\\" + self.classes[x]
destino_treino = self.diretorio_destino + "\\" + str(y+1) + train + "\\" + self.classes[x]
#salva a nova base no diretorio
if (z == y):
if(z == self.k-1):
lista = arquivo.gerar_sub_lista((divisao_classe[x]*z), len(self.endereco_imagens[x]), self.endereco_imagens[x])
arquivo.copiar_arquivo_lista(origem, destino_teste, lista)
else:
lista = arquivo.gerar_sub_lista((divisao_classe[x]*z), divisao_classe[x]*(z+1), self.endereco_imagens[x])
arquivo.copiar_arquivo_lista(origem, destino_teste, lista)
else:
if(z == self.k-1):
lista = arquivo.gerar_sub_lista((divisao_classe[x]*z), len(self.endereco_imagens[x]), self.endereco_imagens[x])
arquivo.copiar_arquivo_lista(origem, destino_treino, lista)
else:
lista = arquivo.gerar_sub_lista((divisao_classe[x]*z), divisao_classe[x]*(z+1), self.endereco_imagens[x])
arquivo.copiar_arquivo_lista(origem, destino_treino, lista)
def iniciar(self):
# função principal do K_Fold
impressao.pular_linha()
impressao.imprimir_informacao("INICIANDO K-FOLD", 2)
impressao.imprimir_informacao("CRIANDO BASE K-FOLD", 2)
self.criar_pastas()
self.buscar_arquivos_base()
self.criar_bases_K_Fold()
impressao.pular_linha()
impressao.imprimir_informacao("Porcentagem de treinamento: " + str((1/self.k)*100) + " % ", 1)
impressao.imprimir_informacao("Número de bases criadas: " + str(self.k), 1)
impressao.pular_linha()
impressao.imprimir_informacao("DIRETORIO ORIGEM: " + self.base_origem, 1)
impressao.imprimir_informacao("DIRETORIO DESTINO: " + self.diretorio_destino, 1)
impressao.imprimir_informacao("BASE K-FOLD CRIADA", 2)
impressao.imprimir_informacao("FIM K-FOLD", 2)