Skip to content

Commit 5f86052

Browse files
authored
Add files via upload
1 parent 2ceae9a commit 5f86052

1 file changed

Lines changed: 225 additions & 0 deletions

File tree

Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
# -*- coding: utf-8 -*-
2+
"""
3+
Created on Wed Jul 7 18:54:36 2021
4+
@author: xiuzhang CSDN
5+
参考:刘润森老师博客 推荐大家关注 很厉害的一位CV大佬
6+
https://maoli.blog.csdn.net/article/details/117688738
7+
"""
8+
import numpy as np
9+
import pandas as pd
10+
from IPython.display import display
11+
import csv
12+
from PIL import Image
13+
from scipy.ndimage import rotate
14+
15+
#----------------------------------------------------------------
16+
# 第一步 读取数据
17+
#----------------------------------------------------------------
18+
#训练数据images和labels
19+
letters_training_images_file_path = "dataset/csvTrainImages 13440x1024.csv"
20+
letters_training_labels_file_path = "dataset/csvTrainLabel 13440x1.csv"
21+
#测试数据images和labels
22+
letters_testing_images_file_path = "dataset/csvTestImages 3360x1024.csv"
23+
letters_testing_labels_file_path = "dataset/csvTestLabel 3360x1.csv"
24+
25+
#加载数据
26+
training_letters_images = pd.read_csv(letters_training_images_file_path, header=None)
27+
training_letters_labels = pd.read_csv(letters_training_labels_file_path, header=None)
28+
testing_letters_images = pd.read_csv(letters_testing_images_file_path, header=None)
29+
testing_letters_labels = pd.read_csv(letters_testing_labels_file_path, header=None)
30+
print("%d个32x32像素的训练阿拉伯字母图像" % training_letters_images.shape[0])
31+
print("%d个32x32像素的测试阿拉伯字母图像" % testing_letters_images.shape[0])
32+
print(training_letters_images.head())
33+
print(np.unique(training_letters_labels))
34+
35+
36+
#----------------------------------------------------------------
37+
# 第二步 数值转换为图像特征
38+
#----------------------------------------------------------------
39+
#原始数据集被反射使用np.flip翻转它 通过rotate旋转从而获得更好的图像
40+
def convert_values_to_image(image_values, display=False):
41+
#转换成32x32
42+
image_array = np.asarray(image_values)
43+
image_array = image_array.reshape(32,32).astype('uint8')
44+
#翻转+旋转
45+
image_array = np.flip(image_array, 0)
46+
image_array = rotate(image_array, -90)
47+
#图像显示
48+
new_image = Image.fromarray(image_array)
49+
if display == True:
50+
new_image.show()
51+
return new_image
52+
53+
convert_values_to_image(training_letters_images.loc[0], True)
54+
55+
56+
#----------------------------------------------------------------
57+
# 第三步 图像标准化处理
58+
#----------------------------------------------------------------
59+
training_letters_images_scaled = training_letters_images.values.astype('float32')/255
60+
training_letters_labels = training_letters_labels.values.astype('int32')
61+
testing_letters_images_scaled = testing_letters_images.values.astype('float32')/255
62+
testing_letters_labels = testing_letters_labels.values.astype('int32')
63+
print("Training images of letters after scaling")
64+
print(training_letters_images_scaled.shape)
65+
print(training_letters_images_scaled[0:5])
66+
67+
68+
#----------------------------------------------------------------
69+
# 第四步 输出One-hot编码转换
70+
#----------------------------------------------------------------
71+
import keras
72+
from keras.utils import to_categorical
73+
number_of_classes = 28
74+
training_letters_labels_encoded = to_categorical(training_letters_labels-1,
75+
num_classes=number_of_classes)
76+
testing_letters_labels_encoded = to_categorical(testing_letters_labels-1,
77+
num_classes=number_of_classes)
78+
print(training_letters_labels)
79+
print(training_letters_labels_encoded)
80+
print(training_letters_images_scaled.shape)
81+
# (13440, 1024)
82+
83+
84+
#----------------------------------------------------------------
85+
# 第五步 形状修改
86+
#----------------------------------------------------------------
87+
#输入形状 32x32x1
88+
training_letters_images_scaled = training_letters_images_scaled.reshape([-1, 32, 32, 1])
89+
testing_letters_images_scaled = testing_letters_images_scaled.reshape([-1, 32, 32, 1])
90+
print(training_letters_images_scaled.shape,
91+
training_letters_labels_encoded.shape,
92+
testing_letters_images_scaled.shape,
93+
testing_letters_labels_encoded.shape)
94+
# (13440, 32, 32, 1) (13440, 28) (3360, 32, 32, 1) (3360, 28)
95+
96+
97+
#----------------------------------------------------------------
98+
# 第六步 CNN模型设计
99+
#----------------------------------------------------------------
100+
from keras.models import Sequential
101+
from keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D, BatchNormalization, Dropout, Dense
102+
103+
#定义模型
104+
def create_model(optimizer='adam', kernel_initializer='he_normal', activation='relu'):
105+
#第一个卷积层
106+
model = Sequential()
107+
model.add(Conv2D(filters=64, kernel_size=3, padding='same', input_shape=(32, 32, 1), kernel_initializer=kernel_initializer, activation=activation))
108+
model.add(BatchNormalization())
109+
model.add(MaxPooling2D(pool_size=2))
110+
model.add(Dropout(0.2))
111+
model.add(GlobalAveragePooling2D())
112+
113+
#全连接层输出28类结果
114+
model.add(Dense(28, activation='softmax'))
115+
116+
#损失函数定义
117+
model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer=optimizer)
118+
return model
119+
120+
#创建模型
121+
model = create_model(optimizer='Adam', kernel_initializer='uniform', activation='relu')
122+
model.summary()
123+
124+
125+
#----------------------------------------------------------------
126+
# 第七步 模型绘制
127+
#----------------------------------------------------------------
128+
from keras.utils.vis_utils import plot_model
129+
from IPython.display import Image as IPythonImage
130+
131+
plot_model(model, to_file="model.png", show_shapes=True)
132+
display(IPythonImage('model.png'))
133+
134+
135+
#----------------------------------------------------------------
136+
# 第八步 模型训练+输出结果
137+
#----------------------------------------------------------------
138+
from keras.callbacks import ModelCheckpoint
139+
from sklearn.metrics import classification_report
140+
import matplotlib.pyplot as plt
141+
142+
#绘制图形
143+
def plot_loss_accuracy(history):
144+
# Loss
145+
plt.figure(figsize=[8,6])
146+
plt.plot(history.history['loss'],'r',linewidth=3.0)
147+
plt.plot(history.history['val_loss'],'b',linewidth=3.0)
148+
plt.legend(['Training loss', 'Validation Loss'],fontsize=18)
149+
plt.xlabel('Epochs ',fontsize=16)
150+
plt.ylabel('Loss',fontsize=16)
151+
plt.title('Loss Curves',fontsize=16)
152+
153+
# Accuracy
154+
plt.figure(figsize=[8,6])
155+
plt.plot(history.history['accuracy'],'r',linewidth=3.0)
156+
plt.plot(history.history['val_accuracy'],'b',linewidth=3.0)
157+
plt.legend(['Training Accuracy', 'Validation Accuracy'],fontsize=18)
158+
plt.xlabel('Epochs ',fontsize=16)
159+
plt.ylabel('Accuracy',fontsize=16)
160+
plt.title('Accuracy Curves',fontsize=16)
161+
162+
#混淆矩阵
163+
def get_predicted_classes(model, data, labels=None):
164+
image_predictions = model.predict(data)
165+
predicted_classes = np.argmax(image_predictions, axis=1)
166+
true_classes = np.argmax(labels, axis=1)
167+
return predicted_classes, true_classes, image_predictions
168+
169+
def get_classification_report(y_true, y_pred):
170+
print(classification_report(y_true, y_pred, digits=4)) #小数点4位
171+
172+
checkpointer = ModelCheckpoint(filepath='weights-cnn.hdf5',
173+
verbose=1,
174+
save_best_only=True)
175+
flag = "train"
176+
if flag=="train":
177+
history = model.fit(training_letters_images_scaled,
178+
training_letters_labels_encoded,
179+
validation_data=(testing_letters_images_scaled,
180+
testing_letters_labels_encoded),
181+
epochs=20,
182+
batch_size=128,
183+
verbose=1,
184+
callbacks=[checkpointer])
185+
print(history)
186+
plot_loss_accuracy(history)
187+
else:
188+
#加载具有最佳验证损失的模型
189+
model.load_weights('weights-cnn.hdf5')
190+
metrics = model.evaluate(testing_letters_images_scaled,
191+
testing_letters_labels_encoded,
192+
verbose=1)
193+
print("Test Accuracy: {}".format(metrics[1]))
194+
print("Test Loss: {}".format(metrics[0]))
195+
196+
y_pred, y_true, image_predictions = get_predicted_classes(model,
197+
testing_letters_images_scaled,
198+
testing_letters_labels_encoded)
199+
get_classification_report(y_true, y_pred)
200+
201+
202+
#----------------------------------------------------------------
203+
# 第九步 绘制测试图像
204+
#----------------------------------------------------------------
205+
fig = plt.figure(0, figsize=(14,14))
206+
indices = np.random.randint(0, testing_letters_labels.shape[0], size=49)
207+
y_pred = np.argmax(model.predict(training_letters_images_scaled), axis=1)
208+
209+
for i, idx in enumerate(indices):
210+
plt.subplot(7,7,i+1)
211+
212+
image_array = training_letters_images_scaled[idx][:,:,0]
213+
image_array = np.flip(image_array, 0)
214+
image_array = rotate(image_array, -90)
215+
216+
plt.imshow(image_array, cmap='gray')
217+
plt.title("Pred: {} - Label: {}".format(y_pred[idx],
218+
(training_letters_labels[idx] -1)))
219+
plt.xticks([])
220+
plt.yticks([])
221+
plt.show()
222+
plt.savefig("resutl.png")
223+
224+
225+

0 commit comments

Comments
 (0)