基于 PyTorch 和 Qt-GUI 的深度卷积网络甲骨文识别

Table of Contents
GitHub 项目仓库:https://github.com/cuicaihao/Deep-Learning-for-Oracle-Bone-Script-Recognition
1. 项目背景 #
项目的简要描述。本仓库将展示如何使用 PyTorch 构建深度卷积神经网络,并使用 Qt 创建带有预训练模型的图形用户界面(GUI),如下图所示。

2. 基础环境与要求 #
我使用 cookiecutter 软件包生成了本项目的骨架结构。
在数据科学项目合作的实践中,根据哪些可行、哪些不可行的经验,该项目结构中隐含了一些设计观点。其中一些关于工作流程,另一些则关于让开发更轻松的工具:
- 数据是不可变的
- Jupyter Notebook 用于探索和交流(而非用于生产环境)
- 数据分析是 DAG(有向无环图,我使用了 ‘Makefile’ 工作流)
- 自底向上构建环境
起步要求 #
- Conda 4.12.0
- Python 3.7, 3.8
建议使用 Anaconda 安装 Python。或者,您可以只安装 miniconda 软件包,以节省大量的硬盘空间。
3. 循序渐进教程 #
步骤 1:初始化项目 #
使用 ‘git’ 命令从 GitHub 克隆项目。
cd PROJECT_DIR
git clone https://github.com/cuicaihao/deep-learning-for-oracle-bone-script-recognition
# 或
# gh repo clone cuicaihao/deep-learning-for-oracle-bone-script-recognition
检查项目结构。
cd deep-learning-for-oracle-bone-script-recognition
ls -l
# 或
# tree -h
您将看到一个类似于末尾展示的文件结构。同时,您可以打开 Makefile 查看工作流的原始命令。
步骤 2:创建 Python 环境并安装依赖 #
默认设置是创建 Python 3.8 的虚拟环境。
make create_environment
然后,激活虚拟环境。
conda activate oracle-bone-script-recognition
然后,安装依赖项。
make requirements
依赖项的详细信息列在 requirements.txt 文件中。
步骤 3:下载原始数据并进行数据预处理 #
得益于开源项目 甲骨文,我们可以下载甲骨文图像原始数据和数据库。接着,我们将下载原始数据并将其在项目的 data/raw 目录中进行预处理。
make download_data
基本步骤是:下载仓库,解压仓库,然后将图像和数据库 (JSON) 文件复制到项目的 data/raw 目录。
然后,我们对数据进行预处理,创建用于模型开发的表格(CSV 文件)。
make create_dataset
源码位于 src/data/make_dataset.py。make 命令将为该脚本提供输入参数,在项目的 data/processed 目录中创建两个表格(CSV 文件)。
步骤 4:使用 PyTorch 构建模型 #
本部分主要介绍模型的开发。
4.1 审查图像与 DataLoader #
在构建模型之前,我们需要审查图像和数据加载器。
make image_review
此步骤将生成一系列甲骨文图像样本,以突出图像的特征,如颜色、高度和宽度。此外,我们将使用 scikit-image 软件包提供的工具展示原始灰度图采用不同二值化方法处理后的结果。
源码位于 src/visualization/visualize.py。
4.2 测试 DataLoader #
我们依然可以通过以下命令测试 Dataloader:
make test_dataloader
这会生成一个 8x8 的甲骨文图像样本网格图。源码位于 src/data/make_dataloader.py。
在下图中,它生成了一批 64 张图像,并在左上角显示其标签(汉字)。
4.3 构建深度卷积神经网络模型 #
现在我们可以构建模型了。源码位于 src/models/train_model.py。此命令将在 models/ 文件夹下生成模型文件及训练过程记录。
make train_model
(可选) 可以通过使用 tensorboard 命令监控训练过程。
# 打开另一个终端
tensorboard --logdir=models/runs
然后打开链接 http://localhost:6006/ 监控训练和验证损失,查看训练批次图像并查看模型网络结构图。
训练过程结束后,会在 models/ 目录中生成一个名为 model_best 的模型文件。
4.4 使用样本图像测试模型 #
预训练模型位于 models/model_best。我们可以使用样本图像测试模型。我在 Makefile 的 test_model 脚本中使用了甲骨文数据集的图像 3653610.jpg,读者可以将其更改为其他图像。
make test_model
# ...
# Chinese Character Label = 安
# label name count prob
# 151 151 安 3 1.00000000
# 306 306 富 2 0.01444918
# 357 357 因 2 0.00002721
# 380 380 家 2 0.00001558
# 43 43 宜 5 0.00001120
# 586 586 会 1 0.00000136
# 311 311 膏 2 0.00000134
# 5 5 执 9 0.00000031
# 354 354 鲧 2 0.00000026
# 706 706 室 1 0.00000011
该命令会生成一个预测样本图,顶部附带预测标签,以及一个包含按概率排序的前 10 个预测标签的表格。
步骤 5:使用 Qt-GUI 测试模型 #
现在有了模型,我们可以配合 Qt-GUI 对其进行测试。我使用 Qt Designer 绘制了 UI 界面,文件存放在 src/ui/obs_gui.ui。然后,使用 pyside6-uic 命令从 UI 文件生成 Python 代码:
激活 GUI 界面:
python gui.py
# 或
# make test_gui
该 GUI 包含一个输入绘图窗口,供用户手写绘制甲骨文字。用户完成绘制并点击 RUN(运行)按钮后,输入图像会被转换为张量(NumPy 数组)并送入模型。模型会预测输入图像的标签及其概率,并显示在 GUI 顶部的“控制面板”中。
- 文本标签 1:显示输入图像的预测汉字标签及预测概率。如果准确率(Acc)大于 0.5,标签背景色为绿色;如果 Acc 小于 0.0001,背景色为红色;否则,背景色为黄色。
- 文本标签 2:显示按概率排序的前 10 个预测标签。
- Clean 按钮:清除输入的图像。
- Run 按钮:使用输入图像运行模型进行识别。
- Translate 按钮:(可选)将汉字标签翻译为英文。我没有找到针对单字的良好翻译服务,因此保留该部分供未来开发或读者思考。
===================================
4. 总结 #
本仓库的灵感来源于 DeepMind 的研究成果 Predicting the past with Ithaca,由于资源有限,我并未深入探究其细节。
我认为这项研究非常有趣,因此想通过尝试不同的语言文字(如甲骨文)来向读者分享我的实践经验。这也是我自己重新温习 PyTorch 深度学习开发包和 Qt-GUI 工具箱的一个不错的入门示例。
如果您能将您的经验分享给更多人,我将非常感激。如果您喜欢这个仓库,请点赞 / Star。
如果您发现此仓库对您有所帮助,请考虑向斯坦福农村地区教育计划(Standford Rural Area Education Program, https://sccei.fsi.stanford.edu/reap/)捐赠:该计划旨在通过政策变化和科学研究以帮助中国农村地区的隐形贫困人口。
谢谢。
许可协议 #
MIT 许可协议 (MIT),版权所有 (c) 2022,Caihao Cui