Tensorflow2_Keras_CNN_Modle

from __future__ import absolute_import, division, print_function, unicode_literals
from tensorflow import keras
from sklearn.model_selection import train_test_split
import tensorflow as tf
import pathlib
import random
import matplotlib.pyplot as plt
import numpy as np
import shutil
import matplotlib.image as mpimg
import os

AUTOTUNE = tf.data.experimental.AUTOTUNE
os.environ["CUDA_VISIBLE_DEVICES"] = "1"
def classification_tran_test_files(rootdir,train_ratio):
    fs = []
    fileCount=0
    tran_ratio=train_ratio
    for root, dirs, files in os.walk(rootdir, topdown=True):
        for name in files:
            _, ending = os.path.splitext(name)
            if ending == ".jpg":
                fs.append(os.path.join(root, name))
                fileCount=len(fs)
    for x in fs:
        if os.path.dirname(x)!=rootdir :
            shutil.move(x, rootdir)

    fs = []
    tran_count=int(tran_ratio*fileCount)
    test_count=fileCount-tran_count

    for root, dirs, files in os.walk(rootdir, topdown=True):
        for name in files:
            _, ending = os.path.splitext(name)
            if ending == ".jpg":
                fs.append(os.path.join(root, name))
                fileCount=len(fs)
                random.shuffle(fs)


    i=0
    for x in fs :
      if(i<tran_count):
          # if not os.path.isdir(rootdir+"\\tran"):
           os.makedirs(rootdir+"\\train", mode=0o777, exist_ok=True)
           shutil.move(x, rootdir+"\\train")
      else:
          os.makedirs(rootdir + "\\test", mode=0o777, exist_ok=True)
          shutil.move(x, rootdir + "\\test")
      i=i+1
    print("Total : "+str(fileCount))
    print("Tran : "+ str(tran_count))
    print("Test : "+ str(test_count))
def path_to_image_Label_npdata(folder_path):
    data_path = pathlib.Path(folder_path)
    all_image_paths = list(data_path.glob('*/*'))
    all_image_paths = [str(path) for path in all_image_paths]  # 所有图片路径的列表
    random.shuffle(all_image_paths)  # 打散
    label_names = sorted(item.name for item in data_path.glob('*/') if item.is_dir())
    label_to_index = dict((name, index) for index, name in enumerate(label_names))
    all_image_labels = [label_to_index[pathlib.Path(path).parent.name] for path in all_image_paths]
    i=0
    # all_images=0
    all_images=0
    # all_images = np.append(image_preprocess(all_image_paths))
    for item in all_image_paths:
        all_images=all_images+image_preprocess(item)
    print(len(all_image_labels))
    return all_images,all_image_labels
def folderPath_to_train_test_split(folder_path,train_ratio,random_num):

    data_path = pathlib.Path(folder_path)
    # all_image_paths = list(data_path.glob('*/*'))
    all_image_paths = list(data_path.glob('*/train/*'))
    all_image_paths = [str(path) for path in all_image_paths]  # 所有图片路径的列表
    random.shuffle(all_image_paths)  # 打散
    dataCount = len(all_image_paths)
    # print(dataCount)
    # print(all_image_paths[:5])
    label_names = sorted(item.name for item in data_path.glob('*/') if item.is_dir())
    # print(label_names)

    #train and Test file use  classification_tran_test_files
    all_image_paths2=[]
    for path in all_image_paths :
       all_image_paths2.append(path.replace("train\\",""))
    #

    label_to_index = dict((name, index) for index, name in enumerate(label_names))
    print(label_to_index)
    all_image_labels = [label_to_index[pathlib.Path(path).parent.name] for path in all_image_paths2]
    X_train, X_test, y_train, y_test = train_test_split(all_image_paths, all_image_labels, train_size=train_ratio,                                                                         random_state=random_num)
    print("train_Size :"+str(  len(X_train)))
    print("train_Size :" + str(len(X_test)))

    X_train2=[]
    X_test2 = []
    for item in X_train:
        X_train2.append(image_preprocess(item))
    for item in X_test:
        X_test2.append(image_preprocess(item))
    return  X_train2, X_test2, y_train, y_test,label_to_index
def image_preprocess(image_path):
    image = tf.io.read_file(image_path)  # 读取图片
    image = tf.image.decode_jpeg(image, channels=3)
    image = tf.image.resize(image, [64, 64])  # 原始图片大小为(266, 320, 3),重设为(192, 192)
    image /= 255.0  # 归一化到[0,1]范围
    return image
def imagePath_to_predict(model,image_path):
    predict_image = image_preprocess(image_path)
    # print(predict_image.shape)  # (64, 64, 3)
    predict_image = np.expand_dims(predict_image, axis=0)
    # print(predict_image.shape)  # (1, 64, 64, 3)
    predict_label = model.predict(predict_image)
    predict_label_index = np.argmax(predict_label, axis=1)
    return predict_label_index
def imagePaths_to_predict_and_showImage(model,image_path,image_number,disp_Row,disp_cow):

    all_image_paths=[]
    for (dirpath, dirnames, filenames) in os.walk(image_path):
        for filename in filenames:
            all_image_paths += [os.path.join(dirpath, filename)]
    images_list=[]
    image_predict_label=[]
    for item in all_image_paths:
        images_list.append(mpimg.imread(item))
        a = imagePath_to_predict(model, item)
        image_predict_label.append(list(label_to_index.keys())[list(label_to_index.values()).index(a)])

    plt.axis('off')  # 不显示坐标轴
    plt.show()
    for i in range(image_number):
        plt.subplot(disp_Row, disp_cow, i + 1)  # (row ,col ,now)
        plt.xticks([])
        plt.yticks([])
        plt.grid(False)
        plt.imshow(images_list[i])
        plt.xlabel(image_predict_label[i])
    plt.show()
def create_Karase_CNN_Model(Classification_number):
    model = keras.Sequential()
    model.add(tf.keras.layers.Conv2D(32, (12, 12), activation='relu', input_shape=(64, 64, 3)))
    model.add(tf.keras.layers.MaxPooling2D((2, 2)))
    model.add(keras.layers.AlphaDropout(rate=0.3))
    model.add(tf.keras.layers.Conv2D(64, (6, 6), activation='relu'))
    model.add(tf.keras.layers.MaxPooling2D((2, 2)))
    model.add(keras.layers.AlphaDropout(rate=0.3))
    model.add(tf.keras.layers.Conv2D(128, (3, 3), activation='relu'))
    model.add(tf.keras.layers.MaxPooling2D((2, 2)))
    model.add(keras.layers.AlphaDropout(rate=0.5))
    model.add(tf.keras.layers.Flatten())
    model.add(tf.keras.layers.Dense(Classification_number, activation='softmax'))
    return model
def plt_accuracy_and_loss():
    loss = history.history['loss']
    val_loss = history.history['val_loss']
    epochs = range(1, len(loss) + 1)
    plt.plot(epochs, loss, 'r', label='Training loss')
    plt.plot(epochs, val_loss, 'b', label='Validation loss')
    plt.title('Training And Validation Loss')
    plt.xlabel('Epochs')
    plt.ylabel('Loss')
    plt.legend()
    plt.show()
    plt.clf()
    acc = history.history['accuracy']
    val_acc = history.history['val_accuracy']
    plt.plot(epochs, acc, 'r', label='Training acc')
    plt.plot(epochs, val_acc, 'b', label='Validation acc')
    plt.title('Training And Validation Accuracy')
    plt.xlabel('Epochs')
    plt.ylabel('Accuracy')
    plt.legend()
    plt.show()
if __name__ == "__main__":
    X_train, X_test, y_train, y_test,label_to_index=folderPath_to_train_test_split("C:\\Users\\JP\\Desktop\\17flowers",0.9,30)
    epochs_count=50
    steps_per_epoch_num=1
    model=create_Karase_CNN_Model(4)
    # model.load_weights("TestModel_weights")
    model.compile(optimizer=tf.keras.optimizers.Adam
                 (lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0),
                  loss='sparse_categorical_crossentropy',
                  metrics = ['accuracy'])
    model.summary()
    X_train = tf.convert_to_tensor(X_train)
    y_train = tf.convert_to_tensor(y_train)
    X_test = tf.convert_to_tensor(X_test)
    y_test = tf.convert_to_tensor(y_test)
    print(X_train.shape)
    print(X_test.shape)

    history = model.fit(X_train,y_train, epochs=epochs_count,
                        validation_data=(X_test,y_test))
    # history = model.fit(X_train, y_train, epochs=epochs_count, steps_per_epoch=steps_per_epoch_num,
    #                     validation_data=(X_test, y_test))

    # predict_label_index=imagePath_to_predict(model,"C:\\Users\\JP\\Desktop\\17flowers\\buttercup\\image_1121.jpg")
    # print(predict_label_index)
    # print(list(label_to_index.keys())[list(label_to_index.values()).index(predict_label_index)])
    imagePaths_to_predict_and_showImage(model,r"C:\Users\JP\Desktop\17flowers\coltsFoot\test",4,2,2)

    # model.save("TestModel.h5")
    # # model.save_weights("TestModel_weights")
    plt_accuracy_and_loss()

 

posted @ 2020-02-22 22:27  JerryPan  阅读(107)  评论(0)    收藏  举报