library(keras)
library(tensorflow)
inpath = trainpath
dnall = list.files(inpath, full.names = FALSE)
dn = dnall[c(-1, -2, -3, -4)]

flyers_train = dn[1:350]
flyers_test  = dn[351: 435]

Hums_train = dn[436:785]
Hums_test  = dn[786: 870]

Phos_train = dn[870:1165]
Phos_test  = dn[1166: 1316]

+ Train data

set.seed(1234)
TF = sample(1:350,20,replace=F)
sort(TF)
##  [1]   4  40  62  77  80  89  96  99 176 185 213 217 218 221 228 236 281
## [18] 298 312 338
TH = sample(436:785,20,replace=F)
sort(TH)
##  [1] 449 451 491 496 503 511 522 525 538 541 546 591 606 616 690 703 715
## [18] 720 749 765
TP = sample(870:1165,20,replace=F)
sort(TP)
##  [1]  891  913  918  940  958  961  966 1008 1010 1011 1012 1016 1033 1052
## [15] 1060 1066 1073 1079 1089 1105
mypic_Train_FHP = c(dn[sort(TF)], dn[sort(TH)], dn[sort(TP)] )
mypic_Train_FHP
##  [1] "Fly_003.png"  "Fly_039.png"  "Fly_061.png"  "Fly_076.png" 
##  [5] "Fly_079.png"  "Fly_088.png"  "Fly_095.png"  "Fly_098.png" 
##  [9] "Fly_175.png"  "Fly_184.png"  "Fly_212.png"  "Fly_216.png" 
## [13] "Fly_217.png"  "Fly_220.png"  "Fly_227.png"  "Fly_235.png" 
## [17] "Fly_280.png"  "Fly_297.png"  "Fly_311.png"  "Fly_337.png" 
## [21] "Hum_448.png"  "Hum_450.png"  "Hum_490.png"  "Hum_495.png" 
## [25] "Hum_502.png"  "Hum_510.png"  "Hum_521.png"  "Hum_524.png" 
## [29] "Hum_537.png"  "Hum_540.png"  "Hum_545.png"  "Hum_590.png" 
## [33] "Hum_605.png"  "Hum_615.png"  "Hum_689.png"  "Hum_702.png" 
## [37] "Hum_714.png"  "Hum_719.png"  "Hum_748.png"  "Hum_764.png" 
## [41] "Pho_0890.jpg" "Pho_0912.jpg" "Pho_0917.jpg" "Pho_0939.jpg"
## [45] "Pho_0957.jpg" "Pho_0960.jpg" "Pho_0965.jpg" "Pho_1007.jpg"
## [49] "Pho_1009.jpg" "Pho_1010.jpg" "Pho_1011.jpg" "Pho_1015.jpg"
## [53] "Pho_1032.jpg" "Pho_1051.jpg" "Pho_1059.jpg" "Pho_1065.jpg"
## [57] "Pho_1072.jpg" "Pho_1078.jpg" "Pho_1088.jpg" "Pho_1104.jpg"

+ test data

set.seed(4512)

GF = sample(351: 435,10,replace=F)
sort(GF)
##  [1] 370 385 387 402 404 408 412 421 425 433
GH = sample(786: 870,10,replace=F)
sort(GH)
##  [1] 788 817 819 832 838 847 856 857 858 869
GP = sample(1166: 1316,10,replace=F)
sort(GP)
##  [1] 1174 1201 1216 1230 1252 1254 1265 1269 1279 1293
mypic_Test_FHP = c(dn[sort(GF)], dn[sort(GH)],dn[sort(GP)]  )
mypic_Test_FHP
##  [1] "Fly_369.png"  "Fly_384.png"  "Fly_386.png"  "Fly_401.png" 
##  [5] "Fly_403.png"  "Fly_407.png"  "Fly_411.png"  "Fly_420.png" 
##  [9] "Fly_424.png"  "Fly_432.png"  "Hum_787.png"  "Hum_816.png" 
## [13] "Hum_818.png"  "Hum_831.png"  "Hum_837.png"  "Hum_846.png" 
## [17] "Hum_855.png"  "Hum_856.png"  "Hum_857.png"  "Hum_868.png" 
## [21] "Pho_1173.jpg" "Pho_1200.jpg" "Pho_1215.jpg" "Pho_1229.jpg"
## [25] "Pho_1251.jpg" "Pho_1253.jpg" "Pho_1264.jpg" "Pho_1268.jpg"
## [29] "Pho_1278.png" "Pho_1292.jpg"

+ image file : read, format to RGB, normalize and resize

+ 60 object Images for training

+ 30 object Images for testing

+ matrix file for training or testing

+ Categorize Object-images

trainme60 = c( (1:20 %/% 1:20)*0 , ((1:20 %/% 1:20))*1 , ((1:20 %/% 1:20))+ 1 )
 testme30 = c( (1:10 %/% 1:10)*0 , ((1:10 %/% 1:10))*1 , ((1:10 %/% 1:10))+ 1 )

trainLabels60 = to_categorical(as.array(trainme60) )
testLabels30 = to_categorical(as.array(testme30) )

+ Construct CNN Model

model = keras_model_sequential()

model %>%
  layer_conv_2d(filters = 32,
                kernel_size = c(3,3),
                activation = "relu",
                input_shape = c(100,100,3)) %>%
  layer_conv_2d(filters = 32,
                kernel_size = c(3,3),
                activation = "relu") %>%
  layer_max_pooling_2d(pool_size = c(2,2)) %>%
  layer_dropout(rate = 0.25) %>%
  layer_conv_2d(filters = 64,
                kernel_size = c(3,3),
                activation = "relu") %>%
  layer_conv_2d(filters = 64,
                kernel_size = c(3,3),
                activation = "relu") %>%
  layer_max_pooling_2d(pool_size = c(2,2)) %>%
  layer_dropout(rate = 0.25) %>%
  layer_flatten() %>%
  layer_dense(units = 256, activation = "relu")%>%
  layer_dropout(rate=0.25)%>%
  layer_dense(units = 3, activation = "softmax") %>%

  compile(loss = "categorical_crossentropy",
          optimizer = optimizer_sgd(lr = 0.01,
                                     decay =1e-6,
                                     momentum = 0.9,
                                     nesterov=T),
          metrics = c("accuracy"))
summary(model)
## ___________________________________________________________________________
## Layer (type)                     Output Shape                  Param #     
## ===========================================================================
## conv2d (Conv2D)                  (None, 98, 98, 32)            896         
## ___________________________________________________________________________
## conv2d_1 (Conv2D)                (None, 96, 96, 32)            9248        
## ___________________________________________________________________________
## max_pooling2d (MaxPooling2D)     (None, 48, 48, 32)            0           
## ___________________________________________________________________________
## dropout (Dropout)                (None, 48, 48, 32)            0           
## ___________________________________________________________________________
## conv2d_2 (Conv2D)                (None, 46, 46, 64)            18496       
## ___________________________________________________________________________
## conv2d_3 (Conv2D)                (None, 44, 44, 64)            36928       
## ___________________________________________________________________________
## max_pooling2d_1 (MaxPooling2D)   (None, 22, 22, 64)            0           
## ___________________________________________________________________________
## dropout_1 (Dropout)              (None, 22, 22, 64)            0           
## ___________________________________________________________________________
## flatten (Flatten)                (None, 30976)                 0           
## ___________________________________________________________________________
## dense (Dense)                    (None, 256)                   7930112     
## ___________________________________________________________________________
## dropout_2 (Dropout)              (None, 256)                   0           
## ___________________________________________________________________________
## dense_1 (Dense)                  (None, 3)                     771         
## ===========================================================================
## Total params: 7,996,451
## Trainable params: 7,996,451
## Non-trainable params: 0
## ___________________________________________________________________________

+ fit model : first run

TrainResult60 = model %>%
              fit(traincomb_FHP_df  ,
                  trainLabels60,
                  epochs = 50,
                  batch_size = 60,
                  validation_split = 0.2 )
plot(TrainResult60)

+ fit model : second run

TrainResult60 = model %>%
              fit(traincomb_FHP_df  ,
                  trainLabels60,
                  epochs = 50,
                  batch_size = 60,
                  validation_split = 0.2 )
plot(TrainResult60)

+ fit model : third run

TrainResult60 = model %>%
              fit(traincomb_FHP_df  ,
                  trainLabels60,
                  epochs = 50,
                  batch_size = 60,
                  validation_split = 0.2 )
plot(TrainResult60)

+ fit model : fourth run

TrainResult60 = model %>%
              fit(traincomb_FHP_df  ,
                  trainLabels60,
                  epochs = 50,
                  batch_size = 60,
                  validation_split = 0.2 )
plot(TrainResult60)

+ evaluation and prediction for train data

model %>% evaluate(traincomb_FHP_df, trainLabels60)
## $loss
## [1] 0.5420191
## 
## $acc
## [1] 0.9166667
pred = model %>% predict_classes(traincomb_FHP_df)

tab60 = table(PredictCls = pred, ActualCls = trainme60)
tab60
##           ActualCls
## PredictCls  0  1  2
##          0 20  0  5
##          1  0 20  0
##          2  0  0 15
Actualobj = trainme60
Actualobj[trainme60 == "0"] = "Flyer"
Actualobj[trainme60 == "1"] = "HFace"
Actualobj[trainme60 == "2"] = "Phone"

prob = model %>% predict_proba(traincomb_FHP_df)


predtrain.df = data.frame(cbind(1:60, round(prob, 4)*100, PredCls = pred, ActuCls = trainme60))

colnames(predtrain.df) = c( "Index", "Prob_Flyer" , "Prob_Face" , "Prob_Phone" , "PredCls", "ActuCls" )
predtrain.df["ActuObjs"] = Actualobj
Index Prob_Flyer Prob_Face Prob_Phone PredCls ActuCls ActuObjs
1 99.99 0.00 0.01 0 0 Flyer
2 99.98 0.00 0.02 0 0 Flyer
3 99.40 0.04 0.56 0 0 Flyer
4 99.50 0.00 0.50 0 0 Flyer
5 99.99 0.01 0.00 0 0 Flyer
6 99.86 0.00 0.14 0 0 Flyer
7 100.00 0.00 0.00 0 0 Flyer
8 96.11 3.50 0.39 0 0 Flyer
9 99.44 0.34 0.22 0 0 Flyer
10 99.99 0.00 0.01 0 0 Flyer
11 100.00 0.00 0.00 0 0 Flyer
12 97.17 1.51 1.33 0 0 Flyer
13 91.23 2.25 6.52 0 0 Flyer
14 98.22 0.10 1.67 0 0 Flyer
15 99.97 0.01 0.01 0 0 Flyer
16 99.97 0.00 0.03 0 0 Flyer
17 94.11 0.58 5.31 0 0 Flyer
18 99.99 0.00 0.01 0 0 Flyer
19 100.00 0.00 0.00 0 0 Flyer
20 100.00 0.00 0.00 0 0 Flyer
21 0.00 100.00 0.00 1 1 HFace
22 0.01 99.99 0.00 1 1 HFace
23 0.00 100.00 0.00 1 1 HFace
24 0.02 99.98 0.00 1 1 HFace
25 0.18 99.82 0.00 1 1 HFace
26 0.00 100.00 0.00 1 1 HFace
27 0.00 100.00 0.00 1 1 HFace
28 0.00 100.00 0.00 1 1 HFace
29 0.00 100.00 0.00 1 1 HFace
30 0.00 100.00 0.00 1 1 HFace
31 0.00 100.00 0.00 1 1 HFace
32 0.00 100.00 0.00 1 1 HFace
33 0.00 100.00 0.00 1 1 HFace
34 0.00 100.00 0.00 1 1 HFace
35 0.00 100.00 0.00 1 1 HFace
36 0.00 100.00 0.00 1 1 HFace
37 0.00 100.00 0.00 1 1 HFace
38 0.00 100.00 0.00 1 1 HFace
39 0.00 100.00 0.00 1 1 HFace
40 0.00 100.00 0.00 1 1 HFace
41 0.22 0.00 99.78 2 2 Phone
42 0.39 0.00 99.61 2 2 Phone
43 0.05 0.00 99.95 2 2 Phone
44 0.00 0.00 100.00 2 2 Phone
45 0.00 0.00 100.00 2 2 Phone
46 0.00 0.00 100.00 2 2 Phone
47 0.25 0.00 99.75 2 2 Phone
48 0.01 0.00 99.99 2 2 Phone
49 0.00 0.00 100.00 2 2 Phone
50 0.03 0.00 99.97 2 2 Phone
51 40.54 0.00 59.46 2 2 Phone
52 100.00 0.00 0.00 0 2 Phone
53 96.23 3.76 0.01 0 2 Phone
54 97.76 0.00 2.24 0 2 Phone
55 94.61 0.28 5.11 0 2 Phone
56 0.76 0.00 99.24 2 2 Phone
57 2.51 0.00 97.49 2 2 Phone
58 0.00 0.00 100.00 2 2 Phone
59 86.37 0.26 13.37 0 2 Phone
60 38.77 13.83 47.40 2 2 Phone

+ evaluation and prediction - test data

model %>% evaluate(testcomb_FHP_df, testLabels30)
## $loss
## [1] 1.492401
## 
## $acc
## [1] 0.8666667
pred = model %>% predict_classes(testcomb_FHP_df)

tab30 = table(PredictCls = pred, ActualCls = testme30)
tab30
##           ActualCls
## PredictCls  0  1  2
##          0 10  0  4
##          1  0 10  0
##          2  0  0  6
Actualobj = testme30
Actualobj[testme30 == "0"] = "Flyer"
Actualobj[testme30 == "1"] = "HFace"
Actualobj[testme30 == "2"] = "Phone"


prob = model %>% predict_proba(testcomb_FHP_df)

predtest.df = data.frame(1:30, cbind(round(prob, 4)*100, PredictCls = pred, ActualCls = testme30) )
colnames(predtest.df) = c("Index", "Prob_Flyer" , "Prob_Face" , "Prob_Phone" , "PredCls", "ActuCls" )
predtest.df["ActuObjs"] = Actualobj
Index Prob_Flyer Prob_Face Prob_Phone PredCls ActuCls ActuObjs
1 99.98 0.00 0.02 0 0 Flyer
2 89.12 10.81 0.07 0 0 Flyer
3 98.34 0.04 1.62 0 0 Flyer
4 89.23 10.75 0.02 0 0 Flyer
5 99.71 0.28 0.02 0 0 Flyer
6 99.70 0.29 0.01 0 0 Flyer
7 96.56 3.44 0.00 0 0 Flyer
8 100.00 0.00 0.00 0 0 Flyer
9 99.97 0.02 0.01 0 0 Flyer
10 99.19 0.81 0.00 0 0 Flyer
11 0.00 100.00 0.00 1 1 HFace
12 0.00 100.00 0.00 1 1 HFace
13 0.00 100.00 0.00 1 1 HFace
14 0.00 100.00 0.00 1 1 HFace
15 1.36 98.64 0.00 1 1 HFace
16 0.00 100.00 0.00 1 1 HFace
17 1.70 98.29 0.00 1 1 HFace
18 0.00 100.00 0.00 1 1 HFace
19 0.00 100.00 0.00 1 1 HFace
20 0.00 100.00 0.00 1 1 HFace
21 38.93 0.00 61.07 2 2 Phone
22 0.00 0.00 100.00 2 2 Phone
23 0.06 0.00 99.94 2 2 Phone
24 0.00 0.00 100.00 2 2 Phone
25 98.53 0.00 1.47 0 2 Phone
26 9.45 0.00 90.55 2 2 Phone
27 100.00 0.00 0.00 0 2 Phone
28 100.00 0.00 0.00 0 2 Phone
29 3.25 0.00 96.75 2 2 Phone
30 100.00 0.00 0.00 0 2 Phone