Preparación de imagenes
Previo a la complementación de los modelos, es necesario convertir
las imágenes de los espectrogramas para las 6 especies en arreglos de
matrices.
Inicialmente se separan las imágenes en train y test. Para esto se
crean 2 nuevos folder donde se dividirán las imágenes con un split, con
el 80% de las imágenes para el train, y el 20% restantes para el
test.
El código utilizado para realizar esta separación de los datos es el
siguiente:
folder_list <- birds
folder_list %>% as.character()
## [1] "brnowl" "comsan" "houspa" "mallar3" "norcar" "skylar"
# set.seed(123)
#
# folder_path <- paste0('C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/Pruebas/', folder_list, "/")
# folder_path
#
# folder_train <- 'C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/train/'
# folder_test <- 'C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/test/'
#
# # Obtener la lista de carpetas en la carpeta "Pruebas"
# lista_carpetas <- list.dirs(folder_path)
# lista_carpetas
#
# # Obtener el número de imágenes en cada carpeta
# numero_imagenes <- unlist(lapply(lista_carpetas, function(x) {
# length(list.files(x))
# }))
# numero_imagenes
#
# # Calcular el número de imágenes para el conjunto de entrenamiento
# numero_imagenes_entrenamiento <- round(0.8 * 500)
# numero_imagenes_entrenamiento
#
# # Crear una lista con las imágenes para el conjunto de entrenamiento
# imagenes_entrenamiento <- lapply(lista_carpetas, function(x) {
# sample(list.files(x), numero_imagenes_entrenamiento)
# })
#
# # Mover las imágenes del conjunto de entrenamiento a la carpeta "train"
# for (i in 1:length(imagenes_entrenamiento)) {
# for (imagen in imagenes_entrenamiento[[i]]) {
# print(paste0(folder_path[i], imagen))
# file.copy(from = paste0(folder_path[i], imagen), to= paste0(folder_train, folder_list[[i]] ,"/",imagen))
# }
# }
#
# # Obtener el número de imágenes restantes
# numero_imagenes_restantes <- 500 - numero_imagenes_entrenamiento
# Crear lista vacia para guardar las imagenes que se guardaran en test
# imagenes_prueba <- list()
# for (i in 1:length(folder_list)){
# imagenes_prueba[[i]] <-list.files(lista_carpetas[i])[!list.files(lista_carpetas[i]) %in% imagenes_entrenamiento[[i]]]
# }
#
# # Mover las imágenes del conjunto de prueba a la carpeta "test"
# for (i in 1:length(imagenes_prueba)) {
# for (imagen in imagenes_prueba[[i]]) {
# print(paste0(folder_path[i], imagen))
# file.copy(from = paste0(folder_path[i], imagen), to= paste0(folder_test, folder_list[[i]] ,"/",imagen))
# }
# }
A continuación se activa un ambiente en Python, el cual es necesario
para utilizar las librerías de manipulación de imágenes.
library(reticulate)
reticulate::use_condaenv("tf_image", required = TRUE)
# reticulate::py_install("scipy")
# library(tidyverse)
library(imager)
library(keras)
library(caret)
library(purrr)
options(scipen = 999)
Carpetas con las imágenes de entrenamientos de las 6 especies:
set.seed(123)
folder_path <- paste0('C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/train/', folder_list, "/")
folder_path
## [1] "C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/train/brnowl/"
## [2] "C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/train/comsan/"
## [3] "C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/train/houspa/"
## [4] "C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/train/mallar3/"
## [5] "C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/train/norcar/"
## [6] "C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/train/skylar/"
En el siguiente código se obtiene un listado con cada uno de los
espectrogramas para cada especie:
# Nombres de los archivos
file_name <-purrr::map(folder_path,
function(x) paste0(x, list.files(x))
) %>%
unlist()
head(file_name)
## [1] "C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/train/brnowl/XC115605.jpeg"
## [2] "C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/train/brnowl/XC120974.jpeg"
## [3] "C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/train/brnowl/XC121413.jpeg"
## [4] "C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/train/brnowl/XC138038.jpeg"
## [5] "C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/train/brnowl/XC138041.jpeg"
## [6] "C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/train/brnowl/XC138613.jpeg"
Cantidad de imágenes de entrenamiento:
## [1] 2400
A continuación se muestran algunas de las imágenes de
entrenamiento:
sample_image <- sample(file_name, 12)
# cargar imagenes
img <- map(sample_image, load.image)
par(mfrow = c(2, 4))
map(img, plot)

## [[1]]
## Image. Width: 295 pix Height: 1025 pix Depth: 1 Colour channels: 3
##
## [[2]]
## Image. Width: 316 pix Height: 1025 pix Depth: 1 Colour channels: 3
##
## [[3]]
## Image. Width: 267 pix Height: 1025 pix Depth: 1 Colour channels: 3
##
## [[4]]
## Image. Width: 232 pix Height: 1025 pix Depth: 1 Colour channels: 3
##
## [[5]]
## Image. Width: 2303 pix Height: 1025 pix Depth: 1 Colour channels: 3
##
## [[6]]
## Image. Width: 499 pix Height: 1025 pix Depth: 1 Colour channels: 3
##
## [[7]]
## Image. Width: 1567 pix Height: 1025 pix Depth: 1 Colour channels: 3
##
## [[8]]
## Image. Width: 1551 pix Height: 1025 pix Depth: 1 Colour channels: 3
##
## [[9]]
## Image. Width: 744 pix Height: 1025 pix Depth: 1 Colour channels: 3
##
## [[10]]
## Image. Width: 484 pix Height: 1025 pix Depth: 1 Colour channels: 3
##
## [[11]]
## Image. Width: 988 pix Height: 1025 pix Depth: 1 Colour channels: 3
##
## [[12]]
## Image. Width: 814 pix Height: 1025 pix Depth: 1 Colour channels: 3
Se puede obtener información sobre la estructura de las imágenes: alto,
ancho y canales de color.
# información de la imagen
img <- load.image(file_name[1])
img
## Image. Width: 529 pix Height: 1025 pix Depth: 1 Colour channels: 3
La anterior imagen tiene un ancho de 1292 pixeles y un alto de 1025,
profundidad de 1, y con 3 canales de color.
Ahora se genera una función que permita extraer el ancho y alto de
las imágenes. Esto es necesario, debido a que las imágenes deben tener
las mismas dimensiones antes de ser ingresadas en los modelos.
# Función para adquirir en ancho y alto de la imagen
get_dim <- function(x){
img <- load.image(x)
df_img <- data.frame(height = height(img),
width = width(img),
filename = x
)
return(df_img)
}
get_dim(file_name[1])
## height width
## 1 1025 529
## filename
## 1 C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/train/brnowl/XC115605.jpeg
Se escoge a continuación una muestra de imágenes, para identificar el
ancho y alto de cada una. Al observar los resultados, se logra apreciar
que las imágenes de entrenamiento tienen la misma altura, pero distintos
anchos. Para poder utilizar estas imágenes para los modelos de
clasificación, se deben redimensionar todas las imágenes para que tengan
el mismo ancho y altura.
set.seed(123)
sample_file <- sample(file_name, 500)
file_dim <- map_df(sample_file, get_dim)
summary(file_dim)
## height width filename
## Min. :1025 Min. : 158.0 Length:500
## 1st Qu.:1025 1st Qu.: 418.8 Class :character
## Median :1025 Median : 859.0 Mode :character
## Mean :1025 Mean : 2038.8
## 3rd Qu.:1025 3rd Qu.: 1849.0
## Max. :1025 Max. :62882.0
Se establecen las dimensiones que tendrán las iamgenes, y el tamaño
del lote de entrenamiento para la red neuronal convolucional que se
entrenará como primer modelo.
# ancho y alto deseado
target_size <- c(224, 224)
# tamaño del batch para el modelo
batch_size <- 32
Tambien se deben escalar las imágenes para poder trabajar con ellas.
Para esto se normalizan las características de entrada dividiendo cada
valor de píxel por 255. Esto escala los valores de píxel en el rango [0,
1].
# Generador de imagenes
train_data_gen <- image_data_generator(rescale = 1/255,
validation_split = 0.2
)
Ahora se genera el dataset de entrenamiento y el de validación. Se
van a manejar los 3 canales de color, las dimensiones de las imágenes
serán de 224 x 224, y se normalizaran los pixeles.
# Training Dataset
train_image_array_gen <- flow_images_from_directory(directory = "C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/train/", #
target_size = target_size,
color_mode = "rgb",
batch_size = batch_size ,
seed = 123,
subset = "training",
generator = train_data_gen
)
## Found 1920 images belonging to 6 classes.
# Validation Dataset
val_image_array_gen <- flow_images_from_directory(directory = "C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/train/",
target_size = target_size,
color_mode = "rgb",
batch_size = batch_size ,
seed = 123,
subset = "validation",
generator = train_data_gen
)
## Found 480 images belonging to 6 classes.
Se verifica, a continuación, si la proporción de datos en el set de
entranmeinto para cada especie es igual.
train_samples <- train_image_array_gen$n # numero de datos de entrenamiento
valid_samples <- val_image_array_gen$n # numero de datos de validacion
output_n <- n_distinct(train_image_array_gen$classes) # numero de clases
# proporción de datos por clase
table("\nFrequency" = factor(train_image_array_gen$classes)
) %>%
prop.table()
##
## Frequency
## 0 1 2 3 4 5
## 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667