| Type: | Package | 
| Title: | Post-Hurricane Damage Severity Classification from TLS and AI | 
| Version: | 0.0.5 | 
| Description: | Terrestrial laser scanning (TLS) data processing and post-hurricane damage severity classification at the individual tree level using deep Learning. Further details were published in Klauberg et al. (2023) <doi:10.3390/rs15041165>. | 
| License: | GPL-3 | 
| Encoding: | UTF-8 | 
| Depends: | R (≥ 3.5.0) | 
| Imports: | caret, ggplot2, grDevices, lidR, keras, matrixStats, reticulate, rgl, sf, tensorflow | 
| Suggests: | terra, viridis | 
| RoxygenNote: | 7.2.3 | 
| URL: | https://github.com/carlos-alberto-silva/rTLsDeep | 
| BugReports: | https://github.com/carlos-alberto-silva/rTLsDeep/issues | 
| NeedsCompilation: | no | 
| Packaged: | 2023-03-30 00:28:32 UTC; caioh | 
| Author: | Carine Klauberg [aut], Ricardo Dalagnol [aut, cph], Matheus Ferreira [aut, ctb], Jason Vogel [aut, ctb], Caio Hamamura [aut, ctb, cre], Carlos Alberto Silva [aut, cph] | 
| Maintainer: | Caio Hamamura <caiohamamura@gmail.com> | 
| Repository: | CRAN | 
| Date/Publication: | 2023-03-31 15:20:02 UTC | 
Confusion matrix
Description
This function calculates a cross-tabulation of reference and predicted classes with associated statistics based on the deep learning models.
Usage
confmatrix_treedamage(predict_class, test_classes, class_list)
Arguments
| predict_class | A vector with the predicted classes. This is the output from the predict_treedamage function. | 
| test_classes | A vector with the predicted classes. This is the output from the get_validation_classes function. | 
| class_list | A character string or numeric value describing the post-hurricane individual tree level damage classes, e.g.: c("1","2","3","4","5","6"). | 
Value
Returns the confusion matrix comparing predictions with the reference from validation dataset.
See Also
https://www.rdocumentation.org/packages/caret/versions/3.45/topics/confusionMatrix
Examples
# Set directory to tensorflow (python environment)
# This is required if running deep learning local computer with GPU
# Guide to install here: https://doi.org/10.5281/zenodo.3929709
tensorflow_dir = NA
# define model type
model_type = "simple"
#model_type = "vgg"
#model_type = "inception"
#model_type = "resnet"
#model_type = "densenet"
#model_type = "efficientnet"
# Image and model properties
# path to image folders - black
train_image_files_path <- system.file('extdata', 'train', package='rTLsDeep')
test_image_files_path <- system.file('extdata', 'validation', package='rTLsDeep')
img_width <- 256
img_height <- 256
class_list_train = unique(list.files(train_image_files_path))
class_list_test = unique(list.files(test_image_files_path))
lr_rate = 0.00003
target_size = c(img_width, img_height)
channels = 4
batch_size = 8L
epochs = 4L
# get model
model = get_dl_model(model_type=model_type,
                    img_width=img_width,
                    img_height=img_height,
                    channels=channels,
                    lr_rate = lr_rate,
                    tensorflow_dir = tensorflow_dir,
                    class_list = class_list_train)
# train model and return best weights
weights = fit_dl_model(model = model,
                                train_input_path = train_image_files_path,
                                test_input_path = test_image_files_path,
                                target_size = target_size,
                                batch_size = batch_size,
                                class_list = class_list_train,
                                epochs = epochs,
                                lr_rate = lr_rate)
# Predicting post-hurricane damage at the tree-level
tree_damage<-predict_treedamage(model=model,
                           input_file_path=test_image_files_path,
                           weights=weights,
                           target_size = c(256,256),
                           class_list=class_list_test,
                           batch_size = batch_size)
# Get damage classes for test datasets
classes<-get_validation_classes(file_path=test_image_files_path)
# Calculate, print and return confusion matrix
cm = confmatrix_treedamage(predict_class = tree_damage,
                          test_classes=classes,
                          class_list = class_list_test)
Fitting deep learning models for post-hurricane individual tree level damage classification
Description
This function fits deep learning models for post-hurricane individual tree level damage classification using TLS-derived 2D images
Usage
fit_dl_model(
  model,
  train_input_path,
  test_input_path,
  output_path = tempdir(),
  target_size = c(256, 256),
  batch_size = 8,
  class_list,
  epochs = 20L,
  lr_rate = 1e-04
)
Arguments
| model | A model object output of the get_dl_model function. See [rTLsDeep::get_dl_model()]. | 
| train_input_path | A character string describing the path to the training dataset, e.g.: "C:/train_data/". | 
| test_input_path | A character string describing the path to the testing dataset, e.g.: "C:/test_data/". | 
| output_path | A character string describing the path where to save the weights for the neural network. | 
| target_size | A vector of two values describing the image dimensions (Width and height) to be used in the model. Default: c(256,256) | 
| batch_size | A numerical value indicating the number of images to be processed at the same time. Reduce the batch_size if the GPU is giving memory errors. | 
| class_list | A character string or numeric value describing the post-hurricane individual tree level damage classes, e.g.: c("1","2","3","4","5","6"). | 
| epochs | A numeric value indicating the number of iterations to train the model. Use at least 20 for pre-trained models, and at least 200 for a model without pre-trained weights. | 
| lr_rate | A numeric value indicating the learning rate. Default: 0.0001. | 
Value
Returns a character string indicating the filename of the best weights trained for the chosen model.
Examples
# Set directory to tensorflow (python environment)
# This is required if running deep learning local computer with GPU
# Guide to install here: https://doi.org/10.5281/zenodo.3929709
tensorflow_dir = NA
# define model type
model_type = "simple"
#model_type = "vgg"
#model_type = "inception"
#model_type = "resnet"
#model_type = "densenet"
#model_type = "efficientnet"
train_image_files_path = system.file('extdata', 'train', package='rTLsDeep')
test_image_files_path = system.file('extdata', 'validation', package='rTLsDeep')
img_width <- 256
img_height <- 256
class_list_train = unique(list.files(train_image_files_path))
class_list_test = unique(list.files(test_image_files_path))
lr_rate = 0.0001
target_size <- c(img_width, img_height)
channels <- 4
batch_size = 8L
epochs = 2L
# get model
if (reticulate::py_module_available('tensorflow') == FALSE)
{
 tensorflow::install_tensorflow()
}
model = get_dl_model(model_type=model_type,
                    img_width=img_width,
                    img_height=img_height,
                    channels=channels,
                    lr_rate = lr_rate,
                    tensorflow_dir = tensorflow_dir,
                    class_list = class_list_train)
# train model and return best weights
weights = fit_dl_model(model = model,
                                train_input_path = train_image_files_path,
                                test_input_path = test_image_files_path,
                                target_size = target_size,
                                batch_size = batch_size,
                                class_list = class_list_train,
                                epochs = epochs,
                                lr_rate = lr_rate)
unlink('epoch_history', recursive = TRUE)
unlink('weights', recursive = TRUE)
unlink('weights_r_save', recursive = TRUE)
Plot confusion matrix
Description
This function plots the confusion matrix for classification assessment
Usage
gcmplot(
  cm,
  colors = c(low = "white", high = "#009194"),
  title = "cm",
  prop = TRUE
)
Arguments
| cm | An confusion matrix object of class "confusionMatrix". Output of the [rTLsDeep::confmatrix_damage()] function. | 
| colors | A vector defining the low and high colors. Default is c(low="white", high="#009194"). | 
| title | A character defining the title of the figure. | 
| prop | If TRUE percentage values will be plotted to the figure otherwise Freq. | 
Value
Returns an object of class gg and ggplot and plot of the confusion matrix.
Examples
# Path to rds file
rdsfile <- system.file("extdata", "cm_vgg.rds", package="rTLsDeep")
# Read RDS fo;e
cm_vgg<-readRDS(rdsfile)
# Plot confusion matrix
gcmplot_vgg<-gcmplot(cm_vgg,
                    colors=c(low="white", high="#009194"),
                    title="densenet")
Rotating calipers algorithm
Description
Calculates the minimum oriented bounding box using the rotating calipers algorithm.
Usage
getMinBBox(hull)
Arguments
| hull | A matrix of xy values from a convex hull from which will calculate the minimum oriented bounding box. | 
Grid snapshot
Description
This function captures a 2D grid snapshot of the TLS-derived 3D Point Cloud
Usage
getTLS2D(las, res = 0.05, by = "xz", func = ~list(Z = max(Z)), scale = TRUE)
Arguments
| las | An object of class LAS [lidR::readLAS()]. | 
| res | Numeric defining the resolution or grid cell size of the 2D image. | 
| by | Character defining the grid snapshot view: 'xz', 'yx' or 'xy'. Default: 'xz'. | 
| func | formula defining the equation to be passed in each grid. Default: ~list(Z = max(Z)). | 
| scale | if TRUE, the xyz coordinates will be scaled to local coordinates by subtracting their values to their corresponding minimum values (e.g. x - min(x). Default is TRUE. | 
Value
Returns an object of class SpatRaste containing the 2D grid snapshot of the TLS 3D point cloud.
Examples
#Loading lidR and viridis libraries
library(lidR)
library(viridis)
# Path to las file
lasfile <- system.file("extdata", "tree_c1.laz", package="rTLsDeep")
# Reading las file
las<-readLAS(lasfile)
# Visualizing las file
suppressWarnings(plot(las))
# Creating a 2D grid snapshot
func = ~list(Z = max(Z))
by="xz"
res=0.05
scale=TRUE
g<-getTLS2D(las, res=res, by=by, func = func, scale=scale)
# Visualizing 2D grid snapshot
plot(g, asp=TRUE, col=viridis::viridis(100),axes=FALSE, xlab="",ylab="")
# Exporting 2D grid snapshot as png file
output_png = paste0(tempfile(), '.png')
png(output_png, units="px", width=1500, height=1500)
terra::image(g, col=viridis::viridis(100))
dev.off()
Get best angle for plotting the tree
Description
Calculates the minimum oriented bounding box using the rotating calipers algorithm and extracts the angle
Usage
get_best_angle(las)
Arguments
| las | An object of class LAS [lidR::readLAS()]. | 
Value
Returns a list containing the model object with the required parameters and model_type used.
Examples
lasfile <- system.file("extdata", "tree_c2.laz", package = "rTLsDeep")
las <- lidR::readLAS(lasfile)
(get_best_angle(las))
Selecting deep learning modeling approaches
Description
This function selects and returns the deep learning approach to be used with the fit_dl_model function for post-hurricane individual tree-level damage classification.
Usage
get_dl_model(
  model_type = "vgg",
  img_width = 256,
  img_height = 256,
  lr_rate = 1e-04,
  tensorflow_dir = NA,
  channels,
  class_list
)
Arguments
| model_type | A character string describing the deep learning model to be used. Available models: "vgg", "resnet", "inception", "densenet", "efficientnet", "simple". | 
| img_width | A numeric value describing the width of the image used for training. Default: 256. | 
| img_height | A numeric value describing the height of the image used for training. Default: 256. | 
| lr_rate | A numeric value indicating the learning rate. Default: 0.0001. | 
| tensorflow_dir | A character string indicating the directory for the tensorflow python environment. Guide to install the environment here: https://doi.org/10.5281/zenodo.3929709. Default = NA. | 
| channels | A numeric value for the number of channels/bands of the input images. | 
| class_list | A character string or numeric value describing the post-hurricane individual tree level damage classes, e.g.: c("1","2","3","4","5","6"). | 
Value
Returns a list containing the model object with the required parameters and model_type used.
Examples
# Set directory to tensorflow (python environment)
# This is required if running deep learning local computer with GPU
# Guide to install here: https://doi.org/10.5281/zenodo.3929709
tensorflow_dir = NA
# define model type
model_type = "simple"
#model_type = "vgg"
#model_type = "inception"
#model_type = "resnet"
#model_type = "densenet"
#model_type = "efficientnet"
train_image_files_path = system.file('extdata', 'train', package='rTLsDeep')
test_image_files_path = system.file('extdata', 'validation', package='rTLsDeep')
img_width <- 256
img_height <- 256
class_list_train = unique(list.files(train_image_files_path))
class_list_test = unique(list.files(test_image_files_path))
lr_rate = 0.0001
target_size <- c(img_width, img_height)
channels = 4
# get model
if (reticulate::py_module_available('tensorflow') == FALSE)
{
 tensorflow::install_tensorflow()
}
model = get_dl_model(model_type=model_type,
                    img_width=img_width,
                    img_height=img_height,
                    channels=channels,
                    lr_rate = lr_rate,
                    tensorflow_dir = tensorflow_dir,
                    class_list = class_list_train)
Tree-level damage classes for validation datasets
Description
This function return the post-hurricane individual tree-level damage classes based on file names in a given directory.
Usage
get_validation_classes(file_path)
Arguments
| file_path | A character string indicating the path to the validation folders, one for each class. This folder must have sub folders with samples for each class. | 
Value
Returns the classes based on file names in a given folder.
Examples
# Image and model properties
val_image_files_path = system.file('extdata', 'validation', package='rTLsDeep')
# Get damage classes for validation datasets
classes = get_validation_classes(file_path=val_image_files_path)
Predict post-hurricane individual tree level damage
Description
This function predicts post-hurricane individual tree-level damage from TLS derived 2D images
Usage
predict_treedamage(
  model,
  input_file_path,
  weights,
  target_size = c(256, 256),
  class_list,
  batch_size = 8
)
Arguments
| model | A model object output of the get_dl_model function. See [rTLsDeep::get_dl_model()]. | 
| input_file_path | A character string describing the path to the images to predict, e.g.: "C:/test_data/". | 
| weights | A character string indicating the filename of the weights to use for prediction. | 
| target_size | A vector of two values describing the image dimensions (Width and height) to be used in the model. Default: c(256,256) | 
| class_list | A character string or numeric value describing the post-hurricane individual tree level damage classes, e.g.: c("1","2","3","4","5","6"). | 
| batch_size | A numerical value indicating the number of images to be processed at the same time. Reduce the batch_size if the GPU is giving memory errors. | 
Value
Returns a character string with the prediction classes.
Examples
# Set directory to tensorflow (python environment)
# This is required if running deep learning local computer with GPU
# Guide to install here: https://doi.org/10.5281/zenodo.3929709
tensorflow_dir = NA
# define model type
model_type = "simple"
#model_type = "vgg"
#model_type = "inception"
#model_type = "resnet"
#model_type = "densenet"
#model_type = "efficientnet"
train_image_files_path = system.file('extdata', 'train', package='rTLsDeep')
test_image_files_path = system.file('extdata', 'validation', package='rTLsDeep')
img_width <- 256
img_height <- 256
class_list_train = unique(list.files(train_image_files_path))
class_list_test = unique(list.files(test_image_files_path))
lr_rate = 0.0001
target_size <- c(img_width, img_height)
channels = 4
batch_size = 8L
epochs = 20L
# get model
model = get_dl_model(model_type=model_type,
                    img_width=img_width,
                    img_height=img_height,
                    lr_rate = lr_rate,
                    tensorflow_dir = tensorflow_dir,
                    channels = channels,
                    class_list = class_list_train)
# train model and return best weights
weights = fit_dl_model(model = model,
                                train_input_path = train_image_files_path,
                                test_input_path = test_image_files_path,
                                target_size = target_size,
                                batch_size = batch_size,
                                class_list = class_list_train,
                                epochs = epochs,
                                lr_rate = lr_rate)
# Predicting post-hurricane damage at the tree-level
tree_damage<-predict_treedamage(model=model,
                           input_file_path=test_image_files_path,
                           weights=weights,
                           target_size = c(256,256),
                           class_list=class_list_test,
                           batch_size = batch_size)
unlink('epoch_history', recursive = TRUE)
unlink('weights', recursive = TRUE)
unlink('weights_r_save', recursive = TRUE)
rTLsDeep: Set of tools for post-hurricane individual tree-level damage classification from terrestrial laser scanning and deep learning.
Description
The rTLSDeep package provides options for: i) rotating and deriving 2D images from TLS 3D point clouds ii) calibrating and validating convolutional neural network (CNN) architectures and iii) predicting post-hurricane damage severity at the individual tree level
Rotate TLS-derived 3D Point Clouds
Description
This function rotates TLS-derived 3D Point Clouds
Usage
tlsrotate3d(las, theta, by = "z", scale = TRUE)
Arguments
| las | An object of class LAS [lidR::readLAS()]. | 
| theta | Numeric defining the angle in degrees (from 0 to 360) for rotating the 3d point cloud. | 
| by | Character defining the rotation around x ('x'), y ('y') or z ('z') axis. Default: around z-axis. | 
| scale | if TRUE, the xyz coordinates will be scaled to local coordinates by subtracting their values to their corresponding minimum values (e.g. x - min(x). Default is TRUE. | 
Value
Returns an object of class LAS containing the rotated 3d point cloud.
Examples
# Path to las file
lasfile <- system.file("extdata", "tree_c1.laz", package="rTLsDeep")
# Reading las file
las<-lidR::readLAS(lasfile)
# Visualizing las file
suppressWarnings(lidR::plot(las))
# Rotating 3d point cloud around Z-axis
lasr<-tlsrotate3d(las,theta=180, by="x", scale=TRUE)
# Visualizing rotated las file
suppressWarnings(lidR::plot(lasr))
if (!rgl::rgl.useNULL())
 rgl::play3d(rgl::spin3d(axis = c(0, 0, 1), rpm = 5), duration = 10)