在基本完成了银行卡识别之后,开始新的任务:发票类OCR识别。发票类OCR识别一直以来也是OCR之中的热点,包括证件类识别等等,后续都要一步步来。
一:发票格式解析
现在随着无纸化办公的推行,电子发票的使用率越来越多,纸质发票的数量越来越少,一般来说,我们现在的发票分为三大类:
①:增值税电子普通发票 ②:增值税普通发票 ③:增值税专用发票
现在以我在京东购物的发票为例:
发票的尺寸为24*14cm,都是比较规范的标准。
二:发票识别分析
我们识别一张发票,我们一定是想从当中查询到那些信息,那些信息有用我们着重识别,那些信息没用我们可以暂且放在一边。在国家税务总局全国增值税查验平台上,我们来验证一张发票是否合法,着重要注意四项:
①发票代码,②:发票号码,③:开票日期,④开票金额
只要找到这四项,基本上一张发票的利用价值就结束了。
那问题来了,如何找到这四项,现在有两个思路:
第一种,识别发票二维码。第二种,直接全局识别发票内容(最全,也是最麻烦)
当然,为了保证代码的有效性,这两种我们肯定都得做。
第一种:识别发票二维码
识别左上角的二维码,二维码中包含发票里面大部分有用信息,并且识别的结果基本上无误差。我写了个小代码识别了一下:
01,10,011002000111,31015945,251.77,20200407,68212483303223031362,A6CA,
这里边的信息需要说一下:
发票二维码中一共有8个属性:
以我识别出来的为例:
其中第二项:不同的代码表示的发票类型不一样
10表示的是增值税电子发票, 04表示的增值税普通发票(纸票),01表示增值税专用发票
微信识别结果:
但是二维码识别的问题在于,如果上传的都是电子版截图,效果很不错,很好识别,但是如果上传的是拍照的纸质发票,这种识别方法需要做一些图像处理后再去识别,并且很多情况下识别二维码是无效的。这是需要改进的地方。使用pyzbar
识别的成功率在65%左右。
第二种:OpenCV+神经网络
第二种方法使用的方法和之前识别银行卡的架构很相似,但是处理起来会更麻烦,原因有几点:
①:银行卡只需要识别卡号,而发票信息需要定位更多地方
②:需要标注数据量很多,人力要求高
初步思路:
读入图片-> 边缘检测->二值化->轮廓检测->筛选结果融合->定位->数据集制作->模型训练->识别
先慢慢进行,一点点摸索吧~