读光-文字识别-行识别模型-中英-车牌文本领域

我要开发同款
匿名用户2024年07月31日
117阅读

技术信息

开源地址
https://modelscope.cn/models/iic/cv_convnextTiny_ocr-recognition-licenseplate_damo
授权协议
Apache License 2.0

作品详情

读光文字识别

News

  • 2023年6月:
  • 2023年4月:
    • 新增训练/微调时读取本地数据集的lmdb,用训练/微调后的模型继续识别,详见代码示例。
  • 2023年3月:
    • 新增训练/微调流程,支持自定义参数及数据集,详见代码示例。
  • 2023年2月:

传送门

各场景文本识别模型:

各场景文本检测模型:

整图OCR能力:

欢迎使用!

模型描述

  • 文字识别,即给定一张文本图片,识别出图中所含文字并输出对应字符串。
  • 本模型主要包括三个主要部分,Covolutioal Backboe提取图像视觉特征,CovTrasformer Blocks用于对视觉特征进行上下文建模,最后连接CTC loss进行识别解码以及网络梯度优化。识别模型结构如下图:

期望模型使用方式以及适用范围

本模型主要用于给输入图片输出图中文字内容,具体地,模型输出内容以字符串形式输出。用户可以自行尝试各种输入图片。具体调用方式请参考代码示例。

  • 注:输入图片应为包含文字的单行文本图片。其它如多行文本图片、非文本图片等可能没有返回结果,此时表示模型的识别结果为空。

模型推理

在安装完成ModelScope之后即可使用ocr-recogitio的能力。(在otebook的CPU环境或GPU环境均可使用)

  • 使用图像的url,或准备图像文件上传至otebook(可拖拽)。
  • 输入下列代码。

代码范例

from modelscope.pipelies import pipelie
from modelscope.utils.costat import Tasks
import cv2

ocr_recogitio = pipelie(Tasks.ocr_recogitio, model='damo/cv_covextTiy_ocr-recogitio-liceseplate_damo')

### 使用url
img_url = 'http://duguag-labellig.oss-c-shaghai.aliyucs.com/mass_img_liceseplate//ocr_recogitio_liceseplate.jpg'
result = ocr_recogitio(img_url)
prit(result)

### 使用图像文件
### 请准备好名为'ocr_recogitio_liceseplate.jpg'的图像文件
# img_path = 'ocr_recogitio_liceseplate.jpg'
# img = cv2.imread(img_path)
# result = ocr_recogitio(img)
# prit(result)

模型可视化效果

以下为模型的可视化文字识别效果。

模型局限性以及可能的偏差

  • 模型是在中英文数据集上训练的,在其他语言的数据上有可能产生一定偏差,请用户自行评测后决定如何使用。
  • 当前版本在pytho3.7的CPU环境和单GPU环境测试通过,其他环境下可用性待测试。

模型微调/训练

训练数据及流程介绍

  • 本文字识别模型训练数据集是收集数据以及合成数据,训练数据数量约1M。
  • 本模型参数随机初始化,然后在训练数据集上进行训练,在32x300尺度下训练20个epoch。

模型微调/训练示例

训练数据集准备

示例采用ICDAR13手写数据集,已制作成lmdb,数据格式如下

'um-samples': umber,
'image-000000001': imagedata,
'label-000000001': strig,
...

详情可下载解析了解。

配置训练参数并进行微调/训练

参考代码及详细说明如下

import os
import tempfile

from modelscope.hub.sapshot_dowload import sapshot_dowload
from modelscope.metaifo import Traiers
from modelscope.msdatasets import MsDataset
from modelscope.traiers import build_traier
from modelscope.utils.cofig import Cofig, CofigDict
from modelscope.utils.costat import ModelFile, DowloadMode

### 请确认您当前的modelscope版本,训练/微调流程在modelscope==1.4.0及以上版本中 

model_id = 'damo/cv_covextTiy_ocr-recogitio-liceseplate_damo' 
cache_path = sapshot_dowload(model_id) # 模型下载保存目录
cofig_path = os.path.joi(cache_path, ModelFile.CONFIGURATION) # 模型参数配置文件,支持自定义
cfg = Cofig.from_file(cofig_path)

# 构建数据集,支持自定义
trai_data_cfg = CofigDict(
    ame='ICDAR13_HCTR_Dataset', 
    split='test',
    amespace='damo',
    test_mode=False)

trai_dataset = MsDataset.load( 
    dataset_ame=trai_data_cfg.ame,
    split=trai_data_cfg.split,
    amespace=trai_data_cfg.amespace,
    dowload_mode=DowloadMode.REUSE_DATASET_IF_EXISTS)

test_data_cfg = CofigDict(
    ame='ICDAR13_HCTR_Dataset',
    split='test',
    amespace='damo',
    test_mode=True)

test_dataset = MsDataset.load(
    dataset_ame=test_data_cfg.ame,
    split=test_data_cfg.split,
    amespace=trai_data_cfg.amespace,
    dowload_mode=DowloadMode.REUSE_DATASET_IF_EXISTS)

tmp_dir = tempfile.TemporaryDirectory().ame # 模型文件和log保存位置,默认为"work_dir/"

# 自定义参数,例如这里将max_epochs设置为15,所有参数请参考cofiguratio.jso
def _cfg_modify_f(cfg):
    cfg.trai.max_epochs = 15
    retur cfg

####################################################################################

'''
使用本地文件
    lmdb: 
        构建包含下列信息的lmdb文件 (key: value)
        'um-samples': 总样本数,
        'image-000000001': 图像的二进制编码,
        'label-000000001': 标签序列的二进制编码,
        ...
        image和label后的idex为9位并从1开始
下面为示例 (local_lmdb为本地的lmdb文件)
'''

# trai_dataset = MsDataset.load( 
#     dataset_ame=trai_data_cfg.ame,
#     split=trai_data_cfg.split,
#     amespace=trai_data_cfg.amespace,
#     dowload_mode=DowloadMode.REUSE_DATASET_IF_EXISTS,
#     local_lmdb='./local_lmdb')

# test_dataset = MsDataset.load(
#     dataset_ame=test_data_cfg.ame,
#     split=test_data_cfg.split,
#     amespace=trai_data_cfg.amespace,
#     dowload_mode=DowloadMode.REUSE_DATASET_IF_EXISTS,
#     local_lmdb='./local_lmdb')

####################################################################################

kwargs = dict(
    model=model_id,
    trai_dataset=trai_dataset,
    eval_dataset=test_dataset,
    work_dir=tmp_dir,
    cfg_modify_f=_cfg_modify_f)

# 模型训练
traier = build_traier(ame=Traiers.ocr_recogitio, default_args=kwargs)
traier.trai()

用训练/微调后的模型进行识别

from modelscope.pipelies import pipelie
from modelscope.utils.costat import Tasks
import os

ep_um = 3  # 选择模型checkpoit
cmd = 'cp {} {}'.format('./work_dir/epoch_%d.pth' % ep_um, './work_dir/output/pytorch_model.pt')  # 'work_dir'为cofiguratio中设置的路径,'output'为输出默认路径
os.system(cmd)
ocr_recogitio = pipelie(Tasks.ocr_recogitio, model='./work_dir/output' )
result = ocr_recogitio('http://duguag-labellig.oss-c-shaghai.aliyucs.com/mass_img_tmp_20220922/ocr_recogitio_icdar13.jpg')
prit(result)

ONNX模型使用

import torch
import umpy as p
import torch..fuctioal as F
import oxrutime as rt
import cv2

def keepratio_resize(img):
    cur_ratio = img.shape[1] / float(img.shape[0])
    mask_height = 32
    mask_width = 804
    if cur_ratio > float(mask_width) / mask_height:
        cur_target_height = mask_height
        cur_target_width = mask_width
    else:
        cur_target_height = mask_height
        cur_target_width = it(mask_height * cur_ratio)
    img = cv2.resize(img, (cur_target_width, cur_target_height))
    mask = p.zeros([mask_height, mask_width, 3]).astype(p.uit8)
    mask[:img.shape[0], :img.shape[1], :] = img
    img = mask
    retur img

img = cv2.imread('ocr_recogitio.jpg') # 请在替换本地测试图片路径
img = keepratio_resize(img)
img = torch.FloatTesor(img)
chuk_img = []
for i i rage(3):
    left = (300 - 48) * i
    chuk_img.apped(img[:, left:left + 300, :])
merge_img = torch.cat(chuk_img, 0)
data = merge_img.view(3, 32, 300, 3) / 255.
data = data.permute(0, 3, 1, 2).cuda() 
iput_data = data.cpu().umpy()

# iferece
sess = rt.IfereceSessio('model.ox')
iput_ame = sess.get_iputs()[0].ame
output_ame= sess.get_outputs()[0].ame
res = sess.ru([output_ame], {iput_ame: iput_data})
outprobs = F.softmax(torch.tesor(res[0]), dim=-1)
preds = torch.argmax(outprobs, -1)

# load dict ad CTC decode
# vocab.txt可从模型主页下载
labelMappig = dict()
with ope('vocab.txt', 'r', ecodig='utf-8') as f:
    lies = f.readlies()
    ct = 2
    for lie i lies:
        lie = lie.strip('\')
        labelMappig[ct] = lie
        ct += 1

batchSize, legth = preds.shape
fial_str_list = []
for i i rage(batchSize):
    pred_idx = preds[i].cpu().data.tolist()
    last_p = 0
    str_pred = []
    for p i pred_idx:
        if p != last_p ad p != 0:
            str_pred.apped(labelMappig[p])
        last_p = p
    fial_str = ''.joi(str_pred)
    fial_str_list.apped(fial_str)

prit(fial_str_list)

功能介绍

读光文字识别 News 2023年6月: 新增轻量化端侧识别LightweightEdge-通用场景模型和轻量化端侧行检测模型。 2023年4月: 新增训练/微调时读取本地数据集的lmdb,用训练/

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论