用opencv的dnn模块做OCR,实现对图片中的文本检测与识别,其中文本检测用的是EAST,文本识别用的是CRNN。这套程序里有Python和C++两种版本的实现,以Python版本的程序为例,程序的运行不依赖任何深度学习框架pytorch,tensorflow等等的,只依赖opencv,numpy,math和argparse这4个python库,做到极简主义OCR。我把这套程序源码发布在github上了,地址是 https://github.com/hpc203/ocr-opencv-dnn
在运行程序前,按照README.md里的提供的模型文件地址下载模型文件后,就可以运行程序了。
在编写这个程序时,我一直有个疑惑,就是在EAST文本检测模块里。起初,我是在https://github.com/spmallick/learnopencv/blob/master/TextDetectionEAST/textDetection.py里看到用opencv的dnn模块做EAST文本检测,但是它的读取模型文件初始化网络的方式我一直疑惑不解。看text_detect_recognition.py的第152行:
detector = cv.dnn.readNet(modelDetector)
modelDetector是.pb文件,这说明它是在tensorflow框架里训练得到的,我把这行代码换成
detector = cv.dnn.readNetFromTensorflow(modelDetector)
程序依然可以正常运行,值得注意的是它这里只提供.pb文件作为输入就能正常运行。但是我看到过的用cv.dnn.readNetFromTensorflow读取faster-rcnn,mask-rcnn,又或者ssd的时候,需要提供.pb和.pbtxt文件才能正常运行的,如果只提供.pb文件,那程序运行就会报错中断的。看opencv里的dnn.py文件,readNetFromTensorflow函数接口的定义:
可以看到config(也就是pbtxt文件)是一个可选项,在调用这个函数时,可以不提供config输入参数的。readNet函数接口的定义也是如此
因此,我就有个疑问,在tensorflow框架里训练产生的模型文件,用opencv的dnn模块读取时,什么样的网络可以只提供.pb文件就能正常运行,什么样的网络需要既提供.pb又要提供.pbtxt文件才能正常运行呢?
此外,我做了一个OCR的应用,使用OCR算法做身份证全卡面文字解析,在这个算法里,包含Faster-rcnn检测图片里的证件照,DBNet检测证件照里的文字,CRNN识别文字,一共三个模块,我把程序发布在github上了,地址是 https://github.com/hpc203/OCR-dbnet-crnn