knitr::opts_chunk$set(echo = TRUE)

Get training set and corresponding image feature data from DB

We want to have a baseline estimate to compare the Neural Network approach of Daniel.

library(data.table)
library(DBI)
library(jsonlite)
library(dplyr)
library(ggplot2)
library(rpart)
library(rattle)
library(caret)
library(ranger)
library(class)
dbConfig <- fromJSON("../config.json")

con <- dbConnect(RPostgreSQL::PostgreSQL(),
                 dbname = "FOGDB",
                 host = dbConfig[["host"]], port = 9418,
                 user = dbConfig[["user"]], password = dbConfig[["pw"]])
train <- readRDS("~/Desktop/Daniel/Training/ImageDescription2.rds")
test <- readRDS("~/Desktop/Daniel/Testing/ImageDescription2.rds")
selectedFeatures <- c("mean_edge", "change_point", #"fractal_dim",
                      "mean_hue", "mean_saturation", "mean_brightness")
sqlSelect <- "SELECT image_id, "
sqlSelect <- paste0(sqlSelect, paste(selectedFeatures, collapse = ", "))
sqlSelect <- paste0(sqlSelect, " FROM image_features WHERE image_id IN ")
sqlSelect <- paste0(sqlSelect,
                    "(", paste(train[, image_id], collapse = ", "),
                    ")")

trainFeatures <- as.data.table(dbGetQuery(con, sqlSelect))

sqlSelect <- "SELECT image_id, "
sqlSelect <- paste0(sqlSelect, paste(selectedFeatures, collapse = ", "))
sqlSelect <- paste0(sqlSelect, " FROM image_features WHERE image_id IN ")
sqlSelect <- paste0(sqlSelect,
                    "(", paste(test[, image_id], collapse = ", "),
                    ")")
testFeatures <- as.data.table(dbGetQuery(con, sqlSelect))
train <- merge(train, trainFeatures, by = "image_id")
train[, camera_id := as.factor(camera_id)]
test <- merge(test, testFeatures, by = "image_id")
test[, camera_id := as.factor(camera_id)]
NormalizeByMedian <- function(x) {
  (x - median(x)) / mad(x)
}

trainNorm <- train %>% 
  group_by(camera_id) %>%
  mutate(edges       = NormalizeByMedian(mean_edge)) %>%
  mutate(changepoint = NormalizeByMedian(change_point)) %>%
  mutate(hue         = NormalizeByMedian(mean_hue)) %>%
  mutate(saturation  = NormalizeByMedian(mean_saturation)) %>%
  mutate(brightness  = NormalizeByMedian(mean_brightness)) %>%
  select(camera_id, image_id, mor_visibility, vis_class,
         edges, changepoint, hue, saturation, brightness) %>%
  ungroup() %>% as.data.table()

testNorm <- test %>% 
  group_by(camera_id) %>%
  mutate(edges       = NormalizeByMedian(mean_edge)) %>%
  mutate(changepoint = NormalizeByMedian(change_point)) %>%
  mutate(hue         = NormalizeByMedian(mean_hue)) %>%
  mutate(saturation  = NormalizeByMedian(mean_saturation)) %>%
  mutate(brightness  = NormalizeByMedian(mean_brightness)) %>%
  select(camera_id, image_id, mor_visibility, vis_class,
         edges, changepoint, hue, saturation, brightness) %>%
  ungroup() %>% as.data.table()

ggplot(trainNorm, aes(x = mor_visibility, y = edges,
                      col = camera_id)) +
  scale_x_log10() +
  geom_point(alpha = 0.5)
dbDisconnect(con)

Based on the training set we obtain the following preliminary decision tree:

trainNorm[, vis_class_bi := vis_class == "A"]
fogTree <- rpart(vis_class ~ edges + changepoint + hue +
                   saturation + brightness,
                 trainNorm[camera_id==2 | camera_id==3],
                 control = rpart.control(cp = 0.01))
# fogTree <- ranger(vis_class ~ edges + changepoint + hue +
#                    saturation + brightness,
#                  trainNorm[camera_id==1])
# fancyRpartPlot(fogTree, sub="")
trainPred <- predict(fogTree, trainNorm[camera_id==2 | camera_id==3, ], type = "class")
confusionMat <- confusionMatrix(trainPred, trainNorm[camera_id==2 | camera_id==3, vis_class])
confusionMat$table
confusionMat$overall[1]

# trainNorm[camera_id==2 | camera_id==3, ][which(trainPred == "D" & trainNorm[camera_id==2 | camera_id==3, vis_class] == "A"), image_id]
testPred <- predict(fogTree, testNorm[camera_id==2 | camera_id==3], type = "class")
confusionMat <- confusionMatrix(testPred, testNorm[camera_id==2 | camera_id==3, vis_class])
confusionMat$table
confusionMat$overall[1]
testPred <- predict(fogTree, testNorm[camera_id==1], type = "class")
confusionMat <- confusionMatrix(testPred, testNorm[camera_id==1, vis_class])
confusionMat$table
confusionMat$overall[1]
testPred <- knn(trainNorm[camera_id==1, .(edges, changepoint, hue, saturation, brightness)], testNorm[camera_id==1, .(edges, changepoint, hue, saturation, brightness)], trainNorm[camera_id==1, vis_class])
confusionMat <- confusionMatrix(testPred, testNorm[camera_id==1, vis_class])
confusionMat$table
confusionMat$overall[1]


MartinRoth/fogDec documentation built on May 7, 2019, 3:38 p.m.