0
点赞
收藏
分享

微信扫一扫

Kafka-设计思想-1

背景

最近在实际操作阿拉伯文小语种OCR功能的时候,尝试了诸多开源算法,但效果均不尽如人意。

说实在的,针对阿拉伯文的OCR开源算法,若仅仅是效果没那么优秀,比如识别率能有个70%80%,我还能微调微调,但是现在很多开源算法连最基础的识别率都不能保证,丝毫没有微调的可能性,这和从头训练没有区别!

但是前几天以一种不抱希望的态度尝试EasyOCR里面阿拉伯文模型的时候,带给了我惊喜,在我实际操作使用的过程中,easyOCR算法无论在实际效果、运行效率、易操作性都大大领先与一众其他的OCR开源算法。

本文则重点介绍EasyOCR算法中CRAFT文本检测模型的微调方法

EasyOCR简介

一般的OCR算法主要分三步走:

  • 文本检测模型框出待检测图像内的文本,并输出文本框的坐标描述。
  • 文本分割模型分割文本框内的文本,最终输出字符的文本框坐标描述
  • 文本识别模型针对每个字符进行识别,并最终输出

显然这种方式丢失了各个字符之间的相互关系信息,使得前后字符无法互相纠错,识别率自然大大降低。

故EasyOCR将后续两步进行了大修,先用基础的ResNet进行特征提取,后采用了时间序列的循环神经网络LSTM和CTC解码的方式进行整体单词的识别和输出,这使得EasyOCR在对于一些基于字母排列顺序的文本识别效果极佳(例如:英文、阿拉伯文、德语……)

EasyOCR详细的架构图如下

CRAFT微调方法

其实官网有详细的说明文档,本文也是基于官网的操作步骤进行补充说明,以期使得更加易懂和富有操作性。

官网连接如下:

EasyOCR/trainer/craft/README.md at master · JaidedAI/EasyOCR · GitHub

step1:安装相关项目和库

1. 下载项目

git clone https://github.com/JaidedAI/EasyOCR.git

2. 安装相关库

进入项目根目录下的trainer\craft文件夹,并执行:

pip install -r requirements.txt

step2:准备本地数据集

1. craft文件夹下文件树结构介绍

trainer\craft文件目录下的文件树如下所示,重点为下列加粗红色标记的文件

 2. 数据集结构说明

 label文本文件的结构如下:

 对应的图形化说明如下:

label文本文件的一个示例如下: 

3. 使用labelimg来帮助标注

easyocr的标注格式奇奇怪怪的,没找到合适的标注软件,之前常用labelimg来进行模型标注,相似的标注格式为YOLO的图像标注,故采用labelimg来进行标注。若读者有更好的标注方式,请评论告知,满城百姓,感谢不尽!

我猜测easyocr还支持相似变换的OCR功能,所以标注文件需要把四个点的坐标都输出,以支持类似平行四边形、梯形的文本框。(待验证)

yolo标签格式转easyocr标签格式: 

def yolo_to_corners(txt_file_path, img_path):  
    # 读取图像尺寸  
    img = cv2.imread(img_path)  
    img_height, img_width, _ = img.shape  
  
    # 读取YOLO格式的标签文件  
    with open(txt_file_path, 'r') as f:  
        lines = f.readlines()  
    results = []
    for line in lines:  
        parts = line.strip().split(' ')  
        cls = int(parts[0])  
        x_center = float(parts[1])  
        y_center = float(parts[2])  
        width = float(parts[3])  
        height = float(parts[4])  
  
        # 将相对坐标转换为绝对像素坐标  
        x_center_px = int(x_center * img_width)  
        y_center_px = int(y_center * img_height)  
        half_width = int(width * img_width / 2)  
        half_height = int(height * img_height / 2)  
  
        # 计算四个角的坐标  
        x1, y1 = x_center_px - half_width, y_center_px - half_height  
        x2, y2 = x_center_px + half_width, y_center_px - half_height
        x3, y3 = x_center_px + half_width, y_center_px + half_height  
        x4, y4 = x_center_px - half_width, y_center_px + half_height 
        results.append(f"{x1},{y1},{x2},{y2},{x3},{y3},{x4},{y4},txt")
 
    return results

step3:下载预训练模型,并更新config配置 

1. 下载预训练模型

官方链接如下:

https://drive.google.com/file/d/1enVIsgNvBf3YiRsVkxodspOn55PIK-LJ/view?usp=sharing

下载完毕后,放于EasyOCR\trainer\craft\pretrained_model目录下,若没有pretrained_model目录,自己新建一个即可。

2. 更新config配置

进入config文件夹,里面有一个custom_data_train.yaml文件。

若你是根据上诉步骤一步步来的,实际上无需修改任何配置,但是也许你可以修改一下end_iter字段,这个是训练轮次的意思,原来数据为25000,一开始你可以设置的小一点。

总之我的custom_data_train.yaml文件内容如下:

step3:微调训练开始!

进入EasyOCR\trainer\craft目录运行如下代码:

python train.py --yaml=custom_data_train 

然后静待结束即可 。训练完成的模型输出目录为:EasyOCR\trainer\craft\exp\custom_data_train

举报

相关推荐

0 条评论