基于MindSpore案例的香橙派开发板离线推理实践——图片文本识别
2024/06/29调试调优
基于MindSpore案例的香橙派开发板离线推理实践——图片文本识别
样例介绍
文本识别指从图像中识别出文本,将图像中的文字区域转化为字符信息,通常采用CNN网络从图像中提取丰富的特征信息,然后根据提取的特征信息进行识别。这里采用ResNet作为特征提取网络,采用CTC(Connectionist Temporal Classification)方法进行识别。 此脚本用于将cnnctc模型ckpt文件转换成AIR文件,再转换成OM文件,最后进行离线推理。
前期准备
- 基础镜像的样例目录中已包含转换后的om模型以及测试图片,如果直接运行,可跳过此步骤。如果需要重新转换模型,可以参考下面的步骤。
- 建议在Linux服务器或者虚拟机转换该模型。
- 为了能进一步优化模型推理性能,我们需要将其转换为om模型进行使用 以下为转换指令:
atc --model=cnnctc.air --output="cnnctc" --framework=1 --soc_version=Ascend310B4 --output_type=FP32 --precision_mode=allow_fp32_to_fp16 --log=info- 其中转换参数的含义为:
- --model:输入模型路径
- --framework:原始网络模型框架类型,1表示air,5表示ONNX
- --output:输出模型路径
- --log:日志级别
- --soc_version:昇腾AI处理器型号
!sh env.sh # cell中运行此代码
模型推理实现
得到cnnctc.om后,执行离线推理代码,加载推理图片predict.png
1. 导入三方库
import os
import time
import argparse
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
from acllite_model import AclLiteModel as Model
from acllite_resource import AclLiteResource as AclResource
2. 模型导入和处理
# 获取模型om文件
from download import download
model_url = "https://mindspore-courses.obs.cn-north-4.myhuaweicloud.com/orange-pi-mindspore/02-CNNCTC/cnnctc.zip"
download(model_url, "./", kind="zip", replace=True)
# om模型和图片的位置
MODEL_PATH = './cnnctc.om'
IMAGE_PATH = './predict.png'
# 初始化acl资源
acl_resource = AclResource()
acl_resource.init()
#导入本地om模型
print('load model....')
model = Model(MODEL_PATH)
print('load model finished....')
# 文本与数据编码
class CTCLabelConverter():
def __init__(self, character):
dict_character = list(character)
self.dict = {}
for i, char in enumerate(dict_character):
self.dict[char] = i + 1
self.character = ['[blank]'] + dict_character
self.dict['[blank]'] = 0
#将文本转换为数字编码
def encode(self, text):
length = [len(s) for s in text]
text = ''.join(text)
text = [self.dict[char] for char in text]
return np.array(text), np.array(length)
# 将数字编码转换为文本
def decode(self, text_index, length):
texts = []
index = 0
for l in length:
t = text_index[index:index + l]
char_list = []
for i in range(l):
if t[i] != self.dict['[blank]'] and (
not (i > 0 and t[i - 1] == t[i])):
char_list.append(self.character[t[i]])
text = ''.join(char_list)
texts.append(text)
index += l
return texts
3. 进行推理
# 导入和处理目标图片
img_PIL = Image.open(IMAGE_PATH).convert('RGB')
img = img_PIL.resize((100, 32), resample=3)
img = np.array(img, dtype=np.float32)
img = np.expand_dims(img, axis=0)
img = np.transpose(img, [0, 3, 1, 2])
# 定义推理的时间
start = time.time()
model_predict = model.execute([img])[0]
end = time.time()
print(f'infer use time:{(end-start)*1000}ms')
# 初始化文本编码函数
character = '0123456789abcdefghijklmnopqrstuvwxyz'
converter = CTCLabelConverter(character)
# 推理过程
preds_size = np.array([model_predict.shape[1]])
preds_index = np.argmax(model_predict, 2)
preds_index = np.reshape(preds_index, [-1])
preds_str = converter.decode(preds_index, preds_size)
print('Predict: ', preds_str)
总结与扩展
以上就是cnnctc文本识别样例离线推理的运行结果了,可以看到最后的验证结果,成功识别了示例图片中‘PARKING’的字样。 注意:
- 若出现推理失败的情况,请确保以root权限设置好环境变量(运行或参考文件夹内的env.sh文件)。
- 再次进行推理清清空所有缓存。