easyocr配置及相关训练

news/2024/12/11 14:51:14/

ocr>easyocr配置及相关训练

  • 1,相关链接
  • 2,安装配置
  • 3,官方模型测试
  • 4,自定义数据集训练及测试
    • (1)标签转换脚本
    • (2)生成lmdb数据格式(重要)
    • (3)预训练模型下载
    • (4)训练
    • (5)测试

1,相关链接

https://blog.csdn.net/leiwuhen92/article/details/126419345
EasyOCR 识别模型训练(重要必看)

2,安装配置

pip install ocr>easyocr

3,官方模型测试

使用下方代码进行模型调用,可以对检测结果可视化,并且其在 EasyOCR 基础上,增补功能,提高文字识别的准确率和覆盖率。

https://gitee.com/deng-kan/augmented_ocr>easyocr/tree/master
基于EasyOCR 二次封装好的源代码(重要)

在这里插入图片描述

相关模型下载:
https://www.jaided.ai/ocr>easyocr/modelhub/
在这里插入图片描述

使用纯英文模型

将相关模型放到用户下的相关路径下
在这里插入图片描述

使用en 专门的英文模型(只用en要比准确)
在这里插入图片描述

其可以是被验证码,即其对于遮挡物体的数字英文识别效果也是比较好一些的
在这里插入图片描述

4,自定义数据集训练及测试

参考下方链接,及其重要
https://blog.csdn.net/leiwuhen92/article/details/126419345
EasyOCR 识别模型训练(重要必看)

只下载用于训练的即可
https://github.com/clovaai/deep-text-recognition-benchmark#when-you-need-to-train-on-your-own-dataset-or-non-latin-language-datasets

这里用自己的图像集训练,可以只下载deep-text-recognition-benchmark即可,用此来进行训练

(1)标签转换脚本

import cv2
import os
import csvinput_path = "E:/tupian/ocr2/ocr_data"
output_path = "./data"
ratio = 0.2#拆分列表
def split_list(lst, ratios, num_splits):"""将列表按照指定比例和数量拆分成子列表:param lst: 待拆分列表:param ratios: 每个子列表的元素占比,由小数表示的列表:param num_splits: 子列表的数量:return: 拆分后的子列表组成的列表"""if len(ratios) != num_splits:raise ValueError("The length of ratios must equal to num_splits.")total_ratio = sum(ratios)if total_ratio != 1:raise ValueError("The sum of ratios must be equal to 1.")n = len(lst)result = []start = 0for i in range(num_splits):end = start + int(n * ratios[i])result.append(lst[start:end])start = endreturn resultdef read_path(input_path,output_path,ratio):#遍历该目录下的所有图片文件train_list = []img_output_path_train = './data/train/images/'img_output_path_valid = './data/valid/images/'img_output_path_eval = './data/eval/images/'for filename in os.listdir(input_path):if '.jpg' in filename:img_filename = filenameimg_path = input_path +'/' + filenametxt_path = input_path +'/' + filename.replace('.jpg','.txt')img_output_path_train = './data/train/images/'img_output_path_valid = './data/valid/images/'img_output_path_eval = './data/eval/images/'if not os.path.exists(img_output_path_train):os.makedirs(img_output_path_train)if not os.path.exists(img_output_path_valid):os.makedirs(img_output_path_valid)if not os.path.exists(img_output_path_eval):os.makedirs(img_output_path_eval)print(img_path)print(txt_path)#读取保存图像img = cv2.imread(img_path)cv2.imwrite(img_output_path_train + img_filename, img)cv2.imwrite(img_output_path_valid + img_filename, img)cv2.imwrite(img_output_path_eval + img_filename, img)#读取txt文件并保存到tsv#中间用tab隔开(字符空格隔开,使用space表示空格)label = ''with open(txt_path, "r", encoding='utf-8') as f:# read():读取文件全部内容,以字符串形式返回结果data = f.read()for char in data:# if char == ' ':#     char = '<space>'label = label + char + ' 'label = label.replace(' \n ','').replace(' ','')print(label)name_label_list =[]name_label_list.append('images/' + img_filename)name_label_list.append(label)print(name_label_list)train_list.append(name_label_list)#按照比例分割开ratios = [1-ratio, ratio]num_splits = 2result = split_list(train_list, ratios, num_splits)#其中,train.tsv是待创建的文件名或项目文件夹中已有的文件名,‘w’代表写入,指定newline=’‘是为了避免每写出一行数据就会有一个空行,delimiter代表分隔符,tsv的分隔符为’\t’,csv的分隔符为’,’。with open('./data/train/gt.txt', 'w', newline='') as tsvfile:writer = csv.writer(tsvfile, delimiter='\t')writer.writerows(result[0])with open('./data/valid/gt.txt', 'w', newline='') as tsvfile:writer = csv.writer(tsvfile, delimiter='\t')writer.writerows(result[1])with open('./data/eval/gt.txt', 'w', newline='') as tsvfile:writer = csv.writer(tsvfile, delimiter='\t')writer.writerows(result[1])#注意*处如果包含家目录(home)不能写成~符号代替
#必须要写成"/home"的格式,否则会报错说找不到对应的目录
#读取的目录
read_path(input_path, output_path, ratio)
#print(os.getcwd())

要将其转换成如下的数据集格式
在这里插入图片描述
在这里插入图片描述

(2)生成lmdb数据格式(重要)

此处生成lmdb数据格式不能省略(注意:)

python create_lmdb_dataset.py --inputPath data/train --gtFile data/train/gt.txt --outputPath result/train
python create_lmdb_dataset.py --inputPath data/valid --gtFile data/valid/gt.txt --outputPath result/valid
python create_lmdb_dataset.py --inputPath data/eval --gtFile data/eval/gt.txt --outputPath result/eval

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

文件结构要变一下,要手动将其mdb放到MJ-ST文件夹下
在这里插入图片描述

(3)预训练模型下载

https://github.com/WelY1/lp_recognition_TensorRT
在这里插入图片描述

(4)训练

在这里插入图片描述

只下载用于训练的deep-text-recognition-benchmark即可
https://github.com/clovaai/deep-text-recognition-benchmark#when-you-need-to-train-on-your-own-dataset-or-non-latin-language-datasets

训练要选择的字库
在这里插入图片描述

##########

python train.py --train_data result/train --valid_data result/valid --workers 0 --Transformation None --FeatureExtraction VGG --SequenceModeling BiLSTM --Prediction CTC

用下方的训练命令,使用预训练模型
############

python train.py --train_data result/train --valid_data result/valid --workers 0 --select_data MJ-ST  --batch_ratio 0.5-0.5 --Transformation None --FeatureExtraction VGG --SequenceModeling BiLSTM --Prediction CTC  --saved_model None-VGG-BiLSTM-CTC.pth  --num_iter 2000  --valInterval 20 --FT

初步运行成功了

在这里插入图片描述

在这里插入图片描述

(5)测试

在这里插入图片描述

测试脚本增加

 #结果输出string_txt = img_name.replace('.jpg', '') + '_' + pred + '.txt'print(string_txt)with open(string_txt, 'w') as tsvfile:tsvfile.write(pred)

在这里插入图片描述

# 测试项目中包含的演示图像
python demo.py --Transformation None --FeatureExtraction VGG --SequenceModeling BiLSTM --Prediction CTC --image_folder demo_image/  --saved_model ./saved_models/None-VGG-BiLSTM-CTC-Seed1111/best_accuracy.pth

在这里插入图片描述

测试效果不错
在这里插入图片描述


http://www.ppmy.cn/news/1554243.html

相关文章

【系统设计】高可用之缓存基础

缓存的缘起 使用缓存的主要原因包括提高系统性能、降低数据库负载、提升用户体验和保证系统可用性。‌ 在计算机体系结构中&#xff0c;由于处理器和存储器的处理时间不匹配&#xff0c;在处理器和一个较大较慢的设备之间插入一个更小更快的存储设备&#xff08;如高速缓存&a…

深入浅出特征的维度与个数【大白话版】

一、矩阵中的基本概念 在机器学习和深度学习中&#xff0c;数据通常以矩阵的形式表示&#xff1a; 行&#xff08;Rows&#xff09;&#xff1a;代表 样本数量&#xff08;data points&#xff09;&#xff0c;也就是点云中的点数列&#xff08;Columns&#xff09;&#xff…

dolphinScheduler 任务调度

#Using docker-compose to Start Server #下载&#xff1a;https://dlcdn.apache.org/dolphinscheduler/3.1.9/apache-dolphinscheduler-3.1.9-src.tar.gz $ DOLPHINSCHEDULER_VERSION3.1.9 $ tar -zxf apache-dolphinscheduler-"${DOLPHINSCHEDULER_VERSION}"-src.t…

驱动---1.DAC8552实现三角波输出

最近开始进行新项目的研发&#xff0c;考虑用DAC做一个前级输出&#xff0c;选择了DAC8552这个器件的一个模块&#xff0c;用了野火的指南者做主控&#xff0c;芯片是STM32F103VET6&#xff0c;主频是72MHz。 一、器件手册重要信息提取 1.DAC8552具有十六位的分辨率、双通道输…

猫与土豆:谨慎的饮食考量

在宠物饲养日益精细化的今天&#xff0c;猫主人常常会思考各种食物是否适合自家猫咪食用&#xff0c;土豆便是其中之一。 土豆本身富含碳水化合物、维生素 C、钾等营养成分。对于人类而言&#xff0c;土豆是常见且重要的食物来源。然而&#xff0c;猫作为严格的肉食动物&#…

【opencv入门教程】14. 矩阵乘除运算

文章选自&#xff1a; 一、函数multiply、divide //乘法 CV_EXPORTS_W void multiply(InputArray src1, InputArray src2,OutputArray dst, double scale 1, int dtype -1); brief 计算两个数组的每个元素的按比例缩放乘积 note 当输出数组的深度为 CV_32S 时&#xff0c;…

django项目部署 uwsgi的一些知识

前端请求 127.0.0.1:8000/api 是通过 HTTP 协议与后端通信的。在这种情况下&#xff0c;不能直接使用 Unix Socket 文件&#xff0c;因为浏览器或前端程序无法直接与 Unix Socket 文件通信&#xff0c;它们只能通过 HTTP 或 HTTPS 与后端进行通信。 为什么不能用 Unix Socket&…

【kafka】kafka安装(ubuntu+jdk+zookeeper)

前置安装 1.jdk安装与环境变量配置 安装 OpenJDK 21或者其他版本 sudo apt update sudo apt install openjdk-21-jdk使用 readlink 命令查找 java 的路径 readlink -f $(which java)复制 永久设置JAVA_HOME # 粘贴路径/usr/lib/jvm/java-21-openjdk-amd64 echo "e…