Orange Ai pro部署票据类OCR AI实践

一、前言:

随着人工智能AI技术的飞速发展,深度学习已在工业界取得重大突破和广泛应用,自然语言处理为了让计算机能够“读懂”人类的语言,随着深度学习的显著进展,在文本分类、推荐系统等方向都有着广泛应用;而语音合成和语音识别在智能问答、聊天机器人也有着广泛应用,图像领域作为深度学习应用最为成熟的领域,在这些背后都离不开超强的算力支持。

OrangePi AIpro提供了强大的训练能力,优异的推理能力,可以满足大多数AI算法原型验证、推理应用开发的需求,可以服务于深度学习、科学计算、图形可视化、视频处理多种应用场景,随时为您提供触手可得的算力,有效缓解计算压力,提升您的业务效率,助您提高企业竞争力。


二、OrangePi AIpro的亮点:

OrangePi AIpro(8-12T)采用昇腾AI技术路线,具体为4核64位处理器+AI处理器,集成图形处理器,支持8-12TOPS AI算力,拥有8GB/16GB LPDDR4X,可以外接32GB/64GB/128GB/256GB eMMC模块,支持双4K高清输出。

  • 丰富的接口:包括两个HDMI输出、GPIO接口、Type-C电源接口、支持SATA/NVMe SSD 2280的M.2插槽、TF插槽、千兆网口、两个USB3.0、一个USB Type-C 3.0、一个Micro USB(串口打印调试功能)、两个MIPI摄像头、一个MIPI屏等,预留电池接口。
  • 广泛适的应用场景:可用于AI边缘计算、深度视觉学习及视频流AI分析、视频图像分析、自然语言处理、智能小车、机械臂、人工智能、无人机、云计算、AR/VR、智能安防、智能家居等领域,覆盖 AIoT各个行业。
  • 系统支持:Orange Pi AIpro支持Ubuntu、openEuler操作系统,满足大多数AI算法原型验证、推理应用开发的需求。

在这里插入图片描述


三、搭建系统环境:


1. 环境搭建:

在评测之前,除了官方提供了一些配件外,还有一些需要自行提前准备的东西,自行提供的配件清单:

  • TF读卡器
  • HDMI显示器连接线
  • 串口测试线

在这里插入图片描述

首先打开balena烧录工具地址,因为个人办公是Mac电脑,借用了同事的Windows电脑来进行此次的测试,我们选择OS为“WINDOWS”的X86|X64版本下载。

在这里插入图片描述

打开下载的balena烧录工具,不用安装,直接就打开了,非常的方便,不用在电脑上安装软件:

  • 点击“从文件烧录”选择好我们提前下载的镜像(百度云真的慢)
  • 点击“选择目标磁盘”选中我们插入的TF卡(我提前格式化了)
  • 点击“现在烧录”就可以开始进行烧录了

在这里插入图片描述

经过2个阶段,一个是验证阶段,一个是烧录阶段,不过,可惜的是最后一步出错了,百度一下有人说可以不用管,先尝试一下可不可以开机。

在这里插入图片描述


2. 机器组装:

插入USB的鼠标和键盘、显示器HDMI线、自带的type-c电源线后,即可以去插上电源了,一插入就自动启动了,没有什么开机键,即一通电就自动启动,但是有一个问题,等了5分钟除了风扇一直响外,显示器一直不显示,猜测是之前的烧录有问题。

在这里插入图片描述

排查原因:

序号可能存在问题点解决方案难度
1检查一下控制启动设备的两个拨码开关,要想从TF卡启动,需要都是右检查无问题1星
2可能烧录的时候出现上面异常,导致无法亮灯可以尝试使用网友提供的ascend重新烧录一下2星
3手里是否有备用TF卡,不过最好使用容量大点的,32G以上,推荐64G需要买一张备用卡3星
4可能开发板子存在问题这个需要专业人员来解决4星

在这里插入图片描述

因为手里没有备用的TF卡,只能通过第二种方案换一种工具来进行烧录试试,如果网友可以成功启动,就不需要下一步操作。


3. 替换烧录工具:

在网友的推荐下,使用了另外一个烧录工具ascend,不过这个工具需要下一步下一步安装,就不过多复述了。

在这里插入图片描述

小细节:

  1. 烧录时,提示U盘找不到,需要重新插入,此时,不用管他的提示。
  2. 在烧录完成后,提示要格式化,也不需要管,因为在烧录时,就已经开始写成linux的启动镜像盘了,此时,在windows系统是无法识别的,是正常的。
  3. 第一次烧的时候,看到东西就点,点快了,结果重新烧录了一次,需要注意一下。

通过重新烧录之后,我们的系统就可以正常启动了,启动时,需要输入一个用户名密码,非常的开心,后面使用SSH也需要使用到。

  • 用户名:HwHiAiUser
  • 密码:Mind@123

在这里插入图片描述


4. 链接Wifi,使用SSH登录:

因为没有联网,所以,只能在显示器上进行Wifi的联网操作,联网后输入ifconfig查看Wifi的IP地址,在同一个局域网,使用ping ip地址保证网是能连通的情况下,我们就可以使用我工作的主机来SSH登录到开发板子上了,这样操作起来比较便捷,有点类似于机房的机器,只需要联网了,下次就不用每次使用时,将显示器链接到开发板上。

# 查看主机IP地址
ifconfig

# 检查网络是否连通
ping 192.xx.xx.xx

在这里插入图片描述

至此,我们的环境就算搭建完成了,接下来,开始我们的重头戏。


四、官方Demo演示:

在当前用户目录下的/home/HwHiAiUser/samples,直接运行./start_notebook.sh打开一下即可,但是发现启动的脚本URL只是127.0.0.1里面的地址,因为我是使用SSH链接的,打不开这个地址。
在这里插入图片描述

只能查看一个这个脚本看一下,可以看到这个脚本中是可以携带参数的,我们只需要后面跟个参数,就当做ip来启动了。

在这里插入图片描述
以下为脚本代码:

export PYTHONPATH=/usr/local/Ascend/thirdpart/aarch64/acllite:$PYTHONPATH

if [ $# -eq 1 ];then
    jupyter lab --ip $1 --allow-root --no-browser
else
    jupyter lab --ip 127.0.0.1 --allow-root --no-browser
fi

可以使用./start_notebook.sh 10.199.48.81来启动脚本,启动后,就可以看到有一个10.199.48.81 IP地址启动的链接,在我的主机上就可以完美打开。

在这里插入图片描述
通过复制上面的地址,注意有一个token值“http://10.199.48.81:8888/lab?token=f6296a75361544978b2e82da9d67887d2d0ea36939b202bd”,打开页面,可以看到系统提供的8个Demo,我稍微浏览了一下,感觉第8个有点意思,根据文档一步一步走到最后。

  • 功能:使用Pix2Pix实现图像转换。
  • 样例输入:mindrecord格式的文件。
  • 样例输出:风格转换后的图象。
    在这里插入图片描述
    可以看到使用推理完成后,非常快就能输出结果(大概不到10秒),上述的操作可以包括以下几个步骤:
  • 初始化acl资源:在调用acl相关资源时,必须先初始化AscendCL,否则可能会导致后续系统内部资源初始化出错。
  • 对图片进行前处理:在此样例中,我们首先根据图片路径,使用mindspore.dataset.MindDataset接口下加载测试用数据集。然后基于数据集对象使用mindspore中的create_dict_iterator接口创建数据迭代器。
  • 推理:利用AclLiteModel.execute接口对数据进行推理。
  • 可视化图片:利用plt将结果画出。

五、迁移票据OCR实操:

公司在前几年都处于一个发展期,自从去年开始,由于GPT大火之后,公司上下也在不断的在摸索智能AI产品,目的在于为工作提效,降低一些运营成本,比如有些销售人员开始使用kimi工具进行一些excel报表的提效,有些UI使用了MJ生成海报来提效,那么,目前有2块IT开发的业务已经在生产上的运行,同时也达到了比较好的效果。

  • 运营人员通过Coze进行生成AI海报和转发文案,减少了运营人员的工作量

在这里插入图片描述

  • 售后、财务增加票据OCR AI智能识别,将票据信息按照规律自动填充,减少手工录入的痛点,一般票据上有很多字段,人工录入容易出错,且人效不高,录错了导致流程重新打回,增加作业的成本。

1. 上传需要准备的素材:

公司采购了一套OCR相关的AI代码,目前部署在生产环境,这里我们将OCR的相关代码使用scp命令,从我的主机上传到开发板上,另外,再上传一张图片做为票据的识别图片,没有像windows那样的FTP那么方便。
在这里插入图片描述


2. 创建运行环境:

Conda 是一个开源的软件包管理系统和环境管理系统,用于安装多个版本的软件包及其依赖关系,并在它们之间轻松切换。

# 使用anconda运行python
conda create -n ocrTest python=3.9
1.2切换到对应环境
conda activate ocrTest

在这里插入图片描述

通过conda我们初始化一个虚拟环境,这样在部署其它的AI应用时,可以很好的做到一个环境的隔离,我们生产也是这样做的。


2. 安装依赖命令:

安装项目中需要使用到的依赖,这里可以从清华源来进行安装,速度相对于来快。

pip3 install transformers==4.33.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118
pip3 install synthtiger==1.2.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install protobuf==4.24.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install sentencepiece==0.1.99 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install transformers[torch] -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install datasets==2.14.5 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install tensorboardX==2.6.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install flask -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install uwsgi -i https://pypi.tuna.tsinghua.edu.cn/simple

在这里插入图片描述

在最后一步安装uwsgi报错,“*** error linking uWSGI ***[end of output]”,在网上搜索了一个文章在 Python3.9 的 Anaconda 虚拟环境中安装 uWSGI 时出现以下报错

3. 启动方法:

将之前的上传的项目,使用unzip解压缩一下,再切换项目的当前路径上,执行以下启动的命令:

uwsgi --http :80 --wsgi-file App.py --processes 1 --threads 2

这里需要注意一下,使用uwsgi时,报错找不到命令,改为以下路径执行即可:

/home/HwHiAiUser/.conda/envs/ocrTest/bin/ uwsgi --http :80 --wsgi-file App.py --processes 1 --threads 2

在这里插入图片描述


代码说明:

(1). 期间脚本一直提示import cv不成功,找了好几个方案也没解决:

导入import cv2时报错ImportError:DLL load fail:找不到指定模块解决办法

import transformers,os,torch,cv
from PIL import Image
import numpy as np

def run_prediction(image:Image,max_length=1024, model=ocr_model, processor=ocr_processor):

    img = np.array(image)
    # 判断图片角度
    #angle = get_angle(image)
    #if angle == 1:
    #    img = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)
    #elif angle == 2:
    #    img = cv2.rotate(img, cv2.ROTATE_180)
    #elif angle == 3:
    #    img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)

pixel_values = processor(img, random_padding=False, return_tensors="pt").pixel_values
...

查看代码这个cv是为了进行图片的角度旋转,因为时间原因,所以,直接就暂时注释一下。

(2). 模型相关以下是模型相关的主要代码,本项目有两个模型,图片方向识别模型 使用resnet18做了一个简单的分类算法,donut文档理解模型 用来识别发票理解文档。

在这里插入图片描述

# 加载识别模型
ocr_processor = DonutProcessor.from_pretrained(os.path.join(path,"model/donut"))
ocr_model = VisionEncoderDecoderModel.from_pretrained(os.path.join(path,"model/donut"))

# Move model to GPU
device = "cuda" if torch.cuda.is_available() else "cpu"
ocr_model.to(device) #模型绑定到GPU上

# 加载图片角度识别模型
angle_extractor = AutoFeatureExtractor.from_pretrained(os.path.join(path,"model/angle"))
angle_model = ResNetForImageClassification.from_pretrained(os.path.join(path,"model/angle"))

以下是Flask启动一个web服务,当然里面有一些中间件鉴权的代码我这里稍微去掉了,通过启动一个Flask的Web服务,就可以让其它系统进行调用这个模型来自动识别图片。

@application.route('/ocr',methods=['POST','GET'])#如果不想给方法起名就用'/',也可以自己定义名称,例如这里起名为demo
def ocr():
    if request.method == 'POST':
        #max_length = request.form['max_length']
        #image = request.form['image']
        res = request.get_json()
        max_length=int(res['max_length'])
        image = Image.open(io.BytesIO(base64.b64decode(res['image']))).convert('RGB')
        ....

if __name__ == '__main__':
 application.run(host='0.0.0.0', port=80, debug=True, use_reloader=False)

接口测试请求文件使用说明,这里去掉一些加密授权的代码,输入本地图片的地址(需要注意一下反斜杠需要做转义)和wifi的IP地址,使用python test.py命令即可执行。

import requests,base64,time,hashlib

# 加密授权算法注释了
......

data={
    "max_length":1024,
    "image":base64.b64encode(open(r"xxxxxxxxxxxxxxx",mode="rb").read()).decode(),
}

resp=requests.post("http://xxx.xxxx.xxxx.xxx/ocr",json=data)
print(resp.json())

如果有Java的朋友,也可以使用以下代码进行调用,无非就是发送一个post请求:

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import cn.hutool.crypto.digest.DigestUtil;
import org.apache.commons.codec.binary.Base64;

public class TEST {

    public static String encode(final byte[] bytes) {
        return new String(Base64.encodeBase64(bytes));
    }
    public static String img2Base64(BufferedImage img) throws IOException{
		ByteArrayOutputStream os = new ByteArrayOutputStream();
		ImageIO.write(img, "png", os);
		String imgString=encode(os.toByteArray());
		return imgString;
    }
	public static void main(String[] args) throws Exception {
		long timestamp = System.currentTimeMillis();
		JSONObject param = JSONUtil.createObj();
		param.put("max_length", 1024);
		param.put("image", img2Base64(ImageIO.read(new File("xxx/xxx/xxx/xxxx"))));
		String result = HttpUtil.post("http://xxx.xxx.xxx.xxx/ocr", param.toString());
		System.out.println(result);
	}
}

五、总结:

自从在上家公司物联网行业接触过树莓派之后,到现在新接触香橙派这个板子,然后完成了公司的一个项目迁移到香橙派开发板子上运行,有以下总结:

优点:

  • 颜值比较高,比以前接触的树莓派外观上好很多,而且风扇也很大,可以保证在推理的时候,及时降低温度
  • 对于我们公司的应用完全够用,速度方面个人感觉还是比较快,比我们现在生产部署的应用还要快一点。
  • 机器在推理的时候,没有噪音,在拿到板子到实验完成过程中,首次开机后,就一直很稳定
  • 在早期我们也有考虑过使用OCR的付费产品,但是对于我们这种汽车保险类的公司,单据量非常庞大(但是并发不高,因为平均1天1-2个案件),一个案例可能需要几十个报销证明、单据,按量付费,确实比较贵,自己部署的AI应用相对于成本小一点,可以使用香橙派,节省一些线上的云资源
  • 另外,支持多种启动方式,支持丰富的硬件接口,还有串口调试、USB识别
  • 支持Ubuntu、openEuler操作系统,满足大多数AI算法原型验证、推理应用开发的需求
  • 安装项目中需要使用到的依赖,从清华源来进行安装,速度还是比较快的,然后,在数据写入的过程中,也没有发现板子有什么响动(在mac下载的朋友有体验过,嗡嗡的狂响),而且风扇也十分的平稳,没有异动
  • 使用系统的shutdown关机后,我摸了一下主板,不是很烫,说明在长时间的运行过程中,至少散热性是比较不错的
  • USB、HDMI、type-c电源线的接口稍微有点紧,在拔出的时候,害怕把主板搞坏

缺点:

  • 官方的一些资料托管到百度云盘,可以多几个渠道,没开会员,网速实确比较尴尬,一个镜像我下载了1天
  • 只有在启动的前一会,风扇的噪音特别的大,比如将机器重启、将机器关机重开机,将机器重新插上电源
  • 官方的文档太丰富了,其实里面讲的很详细,但是在查阅的时候,需要大量的排查,建议也出一个AI智能体查阅资料
  • 板子最好还是要有个箱子,不然,怕触电或者有东西碰到风扇
  • 另外在TF卡,是否比较稳定,如果在我们以前这种租赁的物联网水机或者租赁的打印机中放置会不会有影响?

官方的资料和镜像其实算很完善,可以详细阅读一下,有需要的朋友自拿。
在这里插入图片描述

在这里插入图片描述

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值