最近在训练文字检测模型,需要对大量数据进行处理,这里简单记录了我对几种数据集的处理以及标签制作,将标签变为训练所需格式:
下载以后得到压缩包,里面是图片集以及标注文件gt.mat。需要先读取gt.mat的内容,再将其转化为需要的格式。
关于synthtext的结构,推荐大家看这位博主的解析,很详细:
链接: link.
读取gt.mat文件我参考了这位博主的文章:
链接: link.
# -*- 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")
运行以后,会生成一个较大的文本文件,每一行内容为一个单词及其位置。一张图片会有多个单词,所以需要处理该文本文件,将一张图片的所有单词放在同一行上。
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数据处理完成。
下载文件,分别获得图片以及gt压缩包。需要更改图片名字以及制作合适的标签。
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的形式即可。
下载文件后,会得到图片集以及json文件。此文件处理最简单,只需读取json文件即可,部分与官方标注不一样的内容,比如"illegibility": false,我认为最简单的方法就是在生成的label.txt中直接替换掉,下面来将json文件转化为txt吧。
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.