情况1:默认不需要标注电能表样本、训练电能表OCR模型,需调用PaddleOCR出识别字符,对识别信息进行提取
01 -- >> test01.py
情况2:需要从无到有标注OCR样本,或已有样本及标签文件,需训练电能表OCR模型,调用OCR模型识别样本字符,对识别信息进行提取
02 -- PaddleOCR-main
OCR的处理包含两个流程:1-字符检测,2-字符识别。两个流程需要两种不同的数据集格式,如字符检测部分,样本内容主要包含字符图像与字符对应的坐标(参考dataset/ctw1500数据集),
识别部分样本内容包含裁剪出的字符区域样本及对应的字符标签(参考dataset/rec数据集)。因此在训练电能表信息提取模型前,数据样本需处理成可训练的格式(参考ctw1500数据集、rec数据集)
文字检测训练 mv3_db 模型
直接在控制台运行以下脚本即可完成字符检测算法的训练,其中configs/det/det_mv3_db.yml文件为算法的基础配置文件,det_mv3_db为选择的算法类型,调整改文档中的参数既能对算法训练的信息
进行修正,如总迭代次数:epoch_num,每迭代多少次保存一次权重:save_epoch_step, 训练的图像路径:data_dir, 训练的标签路径:label_file_list,
另pretrained/MobileNetV3_large_x0_5_pretrained为算法训练的权重路径
python tools/train.py -c configs/det/det_mv3_db.yml -o Global.pretrained_model=./pretrained/MobileNetV3_large_x0_5_pretrained
文字识别训练
直接在控制台运行以下脚本即可完成字符识别算法的训练,关键信息与上述相同
python tools/train.py -c configs/rec/PP-OCRv3/en_PP-OCRv3_rec.yml -o Global.pretrained_model=./pretrained/en_PP-OCRv3_rec_train/best_accuracy
推理
paddle训练的模型需将训练生成的权限转换为推理所需的权重
1、对文字检测模型的权重进行转换
加载配置文件det_mv3_db.yml
,从/output/db_mv3/
目录下加载latest
模型,inference模型保存在./output/det_db_inference
目录下
python tools/export_model.py -c configs/det/det_mv3_db.yml -o Global.pretrained_model="./output/db_mv3/latest" Global.save_inference_dir="./output/det_db_inference/"
2、对文书识别模型的权重进行转换
关键信息配置同上
python tools/export_model.py -c configs/rec/PP-OCRv3/en_PP-OCRv3_rec.yml -o Global.pretrained_model=./output/v3_en_mobile/latest Global.save_inference_dir=./output/rec__inference/
文字检测算法、文字识别算法(完成OCR算法的推理)
02 -- PaddleOCR-main -- test02.py
test02.py 涉及代码实际与test01.py相同,其主要区别在于test01.py直接使用提供的的权重进行字符的检测识别,test02.py为仅有样本及标签文件,从标签文件开始训练自己的模型,转换模型实现模型的推理
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# @Project :电能表信息提取
# @Author :rui
# @Date :2024/10/11 16:56
# 导入库
import cv2
from paddleocr import PaddleOCR, draw_ocr
from PIL import Image
# 第一部分:电能表字符识别及提取
# OCR识别默认中文--'ch'
paddleOcr = PaddleOCR(lang='ch')
# 读取图像
img = cv2.imread('images/08f790529822720e0cf37bed01991d46f21fbe097dd3.jpg') # 打开需要识别的图片
# 字符识别
result = paddleOcr.ocr(img)
# 1、逐行输出识别结果,含位置坐标,提取的信息, 识别字块对应的置信度
for i in result[0]:
print(i)
# 逐行输出识别结果,仅提取字符信息
for i in range(len(result[0])):
print(result[0][i][1][0])
# 第二部分,识别结果展示
result = result[0]
image = Image.open('images/08f790529822720e0cf37bed01991d46f21fbe097dd3.jpg').convert('RGB')
# 提取每一个字块对应的框
boxes = [line[0] for line in result]
# 按识别顺序提取字符
txts = [line[1][0] for line in result]
# 字块置信度提取
scores = [line[1][1] for line in result]
# 识别结果写入图像进行展示
im_show = draw_ocr(image, boxes, txts, scores, font_path='./fonts/simfang.ttf')
im_show = Image.fromarray(im_show)
# 保存样本
im_show.save('result.jpg')
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# @Project :电能表信息提取
# @Author :rui
# @Date :2024/10/16 14:55
import os
import cv2 as cv
from paddleocr import PaddleOCR
def ocr_predict(imgPath):
'''
det_model_dir:文本检测
rec_model_dir:文本识别
'''
# 注意lang参数,en时代表英文字符识别,ch为中文
ocr = PaddleOCR(det_model_dir="./output/det_db_inference/",
rec_model_dir="./output/rec__inference/", lang='en', use_angle_cls=True,
use_gpu=False)
img = cv.imread(imgPath)
result = ocr.ocr(img)
print(result)
if __name__ == '__main__':
img_path = "dataset/ctw1500/imgs/test/"
files = os.listdir(img_path)
for file in files:
img = img_path + file
ocr_predict(img)