背景介绍

手上有一个工程
https://github.com/aditya-vora/FCHD-Fully-Convolutional-Head-Detector
该工程是一个预测人头位置的目标检测工程。

也就是说,该工程的输出是一个个的对头的方框标注

因此所需要的label文件是关于当前图片所有目标的像素点位置记录,是一个json文件,如下所示

我的目标就是在普通图片上实现该文件的输出。

方案说明

采取的方案是用labelImg应用得到xml文件,再从xml文件中提取需要的部分生成对应json文件

labelImg可自行寻找。

xml文件一般格式

所需要的便是‘bndbox’内的数据。

代码(基于Python3)

import os
import json
import xmltodict
import numpy as np
import random
'''得到关于所有框位置的数据'''
def get(path,txt):with open(path) as f:dic=xmltodict.parse(f.read())dd=dic["annotation"]["object"]type(dd)for i in range(len(dd)):x1=[dd[i]["bndbox"]["xmin"]+'.0']x2=[dd[i]["bndbox"]["xmax"]+'.0']y1=[dd[i]["bndbox"]["ymin"]+'.0']y2=[dd[i]["bndbox"]["ymax"]+'.0']txt=txt+x1+x2+y1+y2return txt
'''制作json文件,dic为最终输出的字典格式'''
def makejson(dic,save_path): #dic={"image_ath":data_path,"rects":boxes[1:]}#obj=json.dumps(dic)with open(save_path, 'w') as f:json.dump(dic, f, sort_keys=True, indent=2, separators=(',', ': '))f.close()
'''读取txt文件内的内容,分别读取train,test,val的数据,返回以list格式'''
def readtxt(txtpath,name):txt = txtpath+name+'.txt'f = open(txt,"r")   #设置文件对象line = f.readline()train=[line[:-1]]while line:             #直到读取完文件line = f.readline()  #读取一行文件,包括换行符line = line[:-1]     #去掉换行符,也可以不去train.append(line)train=train[:-1]return train#print(train)f.close() #关闭文件
'''根据地址读取xml文件名,再根据比例进行分配,分别保存为三个txt文件,用于后续读取'''
def divide(xmlfilepath,txtsavepath, test_percent = 0.2,val_percent = 0.2,train_percent = 0.6):total_xml = os.listdir(xmlfilepath)num = len(total_xml)#list = range(num)tr = int(num * train_percent)te = int(num * test_percent)+tr
#train = int(tv * train_percent)#val = int()
#train = random.sample(list, tr)
#train = random.sample(trainval, tr)
#test = random.sample(list, te)ftrain = open('/home/tjw/Desktop/change/xml_to_json_idl/txt/train.txt', 'w')ftest = open('/home/tjw/Desktop/change/xml_to_json_idl/txt/test.txt', 'w')fval = open('/home/tjw/Desktop/change/xml_to_json_idl/txt/val.txt', 'w')xml_num=0for xml in total_xml:name = xml[:-4] + '\n'if (xml_num<tr):ftrain.write(name)xml_num+=1elif (xml_num<te):ftest.write(name) xml_num+=1else:fval.write(name)ftrain.close()fval.close()ftest.close()#print("finish")
if __name__ == '__main__':#data_path='/home/tjw/Desktop/change/xml_to_json_idl/xml/00000000_640x480.xml'xml_data_path = '/home/tjw/Desktop/change/xml_to_json_idl/xml/'#xml文件地址img_paths='/home/tjw/Desktop/change/xml_to_json_idl/img/'save_path='/home/tjw/Desktop/change/xml_to_json_idl/json/data.json'#json文件的保存位置#xmlfilepath = '/home/tjw/Desktop/change/xml_to_json_idl/xml/'txtsavepath = '/home/tjw/Desktop/change/xml_to_json_idl/txt/'#txt文件的保存位置divide(xml_data_path,txtsavepath) #根据读取到的xml路径进行分配,制作txt文件'''分别得到三种类型数据的列表'''txt_train = readtxt(txtsavepath,'train')txt_test = readtxt(txtsavepath,'test')txt_val = readtxt(txtsavepath,'val')unreshape_box=[]#用于存储未reshape的框位置信息dic=[]#用于存储最后的文件#labeltxt_path = os.path.join('/home/tjw/Desktop/change/xml_to_json_idl/xml/')#获取所有xml文件名#filenames = os.listdir(labeltxt_path)#for filename in filenames:for filename in txt_train:   img_path=(filename[:-4]+'.png')unreshape_box=get(xml_data_path+filename+'.xml',unreshape_box)#得到关于x,y的数据b=np.array(unreshape_box)#此时得到的是一长串的数字,s数组格式b=b.reshape(-1,4)#四个为一组a=len(b)boxes={"x1":b[0][0],"x2":b[0][1],"y1":b[0][2],"y2":b[0][3]},#这个是元组,reshape好的框位置信息i=1#搭建rectsfor i in range(a):box={"x1":b[i][0],"x2":b[i][1],"y1":b[i][2],"y2":b[i][3]},#元组boxes=boxes+box#元组可直接拼接dic1={"image_path":img_paths+img_path,"rects":boxes}#此时为dict格式dic.append(dic1)#通过list的append操作进行存储#print(dic)#makejson(dic,save_path)#根据dic创建json文件#obj=json.dumps(dic)#print(obj)

关于对象标注文件的转换(xml转json)相关推荐

  1. json文件批量转换xml

    在参加比赛时,官方给出的标记文件是json格式,自己编写代码使其转换为xml格式.使用的是Python 标准库之 xml.etree.ElementTree. 官方给出的格式: 转换代码如下: imp ...

  2. xStream完美转换XML、JSON

    xStream框架 xStream可以轻易的将Java对象和xml文档相互转换,而且可以修改某个特定的属性和节点名称,而且也支持json的转换: 前面有介绍过json-lib这个框架,在线博文:htt ...

  3. Yolo v5的txt标注文件转为coco格式的json标注文件

    社区上将coco数据集格式的json标注文件转为yolo的txt格式的文章较多,但是如何将txt转为json博主并没有发现.这篇文章就给大家提供一个很方便的小脚本,实现这个功能. 需要注意的是,如果直 ...

  4. xStream转换XML、JSON

    一. 简介 xStream可以很容易实现Java对象和xml文档互相转换, 可以修改某个特定的属性和节点名称,xStream提供annotation注解, 可以在JavaBean中完成对xml节点和属 ...

  5. 将所有单个json标注文件合并成一个总的json标注文件(COCO数据集格式)

    import sys import os import json from PIL import Image from tqdm import tqdm from itertools import c ...

  6. XML,Object,Json分析转换Xstream采用

    XML,Object,Json转换之浅析Xstream的使用 请尊重他人的劳动成果,转载请注明出处:XML,Object,Json转换之浅析Xstream的使用 XStream的是一个简单的库.主要用 ...

  7. 将VOC格式标注文件转换为Yolo格式

    这篇文章主要参考博客中的代码,对原博客VOC格式数据集转yolo格式代码进行一定修改.添加注释,此外还在后面添加了我自己写的一段关于对转换后的图片和标注文件进行整理的脚本代码. 关于数据集在Yolo格 ...

  8. 将Yolo格式标注文件转换为VOC格式

    这篇文章主要参考博客Yolo标准数据集格式转Voc数据集中的代码,对原博客代码进行一定修改.添加注释,此外还在后面添加了我自己写的一段关于对转换后的标注文件进行整理的脚本代码. Yolo标注的格式与V ...

  9. xml与json互相转换

    import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson ...

最新文章

  1. kettle mysql 配置_Kettle数据库配置抽离
  2. UVA 141 The Spot Game
  3. 【c++面向对象编程】工资管理系统
  4. unity自发光透明shader
  5. linux技术理解,技术|理解 Linux 链接(二)
  6. 什么叫优雅降级和渐进增强
  7. linux硬件抽象层框图,理解和使用Linux的硬件抽象层HAL.docx
  8. mac mail 删除邮件服务器,如何从Mac OS X中的邮件中删除所有电子邮件 | MOS86
  9. hiho一下 第173周
  10. linux系统移植和根文件系统制作
  11. Xcode在 release 模式下断点调试
  12. java常见面试考点(九):SSM面试题
  13. <论文阅读> M2BEV Multi-Camera Joint 3D Detection and Segmentation with Unified Bird’s-Eye View Represen
  14. 记一下chrome浏览器被毒霸域名劫持解决方案
  15. Laravel学习记录--数据填充
  16. 微信如何群发消息给好友和群:一键群发
  17. HBase常用过滤器
  18. C语言:数组排序(插入法排序)
  19. 基于OpenCV的单目相机标定与三维定位
  20. matlab 求矩阵程序设计,MATLAB程序设计教程(2)—MATLAB矩阵及其运算(3)

热门文章

  1. Eclipse配置gradle插件教程
  2. vant-ui 使用
  3. 计算机无法正常进入系统,式电脑开机提示Error 1962无法正常开机进入系统怎么办?...
  4. adb shell dumpsys package
  5. 三国志2霸王的大陆 攻防计算
  6. 基于STM32F469I-DISCOVERY的触屏版中国象棋
  7. PCI-E x1/x4/x8/x16四种插槽区别是什么
  8. 从一座瑞典风机的倒塌看VDI2230用于螺栓连接精确计算的重要性
  9. python 绘图线条颜色
  10. c语言单片机与plc通讯,用c51实现单片机和plc之间通讯实例