paddleOCR制作文字检测模型标签

paddleOCR制作文字检测模型标签

  • 1 Synthtext
    • 1.1 代码
      • 1.1.1 读取gt.mat
      • 1.1.2 生成所需标签
  • 2 mlt 2019
    • 2.1 代码
  • 3 lvst 2019
    • 3.1 代码

最近在训练文字检测模型,需要对大量数据进行处理,这里简单记录了我对几种数据集的处理以及标签制作,将标签变为训练所需格式:
在这里插入图片描述

1 Synthtext

下载以后得到压缩包,里面是图片集以及标注文件gt.mat。需要先读取gt.mat的内容,再将其转化为需要的格式。

关于synthtext的结构,推荐大家看这位博主的解析,很详细:
链接: link.
读取gt.mat文件我参考了这位博主的文章:
链接: link.

1.1 代码

1.1.1 读取gt.mat

# -*- coding: utf-8 -*-
import numpy as np
import scipy.io as sio
import sys
import json

def readMat(path):
    # 该函数加载mat文件返回一个字典
    data = sio.loadmat(path)

    # 图像的绝对地址
    abs_path = data["imnames"][0]
    # 获取bbox的位置信息(所有图片的)
    coordinate = data["wordBB"][0]
    # 获取注释(字符、文本标注)
    string_anns = data["txt"][0]
    
    # 使用循环获取每一张图像以及其坐标信息标注
    for i in  range(len(data['txt'][0])):
    # 遍历gt值
        train_file = open('label.txt', 'w+')
        print(1)
    for i in range(len(data['txt'][0])):

        for val in data['txt'][0][i]:
            # 去掉换行符号和空格
            v = [x.split("\n") for x in val.strip().split(" ")]           
  
        rec = np.array(data['wordBB'][0][i], dtype=np.int32)
        
        if len(rec.shape) == 3:
            rec = rec.transpose([2, 1, 0])
        else:
            rec = rec.transpose([1, 0])[np.newaxis, :]
            
        # 将每一个矩形框的坐标值写入到txt文件
        for j in range(len(rec)):
            x1 = rec[j][0][0]
            y1 = rec[j][0][1]
            x2 = rec[j][1][0]
            y2 = rec[j][1][1]
            x3 = rec[j][2][0]
            y3 = rec[j][2][1]
            x4 = rec[j][3][0]
            y4 = rec[j][3][1]
            z1 = [str(x1),str(y1)]
            z2 = [str(x2),str(y2)]
            z3 = [str(x3),str(y3)]
            z4 = [str(x4),str(y4)]
            list1 = str(z1).replace("'","")
            list2 = str(z2).replace("'","")
            list3 = str(z3).replace("'","")
            list4 = str(z4).replace("'","")

            train_file.write((str(data['imnames'][0][i][0])) + '\t' + '{' + '"transcription": ' + '""' + ', ' + '"points": ' + '[' + str(list1) + ', ' + str(list2) + ', ' + str(list3) + ', ' + str(list4) + ']}' + '\n')

            print(2)
    print('finish')
    
readMat("gt.mat")

运行以后,会生成一个较大的文本文件,每一行内容为一个单词及其位置。一张图片会有多个单词,所以需要处理该文本文件,将一张图片的所有单词放在同一行上。

1.1.2 生成所需标签

import json
import demjson

f = open("label.txt")
label = ''
fw = open("label_train.txt", 'w+')

for i, line in enumerate(f):

    sep = line.split('\t')
    name, info = sep[0], sep[1]
    
    if i == 0:
        temp_name = name
        temp_info = info
        continue
    
    if name == temp_name:
        label = label + info.strip('\n') + ','
        
    else:
        label = "[" + label.strip(',') + "]"
        label = json.dumps(label, ensure_ascii=False).replace('"', '').replace('\\', '"')
        fw.write(temp_name + "\t" +label +'\n')
        label = ''
        temp_name = name
        
print('finish')
fw.close() 

至此,Synthtext数据处理完成。

2 mlt 2019

下载文件,分别获得图片以及gt压缩包。需要更改图片名字以及制作合适的标签。

2.1 代码

import os
import glob

read_img_path = "Chinese_pic/"  # 图片集解压后的文件夹
# read_img_path = "Latin/"
save_img_path = "2019_train/"  # 改名后的图片集文件夹
imgfiles = os.listdir(read_img_path)
# labelfiles = glob.glob("Latin_gt/*.txt")
labelfiles = glob.glob("Chinese_gt/*.txt")
idx = 0
i = 0

# 处理图片名称
for img in imgfiles:
    if img.endswith('jpg'):
        src = os.path.join(read_img_path, img)
        i += 1
        img_name = "Chinese_" + str(i) + ".jpg"
        # img_name = "Latin_" + str(i) + ".jpg"        
        dct = os.path.join(save_img_path, img_name)
        os.rename(src, dct)

# 处理标签
for file in labelfiles:
    idx += 1
    with open(file, "r", encoding = "utf-8") as f:
        res = ""
        for line in f.readlines():
            x1 = line.split(",")[0].strip()
            y1 = line.split(",")[1].strip()
            x2 = line.split(",")[2].strip()
            y2 = line.split(",")[3].strip()
            x3 = line.split(",")[4].strip()
            y3 = line.split(",")[5].strip()
            x4 = line.split(",")[6].strip()
            y4 = line.split(",")[7].strip()
            z1 = "[" + x1 + ", " + y1 + "]"
            z2 = "[" + x2 + ", " + y2 + "]"
            z3 = "[" + x3 + ", " + y3 + "]"
            z4 = "[" + x4 + ", " + y4 + "]"
            label = '{"transcription": "", ' + '"points": ' + '[' + z1 + ',' + z2 + ',' + z3 + ',' + z4 + ']}' + ','
            res += label

        mltlabel = '[' + res.strip(",") + ']'
        name = '2019_train/Chinese_' + str(idx) + '.jpg'
        # name = '2019_train/Latin_' + str(idx) + '.jpg'
        mlt = name + '\t' + mltlabel + '\n'
            
        fw = open("2019label.txt", "a", encoding = "utf-8")
        fw.write(mlt)
        fw.close()
       
print("finish")

至此,mlt 2019数据处理完成,mlt 2017数据处理与19相似,不需要对图片进行处理,更改上面代码中label的形式即可。

3 lvst 2019

下载文件后,会得到图片集以及json文件。此文件处理最简单,只需读取json文件即可,部分与官方标注不一样的内容,比如"illegibility": false,我认为最简单的方法就是在生成的label.txt中直接替换掉,下面来将json文件转化为txt吧。

3.1 代码

import json
import re

json_file = open("train_full_labels.json", "r", encoding = "utf-8")
txt_file = open("lvst_label.txt", "w", encoding = "utf-8")

data = json_file.read()
dic = json.loads(data)  # json.loads(str) ; json.load(file)

for key in dic:
    values = dic[key]
    label = "lvst2019/" + key + ".jpg"+ "\t" + str(values).replace("'", '"') + "\n"
    txt_file.write(str(label))

json_file.close()    
txt_file.close()
print("finish")

至此,lvst 2019数据处理完成,值得一提的是,该数据集中有大量弯曲文本,许多图片标注的点数都不一致,DB可以进行弯曲文字检测,但需要标签文本点数一致,最好使用SAST,支持弯曲文字检测。然而目前百度还没有开源,我就不训练这个数据了。

参考文章:
链接: link.
链接: link.
链接: link.
链接: link.
链接: link.

你可能感兴趣的:(深度学习,python,json)