文章目录[隐藏]
工具链接:Curve-Text-Detector/data at master · Yuliang-Liu/Curve-Text-Detector · GitHub
目录
前言
本次介绍的标注方式和标注工具均为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 数据集可视化示意图
总结
以上为本次文本检测数据集标注工具的使用经验介绍,主要通过使用论文作者提供的工具完成数据集的标注工作,如果大家遇到更好的文本标注软件可以一起分享讨论。
版权声明:本文为CSDN博主「kongbailongtian」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kb16045125/article/details/121433685
暂无评论