因为要标注数据,数据集是 ICDAR 2015 比赛中的 Challenge 4: Incidental Scene Text 。
原图及标注的图像,还有给定的 ground truth 文件如下所示:
最左边是原图,中间是标注的图像,右边是 ground truth 文件内容,按顺时针顺序的坐标:
x 1 , y 1 , x 2 , y 2 , x 3 , y 3 , x 4 , y 4
,最后是 words,但是如果是 ### 这种表示的,则表示不 care 文字的内容。
用 Python 将 ground truth 框住文字,代码如下:
import os
import path
import glob
import Image, ImageDraw
gt_text_dir = "/home/chenxp/Documents/Hitachi/ICDAR_2015/ICDAR2015_ch4/ch4_training_localization_transcription_gt"
image_dir = "/home/chenxp/Documents/Hitachi/ICDAR_2015/ICDAR2015_ch4/*.jpg"
imgDirs = []
imgLists = glob.glob(image_dir)
imgs_save_dir = "/home/chenxp/Documents/Hitachi/ICDAR_2015/ICDAR_with_GT"
for item in imgLists:
imgDirs.append(item)
for img_dir in imgDirs:
img = Image.open(img_dir)
dr = ImageDraw.Draw(img)
img_basename = os.path.basename(img_dir)
(img_name, temp2) = os.path.splitext(img_basename)
img_gt_text_name = "gt_" + img_name + ".txt"
print img_gt_text_name
bf = open(os.path.join(gt_text_dir, img_gt_text_name)).read().decode("utf-8-sig" ).encode("utf-8" ).splitlines()
for idx in bf:
rect = []
spt = idx.split(',' )
rect.append(float(spt[0 ]))
rect.append(float(spt[1 ]))
rect.append(float(spt[2 ]))
rect.append(float(spt[3 ]))
rect.append(float(spt[4 ]))
rect.append(float(spt[5 ]))
rect.append(float(spt[6 ]))
rect.append(float(spt[7 ]))
dr.polygon((rect[0 ], rect[1 ], rect[2 ], rect[3 ], rect[4 ], rect[5 ], rect[6 ], rect[7 ]), outline="red" )
img.save(os.path.join(imgs_save_dir, img_basename))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
上面代码中间有一句话:
bf = open(os.path.join(gt_text_dir, img_gt_text_name)).read().decode("utf-8-sig" ).encode("utf-8" ).splitlines()
如果没有 decode("utf-8-sig").encode("utf-8")
这句话,那么在解析 ground truth 的 txt 文件时,会在首行多处下面的东西,如下所示:
看到了吗?第一行 \xef\xbb\xbf
,这是什么鬼?
Google 一下,在 stackoverflow 上有个问答:Split function add: \xef\xbb\xbf…\n to my list :
原来是 txt 文件编码包含了 UTF-8 BOM 。
最后标注的结果如下: