将json格式文本检测的label转为ICDAR数据集的txt格式

 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) #
for py in f:
    print (py)

https://blog.csdn.net/GeorgeAI/article/details/81035422

https://blog.csdn.net/mantoureganmian/article/details/47949101

你可能感兴趣的:(python,数据集)