cam2model workflow

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

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
)
#> Rows: 2 Columns: 3
#> ── Column specification ────────────────────────────────────────────────────────
#> Delimiter: ","
#> chr (2): Directory, FileName
#> dbl (1): File_hour
#> 
#> ℹ Use `spec()` to retrieve the full column specification for this data.
#> ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

sampled
#> # A tibble: 2 × 4
#>   Directory                                  FileName File_hour file_path       
#>   <chr>                                      <chr>        <dbl> <chr>           
#> 1 /tmp/RtmpU5bHnX/cam2model_src_6e3457b0d066 img1.jpg         9 /tmp/RtmpU5bHnX…
#> 2 /tmp/RtmpU5bHnX/cam2model_src_6e3457b0d066 img2.jpg        14 /tmp/RtmpU5bHnX…

Optional plot

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)

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")]
#>        id batch_folder_name   dest_file_name  status
#> 1 img_001         batch_001 img_001_img1.jpg dry_run
#> 2 img_002         batch_001 img_002_img2.jpg dry_run

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

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
)
#> Rows: 2 Columns: 3
#> ── Column specification ────────────────────────────────────────────────────────
#> Delimiter: ","
#> chr (2): Directory, FileName
#> dbl (1): File_hour
#> 
#> ℹ Use `spec()` to retrieve the full column specification for this data.
#> ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

sampled
#> # A tibble: 2 × 4
#>   Directory                                  FileName File_hour file_path       
#>   <chr>                                      <chr>        <dbl> <chr>           
#> 1 /tmp/RtmpU5bHnX/cam2model_src_6e34427afcb2 img1.jpg         9 /tmp/RtmpU5bHnX…
#> 2 /tmp/RtmpU5bHnX/cam2model_src_6e34427afcb2 img2.jpg        14 /tmp/RtmpU5bHnX…

Plot opcional

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)

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")]
#>        id batch_folder_name   dest_file_name  status
#> 1 img_001         batch_001 img_001_img1.jpg dry_run
#> 2 img_002         batch_001 img_002_img2.jpg dry_run