Download images and annotations: BCCD dataset.
Split dataset into train, validation and test set
library(tidyverse) library(platypus) library(abind) library(here) BCCD_path <- here("development/BCCD/") annot_path <- file.path(BCCD_path, "Annotations/") images_path <- file.path(BCCD_path, "JPEGImages/") c("train", "valid", "test") %>% walk(~ { dir.create(file.path(BCCD_path, .)) dir.create(file.path(BCCD_path, ., "Annotations/")) dir.create(file.path(BCCD_path, ., "JPEGImages/")) }) annot_paths <- list.files(annot_path, full.names = TRUE) images_paths <- list.files(images_path, full.names = TRUE) n_samples <- length(annot_paths) set.seed(111) train_ids <- sample(1:n_samples, round(0.8 * n_samples)) valid_ids <- sample(setdiff(1:n_samples, train_ids), round(0.19 * n_samples)) test_ids <- setdiff(1:n_samples, c(train_ids, valid_ids)) walk2(c("train", "valid", "test"), list(train_ids, valid_ids, test_ids), ~ { annots <- annot_paths[.y] images <- images_paths[.y] dir_name <- .x annots %>% walk(~ file.copy(., gsub("BCCD", paste0("BCCD/", dir_name), .))) images %>% walk(~ file.copy(., gsub("BCCD", paste0("BCCD/", dir_name), .))) })
Generate custom anchor boxes:
blood_labels <- c("Platelets", "RBC", "WBC") n_class <- length(blood_labels) net_h <- 416 # Must be divisible by 32 net_w <- 416 # Must be divisible by 32 anchors_per_grid <- 3 blood_anchors <- generate_anchors( anchors_per_grid = anchors_per_grid, # Number of anchors (per one grid) to generate annot_path = annot_path, # Annotations directory labels = blood_labels, # Class labels n_iter = 10, # Number of k-means++ iterations annot_format = "pascal_voc", # Annotations format seed = 55, # Random seed centroid_fun = mean # Centroid function ) blood_anchors
Build YOLOv3
model (you can load YOLOv3 Darknet weights trained on COCO dataset. Download pre-trained weights from here):
blood_yolo <- yolo3( net_h = net_h, # Input image height net_w = net_w, # Input image width grayscale = FALSE, # Should images be loaded as grayscale or RGB n_class = n_class, # Number of object classes (80 for COCO dataset) anchors = blood_anchors # Anchor boxes ) blood_yolo %>% load_darknet_weights(here("development/yolov3.weights")) # Optional blood_yolo
Compile the model with correct loss and metrics:
blood_yolo %>% compile( optimizer = optimizer_adam(lr = 1e-5), loss = yolo3_loss(blood_anchors, n_class = n_class), metrics = yolo3_metrics(blood_anchors, n_class = n_class) )
Create data generators:
train_blood_yolo_generator <- yolo3_generator( annot_path = file.path(BCCD_path, "train", "Annotations/"), images_path = file.path(BCCD_path, "train", "JPEGImages/"), net_h = net_h, net_w = net_w, batch_size = 16, shuffle = FALSE, labels = blood_labels ) valid_blood_yolo_generator <- yolo3_generator( annot_path = file.path(BCCD_path, "valid", "Annotations/"), images_path = file.path(BCCD_path, "valid", "JPEGImages/"), net_h = net_h, net_w = net_w, batch_size = 16, shuffle = FALSE, labels = blood_labels )
Fit the model:
blood_yolo %>% fit_generator( generator = blood_yolo_generator, epochs = 1000, steps_per_epoch = 19, validation_data = valid_blood_yolo_generator, validation_steps = 5, callbacks = list(callback_model_checkpoint("development/BCCD/blood_w.hdf5", save_best_only = TRUE, save_weights_only = TRUE) ) )
Predict on new images:
blood_yolo <- yolo3( net_h = net_h, net_w = net_w, grayscale = FALSE, n_class = n_class, anchors = blood_anchors ) blood_yolo %>% load_model_weights_hdf5(here("development/BCCD/blood_w.hdf5")) test_blood_yolo_generator <- yolo3_generator( annot_path = file.path(BCCD_path, "test", "Annotations/"), images_path = file.path(BCCD_path, "test", "JPEGImages/"), net_h = net_h, net_w = net_w, batch_size = 4, shuffle = FALSE, labels = blood_labels ) test_preds <- predict_generator(blood_yolo, test_blood_yolo_generator, 1) test_boxes <- get_boxes(test_preds, blood_anchors, blood_labels, obj_threshold = 0.6) test_boxes
Plot / save images with predicted bounding boxes:
plot_boxes( images_paths = list.files(file.path(BCCD_path, "test", "JPEGImages/"), full.names = TRUE), boxes = test_boxes, labels = blood_labels, save_dir = BCCD_path)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.