--- title: "cam2model workflow" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{cam2model workflow} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set(collapse = TRUE, comment = "#>") ``` # English version ## Objective This guide documents an end-to-end workflow for preparing camera trap data: `rename_images() -> process_metadata() -> generate_plot() (optional) -> process_training_images() -> copy_in_batches()`. ## Inputs, outputs, and generated files by stage | Stage | Minimum input | In-memory output | Files written | |---|---|---|---| | `rename_images()` | `input_dir` containing images | Result tibble (or a list with `plan` + `result`) | Creates a site folder and copies renamed files | | `process_metadata()` | Folder containing renamed images | Metadata tibble | Writes a metadata CSV | | `generate_plot()` | Data frame and columns used for aesthetics | `ggplot` object | None | | `process_training_images()` | CSV with `Directory` and `FileName` | Sample tibble | Creates `dest_dir`, writes sample and annotation CSVs, and optionally copies images | | `copy_in_batches()` | Data frame with `id` and `path` | Report data frame | Creates batch folders and copies files (or simulates the operation with `dry_run`) | ## Reproducible pipeline with temporary paths ```{r} library(cam2model) # Temporary paths raw_dir <- tempfile("cam2model_raw_") renamed_dir <- tempfile("cam2model_renamed_") train_dir <- tempfile("cam2model_train_") batch_dir <- tempfile("cam2model_batches_") dir.create(raw_dir, recursive = TRUE) dir.create(renamed_dir, recursive = TRUE) dir.create(train_dir, recursive = TRUE) # NOTE: rename_images() and process_metadata() require real images (EXIF). # These calls are shown for reference; the following stages use synthetic data. # renamed <- rename_images( # input_dir = raw_dir, # output_dir = renamed_dir, # site_name = "demo_site" # ) # metadata <- process_metadata( # output_dir = renamed_dir, # output_file = "metadata.csv", # UserComment = FALSE # ) # ------------------------------------------------------------------ # Minimal synthetic metadata to demonstrate process_training_images() # ------------------------------------------------------------------ src_dir <- tempfile("cam2model_src_") dir.create(src_dir, recursive = TRUE) img1 <- file.path(src_dir, "img1.jpg") img2 <- file.path(src_dir, "img2.jpg") writeBin(charToRaw("x"), img1) writeBin(charToRaw("y"), img2) metadata_tbl <- data.frame( Directory = c(src_dir, src_dir), FileName = c("img1.jpg", "img2.jpg"), File_hour = c(9, 14), stringsAsFactors = FALSE ) metadata_csv <- tempfile("cam2model_metadata_", fileext = ".csv") readr::write_csv(metadata_tbl, metadata_csv) sampled <- process_training_images( metadata_file = metadata_csv, dest_dir = train_dir, output_sample_file = "sampled_images.csv", output_annotation_file = "annotation_data.csv", sample_proportion = 1, copy_images = FALSE, show_progress = FALSE ) sampled ``` ## Optional plot ```{r} plot_data <- data.frame( Image_dttm = as.POSIXct("2024-08-01 00:00:00", tz = "UTC") + 0:3 * 3600, bLuma = c(120, 130, 125, 140), Camera = c("C1", "C1", "C2", "C2") ) generate_plot( processed_metadata = plot_data, x = Image_dttm, y = bLuma, color = Camera, facets = Camera ) ``` ## Batch copying (dry run) ```{r} batch_report <- copy_in_batches( df = data.frame( id = sprintf("img_%03d", seq_len(nrow(sampled))), path = sampled$file_path, stringsAsFactors = FALSE ), output_dir = batch_dir, batch_size = 250L, dry_run = TRUE, verbose = FALSE ) batch_report[, c("id", "batch_folder_name", "dest_file_name", "status")] ``` --- # Spanish version ## Objetivo Esta guía documenta un flujo end-to-end para preparar datos de cámaras trampa: `rename_images() -> process_metadata() -> generate_plot() (opcional) -> process_training_images() -> copy_in_batches()`. ## Tabla de entrada/salida/artefactos por etapa | Etapa | Entrada mínima | Salida en memoria | Artefactos en disco | |---|---|---|---| | `rename_images()` | `input_dir` con imágenes | tibble de resultados (o lista con `plan` + `result`) | crea carpeta de sitio y copia archivos renombrados | | `process_metadata()` | carpeta con imágenes renombradas | tibble de metadatos | escribe CSV de metadatos | | `generate_plot()` | data frame + columnas para estética | objeto `ggplot` | ninguno | | `process_training_images()` | CSV con `Directory`, `FileName` | tibble de muestra | crea `dest_dir`, escribe CSV de muestra y CSV de anotación, copia opcional | | `copy_in_batches()` | data frame con `id`, `path` | data frame de reporte | crea carpetas por lote y copia (o simulación con `dry_run`) | ## Pipeline reproducible con rutas temporales ```{r} library(cam2model) # Rutas temporales raw_dir <- tempfile("cam2model_raw_") renamed_dir <- tempfile("cam2model_renamed_") train_dir <- tempfile("cam2model_train_") batch_dir <- tempfile("cam2model_batches_") dir.create(raw_dir, recursive = TRUE) dir.create(renamed_dir, recursive = TRUE) dir.create(train_dir, recursive = TRUE) # NOTA: rename_images() y process_metadata() requieren imágenes reales (EXIF). # Este ejemplo mantiene esas llamadas como referencia y usa un flujo sintético # para etapas posteriores. # renamed <- rename_images( # input_dir = raw_dir, # output_dir = renamed_dir, # site_name = "demo_site" # ) # metadata <- process_metadata( # output_dir = renamed_dir, # output_file = "metadata.csv", # UserComment = FALSE # ) # ------------------------------------------------------------------ # Metadatos mínimos sintéticos para demostrar process_training_images() # ------------------------------------------------------------------ src_dir <- tempfile("cam2model_src_") dir.create(src_dir, recursive = TRUE) img1 <- file.path(src_dir, "img1.jpg") img2 <- file.path(src_dir, "img2.jpg") writeBin(charToRaw("x"), img1) writeBin(charToRaw("y"), img2) metadata_tbl <- data.frame( Directory = c(src_dir, src_dir), FileName = c("img1.jpg", "img2.jpg"), File_hour = c(9, 14), stringsAsFactors = FALSE ) metadata_csv <- tempfile("cam2model_metadata_", fileext = ".csv") readr::write_csv(metadata_tbl, metadata_csv) sampled <- process_training_images( metadata_file = metadata_csv, dest_dir = train_dir, output_sample_file = "sampled_images.csv", output_annotation_file = "annotation_data.csv", sample_proportion = 1, copy_images = FALSE, show_progress = FALSE ) sampled ``` ## Plot opcional ```{r} plot_data <- data.frame( Image_dttm = as.POSIXct("2024-08-01 00:00:00", tz = "UTC") + 0:3 * 3600, bLuma = c(120, 130, 125, 140), Camera = c("C1", "C1", "C2", "C2") ) generate_plot( processed_metadata = plot_data, x = Image_dttm, y = bLuma, color = Camera, facets = Camera ) ``` ## Copia por lotes (simulación) ```{r} batch_report <- copy_in_batches( df = data.frame( id = sprintf("img_%03d", seq_len(nrow(sampled))), path = sampled$file_path, stringsAsFactors = FALSE ), output_dir = batch_dir, batch_size = 250L, dry_run = TRUE, verbose = FALSE ) batch_report[, c("id", "batch_folder_name", "dest_file_name", "status")] ```