Este relatório tem como objetivo principal o aumento de Dados com imagem. Sera um continuação do relatório http://rpubs.com/JulhinhaM/DigitRecognizer, logo sera utilizado a base de dados dos digítos e a pratica de feature engineering. O aumento do dataset, se dara no aumento das dimensões de linhas e colunas.

Criar novas linhas e colunas.

A transformada dctserá utilizada para criar novas colunas, pois essa pode ser aplicada em imagens. Primeiro carrega uma imagem com o numero quatro.

suppressMessages(suppressWarnings(library(magick)))
img <- image_read("quatro.png")
plot(img)

Convertendo a imagem e fazendo os ajustes

img <- image_read("quatro.png") %>% 
  image_scale(geometry = 28) %>% 
  image_data(channels = "gray") %>% 
  .[1, , ] %>% 
  as.numeric() %>% 
  matrix(nrow = 28,ncol = 28,byrow = TRUE) %>% 
  apply(2,rev) %>% # Pra rotacionar
  t()  

img %>% 
  image() 

Aplicando a transformada dct,utilizando o pacote mrbsizeR.

dct28 <- mrbsizeR::dctMatrix(28) 
aplica_dct <- function(x){
  x <- x/255
  q <- x %>% 
    matrix(28,28,byrow = T) %>% 
    apply(2,rev) %>% 
    t()
  q <- t(dct28)%*%q%*%dct28
  return( as.numeric(q) )
}

img %>% 
  aplica_dct() %>% 
  matrix(28,28,byrow = T) %>% 
  head()
##            [,1]       [,2]       [,3]       [,4]        [,5]         [,6]
## [1,] 14.6076199 -4.5645468  3.4969950 -2.0505122  1.76151762 -1.064669321
## [2,] -4.3254878  1.2502970 -1.1786136  0.8242283 -0.67939971  0.125765390
## [3,]  3.2526548 -1.0040006  0.4610961 -0.5660329  0.31609599 -0.127314537
## [4,] -1.9967154  0.7137687 -0.3873121  0.1647508 -0.08955135  0.280065689
## [5,]  1.6220781 -0.5877768  0.4228431 -0.1151111  0.36171900 -0.141957523
## [6,] -0.9754082  0.2528617 -0.3330893  0.2174282 -0.10407070  0.005715265
##             [,7]        [,8]        [,9]       [,10]       [,11]
## [1,]  1.18264071 -0.87315159  1.06842527 -0.53573326  0.72475593
## [2,] -0.20817782  0.47162324 -0.48204884  0.05110212 -0.08230965
## [3,]  0.39021830 -0.19949399  0.15283326 -0.02094665  0.15909403
## [4,] -0.27259840 -0.01741389 -0.08791830  0.06843048 -0.13049810
## [5,] -0.02235212 -0.17247039  0.16905712 -0.03589557  0.09483385
## [6,] -0.16425933  0.06274141  0.04646826  0.13132130 -0.13747906
##            [,12]       [,13]       [,14]       [,15]        [,16]
## [1,] -0.33494101  0.76477053 -0.33414532  0.50878821 -0.115336241
## [2,]  0.15992513 -0.39135700  0.07428731 -0.03911883  0.037056011
## [3,] -0.18679313  0.15006594  0.01148055  0.06813739 -0.079910844
## [4,]  0.08868334 -0.04209940  0.01506061 -0.07489318  0.046780695
## [5,] -0.02762839  0.07777365 -0.02803413  0.08611839 -0.033035045
## [6,] -0.05959185 -0.01123332  0.04956096 -0.08141875  0.005801358
##             [,17]        [,18]       [,19]       [,20]       [,21]
## [1,]  0.522557945 -0.201776202  0.40100108  0.03751185  0.35548093
## [2,] -0.254975307  0.097553159 -0.05810649 -0.05513207 -0.14430668
## [3,]  0.170354093  0.009692337  0.01718119 -0.01836287  0.14257576
## [4,] -0.072296229 -0.031554510 -0.04037120  0.04741622 -0.07581406
## [5,]  0.021812453 -0.001435987  0.07801964 -0.02603729  0.01781957
## [6,] -0.009104959  0.028723883 -0.02826471 -0.01836514 -0.03129389
##             [,22]        [,23]       [,24]        [,25]        [,26]
## [1,] -0.053860443  0.337048151  0.11256908  0.219397198  0.093651414
## [2,]  0.061610089 -0.112112068 -0.06624514 -0.042705843 -0.021231339
## [3,] -0.009092404 -0.009493222  0.03276980  0.118488023 -0.015341206
## [4,] -0.036954437  0.024127862  0.01294442 -0.101639648  0.004786173
## [5,]  0.027576029  0.055715844 -0.01160915  0.014826450  0.032426706
## [6,]  0.026337054 -0.032848136 -0.03343909 -0.005380708  0.004070082
##            [,27]        [,28]
## [1,]  0.23867352  0.144493489
## [2,] -0.10602619 -0.023284585
## [3,] -0.01721723  0.083738648
## [4,]  0.04247120 -0.075375750
## [5,]  0.03891602 -0.001004663
## [6,] -0.03225029 -0.001783210
# Imagem
img %>% 
  aplica_dct() %>% 
  matrix(28,28,byrow = T) %>% 
  apply(2,rev) %>% 
  t() %>% 
  image()

Acima temos a imagem com a transformada.

Aplicamos o dctem um unico digito, agora vamos aplicar na base do record digits

test <- read.csv("/opt/datasets/digits/test.csv")
label <- read.csv("/opt/datasets/digits/sample_submission.csv")
train <- read.csv("/opt/datasets/digits/train.csv")



train2<-train
train <- train2 %>%
  mutate(Flag = sample(x = c(0, 1),
                      size = n(),
                      replace = TRUE,
                      prob = c(.8,.2))) %>%
  sample_frac(1, replace = FALSE)


set.seed(100)

x_train <- train %>% 
  filter(Flag == 0) %>% 
  select(-label, -Flag) %>% 
  mutate_all(function(x) x/255) %>% 
  as.matrix()

y_train <- train %>% 
  filter(Flag == 0) %>% 
  select(label)  %>% as.matrix() %>% 
  keras::to_categorical(num_classes = 10)

# Aplicando na base de treino
x_train_transf <- x_train %>% 
  apply(1,aplica_dct) %>% 
  t()

Aumentando o número de observações.

aplica_inversao <- function(x,theta){ # Theta eh o angulo de rotacao
  x %>% 
    matrix(28,28,byrow = T) %>%
    imager::as.cimg() %>% 
    imager::rotate_xy(theta,15,15) %>% 
    as.vector() %>% 
    return()
}

# Rotacao 45º
as.numeric(img) %>% aplica_inversao(45) %>% matrix(28,28,byrow = T) %>% image()

Aplicando na base de treino.

# Aplicando à base de dados
x_train_inversao_45 <- x_train %>% 
  apply(1,aplica_inversao,45) %>% 
  t()
  
x_train_inversao_90 <- x_train %>% 
  apply(1,aplica_inversao,90) %>% 
  t()

x_train_inversao_45_dct <- x_train_transf %>% 
  apply(1,aplica_inversao,45) %>% 
  t()

x_train_inversao_90_dct <- x_train_transf %>% 
  apply(1,aplica_inversao,90) %>% 
  t()

# Juntando as matrizes
x_train_max <- cbind(rbind(x_train,x_train_inversao_45,x_train_inversao_90),
                     rbind(x_train_transf,x_train_inversao_45_dct,
                           x_train_inversao_90_dct))