# version 11 denotes ,auto keras argumentation, no  validation
# version 12 denotes ,auto keras argumentation,  with validation

#version 13 denotes ,auto keras argumentation,  with validation, and flatten and fully connected
# version 2 denotes ,myself keras argumentation,  with validation
# version 3 denotes ,myself  argumentation using rotation,  with validation
import tensorflow as tf
import scipy
from tensorflow import keras
from tensorflow.keras.applications.inception_v3 import InceptionV3
from tensorflow.keras.applications import InceptionResNetV2
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.applications  import VGG16
from tensorflow.keras.preprocessing import image
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D
from tensorflow.keras.layers import Flatten
from tensorflow.keras import backend as K
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.layers import Input
import warnings
from tensorflow.keras.optimizers import SGD
from PIL import Image
from scipy.io import savemat
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import os
import numpy as np
import os

from keras_applications.resnet_common import ResNet152
#from keras.models import load_model
from numpy.random import seed
#seed(1)
from tensorflow import set_random_seed
#set_random_seed(2)

warnings.filterwarnings('ignore')

##########################################################
#define models, igsize, running times
fold_num='10'
commonpath='/home/amax/mydata/NRtexture3/data/data-10-fold-cross-validation/'+fold_num+'fold/'
trainPath = '/home/amax/mydata/NRtexture3/data/data-10-fold-cross-validation/'+fold_num+'fold/train/'
validpath='/home/amax/mydata/NRtexture3/data/data-10-fold-cross-validation/'+fold_num+'fold/valid/'
resultfolder='/home/amax/mydata/NRtexture3/results_10fold'

#trainPath = '/home/amax/mydata/NRtexture/train-moredots0'
#resultfolder='/home/amax/mydata/NRtexture/results-moredots0'


evalPath = '/home/amax/mydata/NRtexture3/data/data-10-fold-cross-validation/'+fold_num+'fold/test/'
visualPath = evalPath
#visualPath = '/home/amax/mydata/NRtexture/test/test2_visual'
model_num=3#0 for InceptionV3,
            # 1 for resnert 50,
            # 2 for restnet 152,
            # 3 for InceptionResNetV2
##########################################################  modify runing times
runTimes=6




##########################################################
igSize=0

if model_num==0:
    igSize=299
    resultfolder=resultfolder+'/InceptionV3'
elif model_num==1:
    igSize = 224
    resultfolder = resultfolder + '/Res50'
elif model_num==2:
    igSize = 224
    resultfolder = resultfolder + '/Res152'
elif model_num==3:
    igSize = 299
    resultfolder = resultfolder + '/InceptionResV2'
else:
    print ('undefine model')
resultfolder = resultfolder + '/fold'+fold_num






input_tensor = Input(shape=(igSize, igSize, 3))


if model_num==0:
    base_model = InceptionV3(input_tensor=input_tensor,
                             input_shape=(igSize, igSize, 3),
                             weights='imagenet',
                             include_top=False)
elif model_num==1:
    base_model = ResNet50(input_tensor=input_tensor,
                             input_shape=(igSize, igSize, 3),
                             weights='imagenet',
                             include_top=False)
elif model_num==2:
    base_model = ResNet152(input_tensor=input_tensor,
                             input_shape=(igSize, igSize, 3),
                             weights='imagenet',
                             include_top=False)
elif model_num==3:
    #base_model=tf.keras.models.load_model('v3_fold10_fromscratch.h5')
    #base_model = tf.keras.models.load_model('v3_3fold_pretrained_epoch100.h5')

    base_model = InceptionResNetV2(input_tensor=input_tensor,
                                   input_shape=(igSize, igSize, 3),
                                   weights='imagenet',
                                   include_top=False)
else:
    print ('undefine model')



m = Model(inputs=base_model.inputs, outputs=base_model.get_layer("conv_7b").output)# output 8,8,1536

iii=0
for folderr in ['train/', 'test/','valid/']:
#for folderr in ['valid/']:
    for classnum in  ['0/','1/']:
        directory=commonpath +folderr+ classnum
        for filename in os.listdir(directory):
            if 'jpg' in filename:
                iii=iii+1
                path=directory+filename
                imagemy= tf.keras.preprocessing.image.load_img(path, target_size=(igSize, igSize, 3))
                #imagemy=imagemy.astype('float32')
                imagemy=tf.keras.preprocessing.image.img_to_array(imagemy)
                imagemy = imagemy / 255.0
                imagemy=np.array([imagemy])

                value=base_model.predict(imagemy)
                f = m.predict(imagemy)

                savepath= '/home/amax/mydata/NRtexture3/data/convolutional feature/'+'InceptionResV2_imagenet/'
                savepath=savepath+fold_num+'fold/'+ folderr +classnum
                if not os.path.exists(savepath):
                    os.makedirs(savepath)
                savepath=savepath + filename+'.mat'
                scipy.io.savemat(savepath, {'f': f})
    #print(np.std(p), np.mean(p))
print(iii)