本文主要介绍一种入门级文本识别系统的大致实现方法,其主要技术主要涉及要文本目标检测、OCR识别以及GUI界面设计等。闲话少说,下面先来看一下简单的系统样子:
由于本人使用的是笔记本电脑,分辨率不足所以界面展示的不完整,但是大部分界面都已经展示出来了。下面接着看一下具体的功能展示,展示功能之前,我先来介绍一下这个简单文本识别系统的用法,了解深度学习的人都知道,深度学习通过深层神经网络训练得到一个达到要求的模型之后,然后使用模型对待预测数据进行预测。那么,我们这个文本识别系统也是如此,这里使用模型识别文本之前,需要先加载模型,由于模型加载比较耗时,并且模型没有必要重复加载,重复加载会占用更大的内存资源,反复加载还有可能导致计算机内存爆炸而崩溃。所以我在这里设置了一个load model按钮,点一下即可加载模型。如下图所示:
加载模型不是一瞬间的事,所以我在这里加了 loading… 的字样,表示现在模型正在加载,不要着急。加载完之后的样子是这样的:
会在右上角显示加载完成。
然后可以点击 选择文件 我们可以从电脑磁盘上选择我们想要识别的文本的图像:
这是该图片会在GUI界面的左侧显示区域显示出来:
接下来就可以点击 开始识别 按钮了,识别结果如下:
可以看出,识别结果还是非常准确的,这得益于模型训练的好,关键在于数据集的丰富,当然设计网络的大牛们也是非常厉害的。
后面分析一下系统的实现:
首先,GUI部分是最简单的,我用的是pyqt5的designer工具进行设计,没有什么技术含量。三个buttun外加两个textedit。
用qt设计完以后会在目录中baocun一个.ui的文件,这时可以打开cmd命令框,输入pyuic5 -o *****.py **.ui
这样你设计的GUI界面可以直接转化为python代码,文件名就是.py。
接下来就是文本识别部分了,做过文本的应该都知道,文本识别主要分为两个部分,第一部分就是文本定位了,文本定位其实就是目标检测的一种,你可以使用自己喜欢的目标检测方法进行定位,当然,有些方法定位可能不太准确,需要自己进行一些改进或者处理,在这里,我使用的ctpn进行的文本定位。
由于cptn的代码量很大,这里我就不在贴出来了,大家可以在github上直接搜索下载就可以。ctpn的输出是每行文字的坐标。
通过坐标我们就可以很轻松的将图像上的文字按照行的方式截取出来。
文本识别部分采用的是DenseNet + CTC的方式进行识别的,因为这也是一种很成熟的识别方式了,这里不做具体介绍,下面详细介绍一下给界面那妞添加上以上功能。
加载模型按钮:
window.pushButton_3.clicked.connect(window.load_model_thread)
qt采用的是信号与槽的方式为组件添加事件,这里就是将pushButton_3的点击事件与load_model_thread函数进行绑定。
load_model_thread的定义:
def load_model_thread(self):
self.label_4.setText("loading...")
QApplication.processEvents()
thread = Runthread()
thread.load_model()
QApplication.processEvents()
self.label_4.setText('load finished!')
QApplication.processEvents()
这里的thread调用了load_model函数:
def load_model(self):
global ocr
import ocr
ocr文件中有个全局的加载模型的代码:
sess, net = load_tf_model()
然后就是选择文件功能:
def select(self):
self.imagePath = QFileDialog.getOpenFileName()[0]
if self.imagePath == '':
return
os.rename(self.imagePath, self.imagePath[:-3]+'png')
self.imagePath = self.imagePath[:-3]+'png'
将选择文件与按钮绑定:
window.pushButton.clicked.connect(window.select)
接着是识别功能:
def start_identify(self):
self.label_5.setText('正在识别...')
QApplication.processEvents()
thread = Runthread()
result = thread.identify(self.imagePath)
self.label_5.setText('识别完成!')
绑定按钮:
window.pushButton_2.clicked.connect(window.start_identify)
显示图片的代码:
image = QImage(self.imagePath)
size = QSize(480, 580)
pixImg = QPixmap.fromImage(image.scaled(size, Qt.IgnoreAspectRatio))
self.label_3.setPixmap(pixImg)
识别完成之后,在右侧文本组件中显示文字:
for key in result:
self.plainTextEdit.appendPlainText(result[key][1])
QApplication.processEvents()
整个main函数是非常简单的,只有短短几行:
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.pushButton_3.clicked.connect(window.load_model_thread)
window.pushButton.clicked.connect(window.select)
window.pushButton_2.clicked.connect(window.start_identify)
window.show()
sys.exit(app.exec_())
以上就是一个简单的文本识别系统的简单实现,后面有时间我会将工程传到百度云盘中到时链接会分享出来。