文本检测数据集标注

工具链接:Curve-Text-Detector/data at master · Yuliang-Liu/Curve-Text-Detector · GitHub

目录

前言

一、工具介绍

1.标注格式

2.工具使用

二、标注步骤

1.数据准备

2.数据标注

3.数据集label可视化

总结


前言

本次介绍的标注方式和标注工具均为2017年华南理工大学刘禹良提出的弯曲文本标注方式和工具(原文链接:https://arxiv.org/abs/1712.02170),可以对弯曲文本进行弯曲标注,具体数据集可以查看论文作者提出的SCUT-CTW1500。


提示:以下是本篇文章正文内容,下面为工具使用经验总结(论文作者也在工具链接中提供了工具使用手册)







一、工具介绍

1.标注格式

1)对矩形或者四边形文本区域,使用4个顶点就可以确定;

2)而对弯曲文本,作者发现使用14个点就可以进行确定,具体的标注方式如图1所示,先确定4个顶点位置(紫色点),然后根据辅助线在上下边界分别确定5个点(绿色点),并且可以标注文本内容,用于扩充为文本识别数据集。(对于过于弯曲的文本区域标注效果并不利用,建议按单词级别标注,避免过于弯曲文本区域)

图1 标注过程

2.工具使用

"b"和"f":分别为移动至上一张和下一张,并保存当前状态;

"r":切换标注方式(矩形或者多边形);

"d":先在右侧文本标注框实例栏中选择需要删除的实例,再按下"d"进行实例删除;

鼠标右击:保存当前状态并删除当前操作;

鼠标左击:在标注矩形区域时,先左击确定左上角,然后拖动鼠标至右下角左击即可确定矩形区域;而确定四边形区域,则分别在四边形区域分别左击鼠标确定四个点即可;而对于弯曲文本区域的标注是在四边形区域标注基础上进行操作,需要借助"k"和空格进行辅助标注;

"k"和空格:主要使用在标注弯曲文本区域,先确定弯曲文本的四个顶点位置(参考标注四边形区域),然后在右侧文本标注框实例栏“鼠标左击”刚才确定的四边形区域,再点击"k"就会出现十条辅助线(5条红色和5条蓝色),移动鼠标,鼠标的水平线和辅助线相交的点如果在合适的位置再敲击“空格”即确定了一个点,依次红色辅助线的5个点再依次确定蓝色辅助线的5个点就完成了弯曲文本的标注;

鼠标左双击:在右侧实例列表中对实例左双击,会出现一个框,其中可以填入文本内容,用于扩充标注文本识别数据集,敲击"Esc"可以退出,填好文本内容并敲击"Enter"可以保存并退出;

鼠标滚轮:对图像放缩,同时可以结合"Ctrl"+滚轮或者"Ctrl"+"Shift"+滚轮加快放缩速度。当出现标注框出现偏移的情况,通过切换图片可以恢复;(在使用过程中,在对某些放缩过的图像进行标注时,有时标注框会出现偏移,出现这种情况时对该张图像进行原尺寸标注,这种情况很少发生,可以在全部标注工作完成后进行可视化标注框进行检查)

滚动栏:在图像尺寸过大,会出现滚动栏,可以通过滚动栏进行移动画布;

"t":在右侧实例栏选择实例,敲击"t"可以辅助找到标注框,但是提示不明显,基本不会使用到,一般情况通过颜色就能找到相应的标注框。

具体的工具界面如图2所示:

图2 标注工具界面







二、标注步骤






1.数据准备

1)先对准备好需要标注的图片,并将其进行重命名,同时也可以进行对数据集打乱操作;

# 对图像进行重命名
def change_name(root):
    # 读取文件路径下所有的图像
    res = os.listdir(root)
    # 将列表打乱,防止同类型图像堆积在一起,可以随机分布
    random.shuffle(res)
    # 设立index,用于给文件进行行动命名
    index = 1
    for i in res:
        # 对于jpg和png格式图片图片进行换名
        if ".jpg" in i or ".png" in i:
            os.rename(os.path.join(root, i), os.path.join(root, str(index) + '.' + i.split('.', 1)[1]))
            index += 1
        else:
            print('您输入的图片必须是以jpg或者png格式的')

2)建议所有的图片名格式一致并且长度一致,如果你重命名是从1开始,并按照数字命名,建议进行补零操作,因为该工具的读入方式为将按照字符串,这样文件顺序将得以保持;

# 给文件名添加添加前置0
def add_zeros(root):
    res = os.listdir(root)
    # 统一长度为4位
    for i in res:
        if len(i.split('.', 1)[0]) == 1:
            os.rename(os.path.join(root, i), os.path.join(root, '000' + i))
        elif len(i.split('.', 1)[0]) == 2:
            os.rename(os.path.join(root, i), os.path.join(root, '00' + i))
        elif len(i.split('.', 1)[0]) == 3:
            os.rename(os.path.join(root, i), os.path.join(root, '0' + i))

3)将命名好的图片放入image文件夹下,标注好的txt会生成在label文件夹下,并且名字和图片名字一致。






2.数据标注

1)双击运行windows_label_tool.exe;

2)当需要到达上次标注的图片位置,通过输入序号,然后点击“go”,如图3;

图3 工具底部

3)对图片中文本的区域标注参考工具使用中的操作即可,四边形和弯曲文本区域标注操作示意如4所示,矩形区域标注较为简单,简单尝试即会;

图4 标注示意图

4)如果标注文本检测数据集,无需填入文本内容,label文件如图5(a)所示,文本识别数据集label如图5(b)所示,第一行有一个文本框数字代表文本框实例个数,可以用于统计自己数据集一共标注了多少个文本实例(如果不需要,在标注工作完成之后对其删除即可);

图5 label示意图

5)特殊情况说明1:弯曲文本区域过于弯曲,会出现图6左侧效果不佳的情况,建议按单词级进行标注,得到图7右侧效果;

图7 过度弯度标注效果对比

6)在Windows下使用时,对于较为竖直的弯曲文本标注出现困难,生成的辅助线较为水平,而移动无法细微,造成标注框确定困难(未尝试在Ubuntu下是否会出现这种情况),提供两种解决方案,如图8(a):延伸文本区域,使得有一定斜度,但是造成区域贴合度下降;或者图8(b):顶点不确定在四个角,不知对后期训练是否会产生影响;可以尝试更好的解决方案。

图8 过度弯曲标注解决方案示意

3.数据集label可视化

主要是将标注好的文本框还原在原图上,查看标注的文本框是否精准。

# 将标注的图像进行可视化展示
def visualize(image_root, gt_root, out_root, name):
    # 根据路径和文件名将图像读出,本示例采用了jpg格式
    image = cv2.imread(os.path.join(image_root, name+'.jpg'), 3)
    # 根据路径和文件名将标注文件读取,文件格式为txt
    gt_txt = open(os.path.join(gt_root, name+'.txt'))
    height, width, _ = image.shape
    lines = 0
    index = 0
    while 1:
        line = gt_txt.readline()
        if not line:
            break
        # 首行为文本框个数
        if lines == 0:
            lines = int(line)
            continue
        line = line.replace("\n", "")
        line = line.split(',')
        # print(line)
        now = np.empty(shape=[0, 1, 2])
        for i in range(0, len(line), 2):
            temp = np.empty(shape=[0, 2])
            temp = np.append(temp, [[line[i], line[i + 1]]], axis=0)
            now = np.append(now, [temp], axis=0)
        now = now.astype(np.int32)
        # 根据标注文件的坐标点绘制多边形文本框
        image = cv2.polylines(image, [now], True, (0, 0, 255), thickness=2)
        # cv2.imshow('image'+str(index), image)
        index = index + 1
    # 保存可视化图片到输出路径中
    cv2.imwrite(out_root + '\\' + name + '.jpg', image)
    print(name + '.jpg')
    cv2.waitKey(0)
    cv2.destroyAllWindows()

效果如图9所示:

图9 数据集可视化示意图







总结

以上为本次文本检测数据集标注工具的使用经验介绍,主要通过使用论文作者提供的工具完成数据集的标注工作,如果大家遇到更好的文本标注软件可以一起分享讨论。

猜你喜欢

转载自blog.csdn.net/kb16045125/article/details/121433685