首页 > 其他分享 >Voc2Json--挑选voc中的类别生成json文件

Voc2Json--挑选voc中的类别生成json文件

时间:2023-12-26 17:34:22浏览次数:23  
标签:xml voc -- data json path os dir

 

 

import argparse
import json ,shutil
import os,sys
import xml.etree.ElementTree as ET


parent = os.path.dirname(os.path.realpath(__file__))
gadent = os.path.dirname(parent)
sys.path.insert(0,gadent)
sys.path.append(gadent)

from utils.tool import listDir,draw_res



json_base_info = {'version': '4.5.6',
                'flags': {},
                'shapes': [],
                "imagePath": "0001250.jpg",
                "imageData": "null",
                "imageHeight": 720,
                "imageWidth": 1280
                }


def voc2Json(voc_base_dir,save_path_root,classes,prefix):

    ann_dir = os.path.abspath(os.path.join(voc_base_dir,"Annotations"))
    img_dir = os.path.abspath(os.path.join(voc_base_dir,"JPEGImages"))

    xml_list =[]
    listDir(ann_dir,xml_list,"xml")

    for xml_path in xml_list:

        print("xml path : {}".format(xml_path))

        basename_xml = os.path.basename(xml_path)
        basename_jpg = basename_xml.replace("xml","jpg")
        img_path = os.path.abspath(os.path.join(img_dir,basename_jpg))
        if not os.path.exists(img_path):
            continue

        tree = ET.parse(xml_path)
        root = tree.getroot()
        size = root.find('size')
        width = int(size.find('width').text)
        height = int(size.find('height').text)

        json_rects = []
        for obj in root.iter('object'):
            difficult = obj.find('difficult').text
            cls = obj.find('name').text
            if cls not in classes or int(difficult) == 1:
                continue
            cls_id = classes.index(cls)
            xmlbox = obj.find('bndbox')
            xmin,ymin,xmax,ymax = float(xmlbox.find('xmin').text),float(xmlbox.find('ymin').text),float(xmlbox.find('xmax').text) ,float(xmlbox.find('ymax').text)


            rect_dict_person = {"label": "person",
                                "points": [[0, 0], [0, 0]],
                                "group_id": "null",
                                "shape_type": "rectangle",
                                "flags": {}
                                }

            min_x, min_y, max_x, max_y = int(xmin), int(ymin), int(xmax), int(ymax)
            rect_dict_person["points"][0][0] = max(min_x, 0)
            rect_dict_person["points"][0][1] = max(int(ymin), 0)
            rect_dict_person["points"][1][0] = min(max_x, width)
            rect_dict_person["points"][1][1] = min(max_y, height)
            rect_dict_person["group_id"] = None

            json_rects.append(rect_dict_person)



        if len(json_rects) > 0:
            # 第二步创建json文件
            jsondata = json.dumps(json_base_info, indent=4, separators=(',', ': '))
            new_basename_jpg = prefix + basename_jpg

            save_path = os.path.abspath(os.path.join(save_path_root, new_basename_jpg))
            json_data_path = save_path.replace('jpg', 'json')

            f = open(json_data_path, 'w')
            f.write(jsondata)
            f.close()
            # 修正其中的内容
            with open(json_data_path, "r", encoding='utf-8') as jsonFile:
                json_data = json.load(jsonFile)

            json_data['imagePath'] = new_basename_jpg
            json_data['imageData'] = None
            json_data['imageHeight'] = height
            json_data['imageWidth'] = width


            json_data['shapes'] = json_rects
            with open(json_data_path, "w") as jsonFile:
                json.dump(json_data, jsonFile, ensure_ascii=False, indent=4, separators=(',', ': '))
                jsonFile.close()
            shutil.copy(img_path, save_path)




class Voc2Json():
    def __init__(self,args):
        self.voc_base_dir = args.VOC_base_dir
        self.save_path = args.save_path
        self.classes =  args.classes
        self.prefix = args.prefix

    def make(self):
        voc2Json(self.voc_base_dir,self.save_path,self.classes,self.prefix)



parser = argparse.ArgumentParser(description='VOC Datasets Convert json dataset')
parser.add_argument('--VOC_base_dir',default=None,type=str,help='VOC数据集的基础路径')
parser.add_argument('--save_path',default=None,type=str,help="转换后的数据集保存路径")
parser.add_argument('--classes',default=['person'],type=list,help="需要从VOC提取的数据集的类别标签")
parser.add_argument('--prefix',default="voc2012_",type=str,help="新的数据集前缀")



if __name__ =='__main__':
    args =parser.parse_args()
    args.VOC_base_dir = "E:/datasets/public_datasets/VOC/VOCtrainval_11-May-2012/VOCdevkit/VOC2012"
    args.save_path = "E:/datasets/public_datasets/person_voc12_src_size_box"

    print("start !!!")
    vt = Voc2Json(args)
    vt.make()
    print("Done !!!")

  

标签:xml,voc,--,data,json,path,os,dir
From: https://www.cnblogs.com/shuimuqingyang/p/17928885.html

相关文章

  • jQuery功能强大的图片查看器插件 viewer
    http://www.htmleaf.com/jQuery/Image-Effects/201509032517.html 如果想知道用户点击的是第几张图片,可使用HTML5的window.postMessage实现通信,修改viewer.js: 然后在html中接收事件: ......
  • T397291 【模板】拓扑排序(加强版)
    原题链接思路找到所有入度为零的点,然后消除其子节点的入度,再把入度为零的点塞入队列中为什么可以这么做呢?一个点能弹出队列,其父节点一定比他先入队,以此类推。。代码#include<bits/stdc++.h>usingnamespacestd;vector<int>G[100005];intin[100005]={0};intmain(){......
  • git 提交后中文字符会乱码
    转载自:https://blog.csdn.net/yilongchuan/article/details/92833077最近发生那了一件怪事,当然菜鸡经常碰见怪事本来一个.properties文件在idea里面commit的时候看了一下diff,没发现异常,但是提交到gitlab上发现.properties的所有中文字符都变成了\xxxx的ascii的编码。 然......
  • 按不同列排序
    问题:数据源三列,返回第一、二列按数据源第二列降序排序显示第一、二列; 第三、四列按数据源第三列降序排序显示第一、三列。函数公式解决:=CHOOSECOLS(SORT($A2:$C27,COLUMN(D1)/2,-1),IF(MOD(COLUMN(A1),2),1,COLUMN(C1)/2))Sort部分第一参数是数据源,第三参数-1表示降序排序。第二参......
  • 非动态数组版本下的筛选
    问题:一对多查找(筛选)的结果需要横向排列,但是表格暂时不支持动态数组。右拉下拉公式解决:{=IFERROR(INDEX(FILTER($E:$E,$D:$D=$G2),COLUMN(A1)),"")}公式中的Filter部分筛选出满总D列中等产于G2对应E列的内容,其结果是多个单元格组成的数组。使用Index提取数组中的内容,第二参数用Colum......
  • 电子商务
     《Excel商务数据分析》1.《电子商务商数据运营与管理》,零一,2020.8,人民邮电出版社2.《Power BI 电商数据分析实战》[M]. 零一 聂健华韩要宾. 电子工业出版社.2018 跨境电商理论与务实1伍蓓 《跨境电商理论与实务》2陈战胜《跨境电子商务多平台操作实务》  ......
  • P1339 [USACO09OCT] Heat Wave G 最短路入门题 Dijkstra/SPFA/Dijkstra+优先队列优化
    目录朴素的Dijkstra算法SPFA算法Dijkstra+优先队列优化题目链接:https://www.luogu.com.cn/problem/P1339题目大意:无向图有单源最短路。朴素的Dijkstra算法时间复杂度\(O(n^2)\)。#include<bits/stdc++.h>usingnamespacestd;constintmaxn=2505;structEdge......
  • M1 Docker 部署rocketmq
    1、克隆镜像arm64镜像代码编译镜像,docker直接安装会报错所以选择编译gitclonehttps://github.com/apache/rocketmq-docker.git  cdrocketmq-docker #注意这里centos固定不要改镜像版本可以改shbuild-image.sh4.8.0centos 第二步:拉取mqconsole镜像: candice0630/rocket......
  • R语言大学城咖啡店消费问卷调查报告:信度分析、主成分分析可视化
    本次调查旨在了解文汇路咖啡店的市场状况,以便为学校周边咖啡店的经营发展提供积极的引导意义。我们通过问卷调查的方式,收集了大量的数据,通过r软件对数据进行了基本情况分析、信度分析、问卷调查数据可视化分析以及主成分分析,以全面了解文汇路咖啡店的市场情况。咖啡店调查问卷我们......
  • SpringBoot实现热部署详解
    前言SpringBoot热部署是一种开发时极为有用的功能,它能够让开发人员在代码修改后无需手动重启应用程序就能立即看到变化的效果。以下是使用SpringBoot热部署的几个主要原因:1.提高开发效率热部署使开发人员能够更快地验证和测试他们的代码更改。无需手动重启应用程序,每次修改后只需......