Generar arreglo de directorios
Descripción
Si se busca una lista de nombres de los directorios
que están asociados al directorio sample_directory
ejemplo: 'F:/go/face_scrapper/faces/samples/'
se puede usar el comando listdir de la libraría os:
import os # definiciones sample_directory = 'F:/go/face_scrapper/faces/samples/' # obtener arreglo de directorios classes = [] maincls = os.listdir(sample_directory) for cls in maincls: # generar list de archivos file = os.listdir(sample_directory+'/'+cls+'/') # agregar subdirectorios si contienen imagenes if len(file) > 0: classes.append(cls) # mostrar classes print(classes)
Solo se incluyen directorios con imágenes.
ID:(13748, 0)
Generar arreglo de directorios con subdirectorios
Descripción
Si se busca una lista de nombres de los subdirectorios
que están asociados un directorio principal sample_directory
ejemplo: 'F:/go/face_scrapper/faces/samples/'
se puede usar el comando listdir de la libraría os:
import os # definitions sample_directory = 'F:/go/face_scrapper/faces/samples/' # get directory array classes = [] maincls = os.listdir(sample_directory) for subcls in maincls: # get subdirectory array clslst = os.listdir(sample_directory+subcls+'/') for cls in clslst: file = os.listdir(sample_directory+subcls+'/'+cls+'/') # add subdirectories to the array if len(file) > 0: classes.append(cls) # show classes print(classes)
ID:(13781, 0)
Revisar que no existan dobles en el arreglo
Descripción
Para asegurarse de que el arreglo classes no contengan clase para cada tipo deben verificarse que todos los elementos sean únicos:
import collections print([item for item, count in collections.Counter(classes).items() if count > 1]) print('number of elements:'+str(len(classes)))
El arreglo de clases no debe contener dobles.
ID:(13782, 0)
Crear directorios para modelo
Descripción
Para correr los modelos se crean los directorios
- train
- validate
- test
con los subdirectorios de cada imagen de la misma clasificación dependiendo del directorio de trabajo work_directory
ejemplo: 'F:/go/face_scrapper/faces/work/'
import os # define directories work_directory = 'F:/go/face_scrapper/faces/work/' train_path = work_directory+'train/' validate_path = work_directory+'validate/' test_path = work_directory+'test/' # create subdirectories for subcls in classes: # define train directory FOLDER_EXIST = os.path.isdir(train_path+subcls) # check and create if not FOLDER_EXIST: os.mkdir(train_path+subcls) # define validate directory FOLDER_EXIST = os.path.isdir(validate_path+subcls) # check and create if not FOLDER_EXIST: os.mkdir(validate_path+subcls) # define test directory FOLDER_EXIST = os.path.isdir(test_path+subcls) # check and create if not FOLDER_EXIST: os.mkdir(test_path+subcls)
ID:(13749, 0)
Copiar imágenes a directorios
Descripción
Una vez se generaron los directorios se deben copiar las imágenes a cada subdirectorio. Para ello hay que recorrer los subdirectorios que dependen del directorio de muestra sample_directory
ejemplo 'F:/go/face_scrapper/faces/samples/'
y copiaros a los directorios de trabajo work_directory
ejemplo 'F:/go/face_scrapper/faces/work/'
en sus versiones train (entrenar), validate (validar) y test (testear).
El numero a copiar debe tener las fracción
- 80% train
- 15% validate
- 5% test
import shutil # definitions sample_directory = 'F:/go/face_scrapper/faces/samples/' work_directory = 'F:/go/face_scrapper/faces/work/' train_path = work_directory+'train/' validate_path = work_directory+'validate/' test_path = work_directory+'test/' for subcls in classes: # get subclasses subclslst = os.listdir(sample_directory+subcls) # numbers nlen = len(subclslst) if nlen > 0: nlen1 = round(nlen*0.8) if nlen1 == 0: nlen1 = 1 nlen2 = round(nlen*0.15) if nlen2 == 0: nlen2 = 1 nlen3 = round(nlen*0.05) if nlen3 == 0: nlen3 = 1 if nlen1 + nlen2 + nlen3 > nlen: npos3 = nlen - 1 else: npos3 = nlen1 + nlen2 if nlen1 + nlen2 > nlen: npos1 = nlen - 1 npos2 = nlen else: npos1 = nlen1 npos2 = nlen1 + nlen2 print(cls+','+str(nlen1)+','+str(nlen2)+','+str(nlen3)) # copy files for i in range(0,nlen1): shutil.copyfile(sample_directory+subcls+'/'+subclslst[i],train_path+subcls+'/'+subclslst[i]) for i in range(npos1,npos2): shutil.copyfile(sample_directory+subcls+'/'+subclslst[i],validate_path+subcls+'/'+subclslst[i]) for i in range(npos3,nlen): shutil.copyfile(sample_directory+subcls+'/'+subclslst[i],test_path+subcls+'/'+subclslst[i])
ID:(13750, 0)
Copiar imágenes a directorios con subdirectorios
Descripción
Una vez se generaron los directorios se deben copiar las imágenes a cada subdirectorio. Para ello hay que recorrer los subdirectorios que dependen del directorio de muestra sample_directory
ejemplo 'F:/go/face_scrapper/faces/samples/'
y copiaros a los directorios de trabajo work_directory
ejemplo 'F:/go/face_scrapper/faces/work/'
en sus versiones train (entrenar), validate (validar) y test (testear).
El numero a copiar debe tener las fracción
- 80% train
- 15% validate
- 5% test
Para aegurar que a lo menos exista una imagen en el directorio se introduce al algoritmo que redondea a la unidad y luego asigna los ultimos elementos del arreglo:
# determinar el 80% o a lo menos 1 nlen1 = round(nlen*0.8) if nlen1 == 0: nlen1 = 1 # determinar el 15% o a lo menos 1 nlen2 = round(nlen*0.15) if nlen2 == 0: nlen2 = 1 # determinar el 5% o a lo menos 1 nlen3 = round(nlen*0.05) if nlen3 == 0: nlen3 = 1 # si no hay suficientes elementos asignar el ultimo if nlen1 + nlen2 + nlen3 > nlen: npos3 = nlen - 1 else: npos3 = nlen1 + nlen2 # si no hay suficientes elementos asignar el ultimo if nlen1 + nlen2 > nlen: npos1 = nlen - 1 npos2 = nlen else: npos1 = nlen1 npos2 = nlen1 + nlen2
Con ello la rutina queda
import shutil # definitions sample_directory = 'F:/go/face_scrapper/faces/samples/' work_directory = 'F:/go/face_scrapper/faces/work/' train_path = work_directory+'train/' validate_path = work_directory+'validate/' test_path = work_directory+'test/' # get directory array maincls = os.listdir(sample_directory) for subcls in maincls: # get subclasses temp = os.listdir(sample_directory+subcls+'/') for cls in temp: # file list filelst = os.listdir(sample_directory+subcls+'/'+cls+'/') # numbers nlen = len(filelst) if nlen > 0: nlen1 = round(nlen*0.8) if nlen1 == 0: nlen1 = 1 nlen2 = round(nlen*0.15) if nlen2 == 0: nlen2 = 1 nlen3 = round(nlen*0.05) if nlen3 == 0: nlen3 = 1 if nlen1 + nlen2 + nlen3 > nlen: npos3 = nlen - 1 else: npos3 = nlen1 + nlen2 if nlen1 + nlen2 > nlen: npos1 = nlen - 1 npos2 = nlen else: npos1 = nlen1 npos2 = nlen1 + nlen2 print(cls+','+str(nlen1)+','+str(nlen2)+','+str(nlen3)) # copy files for i in range(0,nlen1): shutil.copyfile(sample_directory+subcls+'/'+cls+'/'+filelst[i],train_path+cls+'/'+filelst[i]) for i in range(npos1,npos2): shutil.copyfile(sample_directory+subcls+'/'+cls+'/'+filelst[i],validate_path+cls+'/'+filelst[i]) for i in range(npos3,nlen): shutil.copyfile(sample_directory+subcls+'/'+cls+'/'+filelst[i],test_path+cls+'/'+filelst[i])
ID:(13783, 0)
Generar imágenes para proceso de aprendizaje
Descripción
Para poder entrenar el modelo se realiza un pre-procesamiento en que
- se escala las imágenes al tamaño definido (se escala independiente de que la imagen original sea mayor, menor y/o no cuadradas).
- se aumenta el contraste trabajando con una paleta distinta de colores
import numpy as np import tensorflow as tf from tensorflow import keras from tensorflow.keras.preprocessing.image import ImageDataGenerator # definitions work_directory = 'F:/go/face_scrapper/faces/work/' train_path = work_directory+'train/' validate_path = work_directory+'validate/' test_path = work_directory+'test/' # generate images train_batches = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input).flow_from_directory(directory=train_path, target_size=(224,224), classes=classes, batch_size=10) valid_batches = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input).flow_from_directory(directory=valid_path, target_size=(224,224), classes=classes, batch_size=10) test_batches = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input).flow_from_directory(directory=test_path, target_size=(224,224), classes=classes, batch_size=10, shuffle=False)
Si se entrena un modelo propio el tamaño de las imágenes (target_size) puede asumir cualquier valor. Sin embargo si se emplea un modelo pre-entrenado debe ajustarse el tamaño al de las imágenes del modelo original.
ID:(13751, 0)
Formato archivos train, validate y test
Descripción
La función ImageDataGenerator genera archivos con el formato dado por:
{'image_data_generator':, 'target_size': (224, 224), 'color_mode': 'rgb', 'data_format': 'channels_last', 'image_shape': (224, 224, 3), 'save_to_dir': None, 'save_prefix': '', 'save_format': 'png', 'interpolation': 'nearest', 'split': None, 'subset': None, 'directory': 'F:/go/face_scrapper/faces/work/test/', 'classes': array([ 0, 1, 2, ..., 288, 289]), 'class_mode': 'categorical', 'dtype': 'float32', 'samples': 663, 'num_classes': 290, 'class_indices': {'arraya-andi': 0, 'arraya-marielle': 1, ...,'wagner-mancho': 288, 'wagner-richard': 289}, 'filenames': ['arraya-andi eg087_002_003_603-625-293-375.jpg', ..., 'wagner-richard\\sony-cybershot-20011204-1806002_001_201-163-141-172.jpg'], '_filepaths': ['F:/go/face_scrapper/faces/work/test/arraya-andi eg087_002_003_603-625-293-375.jpg', ..., 'F:/go/face_scrapper/faces/work/test/wagner-richard\\sony-cybershot-20011204-1806002_001_201-163-141-172.jpg'], 'n': 663, 'batch_size': 10, 'seed': None, 'shuffle': False, 'batch_index': 4, 'total_batches_seen': 140, 'lock': , 'index_array': array([ 0, 1, 2, ..., 661, 662]), 'index_generator': }
ID:(13799, 0)