CTW数据集解析与处理

什么是CTW数据集?
CTW数据集是腾讯和清华大学一起制作的数据集,很强。在这个数据集中一共有超过3万个街景图像,约100万个汉字。
1.先吐槽一下CTW数据集的下载相关链接是真烦人,要么再去outlook要么在腾讯云你需要花钱扩容,就问你开心不开心。
CTW数据集解析与处理_第1张图片
CTW数据集解析与处理_第2张图片
2. 拿到数据集后我们得到的是这样的照片如果我们需要做文字检测和识别的话肯定需要对汉字进行切分以及取出来每个汉字的坐标位置。CTW数据集的标注信息都在几个json文件中所以我们把json中的一些属性弄明白我们就可以对这个图像做文字切分操作以及取单字的坐标去做训练和预测了。CTW数据集解析与处理_第3张图片
3. 上图中的图片json属性
CTW数据集解析与处理_第4张图片
CTW数据集解析与处理_第5张图片
4.对json数据进行解析切取单个图片和坐标。

import jsonlines
import cv2
import os


# 任务 切出图片中的每一个字符

def getsplit(jsonfile, imagepath, labelfile, lineimgpath, count_t, cnt):
    # 打开jsonl文件夹并读取所有信息
    list1 = []
    dict1 = {}
    with open(jsonfile, "r+", encoding="utf-8") as f:

        json_inf = jsonlines.Reader(f)
        # 遍历jsonl的每一条信息
        for item in json_inf:
            # 通过每一条信息 的键找到对应的值 注释(主要是为了找坐标和单字的) 图片名称
            annotations = item['annotations']
            img_name = item['file_name']
            # 拼接处图片的路径 然后读取图片
            src = cv2.imread(os.path.join(imagepath, img_name))
            for attr in annotations:
                for sentence in attr:
                    txt = sentence['text']
                    if txt not in list1:
                        list1.append(txt)
                        dict1[txt] = 1
                    else:
                        dict1[txt] = dict1[txt] + 1
                    x = []
                    y = []
                    for polygon in sentence['polygon']:
                        x.append(polygon[0])
                        y.append(polygon[1])
                    minx = int(min(x))
                    miny = int(min(y))
                    maxx = int(max(x))
                    maxy = int(max(y))
                    # 根据坐标 切出来相应坐标的图片
                    img = src[miny:maxy, minx:maxx]

                    # try:
                    # 判断相关路径是否存在 如果存在则直接写入 如果不存在则创建并写入
                    # 写入成功后+1
                    # 尝试写入图
                    write_path = lineimgpath + r"/" + txt + r"/"

                    if not os.path.exists(write_path):
                        os.makedirs(write_path)
                        print("OK")
                    # 为什么不用注释的这个是因为有中文路径问题
                    # cv2.imencode('.jpg', img)[1].tofile()能解决中文路径问题
                    # print(os.path.join(write_path, str(cnt) + '.jpg'))
                    # cv2.imwrite(os.path.join(write_path, str(cnt) + '.jpg'), img)
                    cv2.imencode('.jpg', img)[1].tofile((os.path.join(write_path, str(cnt) + '.jpg')))

                    # 这里 写入 每个字对应的编号 以及对应出现的图片
                    with open(labelfile, 'a', encoding='utf8') as txtf:
                        txtf.write(str(cnt) + '.jpg,' + txt + " " + write_path + '\n')
                        cnt += 1

    # 统计字频
    with open(count_t, "a+", encoding="utf-8") as f:
        for key, value in dict1.items():
            f.write(key + ":" + str(value) + '\n')


if __name__ == "__main__":
    # jsonl 文件 图片的路径 生成的label文件 图片写入的位置 图像统计字频 图像开始计数0
    getsplit('train.jsonl', r'F:\CTW-W\images-trainval\trainimg', './CTW_2/train.txt', './CTW_2/train1/',
             './CTW_2/count_train.txt', 0)
  

5.如有问题请留言。

你可能感兴趣的:(python,ctw)