Usuario:


Directorios

Storyboard

>Modelo

ID:(1779, 0)



Generar arreglo de directorios

Descripción

>Top


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

>Top


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

>Top


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

>Top


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

>Top


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

>Top


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

>Top


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

>Top


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)