当前位置: 首页 > 科技观察

基于PaddleOCR实现AI发票识别的Asp.netCore应用

时间:2023-03-22 12:40:46 科技观察

简单介绍用户上传需要批量识别的照片。上传成功后,系统会启动Hangfire后台Job,开始调用PaddleOCR服务返回结果。这个过程有点类似于微服务架构。模型。PaddleOCRPaddleOCR是百度AI团队的开源项目。应该是所有免费开源OCR项目中识别效果最好的了。你可以通过PaddleOCR了解它。如果没有Python开发经验,在环境部署中可能会遇到一些问题。但几乎总有解决方案。Demohttps://razor.i247365.net/invoices/index用户批量上传待识别文件。由于我的虚拟机性能很差,可以先上传。后台自动识别系统会在识别完成后自动通知用户并修改状态。,用户预览识别结果运行环境.net5.0>Python3.7>ASP.NETCoreRazorPageApplication5.0源码分支(features\invoice_ocr)RazorPageCleanArchitecture\features\invoice_ocrPaddleOCRWebAPI(CentOS阿里云主机)PaddlePaddle/PaddleOCRHangfireDashboardHangfireIO/Hangfire技术栈ASP.NETCoreJquery/JavascriptEasyUIPython安装PaddleOCR环境测试PaddleOCR可以在glibc2.23上运行,也可以测试其他glibc版本或者安装glic2.23PaddleOCR工作环境PaddlePaddle2.0.0python3.7glibc2.23cuDNN7.6+(GPU)推荐使用我们提供的运行PaddleOCR的docker,docker和nvidia-docker的使用请参考链接。如果想使用mac或者windows直接运行预测代码,可以从第2步开始。1.(推荐)准备好docker环境。首次使用此镜像会自动下载,请耐心等待。#切换到工作目录cd/home/Projects#第一次运行需要创建一个docker容器,再次运行时不需要运行当前命令#创建一个名为ppocr的docker容器,并映射当前目录到容器的/paddle目录如果你想在CPU环境下使用docker,使用docker而不是nvidia-docker创建dockersudodockerrun--nameppocr-v$PWD:/paddle--network=host-itpaddlepaddle/paddle:latest-dev-cuda10.1-cudnn7-gcc82/bin/bash如果你使用CUDA10,请运行以下命令创建容器,设置docker容器共享内存shm-size为64G,即建议设置32G以上sudonvidia-dockerrun--nameppocr-v$PWD:/paddle--shm-size=64G--network=host-itpaddlepaddle/paddle:latest-dev-cuda10.1-cudnn7-gcc82/bin/bash您也可以访问[DockerHub](https://hub.docker.com/r/paddlepaddle/paddle/tags/)获取与您的机器匹配的图像。#ctrl+P+Q可以退出docker容器,重新进入docker容器使用如下命令sudodockercontainerexec-itppocr/bin/bash2.安装PaddlePaddle2.0pip3install--upgradepip如果你的机器安装了CUDA9或CUDA10,请运行以下命令安装python3-mpipinstallpaddlepaddle-gpu==2.0.0-ihttps://mirror.baidu.com/pypi/simple如果你的机器是CPU,请运行以下命令安装python3-mpipinstallpaddlepaddle==2.0.0-ihttps://mirror.baidu.com/pypi/simple更多版本要求请参考【安装文档】(https://www.paddlepaddle.org.cn/install/quick)中的说明进行操作。3、克隆PaddleOCRrepo代码【推荐】gitclonehttps://github.com/PaddlePaddle/PaddleOCR如果网络问题拉取失败,也可以选择使用码云上的托管:gitclonehttps://gitee.com/paddlepaddle/PaddleOCR注意:代码云托管代码可能无法实时同步本github项目的更新,会有3到5天的延迟。请先使用推荐的方法。4.安装第三方库cdPaddleOCRpip3install-rrequirements.txt**有问题可以留言,我会帮你**##关键代码分析httpClient调用PaddleOCRAPI启动自动失败重试策略```jsservices.AddHttpClient("ocr",c=>{c.BaseAddress=newUri("https://paddleocr.i247365.net/predict/ocr_system");c.DefaultRequestHeaders.Accept.Add(newMediaTypeWithQualityHeaderValue("application/json"));}).AddTransientHttpErrorPolicy(policy=>policy.WaitAndRetryAsync(3,_=>TimeSpan.FromMilliseconds(1000)));;publicvoidRecognition(intid){使用(varclient=_httpClientFactory.CreateClient("ocr")){varinvoice=_context.Invoices.Find(id);varimgfile=Path.Combine(Directory.GetCurrentDirectory(),invoice.AttachmentUrl);varbytes=File.ReadAllBytes(imgfile);字符串base64string=Convert.ToBase64String(bytes);varresponse=client.PostAsJsonAsync("",new{images=newstring[]{base64string}}).Result;}Console.WriteLine($"{id},已完成。");}解析发票信息,还是比较笨用方法使用正则表达式来匹配必填字段,比如发票金额,发票日期,发票编号等,因为这个是免费的,不像付费服务那样提供更智能的匹配,这里我觉得只要有足够的数据,应该也可以通过自训练实现更智能的识别,所以我把Label这个字段留了下来,目的是手动制定对应的字段,然后用坐标数据进行训练。如果(response.StatusCode==System.Net.HttpStatusCode.OK){varresult=response.Content.ReadAsStringAsync().Result;varocr_result=JsonSerializer.Deserialize(结果);varocr_status="";invoice.Status="完成";invoice.Result=ocr_result.status;if(ocr_result.status=="000"){foreach(ocr_result.results中的var集合){foreach(collection中的var项目){varrawdata=newInvoiceRawData(){Confidence=item.confidence,InvoiceId=id,Text=item.text,Text_Region=JsonSerializer。序列化(item.text_region)};if(item.text.Contains("发券号码")){varregex=newRegex("\\d*$");varmc=regex.Match(item.text);如果(mc.Success){invoice.InvoiceNo=mc.Value;}}if(item.text.Contains("开票日")){varregex=newRegex("\\d{4}年\\d{2}月\\d{2}日");varmc=regex.Match(item.text);如果(mc.Success){invoice.InvoiceDate=Convert.ToDateTime(mc.Value.Replace(“年”,“/”)。Replace("月","/").Replace("日",""));}}if(item.text.Contains("%")){varregex=newRegex("^\\d*.\\d*");varmc=regex.Match(item.text);如果(mc.Success){invoice.TaxRate=decimal.Parse(mc.Value);}}if(item.text.Contains("¥")){varregex=newRegex("\\d.\\d*");varmc=regex.Match(item.text);如果(mc.Success){invoice.Amount=decimal.Parse(mc.Value);}}_context.InvoiceRawDatas.Add(原始数据);}}ocr_status=ocr_result.status;}_context.SaveChangesAsync(默认).Wait();_hubContext.Clients.All.SendAsync(SignalR.OCRTaskCompleted,new{invoiceNo=invoice.InvoiceNo});}Canvas画框标记注意别结果data.map((item,index)=>{$('#rawdata_table>tbody').append(`${index+1}${item.Text}`);varpoints=JSON.parse(item.Text_Region);ctx.lineWidth="5";ctx.strokeStyle="#00ff00";ctx.textAlign='左';ctx.textBaseline='t操作';ctx.fillStyle="#ff0000";ctx.font="bold13pxverdana,sans-serif";ctx.fillText(item.Text,points[0][0],points[0][1]-15);ctx.beginPath();ctx.moveTo(点[0][0],点[0][1]);ctx.lineTo(点[1][0],点[1][1]);ctx.lineTo(点[2][0],点[2][1]);ctx.lineTo(点[3][0],点[3][1]);ctx.closePath();ctx.stroke();});是不是很简单,很酷最后给个star!?如果你喜欢或正在使用这个项目,请给它一个星。谢谢!RazorPageCleanArchitecture\features\invoice_ocr:https://github.com/neozhu/RazorPageCleanArchitecture