工具链接:Curve-Text-Detector/data at master · Yuliang-Liu/Curve-Text-Detector · GitHub
目录
前言
一、工具介绍
1.标注格式
2.工具使用
二、标注步骤
1.数据准备
2.数据标注
3.数据集label可视化
总结
前言
本次介绍的标注方式和标注工具均为华南理工大学刘禹良提出的弯曲文本标注方式和工具(原文链接:/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 = 1for 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 += 1else:print('您输入的图片必须是以jpg或者png格式的')
2)建议所有的图片名格式一致并且长度一致,如果你重命名是从1开始,并按照数字命名,建议进行补零操作,因为该工具的读入方式为将按照字符串,这样文件顺序将得以保持;
# 给文件名添加添加前置0def 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)所示,第一行有一个文本框数字代表文本框实例个数,可以用于统计自己数据集一共标注了多少个文本实例(如果不需要,在标注工作完成之后对其删除即可);
图5label示意图
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)# 根据路径和文件名将标注文件读取,文件格式为txtgt_txt = open(os.path.join(gt_root, name+'.txt'))height, width, _ = image.shapelines = 0index = 0while 1:line = gt_txt.readline()if not line:break# 首行为文本框个数if lines == 0:lines = int(line)continueline = 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数据集可视化示意图
总结
以上为本次文本检测数据集标注工具的使用经验介绍,主要通过使用论文作者提供的工具完成数据集的标注工作,如果大家遇到更好的文本标注软件可以一起分享讨论。