From 99d5d78036da6a08a84157016262ef523be16969 Mon Sep 17 00:00:00 2001
From: shadow <773850645@qq.com>
Date: Fri, 1 May 2020 13:27:42 +0800
Subject: [PATCH] update
---
README.md | 22 ++-
UI/.idea/UI.iml | 11 --
UI/.idea/encodings.xml | 4 -
UI/.idea/misc.xml | 7 -
UI/.idea/modules.xml | 8 -
UI/.idea/workspace.xml | 205 --------------------
UI/tk.py | 289 -----------------------------
{UI => interface}/back.jpg | Bin
UI/UI.py => interface/interface.py | 0
train/README.md | 11 ++
train.py => train/train.py | 0
11 files changed, 29 insertions(+), 528 deletions(-)
delete mode 100644 UI/.idea/UI.iml
delete mode 100644 UI/.idea/encodings.xml
delete mode 100644 UI/.idea/misc.xml
delete mode 100644 UI/.idea/modules.xml
delete mode 100644 UI/.idea/workspace.xml
delete mode 100644 UI/tk.py
rename {UI => interface}/back.jpg (100%)
rename UI/UI.py => interface/interface.py (100%)
create mode 100644 train/README.md
rename train.py => train/train.py (100%)
diff --git a/README.md b/README.md
index dbd7023..451fa17 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,18 @@
-# Deep_Learning
-The design of deep learning
-整体内容为本科期间毕业设计
-文件待补全 内容待调整
\ No newline at end of file
+# 基于深度学习的书法字体识别
+
+## 设计说明
+- 中华文化源远流长,其中汉字书法字体种类就十分之多,但在很多情况下未经系统学习的人们无法简单的识别其中的汉字,本设计应用深度学习对汉字书法字体识别进行设计,使其能够以较高的准确度识别出目的书法字体。
+- 其中数据包括100个汉字书法单字,汉字类别有碑帖,手写书法,古汉字等等。图片全部为单通道灰度jpg,宽高不定。
+- 模型最后测试集精确度达97.53%,数据来源参考自[TinyMind竞赛](https://www.tinymind.cn/competitions/41#overview)
+### 数据集分两部分
+- 第一部分每个汉字100张图片共第一部分每汉字100张图片共10000张图片,有标签。
+- 第二部分测试数据每汉字50张以上图片(单字图片数不固定)共16346张图片,无标签,需上传至题目网站进行检测。
+- 训练集:链接:https://pan.baidu.com/s/1ASOns2qH7D80JqZldxvo9A 提取码:d3za
+- 测试集:链接:https://pan.baidu.com/s/1fxbO6e_gEJC9gNhaTPcrKg 提取码:emqi
+### 设计划分
+#### 神经网络训练
+1. [程序思路](train/README.md)
+2. [程序源码](train/train.py)
+#### 简单前端界面
+1. [程序思路](interface/README.md)
+2. [程序源码](interface/interface.py)
\ No newline at end of file
diff --git a/UI/.idea/UI.iml b/UI/.idea/UI.iml
deleted file mode 100644
index d385fe6..0000000
--- a/UI/.idea/UI.iml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/UI/.idea/encodings.xml b/UI/.idea/encodings.xml
deleted file mode 100644
index 15a15b2..0000000
--- a/UI/.idea/encodings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/UI/.idea/misc.xml b/UI/.idea/misc.xml
deleted file mode 100644
index 3872720..0000000
--- a/UI/.idea/misc.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/UI/.idea/modules.xml b/UI/.idea/modules.xml
deleted file mode 100644
index b1d93f0..0000000
--- a/UI/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/UI/.idea/workspace.xml b/UI/.idea/workspace.xml
deleted file mode 100644
index 4963464..0000000
--- a/UI/.idea/workspace.xml
+++ /dev/null
@@ -1,205 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1557280287689
-
-
- 1557280287689
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/UI/tk.py b/UI/tk.py
deleted file mode 100644
index b670846..0000000
--- a/UI/tk.py
+++ /dev/null
@@ -1,289 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# @Time : 2019/5/23 14:25
-# @Author : shadow
-# @Site :
-# @File : tk.py
-# @Software: PyCharm
-
-from keras.layers import Conv2D, MaxPooling2D, AveragePooling2D, Activation
-from keras.layers import Flatten, BatchNormalization, PReLU, Dense, Dropout
-from keras.models import Model, Input
-from keras.applications.resnet50 import ResNet50
-import numpy as np
-import tkinter as tk
-import tkinter.filedialog
-from PIL import Image, ImageTk
-import matplotlib.pyplot as plt
-import time
-import os
-import tkinter.font as tkFont
-
-def bn_relu(x):
-
- x = BatchNormalization()(x)
- #参数化的ReLU
- x = PReLU()(x)
- return x
-
-def Alex_model(out_dims, input_shape=(128, 128, 1)):
- input_dim = Input(input_shape)
-
- x = Conv2D(96, (20, 20), strides=(2, 2), padding='valid')(input_dim) # 55 * 55 * 96
- x = bn_relu(x)
- x = MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='valid')(x) # 27 * 27 * 96
- x = Conv2D(256, (5, 5), strides=(1, 1), padding='same')(x)
- x = bn_relu(x)
- x = MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='valid')(x)
- x = Conv2D(384, (3, 3), strides=(1, 1), padding='same')(x)
- x = PReLU()(x)
- x = Conv2D(384, (3, 3), strides=(1, 1), padding='same')(x)
- x = PReLU()(x)
- x = Conv2D(256, (3, 3), strides=(1, 1), padding='same')(x)
- x = PReLU()(x)
- x = MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='valid')(x)
-
- x = Flatten()(x)
- fc1 = Dense(4096)(x)
- dr1 = Dropout(0.2)(fc1)
- fc2 = Dense(4096)(dr1)
- dr2 = Dropout(0.25)(fc2)
- fc3 = Dense(out_dims)(dr2)
-
- fc3 = Activation('softmax')(fc3)
-
- model = Model(inputs=input_dim, outputs=fc3)
- return model
-
-def resner50(out_dims, input_shape=(128, 128, 1)):
- # input_dim = Input(input_shape)
- resnet_base_model = ResNet50(include_top=False, weights=None, input_shape=input_shape)
-
- x = resnet_base_model.output
- x = Flatten()(x)
- fc = Dense(512)(x)
- x = bn_relu(fc)
- x = Dropout(0.5)(x)
- x = Dense(out_dims)(x)
- x = Activation("softmax")(x)
-
- # buid myself model
- input_shape = resnet_base_model.input
- output_shape = x
-
- resnet50_100_model = Model(inputs=input_shape, outputs=output_shape)
-
- return resnet50_100_model
-
-
-def my_model(out_dims, input_shape=(128, 128, 1)):
- input_dim = Input(input_shape) # 生成一个input_shape的张量
-
- x = Conv2D(32, (3, 3), strides=(2, 2), padding='valid')(input_dim)
- x = bn_relu(x)
- x = Conv2D(32, (3, 3), strides=(1, 1), padding='valid')(x)
- x = bn_relu(x)
- x = MaxPooling2D(pool_size=(2, 2))(x)
-
- x = Conv2D(64, (3, 3), strides=(1, 1), padding='valid')(x)
- x = bn_relu(x)
- x = Conv2D(64, (3, 3), strides=(1, 1), padding='valid')(x)
- x = bn_relu(x)
- x = MaxPooling2D(pool_size=(2, 2))(x)
-
- x = Conv2D(128, (3, 3), strides=(1, 1), padding='valid')(x)
- x = bn_relu(x)
- x = MaxPooling2D(pool_size=(2, 2))(x)
-
- x = Conv2D(128, (3, 3), strides=(1, 1), padding='valid')(x)
- x = bn_relu(x)
- x = AveragePooling2D(pool_size=(2, 2))(x)
-
- x_flat = Flatten()(x)
-
- fc1 = Dense(512)(x_flat)
- fc1 = bn_relu(fc1)
- dp_1 = Dropout(0.3)(fc1)
-
- fc2 = Dense(out_dims)(dp_1)
- fc2 = Activation('softmax')(fc2)
-
- model = Model(inputs=input_dim, outputs=fc2)
- return model
-
-
-def load_image(image):
- img = Image.open(image).convert('L')
- img = img.resize((128,128))
- img = np.array(img)
- img = img / 255
- img = img.reshape((1,) + img.shape + (1,))
- return img
-
-def get_label(image, model, top_k):
- prediction = model.predict(image)
- predict_list = list(prediction[0])
- min_label = min(predict_list)
- label_k = []
- for i in range(top_k):
- label = np.argmax(predict_list)
- predict_list.remove(predict_list[label])
- predict_list.insert(label, min_label)
- label_k.append(label)
- return label_k
-
-
-def label_of_directory(directory):
- classes = []
- for subdir in sorted(os.listdir(directory)):
- if os.path.isdir(os.path.join(directory, subdir)):
- classes.append(subdir)
-
- class_indices = dict(zip(classes, range(len(classes))))
- return class_indices
-
-
-def get_key_from_classes(dict, index):
- for key, value in dict.items():
- if value == index:
- return key
-
-
-# 弹窗
-class PopupDialog(tk.Toplevel):
- def __init__(self, parent):
- super().__init__()
- self.title('输出结果')
-
- self.parent = parent # 显式地保留父窗口
-
- sw = self.parent.winfo_screenwidth()
- sh = self.parent.winfo_screenheight()
- ww = 500
- wh = 200
- x = (sw-ww) // 2
- y = (sh-wh) // 2
- self.geometry("%dx%d+%d+%d"%(ww, wh, x, y))
-
- ft = tkFont.Font(family='宋体', size=23)
- row1 = tk.Frame(self)
- row1.pack(anchor='s', ipady=25)
- tk.Label(row1, text=str(self.parent.ans_key), font = ft).pack()
-
-
- row2 = tk.Frame(self)
- row2.pack(fill="x")
- tk.Button(row2, text="确认", font = ft, command=self.cancel).pack()
-
-
- def cancel(self):
- self.destroy()
-
-
-# 主窗
-class MyApp(tk.Tk):
-
- def __init__(self):
- super().__init__()
- self.title('基于深度学习的书法字体识别')
-
- # 程序参数
- self.string = tk.StringVar()
- self.ans_key = []
- # 程序界面
- self.setupUI()
-
- def setupUI(self):
- # 初始化字体
- ft1 = tkFont.Font(family='宋体', size=17) # 地址栏字体
- ft2 = tkFont.Font(family='宋体', size=20) # 按钮字体
-
- row1 = tk.Frame(self)
- row1.pack(fill="x") # x方向填充
- tk.Entry(row1, font=ft1, width=68, textvariable=self.string).pack() # 选择文件地址栏
-
- # 三个按钮
- row2 = tk.Frame(self)
- row2.pack(fill="x")
- tk.Button(row2, text="选择文件", width=10, font=ft2, command = self.choose_file).pack()
-
- row3 = tk.Frame(self)
- row3.pack(fill="x")
- tk.Button(row3, text="上传", width=10, font=ft2, command = self.upload_file).pack()
-
- row4 = tk.Frame(self)
- row4.pack(fill="x")
- tk.Button(row4, text="开始识别", width=10, font=ft2, command = self.start).pack()
-
- # 背景图片
- row5 = tk.Frame(self)
- row5.pack(fill="x")
- global img
- img = Image.open("D:/Deep_learning_design/汉字/毕设重要版本/UI/back.jpg")
- (x, y) = img.size
- x //= 2
- y //= 2
- img = img.resize((x, y))
- img = ImageTk.PhotoImage(img)
- lab = tk.Label(row5, image=img)
- lab.pack()
-
-
- # 选择文件
- def choose_file(self):
- selectFileName = tk.filedialog.askopenfilename(title = "选择文件")
- self.string.set(selectFileName)
-
-
- # 上传文件
- def upload_file(self):
- img = Image.open(self.string.get())
- plt.imshow(img)
- path = "D:/Deep_learning_design/汉字/毕设重要版本/image_test"
- name = time.time()
- img.save(path + str(name) + ".jpg")
- plt.show()
-
-
- # 开始识别
- def start(self):
- img_name = os.listdir(image_path)
- img_list = []
- for name in img_name:
- img_list.append(os.path.join(image_path, name))
-
- img_list.sort()
- ans_key = []
- for img in img_list:
- image = load_image(img)
- temp_label = get_label(image, model, 5)
- key = get_key_from_classes(class_indices, temp_label[0])
- ans_key.append(key)
- self.ans_key = ans_key
- self.output_ans()
-
-
- # 输出结果
- def output_ans(self):
- pw = PopupDialog(self)
- self.wait_window(pw)
-
- return
-
-
-if __name__ == '__main__':
- """
- 初始化权重
- """
- weight_path = 'best_weights_Alex.h5'
- image_path = 'D:/Deep_learning_design/汉字/毕设重要版本/image_test'
- train_path = "D:/Deep_learning_design/TMD_data/myTrain/train_data"
- model = Alex_model(100)
- model.load_weights(weight_path)
- class_indices = label_of_directory(train_path) # 获取训练集中标签对应汉字序列
-
- """
- 界面加载
- """
- app = MyApp()
- app.mainloop()
\ No newline at end of file
diff --git a/UI/back.jpg b/interface/back.jpg
similarity index 100%
rename from UI/back.jpg
rename to interface/back.jpg
diff --git a/UI/UI.py b/interface/interface.py
similarity index 100%
rename from UI/UI.py
rename to interface/interface.py
diff --git a/train/README.md b/train/README.md
new file mode 100644
index 0000000..004e625
--- /dev/null
+++ b/train/README.md
@@ -0,0 +1,11 @@
+题目源自:https://www.tinymind.cn/competitions/41#overview
+## 题目
+> 竞赛数据提供100个汉字书法单字,包括碑帖,手写书法,古汉字等等。图片全部为单通道灰度jpg,宽高不定。
+### 测试集分两部分:
+> 第一部分每个汉字100张图片共第一部分每汉字100张图片共10000张图片,有标签。
+
+> 第二部分测试数据每汉字50张以上图片(单字图片数不固定)共16346张图片,无标签,需上传至题目网站进行检测。
+
+> 训练集:链接:https://pan.baidu.com/s/1ASOns2qH7D80JqZldxvo9A 提取码:d3za
+
+> 测试集:链接:https://pan.baidu.com/s/1fxbO6e_gEJC9gNhaTPcrKg 提取码:emqi
diff --git a/train.py b/train/train.py
similarity index 100%
rename from train.py
rename to train/train.py