在使用PaddleOCR官方提供的转换工具时出现问题,经过查看数据格式发现以下问题:
文本检测的训练数据,可以在同一张图片上进行多个文本标注,最后形成的数据格式如下:
" 图像文件名 json.dumps编码的图像标注信息"
ch4_test_images/img_61.jpg [{"transcription": "MASA", "points": [[310, 104], [416, 141], [418, 216], [312, 179]]}, {...}]
...
文本识别的数据集,是一张图片对应一个文本标注,最后格式如下:
" 图像文件名 图像标注信息 "
train_data/train_0001.jpg 简单可依赖
train_data/train_0002.jpg 用科技让复杂的世界更简单
...
因此,想要使用同一组数据进行文本检测和文本识别训练,需要将文本检测使用的数据集进行剪裁,以满足文本识别的格式要求,代码如下:
import os
from PIL import Image
import numpy as np
#文本检测图片路径
det_images = "D:\\DataSet\\images\\OCR\\20210922\\images"
#文本检测标注文件
det_label_file = "D:\\DataSet\\images\\OCR\\20210922\\det_label.txt"
#文本识别的图片存放路径
rec_images = "D:\\DataSet\\images\\OCR\\20210922\\rec_images"
#文本识别标注信息存放文件
rec_label_file = "D:\\DataSet\\images\\OCR\\20210922\\rec_label.txt"
if os.path.exists(rec_label_file):
os.remove(rec_label_file)
with open(rec_label_file,"w",encoding="utf-8") as out_file:
with open(det_label_file,"r",encoding="utf-8") as f:
for line in f.readlines():
tmp = line.strip('\n').replace(" ", "").split('\t')
img_path, label = tmp[0], tmp[1]
img_basename = os.path.basename(img_path)
img_path = os.path.join(det_images,img_basename)
labels = eval(label.replace("false", "0"))
n = len(labels)
print("图片路径:{},标签数量:{}".format(img_path,n))
i = 1
for label in labels:
txt = label["transcription"]
box = label["points"]
print("text:{},box:{}".format(txt,box))#左上,右上,右下,左下
left = int(np.array(box)[:,0].min())
upper = int(np.array(box)[:,1].min())
right = int(np.array(box)[:,0].max())
lower = int(np.array(box)[:,1].max())
out_basename = img_basename[:-4]+"_%03d" % i
out_path = os.path.join(rec_images,out_basename+".jpg")
img = Image.open(img_path)
img.crop(box=(left,upper,right,lower)).save(out_path)
out_file.write("rec_images/"+out_basename+".jpg"+"\t"+txt+"\n")
i += 1
本文介绍如何将PaddleOCR的文本检测数据转换为适合文本识别的格式。转换过程中,需要解决同一图片上多文本标注的问题,以确保符合文本识别的数据集要求。具体做法通过代码实现数据剪裁。

被折叠的 条评论
为什么被折叠?



