ICDAR文本检测的数据集label每一行代表一个文本框的四个点坐标,按时顺时针方向,依次为左上、右上、右下和左下,例如734,310,792,320,792,364,738,361,### 。###代表文字不清楚。
数据集介绍 https://blog.csdn.net/u013250416/article/details/78821877
官网不好下,这里给个ICDAR2015数据集的百度网盘链接:
https://pan.baidu.com/s/1lwbFMlstM0aIPSPYsyTQ6A
提取码:8egn
labelme自己标注的后置调用api生成的一般是json格式的,为了把他们放在一起训练,这里把json格式转成txt
# -*- coding: utf-8 -*-
import glob
import os.path
import numpy as np
import shutil
import json
INPUT_PATH = "E:/card_data/card_autolabel/20200116"
def jsonTotxt(jsonfile):
filename=os.path.split(jsonfile)[1].split('.')[0]
savefile = os.path.join("E:/datasets/icdar",filename+'.txt')
# read json
#setting = []
with open(jsonfile,'r') as f:
b = f.read()
#b = b.encode("utf-8-sig")
data = json.loads(b)
#print(data)
with open(savefile,"a",encoding='utf-8') as f:
for coordict in data['shapes']:
coordlist = coordict['points']
for point in coordlist:
f.write(str(point).replace('[','').replace(']','')+',')
f.write('###'+'\n')
sub_dirs = [x[0] for x in os.walk(INPUT_PATH)]
print(sub_dirs)
is_rootdir = True
for sub_dir in sub_dirs:
if is_rootdir:
is_rootdir = False
continue
extensions_images = ['jpg','JPG','jpeg','JPEG']
extensions_labels = 'json'
images_list = []
#json_list = []
#dir_name = os.path.basename(sub_dir)
i = 0
for extension in extensions_images:
images_glob = os.path.join(INPUT_PATH,'*.'+extension)
images_list.extend(glob.glob(images_glob))
if not images_list:
continue
for image_list in images_list:
shutil.copy(image_list,"E:/datasets/icdar/")
i +=1
if i%1000==0:
print(i)
json_glob = os.path.join(INPUT_PATH,'*.'+ extensions_labels)
json_lists=glob.glob(json_glob)
for json_list in json_lists:
jsonTotxt(json_list)
涉及到的方法 简单记录一下
os.walk() os.walk方法,主要用来遍历一个目录内各个子目录和子文件
os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]])
top -- 是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。
root 所指的是当前正在遍历的这个文件夹的本身的地址
dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
可以递归目录及子目录,目录下的文件以及子目录下的文件
如果文件夹下没有子目录只有文件,可以用 os.path.list 得到所有文件路径列表
def main():
#begin
fileDir = "F:" + os.sep + "test" # 查找F:\aaa 目录下
for a in os.walk(fileDir):
#begin
print(a[0])
print(a[1])
print(a[2])
#end
os.system("pause")
#end
if __name__ == '__main__':
#begin
main()
#end
# F:\test
# ['4']
# ['1.txt', '2.txt', '3.txt']
# F:\aaa\4
# []
# ['5.txt', '6.txt', '7.txt']
import os
# 枚举dirPath目录下的所有文件
def main():
#begin
fileDir = "F:" + os.sep + "test" # 查找F:\aaa 目录下
for root, dirs, files in os.walk(fileDir):
#begin
for dir in dirs:
#begin
print(os.path.join(root, dir))
#end
for file in files:
#begin
print(os.path.join(root, file))
#end
#end
os.system("pause")
#end
if __name__ == '__main__':
#begin
main()
#end
# F:\test\4
# F:\test\1.txt
# F:\test\2.txt
# F:\test\3.txt
# F:\test\4\5.txt
# F:\test\4\6.txt
# F:\test\4\7.txt
shutil copyfile(srcfile, dstfile) 将源内容复制到目标文件中
如果目标文件不可写入,那么复制操作将导致 IOError 异常。
如果源文件和目标文件都相同,它将会返回 SameFileError。
如果目标文件之前有不同的名称,那么该副本将会覆盖其内容。
此方法不会复制到目录
shutil Copy() copy(source_file, [destination_file or dest_dir])
目标是一个文件夹,那么它将在其中创建一个与源文件具有相同名称(基本名称)的新文件。
此外,该方法会在复制源文件的内容后同步目标文件权限到源文件。
https://www.cnblogs.com/keeptg/p/10944109.html
os.path.basename() 返回path最后的文件名
glob.glob
可以查找符合特定规则的文件路径名。跟使用windows下的文件搜索差不多。查找文件只用到三个匹配符:
”*”, “?”, “[]”。”*”匹配0个或多个字符;”?”匹配单个字符;”[]”匹配指定范围内的字符,如:[0-9]匹配数字。
glob.glob
返回所有匹配的文件路径列表。只有一个参数pathname,定义了文件路径匹配规则,这里可以是绝对路径,也可以是相对路径。
glob返回的是一个迭代器,用yield实现的,严格说应该是生成器。print打印会得到所有匹配文件路径的列表,
glob.iglob
获取一个可编历对象,使用它可以逐个获取匹配的文件路径名。
与glob.glob()的区别是:glob.glob同时获取所有的匹配路径,而glob.iglob一次只获取一个匹配路径
import glob
#父目录中的.py文件
f = glob.iglob(r'../*.py')
print (f) #<generator object iglob at 0x00B9FF80>
for py in f:
print (py)
https://blog.csdn.net/GeorgeAI/article/details/81035422
https://blog.csdn.net/mantoureganmian/article/details/47949101