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()