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.
A transformada dct
será 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 dct
em 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))