提示:本文用于学习记录
为了训练深度学习模型,要整理大量的标注数据,需统一不同格式的标注数据,一般情况下习惯读取 txt 格式的数据,但实际中经常遇到 XML 格式或者 json 格式的标注数据,需要对数据格式进行转化;在处理数据的时候,需要对大量图片和文本进行重命名。
import xml.etree.ElementTree as ET
import os
def convert(size, box):
x_center = (box[0] + box[1]) / 2.0
y_center = (box[2] + box[3]) / 2.0
x = x_center / size[0]
y = y_center / size[1]
w = (box[1] - box[0]) / size[0]
h = (box[3] - box[2]) / size[1]
return (x, y, w, h)
def convert_annotation(xml_files_path, save_txt_files_path, classes):
xml_files = os.listdir(xml_files_path)
print(xml_files)
for xml_name in xml_files:
print(xml_name)
xml_file = os.path.join(xml_files_path, xml_name)
out_txt_path = os.path.join(save_txt_files_path, xml_name.split('.')[0] + '.txt')
out_txt_f = open(out_txt_path, 'w')
tree = ET.parse(xml_file)
root = tree.getroot()
size = root.find('size')
w = int(size.find('width').text)
h = int(size.find('height').text)
for obj in root.iter('object'):
# difficult = obj.find('difficult').text
if obj.find('difficult'):
difficult = float(obj.find('difficult').text)
else:
difficult = 0
cls = obj.find('name').text
if cls not in classes or int(difficult) == 1:
continue
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox')
b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
float(xmlbox.find('ymax').text))
# b=(xmin, xmax, ymin, ymax)
print(w, h, b)
bb = convert((w, h), b)
out_txt_f.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
if __name__ == "__main__":
# 需要转换的类别,需要一一对应
classes1 = ['D00', 'D10', 'D20', 'D40']
# 2、voc格式的xml标签文件路径
xml_files1 = r'C:\Users\bistu\Desktop\RoadDamage\labels'
# 3、转化为yolo格式的txt标签文件存储路径
save_txt_files1 = r'C:\Users\bistu\Desktop\batch\label'
convert_annotation(xml_files1, save_txt_files1, classes1)
import os
import xml.etree.ElementTree as ET
# xml文件存放目录(不要以\结尾)
input_dir = r'E:\PycharmProjects\yolov5-master\train\India\Annotations\xmls'
# 输出txt文件目录(不要以\结尾)
out_dir = r'E:\PycharmProjects\yolov5-master\India'
class_list = []
# 获取目录所有xml文件
def file_name(input_dir):
F = []
for root, dirs, files in os.walk(input_dir):
for file in files:
# print file.decode('gbk') #文件名中有中文字符时转码
if os.path.splitext(file)[1] == '.xml':
t = os.path.splitext(file)[0]
F.append(t) # 将所有的文件名添加到L列表中
return F # 返回L列表
# 获取所有分类
def get_class(filelist):
for i in filelist:
f_dir = input_dir + "\\" + i + ".xml"
in_file = open(f_dir, encoding='UTF-8')
filetree = ET.parse(in_file)
in_file.close()
root = filetree.getroot()
for obj in root.iter('object'):
# difficult = obj.find('difficult').text
cls = obj.find('name').text
if cls not in class_list:
class_list.append(cls)
def ConverCoordinate(imgshape, bbox):
# 将xml像素坐标转换为txt归一化后的坐标
xmin, xmax, ymin, ymax = bbox
width = imgshape[0]
height = imgshape[1]
dw = 1. / width
dh = 1. / height
x = (xmin + xmax) / 2.0
y = (ymin + ymax) / 2.0
w = xmax - xmin
h = ymax - ymin
# 归一化
x = x * dw
y = y * dh
w = w * dw
h = h * dh
return x, y, w, h
def readxml(i):
f_dir = input_dir + "\\" + i + ".xml"
txtresult = ''
outfile = open(f_dir, encoding='UTF-8')
filetree = ET.parse(outfile)
outfile.close()
root = filetree.getroot()
# 获取图片大小
size = root.find('size')
width = int(size.find('width').text)
height = int(size.find('height').text)
imgshape = (width, height)
# 转化为yolov5的格式
for obj in root.findall('object'):
# 获取类别名
obj_name = obj.find('name').text
obj_id = class_list.index(obj_name)
# 获取每个obj的bbox框的左上和右下坐标
bbox = obj.find('bndbox')
xmin = float(bbox.find('xmin').text)
xmax = float(bbox.find('xmax').text)
ymin = float(bbox.find('ymin').text)
ymax = float(bbox.find('ymax').text)
bbox_coor = (xmin, xmax, ymin, ymax)
x, y, w, h = ConverCoordinate(imgshape, bbox_coor)
txt = '{} {} {} {} {}\n'.format(obj_id, x, y, w, h)
txtresult = txtresult + txt
# print(txtresult)
f = open(out_dir + "\\" + i + ".txt", 'a')
f.write(txtresult)
f.close()
# 获取文件夹下的所有文件
filelist = file_name(input_dir)
# 获取所有分类
get_class(filelist)
# 打印class
print(class_list)
# xml转txt
for i in filelist:
readxml(i)
# 在out_dir下生成一个class文件
f = open(out_dir + "\\classes.txt", 'a')
classresult = ''
for i in class_list:
classresult = classresult + i + "\n"
f.write(classresult)
f.close()
import os
import xml.etree.ElementTree as ET
def convert_coordinates(size, box):
dw = 1.0 / size[0]
dh = 1.0 / size[1]
x = (box[0] + box[1]) / 2.0
y = (box[2] + box[3]) / 2.0
w = box[1] - box[0]
h = box[3] - box[2]
x = x * dw
w = w * dw
y = y * dh
h = h * dh
return (x, y, w, h)
def convert_xml_to_txt(xml_folder, output_folder, classes):
os.makedirs(output_folder, exist_ok=True)
xml_files = [f for f in os.listdir(xml_folder) if f.endswith('.xml')]
for xml_file in xml_files:
tree = ET.parse(os.path.join(xml_folder, xml_file))
root = tree.getroot()
image_name = os.path.splitext(xml_file)[0]
txt_file_path = os.path.join(output_folder, f"{image_name}.txt")
with open(txt_file_path, 'w') as txt_file:
size = (int(root.find('size/width').text), int(root.find('size/height').text))
for obj in root.findall('object'):
class_name = obj.find('name').text
class_id = classes.index(class_name)
box = obj.find('bndbox')
xmin = int(box.find('xmin').text)
ymin = int(box.find('ymin').text)
xmax = int(box.find('xmax').text)
ymax = int(box.find('ymax').text)
bbox = (xmin, xmax, ymin, ymax)
yolo_bbox = convert_coordinates(size, bbox)
txt_file.write(f"{class_id} {yolo_bbox[0]} {yolo_bbox[1]} {yolo_bbox[2]} {yolo_bbox[3]}\n")
if __name__ == "__main__":
xml_folder = "Annotation/hx9"
output_folder = "labels/hx9"
classes = ['off-road vehicle', 'car', 'suv', 'large van', 'truck', 'flatbed',
'van'] # List of class names in your dataset
convert_xml_to_txt(xml_folder, output_folder, classes)
代码示例如下:
import os
class BatchRename():
def rename(self):
path = r"C:\Users\bistu\Desktop\batch\batchs" # 图片所在路径
filelist = os.listdir(path)
total_num = len(filelist) # 计数,图片数量
i = 0 # 从零开始计数,可进行修改,比如315
for item in filelist:
if item.endswith('.jpg'): # 图片文件后缀名,区分大小写
src = os.path.join(os.path.abspath(path), item)
dst = os.path.join(os.path.abspath(path), '任意添加00/a'+str(i)+'.jpg')
try:
os.rename(src, dst)
i += 1
except:
continue
print('total %d to rename & converted %d png'%(total_num, i))
if __name__=='__main__':
demo = BatchRename()
demo.rename()
import os
import sys
def rename():
path=input("请输入路径(例如D:\\\\picture):")
name=input("请输入开头名:")
startNumber=input("请输入开始数:")
fileType=input("请输入后缀名(如 .jpg、.txt等等):")
print("正在生成以"+name+startNumber+fileType+"迭代的文件名")
count=0
filelist=os.listdir(path)
for files in filelist:
Olddir=os.path.join(path,files)
if os.path.isdir(Olddir):
continue
Newdir=os.path.join(path,name+str(count+int(startNumber))+fileType)
os.rename(Olddir,Newdir)
count+=1
print("一共修改了"+str(count)+"个文件")
rename()
json 文件内容如下:
代码转化前先创建所需 labels 文件夹与 batch_1~batch_15 文件夹
代码转化如下:
from pycocotools.coco import COCO
import numpy as np
import tqdm
import argparse
def arg_parser():
parser = argparse.ArgumentParser('code by rbj')
parser.add_argument('--annotation_path', type=str,
default='data/garbage1/annotations.json')
#生成的txt文件保存的目录
parser.add_argument('--save_base_path', type=str, default='data/garbage1/labels/')
args = parser.parse_args()
return args
if __name__ == '__main__':
args = arg_parser()
annotation_path = args.annotation_path
save_base_path = args.save_base_path
data_source = COCO(annotation_file=annotation_path)
catIds = data_source.getCatIds()
categories = data_source.loadCats(catIds)
categories.sort(key=lambda x: x['id'])
classes = {}
coco_labels = {}
coco_labels_inverse = {}
for c in categories:
coco_labels[len(classes)] = c['id']
coco_labels_inverse[c['id']] = len(classes)
classes[c['name']] = len(classes)
img_ids = data_source.getImgIds()
for index, img_id in tqdm.tqdm(enumerate(img_ids), desc='change .json file to .txt file'):
img_info = data_source.loadImgs(img_id)[0]
file_name = img_info['file_name'].split('.')[0]
height = img_info['height']
width = img_info['width']
save_path = save_base_path + file_name + '.txt'
with open(save_path, mode='w') as fp:
annotation_id = data_source.getAnnIds(img_id)
boxes = np.zeros((0, 5))
if len(annotation_id) == 0:
fp.write('')
continue
annotations = data_source.loadAnns(annotation_id)
lines = ''
for annotation in annotations:
box = annotation['bbox']
# some annotations have basically no width / height, skip them
if box[2] < 1 or box[3] < 1:
continue
#top_x,top_y,width,height---->cen_x,cen_y,width,height
box[0] = round((box[0] + box[2] / 2) / width, 6)
box[1] = round((box[1] + box[3] / 2) / height, 6)
box[2] = round(box[2] / width, 6)
box[3] = round(box[3] / height, 6)
label = coco_labels_inverse[annotation['category_id']]
lines = lines + str(label)
for i in box:
lines += ' ' + str(i)
lines += '\n'
fp.writelines(lines)
print('finish')
数据集结构(转换单个 json 文件)
json 文件内容如下:
{
"exist": [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
"gt_rect": [
[298,247,44,34],
[298,245,41,34],
[299,246,43,34],
[299,247,43,33],
[297,247,43,36],
[299,247,42,35],
[300,250,40,31],
[298,249,43,33],
[298,248,43,35],
[300,248,40,35],
[300,251,42,31],
[301,249,40,35],
[300,251,39,32],
[299,251,41,32],
[301,251,41,34],
[300,251,41,32],
[301,252,39,31],
[301,250,40,35],
[299,250,43,32],
[298,251,43,32],
[298,251,44,33],
[297,250,42,34],
[298,248,40,35],
[299,248,40,35],
[297,250,42,33],
[296,250,46,34],
[298,251,42,30],
[297,250,42,34],
[296,251,39,32],
[296,250,39,33],
[297,251,40,32],
[296,249,41,34],
[295,250,44,33],
[294,249,42,34],
[295,250,41,33],
[295,248,41,36],
[294,252,41,32],
[295,249,39,34],
[291,251,44,33],
[292,251,42,31],
[293,251,41,32],
[293,251,42,32],
[293,251,41,32],
[293,252,43,31],
[293,252,41,31],
[295,252,41,31],
[295,252,40,32],
[293,250,43,34],
[294,252,42,32],
[293,252,43,32],
[294,252,40,33],
[293,254,41,32],
[293,253,43,32],
[294,253,43,34],
[296,253,41,33],
[296,254,41,31],
[297,254,41,32],
[297,254,42,32],
[298,254,40,33],
[298,255,40,31],
[299,255,39,30],
[299,254,37,31],
[297,253,40,33],
[298,254,38,30],
[299,253,37,32],
[300,253,37,32],
[300,253,36,32],
[300,253,38,31],
[300,253,37,30],
[300,253,36,29],
[300,252,37,31],
[300,253,38,30],
[301,252,40,30],
[301,253,38,29],
[302,252,37,31],
[303,253,36,29],
[302,253,37,30],
[302,251,36,31],
[302,252,37,30],
[302,252,38,30],
[303,252,36,31],
[302,252,37,30],
[303,253,36,30],
[302,252,38,32],
[303,254,37,30],
[303,253,35,32],
[303,252,35,32],
[301,252,38,32],
[301,254,37,29],
[300,253,36,32],
[301,253,35,31],
[300,253,37,30],
[299,253,36,30],
[298,252,37,30],
[298,253,36,29],
[296,251,35,30],
[296,250,36,32],
[295,251,37,31],
[293,249,38,34],
[292,250,36,31],
[292,250,36,31],
[291,249,36,32],
[289,250,38,31],
[287,250,41,31],
[289,250,37,32],
[288,249,37,33],
[289,250,37,32],
[289,249,36,33],
[290,250,37,32],
[290,249,39,33],
[291,249,37,33],
[291,250,39,32],
[291,249,40,31],
[292,248,38,33],
[292,249,37,32],
[291,248,38,34],
[292,250,40,31],
[292,249,40,31],
[292,249,40,33],
[293,250,38,32],
[295,251,37,30],
[297,250,38,32],
[299,250,39,32],
[299,251,38,32],
[301,251,39,30],
[302,250,37,32],
[302,250,38,32],
[301,250,38,31],
[302,251,39,31],
[301,251,40,32],
[302,250,37,31],
[302,251,37,31],
[302,251,37,30],
[301,251,38,30],
[300,250,40,33],
[301,250,40,32],
[300,252,38,30],
[300,251,38,31],
[300,250,39,32],
[299,251,39,30],
[301,250,37,33],
[301,250,36,30],
[301,251,35,29],
[301,250,35,30],
[301,250,38,30],
[301,249,36,31],
[300,249,37,31],
[301,248,37,32],
[300,249,37,31],
[300,249,39,30],
[300,248,36,31],
[299,249,38,30],
[298,248,39,31],
[299,249,37,31],
[299,248,36,31],
[299,248,37,31],
[299,249,37,30],
[299,248,36,32],
[299,248,36,32],
[299,249,36,30],
[298,248,37,33],
[299,248,38,31],
[299,248,36,32],
[297,249,38,32],
[297,249,38,31],
[297,249,37,31],
[296,249,38,30],
[296,248,37,31],
[296,247,36,32],
[296,247,36,32],
[295,246,38,32],
[295,246,38,31],
[294,242,39,33],
[295,244,38,31],
[296,241,36,32],
[295,240,36,32],
[295,239,39,33],
[296,239,37,31],
[295,238,38,31],
[296,239,37,29],
[297,237,37,30],
[296,235,37,31],
[296,235,37,30],
[296,237,39,31],
[296,237,39,30],
[296,241,38,30],
[296,246,38,30],
[297,249,38,32],
[298,250,36,31],
[298,255,37,30],
[297,257,39,32],
[298,258,38,30],
[298,258,39,29],
[298,260,38,30],
[299,260,38,30],
[299,261,41,30],
[299,259,43,32],
[300,259,42,32],
[300,257,40,32],
[298,255,42,33],
[299,253,42,32],
[300,252,40,32],
[301,249,41,34],
[300,250,40,32],
[300,247,42,34],
[301,248,39,33],
[301,247,41,33],
[301,247,41,33],
[301,247,40,33],
[298,246,44,34],
[297,247,48,33],
[296,247,47,32],
[294,247,49,32],
[297,247,44,34],
[296,247,47,33],
[298,246,43,33],
[293,244,49,34],
[295,244,47,35],
[296,244,44,35],
[297,246,43,33],
[296,246,44,32],
[295,242,44,36],
[294,242,45,36],
[294,243,44,34],
[293,243,47,35],
[293,244,46,34],
[291,243,49,36],
[291,245,48,34],
[292,245,48,35],
[292,247,47,34],
[292,248,48,34],
[292,248,46,33],
[293,248,45,33],
[292,247,47,35],
[292,247,48,36],
[292,248,49,35],
[292,248,46,34],
[292,248,47,34],
[293,247,46,36],
[292,248,47,34],
[293,248,47,35],
[291,249,49,33],
[293,248,48,35],
[293,249,48,35],
[294,250,46,34],
[294,250,46,34],
[293,250,48,35],
[293,250,48,35],
[294,250,47,35],
[293,250,47,36],
[294,251,48,35],
[293,249,48,36],
[294,250,48,35],
[293,250,49,34],
[293,249,51,34],
[295,248,49,34],
[294,248,49,35],
[295,247,48,35],
[296,246,48,36],
[297,246,47,36],
[298,246,46,36],
[297,246,48,35],
[297,247,47,34],
[297,247,47,33],
[296,246,48,34],
[297,245,48,35],
[297,246,48,34],
[297,247,48,34],
[298,245,48,36],
[297,245,49,35],
[298,246,48,34],
[297,246,49,34],
[297,245,50,36],
[298,246,49,35],
[296,245,50,35],
[297,245,51,37],
[297,246,50,35],
[297,246,50,36],
[296,246,52,36],
[297,247,50,36],
[297,246,50,37],
[296,247,50,36],
[295,247,48,37],
[295,247,48,37],
[294,248,49,36],
[294,248,47,36],
[292,247,49,37],
[293,248,47,36],
[293,247,47,37],
[293,247,48,38],
[292,248,47,37],
[293,249,47,35],
[293,248,47,36],
[292,247,47,38],
[291,246,52,37],
[291,246,46,37],
[291,247,47,36],
[291,247,48,36],
[291,247,48,36],
[291,245,48,39],
[291,247,46,35],
[292,244,46,39],
[292,244,46,40],
[291,245,49,39],
[291,247,46,37],
[291,245,49,39],
[291,245,47,39],
[291,246,48,38],
[290,247,48,38],
[291,246,48,39],
[290,246,50,39],
[291,246,47,39],
[290,245,49,41],
[290,246,50,39],
[291,246,47,39],
[291,246,50,40],
[291,247,49,40],
[292,247,47,40],
[290,247,50,41],
[290,247,51,42],
[290,247,49,41],
[292,249,45,39],
[291,249,46,38],
[291,247,46,41],
[291,250,46,37],
[291,250,46,39],
[289,249,48,39],
[290,252,44,36],
[289,251,47,36],
[289,250,47,37],
[289,251,45,36],
[291,251,43,36],
[290,252,44,35],
[290,253,44,34],
[290,253,43,34],
[290,253,43,33],
[289,252,44,33],
[291,253,43,32],
[292,250,41,35],
[291,250,42,35],
[292,252,42,33],
[292,251,43,34],
[293,250,42,35],
[292,251,43,34],
[294,251,41,33],
[292,250,42,36],
[294,248,39,34],
[293,249,40,34],
[296,248,42,33],
[296,247,44,33],
[300,247,40,32],
[300,246,40,33],
[302,246,41,33],
[303,245,41,34],
[304,247,41,32],
[303,247,43,33],
[303,246,42,34],
[303,247,42,33],
[303,248,41,32],
[305,248,38,32],
[303,247,38,34],
[302,249,40,33],
[300,248,42,34],
[300,249,40,36],
[299,249,40,34],
[298,251,38,34],
[296,251,40,33],
[297,252,41,32],
[298,253,39,31],
[298,254,37,31],
[298,253,37,31],
[296,253,40,32],
[298,255,35,29],
[296,252,37,33],
[296,254,34,31],
[295,253,38,32],
[294,254,36,30],
[295,254,34,30],
[295,254,32,30],
[293,255,35,30],
[293,254,35,30],
[295,255,32,30],
[294,255,33,29],
[295,255,35,29],
[294,255,35,30],
[295,255,34,29],
[295,254,35,29],
[297,253,35,31],
[298,253,35,30],
[300,254,33,28],
[301,254,34,28],
[302,252,34,30],
[303,254,34,28],
[303,254,34,29],
[304,253,34,29],
[305,254,32,27],
[306,254,31,28],
[305,253,33,28],
[304,252,33,29],
[305,253,31,28],
[304,252,34,29],
[302,252,38,29],
[301,252,36,27],
[300,252,37,27],
[302,252,32,28],
[302,251,32,28],
[300,252,34,26],
[301,251,34,29],
[301,251,34,28],
[300,251,34,26],
[300,249,34,29],
[301,250,34,27],
[301,251,33,27],
[299,250,34,28],
[300,252,31,25],
[300,251,31,27],
[301,252,30,26],
[300,252,31,27],
[300,253,31,26],
[300,253,31,27],
[299,254,32,25],
[301,254,30,26],
[299,254,32,25],
[301,254,31,27],
[301,255,30,25],
[300,254,31,26],
[300,253,33,27],
[300,254,33,26],
[300,254,34,26],
[302,254,32,26],
[301,254,33,26],
[303,254,33,27],
[301,254,34,27],
[302,255,30,26],
[302,255,31,26],
[302,255,31,25],
[302,256,31,25],
[303,255,29,25],
[303,255,28,25],
[304,254,29,26],
[304,255,29,24],
[303,254,29,25],
[304,254,30,26],
[303,253,30,26],
[305,254,30,24],
[305,253,29,25],
[305,254,30,24],
[305,255,30,24],
[305,254,29,25],
[305,255,29,23],
[306,255,28,24],
[305,255,29,25],
[305,255,29,24],
[305,254,29,25],
[305,254,30,25],
[306,254,28,24],
[306,254,28,25],
[306,254,30,25],
[306,255,29,24],
[306,256,29,24],
[306,256,29,24],
[307,256,27,25],
[306,257,29,24],
[307,258,27,24],
[307,258,28,23],
[306,258,29,23],
[306,258,27,23],
[306,257,28,24],
[305,258,29,23],
[306,257,27,24],
[305,256,30,25],
[306,256,29,25],
[306,256,27,25],
[304,257,29,23],
[304,256,28,24],
[304,257,28,24],
[301,256,27,25],
[300,256,29,25],
[298,255,29,25],
[297,257,28,24],
[297,256,28,25],
[295,258,29,23],
[295,256,30,25],
[294,257,30,24],
[295,258,29,23],
[296,257,27,24],
[296,256,29,25],
[298,257,27,24],
[300,257,26,24],
[300,257,27,25],
[301,257,28,24],
[302,257,30,23],
[302,257,29,24],
[305,257,28,23],
[308,257,27,22],
[308,257,28,22],
[308,256,27,23],
[310,255,25,24],
[310,255,26,23],
[311,256,26,22],
[311,256,25,22],
[311,256,26,23],
[311,257,26,22],
[311,256,26,23],
[312,256,25,22],
[310,256,27,23],
[312,257,25,23],
[312,257,26,22],
[312,257,26,23],
[312,257,25,23],
[311,256,26,24],
[310,256,26,25],
[310,256,25,23],
[309,256,26,24],
[307,257,25,22],
[304,257,25,23],
[304,257,25,22],
[302,257,25,22],
[297,256,27,24],
[298,258,24,22],
[295,257,25,23],
[295,257,24,22],
[294,258,25,22],
[292,257,24,21],
[291,258,24,22],
[291,258,25,22],
[291,258,24,22],
[291,258,24,22],
[293,259,25,21],
[295,258,25,23],
[298,257,24,23],
[299,258,24,22],
[299,258,24,21],
[299,258,23,21],
[299,258,23,22],
[300,258,22,22],
[299,258,24,22],
[300,258,23,22],
[301,258,24,22],
[303,258,24,22],
[306,258,24,21],
[309,258,22,21],
[309,257,23,22],
[310,258,23,21],
[310,257,23,22],
[310,258,23,21],
[310,258,23,21],
[309,257,24,21],
[310,258,23,21],
[309,257,25,22],
[310,257,23,22],
[310,257,24,22],
[310,258,24,21],
[310,258,24,21],
[311,258,22,21],
[310,258,24,21],
[310,258,24,22],
[310,258,24,21],
[309,259,24,21],
[309,258,24,21],
[309,259,23,21],
[309,259,24,21],
[308,258,24,21],
[307,259,24,21],
[306,258,24,21],
[307,259,22,20],
[306,259,23,20],
[306,258,23,23],
[304,258,25,22],
[304,259,25,21],
[305,258,24,22],
[304,258,26,22],
[304,258,25,22],
[305,258,24,22],
[304,258,25,22],
[304,257,26,23],
[305,258,24,21],
[305,258,23,21],
[305,258,24,21],
[304,258,24,21],
[305,257,24,22],
[304,258,24,21],
[304,258,25,21],
[305,257,23,22],
[305,257,23,22],
[305,257,23,22],
[305,258,22,20],
[305,258,22,21],
[305,258,23,20],
[305,258,24,20],
[305,258,23,21],
[305,258,22,20],
[304,258,24,20],
[304,258,23,20],
[304,258,23,20],
[304,258,23,19],
[305,259,22,20],
[305,259,22,19],
[305,259,22,18],
[305,258,22,19],
[305,259,22,19],
[306,259,21,18],
[306,258,21,19],
[306,258,21,18],
[306,257,20,21],
[306,259,21,19],
[305,259,23,20],
[306,260,22,21],
[306,260,21,20],
[307,260,21,21],
[307,261,22,20],
[306,262,22,19],
[307,262,22,19],
[308,262,21,18],
[308,262,20,19],
[307,262,22,19],
[307,262,23,19],
[307,262,22,18],
[308,262,22,19],
[307,261,22,19],
[309,261,21,20],
[308,262,23,19],
[308,262,23,19],
[308,262,23,19],
[309,262,20,20],
[308,262,22,20],
[308,262,24,20],
[309,262,22,20],
[309,262,22,19],
[309,262,23,20],
[308,262,23,19],
[308,262,23,19],
[308,262,24,19],
[309,261,22,19],
[308,261,22,19],
[308,261,23,20],
[306,261,25,19],
[308,260,22,19],
[307,261,22,19],
[306,261,24,19],
[307,262,22,18],
[307,262,22,18],
[307,261,22,19],
[307,262,21,18],
[306,261,21,19],
[306,262,22,19],
[306,262,22,18],
[306,261,22,18],
[307,262,20,17],
[305,262,22,18],
[306,261,21,18],
[304,261,23,18],
[304,260,22,19],
[305,260,21,18],
[305,260,21,18],
[304,260,21,17],
[305,259,22,19],
[305,259,22,18],
[306,258,19,20],
[306,260,21,18],
[306,261,20,18],
[306,261,20,19],
[306,262,20,18],
[305,262,20,19],
[305,263,21,18],
[306,263,19,18],
[305,263,19,17],
[305,262,20,19],
[306,263,20,18],
[306,263,20,18],
[306,263,21,18],
[306,263,21,18],
[306,264,22,17],
[305,263,21,18],
[306,263,22,18],
[306,263,21,18],
[306,263,21,18],
[306,263,21,17],
[306,263,21,18],
[306,263,22,18],
[307,262,21,18],
[307,262,22,19],
[309,262,20,18],
[310,262,20,18],
[312,262,19,18],
[311,262,21,18],
[312,262,20,17],
[312,260,20,19],
[312,262,21,19],
[312,260,21,20],
[312,261,21,19],
[311,261,21,19],
[311,262,22,18],
[312,262,19,17],
[311,261,20,17],
[311,261,20,18],
[310,261,21,19],
[309,261,22,18],
[308,260,22,19],
[308,261,21,18],
[308,261,21,18],
[308,260,21,18],
[309,261,19,18],
[309,261,19,17],
[308,261,20,17],
[308,261,21,17],
[308,261,20,18],
[307,261,20,18],
[306,262,19,17],
[306,262,20,17],
[305,263,19,16],
[304,262,20,18],
[304,262,19,18],
[304,262,19,17],
[303,262,20,17],
[303,262,19,17],
[303,262,19,18],
[303,262,19,18],
[304,263,18,16],
[304,263,18,16],
[304,262,19,17],
[305,263,19,16],
[306,263,19,16],
[307,263,19,17],
[308,263,20,16],
[307,262,20,17],
[308,263,22,16],
[311,263,19,17],
[310,263,19,17],
[311,262,20,18],
[312,263,19,17],
[311,263,20,17],
[310,261,20,18],
[311,262,20,18],
[312,263,20,16],
[315,263,19,16],
[313,262,21,17],
[316,262,21,18],
[318,262,20,17],
[317,262,21,18],
[319,262,19,18],
[318,262,21,18],
[319,262,20,17],
[319,262,19,18],
[319,262,19,16],
[318,263,20,17],
[317,262,20,18],
[317,263,20,17],
[315,262,21,18],
[312,263,20,16],
[312,263,21,16],
[309,263,21,16],
[307,263,19,16],
[303,263,20,16],
[303,262,19,18],
[300,262,19,17],
[297,263,20,17],
[293,263,21,17],
[294,263,20,17],
[292,263,20,17],
[291,263,20,18],
[290,263,21,17],
[291,263,20,17],
[293,263,19,16],
[295,262,21,17],
[300,261,20,18],
[299,262,21,16],
[306,261,21,16],
[313,262,18,15],
[312,262,20,15],
[318,262,19,15],
[322,261,19,15],
[327,261,19,17],
[327,261,20,17],
[330,261,18,17],
[332,261,19,16],
[334,261,19,18],
[334,261,19,17],
[335,261,19,17],
[335,261,19,17],
[334,262,18,17],
[334,262,18,16],
[331,262,18,16],
[327,261,18,17],
[327,263,18,15],
[320,262,19,17],
[314,263,19,16],
[308,263,19,16],
[308,263,19,16],
[303,263,17,16],
[298,263,18,16],
[297,263,19,16],
[293,263,18,17],
[289,263,19,17],
[288,263,18,17],
[288,263,18,18],
[288,264,18,17],
[288,264,18,17],
[289,264,18,16],
[289,264,17,16],
[291,264,17,16],
[294,264,18,15],
[298,264,18,15],
[298,264,19,15],
[302,264,19,15],
[307,263,18,15],
[307,264,18,15],
[309,263,19,16],
[310,262,19,16],
[310,262,19,16],
[311,261,18,17],
[310,262,18,16],
[309,262,18,15],
[309,262,17,15],
[308,262,18,16],
[307,262,18,16],
[307,262,16,15],
[306,262,17,16],
[306,262,17,16],
[306,262,16,16],
[306,263,17,15],
[305,262,18,16],
[305,263,17,15],
[305,263,17,16],
[305,264,17,15],
[305,263,17,16],
[304,264,18,13],
[305,263,17,16],
[305,263,18,15],
[305,263,17,16],
[306,263,16,15],
[306,262,17,16],
[307,263,16,16],
[306,263,17,16],
[306,263,17,16],
[307,263,16,16],
[306,262,16,16],
[306,263,17,16],
[307,263,15,15],
[307,262,16,17],
[306,263,18,16],
[307,264,17,14],
[307,263,17,15],
[308,264,17,15],
[308,264,17,15],
[308,263,17,16],
[309,264,18,14],
[310,263,17,16],
[310,263,17,16],
[310,263,16,16],
[311,263,16,15],
[310,264,17,14],
[311,264,17,14],
[309,263,17,16],
[311,266,16,14],
[310,266,17,15],
[311,266,17,15],
[312,267,15,15],
[312,268,16,15],
[311,268,17,15],
[312,268,17,15],
[312,267,17,15],
[312,267,17,15],
[312,267,17,15],
[313,267,16,16],
[313,267,17,15],
[313,267,16,15],
[312,267,17,14],
[313,267,16,14],
[312,266,16,16],
[313,266,16,15],
[313,266,16,15],
[312,266,18,15],
[312,266,17,15],
[312,266,17,16],
[312,266,16,15],
[311,266,18,15],
[311,265,16,15],
[311,265,17,15],
[310,265,16,16],
[308,264,18,15],
[307,263,16,16],
[306,264,16,15],
[304,264,17,14],
[302,263,17,15],
[302,263,17,15],
[300,263,17,16],
[298,263,17,16],
[297,264,18,14],
[297,263,17,16],
[297,263,18,16],
[297,264,17,16],
[298,264,17,16],
[298,264,18,16],
[299,265,17,16],
[303,267,18,14],
[308,268,19,13],
[308,268,19,12],
[315,268,20,12],
[321,268,19,12],
[327,268,19,14],
[327,268,17,13],
[330,267,19,13],
[333,267,18,13],
[334,267,17,14],
[334,266,17,15],
[334,266,16,14],
[332,266,18,15],
[329,266,19,15],
[329,266,18,15],
[325,266,18,14],
[320,266,18,15],
[320,266,18,16],
[315,266,19,15],
[311,266,18,15],
[309,266,18,14],
[308,266,19,15],
[308,266,19,15],
[310,266,19,15],
[313,265,18,15],
[314,264,19,15],
[314,264,19,15],
[317,263,19,14],
[319,262,18,13],
[322,260,18,14],
[321,260,19,14],
[323,259,20,13],
[326,259,18,14],
[327,259,19,14],
[327,259,19,15],
[327,258,19,15],
[328,258,19,15],
[328,258,19,15],
[328,258,19,14],
[328,258,20,15],
[325,258,18,15],
[320,259,19,15],
[315,258,20,16],
[315,259,20,15],
[312,258,20,17],
[307,259,21,15],
[307,259,20,16],
[304,258,19,15],
[302,258,20,16],
[298,259,19,15],
[298,258,20,16],
[294,258,20,17],
[292,260,19,16],
[292,260,20,16],
[291,262,19,15],
[291,262,20,18],
[293,265,19,16],
[293,264,21,17],
[294,264,20,17],
[295,263,20,18],
[296,263,20,18],
[296,263,20,18],
[296,264,20,17],
[296,264,20,16],
[297,264,20,17],
[297,264,20,16],
[298,264,19,16],
[300,263,19,16],
[300,263,21,16],
[301,263,19,17],
[303,263,18,16],
[304,262,19,17],
[304,262,19,17],
[305,262,19,16],
[306,262,19,16],
[306,263,19,16],
[306,262,20,16],
[306,263,19,16],
[306,263,20,16],
[307,263,19,17],
[307,263,19,17],
[306,263,21,17],
[306,263,21,17],
[306,262,20,18],
[306,263,21,17],
[306,263,20,17],
[306,263,20,17],
[307,262,20,18],
[307,263,20,17],
[307,263,20,17],
[306,263,20,17],
[306,263,20,18],
[305,263,21,17],
[305,262,21,18],
[306,262,20,18],
[306,262,20,19],
[306,263,20,18],
[307,262,20,19],
[306,262,21,19],
[307,262,19,19],
[306,262,22,19],
[305,263,23,18],
[305,263,23,19],
[305,262,23,19],
[304,262,25,18],
[304,261,24,21],
[304,261,24,20],
[304,262,25,19],
[305,262,23,20],
[304,262,24,20],
[304,263,25,18],
[305,263,25,19],
[305,263,25,18],
[306,262,25,21],
[306,263,25,19],
[306,263,25,19],
[307,262,24,20],
[305,263,25,18],
[304,263,26,19],
[306,262,25,20],
[306,263,24,19],
[306,263,25,19],
[305,262,25,19],
[305,264,27,18],
[305,262,26,21],
[307,264,24,19],
[307,262,24,21],
[306,262,26,22],
[305,263,27,21],
[305,264,26,21],
[305,262,28,23],
[304,261,29,23],
[305,261,27,23],
[305,261,27,22],
[305,261,27,22],
[304,261,30,22],
[303,261,29,22],
[304,261,26,21],
[304,260,28,22],
[302,257,29,24],
[303,258,29,24],
[301,259,30,22],
[300,259,30,22],
[303,259,28,22],
[303,258,28,23],
[302,257,30,23],
[300,256,32,24],
[302,256,30,25],
[299,257,33,25],
[299,257,32,25],
[301,258,30,25],
[299,256,32,25],
[299,257,30,26],
[299,257,32,25],
[300,258,31,23],
[299,255,31,26],
[301,257,30,25],
[300,257,30,24],
[299,257,31,24],
[300,256,30,25],
[300,257,30,23],
[299,255,32,26],
[299,256,32,25],
[299,255,32,26],
[301,257,30,23],
[301,256,29,25],
[300,256,32,25],
[301,257,31,24],
[300,257,32,25],
[303,256,30,25],
[304,256,30,26],
[302,258,34,24],
[306,258,30,22],
[306,259,31,22],
[306,258,30,23],
[306,258,30,23],
[306,258,30,23],
[306,259,30,23],
[305,259,31,23],
[306,259,29,23],
[304,258,33,24],
[304,260,33,22],
[303,259,33,23],
[305,258,30,24],
[303,258,31,24],
[303,260,31,22],
[303,259,31,23],
[301,258,31,23],
[302,258,31,24],
[301,256,31,25],
[302,257,31,25],
[302,258,31,22],
[302,256,30,25],
[302,257,32,24],
[302,259,31,24],
[302,262,31,23],
[302,262,30,23],
[302,263,30,24],
[302,265,31,23],
[302,264,32,25],
[300,266,32,23],
[301,266,32,23],
[300,267,31,23],
[298,265,34,25],
[299,268,31,22],
[300,268,31,23],
[300,266,31,24],
[300,268,32,22],
[299,266,32,24],
[299,266,34,23],
[298,267,33,22],
[300,265,31,24],
[301,265,33,24],
[301,263,34,25],
[301,265,33,23],
[301,262,31,26],
[301,264,33,24],
[301,263,32,26],
[302,264,33,22],
[301,263,33,23],
[302,260,32,25],
[302,261,32,23],
[303,261,31,25],
[305,262,29,23],
[306,262,32,23],
[306,262,31,23],
[309,261,30,23],
[309,262,32,23],
[310,261,32,23],
[311,260,30,24],
[312,261,30,23],
[312,260,28,24],
[312,261,30,22],
[311,260,30,23],
[312,261,30,23],
[310,260,32,24],
[312,260,31,24],
[310,261,32,24],
[309,261,32,24],
[307,262,30,23],
[306,262,34,24],
[306,262,33,24],
[303,262,33,25],
[303,263,32,23],
[302,262,31,25],
[300,262,32,24],
[297,262,34,26],
[297,265,34,22],
[294,264,32,23],
[294,264,34,23],
[292,263,35,24],
[291,264,33,24],
[291,264,31,25],
[291,266,32,23],
[289,266,34,23],
[287,266,35,22],
[288,265,34,24],
[287,266,34,23],
[288,265,32,23],
[286,265,34,23],
[286,265,35,22],
[287,265,32,22],
[288,264,32,23],
[290,263,33,24],
[292,264,34,24],
[292,264,34,23],
[296,264,33,23],
[302,264,30,22],
[305,263,32,23],
[305,264,32,21],
[310,263,30,22],
[312,263,31,22],
[314,263,31,21],
[313,262,31,23],
[315,262,33,23],
[317,262,33,24],
[318,262,33,24],
[319,262,32,23],
[319,262,32,23],
[319,262,32,24],
[318,263,32,22],
[318,262,33,24],
[319,263,30,24],
[318,264,32,22],
[317,265,31,21],
[317,263,32,24],
[315,264,32,22],
[315,264,31,22],
[314,264,31,22],
[313,264,31,24],
[308,265,35,21],
[305,264,33,22],
[304,265,32,21],
[296,265,36,22],
[292,265,32,22],
[288,264,32,22],
[288,265,34,22],
[285,265,32,23],
[278,266,36,21],
[275,265,35,22],
[275,265,34,24],
[273,266,34,22],
[274,264,33,24],
[273,266,33,22],
[275,264,32,24],
[277,264,34,24],
[283,265,31,23],
[282,265,33,24],
[285,264,32,23],
[289,264,32,24],
[290,265,30,23],
[292,264,32,24],
[296,264,32,23],
[299,264,33,23],
[299,264,33,23],
[304,263,30,24],
[307,264,32,23],
[311,263,33,23],
[311,263,33,23],
[316,264,32,22],
[320,264,33,21],
[324,264,32,22],
[326,264,31,21],
[326,264,33,22],
[327,264,33,23],
[328,264,31,24],
[323,264,33,22],
[323,262,33,25],
[320,264,34,25],
[314,264,31,25],
[313,264,33,24],
[305,265,30,21],
[295,263,33,27],
[285,266,30,22],
[287,266,29,22],
[278,265,29,24],
[270,266,30,24],
[264,267,33,23],
[263,266,33,23],
[263,267,33,23],
[266,268,30,22],
[265,268,30,21],
[267,267,33,23],
[271,267,31,23],
[275,266,31,23],
[276,267,30,23],
[285,266,28,23],
[295,266,30,23],
[303,264,31,25],
[303,265,31,24],
[312,264,31,24],
[318,264,28,23],
[319,263,29,23],
[319,264,30,23],
[318,263,31,23],
[316,262,30,23],
[316,262,30,23],
[314,262,32,23],
[314,261,29,23],
[314,261,29,22],
[314,261,30,22],
[314,259,30,24],
[317,259,28,24],
[318,258,28,25],
[317,260,28,22],
[316,260,29,23],
[315,260,29,23],
[313,261,29,22],
[309,261,30,23],
[310,261,29,23],
[296,263,32,24],
[282,263,33,24],
[267,264,33,25],
[267,264,32,24],
[255,266,32,24],
[244,268,31,23],
[243,269,33,22],
[232,270,31,23],
[221,272,32,22],
[207,273,32,23],
[207,273,31,23],
[194,274,31,24],
[183,275,30,23],
[183,275,30,23],
[189,273,33,22],
[211,271,33,22],
[234,269,35,23],
[234,270,34,22],
[258,268,31,22],
[279,265,33,23],
[300,262,35,23],
[300,262,34,22],
[335,259,37,23],
[370,256,38,22],
[404,252,36,23],
[405,252,35,22],
[437,250,35,23],
[450,250,29,23],
[445,251,28,23],
[445,252,28,22],
[440,252,28,22],
[434,252,32,24],
[437,255,29,24],
[436,254,30,27],
[453,262,32,25],
[473,266,31,25],
[474,266,31,24],
[491,271,34,26],
[509,278,35,28],
[525,283,33,25],
[525,280,33,25],
[538,280,29,24],
[547,281,29,24],
[550,282,28,24],
[551,282,28,24],
[549,283,30,22],
[546,282,28,23],
[524,281,47,24],
[523,281,36,22],
[492,282,37,22],
[460,282,36,23],
[458,282,39,22],
[432,282,34,22],
[413,282,32,23],
[400,281,30,23],
[399,281,31,23],
[392,280,29,22],
[385,279,30,22],
[381,278,28,22],
[381,278,29,23],
[369,277,33,23],
[344,273,34,22],
[318,269,34,22],
[318,270,34,21],
[295,268,32,22],
[270,265,33,18],
[270,266,35,19],
[228,258,35,21],
[231,259,33,20],
[208,257,33,19],
[183,254,34,19],
[159,250,34,20],
[159,251,34,18],
[137,247,34,20],
[115,242,34,21],
[91,240,36,20],
[92,240,34,20],
[68,237,35,20],
[46,233,34,20],
[47,232,32,21],
[24,229,33,20],
[1,227,33,19],
[0,0,0,0],
[0,0,0,0],
[0,0,0,0],
[0,0,0,0],
[0,0,0,0],
[0,0,0,0],
[0,0,0,0],
[0,0,0,0],
[0,0,0,0],
[0,0,0,0],
[1,215,21,20],
[11,214,35,19],
[33,214,27,20],
[32,213,31,22],
[32,214,27,22],
[27,214,28,22],
[22,214,29,21],
[22,214,28,20],
[22,214,30,21],
[41,214,34,21],
[40,214,33,20],
[67,213,34,21],
[93,213,34,21],
[116,212,34,22],
[116,213,33,20],
[138,212,33,21],
[158,212,33,21],
[179,212,32,21],
[177,213,33,20],
[198,212,32,22],
[210,213,30,21],
[209,213,31,20],
[207,213,30,20],
[200,212,31,22],
[195,212,30,20],
[198,212,30,21],
[198,213,30,20],
[206,211,29,22],
[212,212,30,22],
[229,212,34,21],
[230,213,32,19],
[255,213,32,20],
[280,212,31,20],
[304,211,33,21],
[303,212,33,20],
[324,211,33,21],
[340,211,28,22],
[340,211,28,23],
[338,213,28,22],
[333,225,25,24],
[327,238,25,24],
[326,238,27,23],
[322,248,26,23],
[322,247,27,22],
[323,248,27,22],
[323,249,28,22],
[326,249,28,22],
[330,255,26,26],
[330,256,25,24],
[330,268,24,24],
[328,280,26,25],
[325,285,29,22],
[326,285,28,22],
[325,284,29,22],
[326,286,29,20],
[327,288,27,24],
[327,288,28,25],
[327,301,29,24],
[327,313,29,24],
[328,313,27,22],
[327,318,30,22],
[326,316,30,22],
[326,318,28,21],
[326,319,30,20],
[326,319,29,21],
[325,319,29,21],
[325,319,30,23],
[326,319,29,22],
[326,320,30,20],
[326,320,29,20],
[326,319,28,22],
[325,319,31,22],
[326,319,29,22],
[323,318,32,23],
[324,320,30,20],
[325,319,29,22],
[326,319,28,22],
[325,319,28,22],
[326,319,27,23],
[324,321,30,21],
[326,319,28,24],
[325,319,28,23],
[325,319,29,22],
[325,320,27,20],
[324,319,30,23],
[324,320,29,21],
[325,320,27,21],
[324,320,29,22],
[326,320,28,20],
[324,319,29,21],
[325,320,27,21],
[324,320,27,21],
[324,320,28,21],
[324,319,27,23],
[324,319,29,22],
[325,320,28,21],
[321,320,31,21],
[323,320,29,21],
[324,320,27,21],
[323,320,29,21],
[323,319,31,23],
[323,319,28,22],
[323,319,29,22],
[323,320,28,22],
[322,320,29,21],
[322,319,29,22],
[322,320,28,21],
[322,321,29,21],
[323,320,29,20],
[321,321,30,21],
[321,316,30,21],
[322,309,31,21],
[320,309,31,20],
[320,303,30,21],
[320,298,28,19],
[319,293,29,21],
[320,292,27,21],
[319,285,28,21],
[316,278,30,23],
[317,279,30,23],
[317,275,28,21],
[317,268,27,21],
[317,262,26,22],
[317,262,26,22],
[315,259,26,21],
[314,259,28,22],
[311,259,29,21],
[311,259,27,21],
[309,259,27,22],
[308,259,28,22],
[306,259,30,22],
[305,259,30,21],
[304,259,30,21],
[302,259,30,21],
[300,260,29,22],
[300,260,28,21],
[296,260,31,22],
[295,261,29,23],
[293,260,32,23],
[296,260,30,21],
[297,260,28,22],
[296,259,32,22],
[298,260,29,21]
]
}
创建所需 labels 文件夹与 IR_1.txt 文件,代码转化如下:
# -*- coding: utf-8 -*-
import json
import os
# 读取json文件
data = json.load(open('1.json', 'r', encoding='utf-8'))
data_gt_rect = data['gt_rect']
print(data_gt_rect[0])
# 保存成txt文件
def text_save(filename, data_gt_rect): # filename为写入CSV文件的路径,data为要写入数据列表.
file = open(filename, 'a')
for i in range(len(data_gt_rect)):
s = data_gt_rect[i]
strNums=[str(x) for x in s]
strNums = ",".join(strNums)
print(strNums)
file.write(strNums)
file.write('\n')
file.close()
print("保存文件成功")
text_save('data/Anti_UAV_test_dev/01_1667_0001-1500/labels/IR_1.txt', data_gt_rect)
数据集结构(批量转换文件夹下 json 文件)
json 文件内容(同上)如下:
代码转化如下:
# -*- coding: utf-8 -*-
import json
import os
# 保存成txt文件
def text_save(file_name, data_gt_rect): # filename为写入CSV文件的路径,data为要写入数据列表.
file = open(file_name, 'a')
for i in range(len(data_gt_rect)):
s = data_gt_rect[i]
strNums = [str(x) for x in s]
strNums = ",".join(strNums)
print(strNums)
file.write(strNums)
file.write('\n')
file.close()
print("保存文件成功")
def get_jsonfile(path, file_list):
dir_list = os.listdir(path)
for x in dir_list:
new_x = os.path.join(path, x)
if os.path.isdir(new_x):
get_jsonfile(new_x, file_list)
else:
file_tuple = os.path.splitext(new_x)
if file_tuple[1] == '.json':
file_list.append(new_x)
return file_list
# 读取json文件
files = []
path = 'data/Anti_UAV_test_dev1'
get_jsonfile(path, files)
for file_name in files:
data = json.load(open(file_name, 'r', encoding='utf-8'))
data_gt_rect = data['gt_rect']
print(data_gt_rect[0])
text_save(file_name + ".txt", data_gt_rect)
代码转化后结构:
从目标文件夹随机选择一定数量图片
import os
import random
import shutil
# 源文件夹和目标文件夹的路径
source_folder = r"/VIData/images/航线2可见光"
destination_folder = "data/SG/VIData/images/train/hk2kj"
# 选择的随机图片数量
num_images_to_extract = 200
# 获取源文件夹中所有图片文件的列表
image_files = [filename for filename in os.listdir(source_folder) if
filename.lower().endswith(('.jpg', '.jpeg', '.png', '.gif'))]
# 随机选择一定数量的图片
selected_images = random.sample(image_files, num_images_to_extract)
# 创建目标文件夹(如果不存在)
if not os.path.exists(destination_folder):
os.makedirs(destination_folder)
# 复制选中的随机图片到目标文件夹
for image in selected_images:
source_path = os.path.join(source_folder, image)
destination_path = os.path.join(destination_folder, image)
shutil.copy2(source_path, destination_path)
print(f"{num_images_to_extract} random images extracted and saved to the destination folder.")
遍历目标文件每个图片文件,寻找同名的文件,并将其复制到新的文件夹中
import os
import shutil
# 图片文件夹、txt文件夹和目标文件夹的路径
image_folder = "data/SG/VIData/images/train/hk2kj"
txt_folder = "data/SG/VIData/labels2/labels/train/hx2kj"
destination_folder = "data/SG/VIData/labels/train/hk2kj"
# 获取图片文件夹中所有图片文件的列表
image_files = [filename for filename in os.listdir(image_folder) if
filename.lower().endswith(('.jpg', '.jpeg', '.png', '.gif'))]
# 创建目标文件夹(如果不存在)
if not os.path.exists(destination_folder):
os.makedirs(destination_folder)
# 遍历每个图片文件,寻找同名的txt文件,并将其复制到目标文件夹
for image_file in image_files:
image_name, _ = os.path.splitext(image_file) # 获取图片文件名(不包含扩展名)
txt_file_path = os.path.join(txt_folder, f"{image_name}.txt")
if os.path.exists(txt_file_path):
destination_path = os.path.join(destination_folder, f"{image_name}.txt")
shutil.copy2(txt_file_path, destination_path)
else:
print(f"Could not find corresponding txt file for {image_file}.")
print("Txt files extracted and saved to the destination folder.")
以上就是Python xml2txt & 批量文件名修改 (rename) 的实现与总结 json 文件转化为 txt 文件的几种情况用于学习记录。