自然场景文本识别
我之前是做自然语言的,但公司有个ocr的项目必须要做,因此开始学习ocr相关知识,边学边做两个多月,还有很多不太明白的地方,只能大概讲一讲经验教训。
自然场景文本分类包括两个步骤,1、文本检测:识别出文本框,2、文本识别:识别出字或者字符。
1、 文本检测:
文本检测和目标检测类似但又有不同,目标检测的物体形状一般是不固定的,而文本框一般是矩形,另外文本检测是二分类,而目标检测是多分类。成熟的文本检测算法有很多,我尝试了ctpn,east以及yolo3(包括yolo3-tiny)等三种文本检测算法。(目前只考虑水平文本,有很多其他算法可以检测非水平文本,包括east)
2、 文本识别:
文本识别尝试了crnn和densenet,总体来看性能差不多。
由于对qps有要求,因此尝试使用tensorrt对模型进行推理优化,keras转trt模型较好的路径还是keras→onnx→trt,而不是keras→uff→trt,因为有很多操作uff都不支持。使用tensorrt后时延从120ms降到了90ms,可以说达到了目的。但是tensorrt只支持定长,只能将图片压缩到固定值(例如608*608),会损失一定精度,tensorrt6以后应该是支持变长的,后面有时间会研究一下这个问题。
因为要综合考虑性能和效率,最终使用yolo3+densenet作为解决方案(从时延和性能上看yolo3都是远远好于ctpn和east(只考虑水平文本),这和我看到的一些信息不符,ctpn和east都是工业界运用比较多的算法了,但这里我没看到任何优势,如果有大神了解欢迎指正)。
使用tensorrt进行推理优化,平均时延大约90ms左右。程序是由python实现,改成c++,时延应该会更低一些。使用了10000条数据进行测试,使用hmean和编辑距离作为评价指标(https://github.com/liuheng92/OCR_EVALUATION.git),最好模型(yolo3-608-densenet)结果为:
"recall": 0.7576752977446645,
"precision": 0.7358534281487819,
"hmean": 0.7466049438527332
"distance": 28.814918508149184,
附代码地址:https://github.com/zhaogangthu/keras-yolo3-ocr-tensorrt.git
另外我对推理加速问题很感兴趣,如果有大神有过研究,欢迎指教。有其他问题也可一起讨论。
——————————————————————————————————————
2020年9月25日更新
tensorrt已经支持动态输入,请查看:
赵刚:tensorRT动态输入(python)zhuanlan.zhihu.com