json轉labelimg標註的xml檔案

2021-10-06 07:13:06 字數 4334 閱讀 6440

比賽只給了json檔案,需要轉成xml檔案

首先需要乙個labelimg標註好的xml檔案做模板,格式如下:
"no"

>

train<

/folder>

000000

<

/filename>

d:/study/pycharmprojects/cv零

;基;礎

;/input/train/

000000.png<

/path>

unknown<

/database>

<

/source>

741<

/width>

350<

/height>

3<

/depth>

<

/size>

0<

/segmented>

1<

/name>

unspecified<

/pose>

0<

/truncated>

0<

/difficult>

259<

/xmin>

77<

/ymin>

320<

/xmax>

272<

/ymax>

<

/bndbox>

<

/object>

<

/annotation>

需要修改的地方有:

filename

size節點下的width、height、depth

object節點下的name(標籤名)

object節點下的bndbox下的xmin、ymin、xmax、ymax

比賽提供的json格式如下:

,'000001.png':,

'000002.png'

:}

注意:這裡與labelimg標註的xml中xmin、xmax、ymin、ymax有所不同

xmin = left

ymin = top

xmax = left + width

ymax = top + height

具體實現:

import os, json

import copy

from lxml.etree import element, subelement, tostring, elementtree

import cv2

import numpy as np

template_file =

'../input/xml/anno.xml'

# xml模板

target_dir =

'../input/xml/annotations/'

#儲存路徑

image_dir =

'../input/val/'

# 資料夾

train_file =

'../input/val.json'

# 儲存了資訊的json檔案

# 提取json

defparse_json

(d):

arr = np.array(

[ d[

'top'

], d[

'height'

], d[

'left'

], d[

'width'

], d[

'label']]

) arr = arr.astype(

int)

arr = arr.astype(

str)

return arr

trainfiles = json.load(

open

(train_file)

)tree = elementtree(

)for k, line in

enumerate

(trainfiles)

: arr = parse_json(trainfiles[line]

) file_name = line #檔名

for i in

range

(arr.shape[1]

):if i ==0:

label = arr[

4, i]

# 標籤名

# 座標

ymin = arr[

0, i]

ymax =

str(

int(arr[

0, i])+

int(arr[

1, i]))

# xmin = arr[

2, i]

xmax =

str(

int(arr[

2, i])+

int(arr[

3, i]))

tree.parse(template_file)

# 解析樹

root = tree.getroot(

)# 根節點

root.find(

'filename'

).text = file_name

# size

sz = root.find(

'size'

) im = cv2.imread(image_dir + file_name)

#讀取資訊

sz.find(

'height'

).text =

str(im.shape[0]

) sz.find(

'width'

).text =

str(im.shape[1]

) sz.find(

'depth'

).text =

str(im.shape[2]

)# object

obj = root.find(

'object'

) obj.find(

'name'

).text = label

bb = obj.find(

'bndbox'

) bb.find(

'xmin'

).text = xmin

bb.find(

'ymin'

).text = ymin

bb.find(

'xmax'

).text = xmax

bb.find(

'ymax'

).text = ymax

# 有多個標籤需要新增object

else

: label = arr[

4, i]

ymin = arr[

0, i]

ymax =

str(

int(arr[

0, i])+

int(arr[

1, i]))

xmin = arr[

2, i]

xmax =

str(

int(arr[

2, i])+

int(arr[

3, i]))

obj_ori = root.find(

'object'

) obj = copy.deepcopy(obj_ori)

# 注意這裡深拷貝

obj.find(

'name'

).text = label

bb = obj.find(

'bndbox'

) bb.find(

'xmin'

).text = xmin

bb.find(

'ymin'

).text = ymin

bb.find(

'xmax'

).text = xmax

bb.find(

'ymax'

).text = ymax

xml_file = file_name.replace(

'png'

,'xml'

) tree.write(target_dir + xml_file, encoding=

'utf-8'

)

SSD講堂四 標註 標註工具LabelImg

目錄 前言ubuntu原始碼安裝 ubuntu pip安裝 windows環境下安裝 安裝anaconda 420 安裝pyqt包 使用方法 後續說明 我們知道,標註主要是用來建立自己的資料集,方便進行深度學習訓練。本篇部落格將推薦一款十分好用的標註工具labelimg,重點介紹其安裝以及使用的過程...

標註工具labelimg的安裝和使用

conda create name labelimg python 3.5 不要用3.6 如果掛掉多試幾次一點會成功的!activate labelimg成功啟用labelimg環境 pip install labelimg 中途可能會掛掉,多試幾次啟動labelimg 如果標籤多不想自己輸入可以去...

目標檢測標註工具labelImg安裝及使用

目標檢測中,原始的標註過程是非常重要的,它的作用是在原始影象中標註目標物體位置並對每張生成相應的xml檔案表示目標標準框的位置。本文介紹一款使用方便且能夠標註多類別並能直接生成xml檔案的標註工具 labelimg工具,並對其使用方法做乙個介紹。方式2 使用git命令 git clone 2 安裝 ...