json文件格式
这是yolov4模型跑出来的检测结果result.json
下面是截取的一张图的检测结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
{
"frame_id" : 1 , #图片的序号
"filename" : "/media/wuzhou/gap/rgb-piglet/test/00000000.jpg" , #图片的路径
"objects" : [ #该图中所有的目标:目标类别、目标名称、归一化的框的坐标(xywh格式)、置信度
{ "class_id" : 0 , "name" : "pp" , "relative_coordinates" :{ "center_x" : 0.750913 , "center_y" : 0.402691 , "width" : 0.038380 , "height" : 0.193304 }, "confidence" : 0.995435 },
{ "class_id" : 0 , "name" : "pp" , "relative_coordinates" :{ "center_x" : 0.764775 , "center_y" : 0.199255 , "width" : 0.049979 , "height" : 0.130169 }, "confidence" : 0.994495 },
{ "class_id" : 0 , "name" : "pp" , "relative_coordinates" :{ "center_x" : 0.560050 , "center_y" : 0.482614 , "width" : 0.036331 , "height" : 0.166377 }, "confidence" : 0.994460 },
{ "class_id" : 0 , "name" : "pp" , "relative_coordinates" :{ "center_x" : 0.710756 , "center_y" : 0.406446 , "width" : 0.041782 , "height" : 0.191297 }, "confidence" : 0.993540 },
{ "class_id" : 0 , "name" : "pp" , "relative_coordinates" :{ "center_x" : 0.638335 , "center_y" : 0.238725 , "width" : 0.107689 , "height" : 0.092282 }, "confidence" : 0.992926 },
{ "class_id" : 0 , "name" : "pp" , "relative_coordinates" :{ "center_x" : 0.780232 , "center_y" : 0.448454 , "width" : 0.041550 , "height" : 0.179540 }, "confidence" : 0.990020 },
{ "class_id" : 0 , "name" : "pp" , "relative_coordinates" :{ "center_x" : 0.563412 , "center_y" : 0.350035 , "width" : 0.103184 , "height" : 0.059460 }, "confidence" : 0.979756 },
{ "class_id" : 0 , "name" : "pp" , "relative_coordinates" :{ "center_x" : 0.522591 , "center_y" : 0.195170 , "width" : 0.083014 , "height" : 0.071478 }, "confidence" : 0.970642 },
{ "class_id" : 0 , "name" : "pp" , "relative_coordinates" :{ "center_x" : 0.658721 , "center_y" : 0.154640 , "width" : 0.103852 , "height" : 0.055686 }, "confidence" : 0.967082 },
{ "class_id" : 0 , "name" : "pp" , "relative_coordinates" :{ "center_x" : 0.537660 , "center_y" : 0.256810 , "width" : 0.101619 , "height" : 0.095211 }, "confidence" : 0.918135 },
{ "class_id" : 0 , "name" : "pp" , "relative_coordinates" :{ "center_x" : 0.528618 , "center_y" : 0.481005 , "width" : 0.033226 , "height" : 0.177723 }, "confidence" : 0.310291 }
]
},
|
完整代码
代码需要指定图片的路径,例如 file_dir = "h:/rgb-piglet/five/test"
注意:result.json文件要跟图片放一起
代码生成的xml与图片在同一个路径下
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
import json
import time
import os
from pil import image
import cv2
import numpy as np
'''人为构造xml文件的格式'''
out0 = '''<annotation>
<folder>%(folder)s</folder>
<filename>%(name)s</filename>
<path>%(path)s</path>
<source>
<database>none</database>
</source>
<size>
<width>%(width)d</width>
<height>%(height)d</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
'''
out1 = ''' <object>
<name>%(class)s</name>
<pose>unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>%(xmin)d</xmin>
<ymin>%(ymin)d</ymin>
<xmax>%(xmax)d</xmax>
<ymax>%(ymax)d</ymax>
</bndbox>
</object>
'''
out2 = '''</annotation>
'''
def read_json(json_dir):
with open (json_dir, "r" ) as f:
data = json.load(f)
print ( type (data), len (data), type (data[ 0 ]),data[ 0 ][ 'frame_id' ])
return data
'''txt转xml函数'''
def translate(fdir,lists):
source = {}
label = {}
data = read_json(fdir + "/result.json" )
k = 0
for jpg in lists:
print (jpg)
if jpg[ - 4 :] = = '.jpg' :
image = cv2.imread(jpg) #路径不能有中文
h,w,_ = image.shape #图片大小
fxml = jpg.replace( '.jpg' , '.xml' )
fxml = open (fxml, 'w' );
imgfile = jpg.split( '/' )[ - 1 ]
source[ 'name' ] = imgfile
source[ 'path' ] = jpg
source[ 'folder' ] = os.path.basename(fdir)
source[ 'width' ] = w
source[ 'height' ] = h
fxml.write(out0 % source)
for obj in data[k][ "objects" ]:
label[ 'class' ] = obj[ "class_id" ]
box = obj[ "relative_coordinates" ]
'''把txt上的数字(归一化)转成xml上框的坐标'''
xmin = float (box[ "center_x" ] - 0.5 * box[ "width" ]) * w
ymin = float (box[ "center_y" ] - 0.5 * box[ "height" ]) * h
xmax = float (xmin + box[ "width" ] * w)
ymax = float (ymin + box[ "height" ] * h)
label[ 'xmin' ] = xmin
label[ 'ymin' ] = ymin
label[ 'xmax' ] = xmax
label[ 'ymax' ] = ymax
fxml.write(out1 % label)
k = k + 1
fxml.write(out2)
if __name__ = = '__main__' :
file_dir = "h:/rgb-piglet/five/test"
lists = []
for i in os.listdir(file_dir):
if i[ - 3 :] = = 'jpg' :
lists.append(file_dir + '/' + i)
#print(lists)
translate(file_dir,lists)
print ( '---------------done!!!--------------' )
|
到此这篇关于python之json文件转xml文件案例讲解的文章就介绍到这了,更多相关python之json文件转xml内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/weixin_42899627/article/details/118373040