json文件在faster_rcnn中从测试到训练 可行性

news2024/10/6 14:32:46

1.确认任务

经过mydataset文件处理后  - >  在train_res50_fpn文件内应用 

# load train data set
# VOCdevkit -> VOC2012 -> ImageSets -> Main -> train.txt
train_dataset = VOCDataSet(VOC_root, "2012", data_transform["train"], "train.txt")
train_sampler = None

 在经过mydataset处理后,框出各项位置。

2.原mydataset内容

主要要做的就是在每个xml文件内提取出 类别+类别所在区域(xmin xmax ymin ymax)

2.1 split_data.py分类出训练集 and 验证集

得到结果:

2.2 构造函数 def_init

索引每一个xml文件

xml_list = 每一个训练集中的xml文件集合

        assert year in ["2007", "2012"], "year must be in ['2007', '2012']"
        # 增加容错能力
        if "VOCdevkit" in voc_root:
            self.root = os.path.join(voc_root, f"VOC{year}")
        else:
            self.root = os.path.join(voc_root, "VOCdevkit", f"VOC{year}")
        self.img_root = os.path.join(self.root, "JPEGImages")
        self.annotations_root = os.path.join(self.root, "Annotations")

        # read train.txt or val.txt file
        txt_path = os.path.join(self.root, "ImageSets", "Main", txt_name)
        assert os.path.exists(txt_path), "not found {} file.".format(txt_name)

        with open(txt_path) as read:
            xml_list = [os.path.join(self.annotations_root, line.strip() + ".xml")
                        for line in read.readlines() if len(line.strip()) > 0]

        self.xml_list = []

 按行索引classes文件

class_dict 匹配类别对应的序号

        # read class_indict
        json_file = './pascal_voc_classes.json'
        assert os.path.exists(json_file), "{} file not exist.".format(json_file)
        with open(json_file, 'r') as f:
            self.class_dict = json.load(f)

 parse_xml_to_dict方法 把每一个xml文件检测到的类别提取出来<object>

        xml = etree.fromstring(xml_str)
        data = self.parse_xml_to_dict(xml)["annotation"]

提取每个类别的各项信息

位置信息放入boxes中

        boxes = []
        labels = []
        iscrowd = []
        assert "object" in data, "{} lack of object information.".format(xml_path)
        for obj in data["object"]:
            xmin = float(obj["bndbox"]["xmin"])
            xmax = float(obj["bndbox"]["xmax"])
            ymin = float(obj["bndbox"]["ymin"])
            ymax = float(obj["bndbox"]["ymax"])

        # 进一步检查数据,有的标注信息中可能有w或h为0的情况,这样的数据会导致计算回归loss为nan
            if xmax <= xmin or ymax <= ymin:
                print("Warning: in '{}' xml, there are some bbox w/h <=0".format(xml_path))
                continue
            
            boxes.append([xmin, ymin, xmax, ymax])
            labels.append(self.class_dict[obj["name"]])
            if "difficult" in obj:
                iscrowd.append(int(obj["difficult"]))
            else:
                iscrowd.append(0)

转为tensor 

        # convert everything into a torch.Tensor
        boxes = torch.as_tensor(boxes, dtype=torch.float32)
        labels = torch.as_tensor(labels, dtype=torch.int64)
        iscrowd = torch.as_tensor(iscrowd, dtype=torch.int64)
        image_id = torch.tensor([idx])
        area = (boxes[:, 3] - boxes[:, 1]) * (boxes[:, 2] - boxes[:, 0])

        target = {}
        target["boxes"] = boxes
        target["labels"] = labels
        target["image_id"] = image_id
        target["area"] = area
        target["iscrowd"] = iscrowd

        if self.transforms is not None:
            image, target = self.transforms(image, target)

        return image, target

提取图像的高宽

    def get_height_and_width(self, idx):
        # read xml
        xml_path = self.xml_list[idx]
        with open(xml_path) as fid:
            xml_str = fid.read()
        xml = etree.fromstring(xml_str)
        data = self.parse_xml_to_dict(xml)["annotation"]
        data_height = int(data["size"]["height"])
        data_width = int(data["size"]["width"])
        return data_height, data_width

被调用过的函数 --- 将xml解析为字典模式 

    def parse_xml_to_dict(self, xml):
        """
        将xml文件解析成字典形式,参考tensorflow的recursive_parse_xml_to_dict
        Args:
            xml: xml tree obtained by parsing XML file contents using lxml.etree

        Returns:
            Python dictionary holding XML contents.
        """

        if len(xml) == 0:  # 遍历到底层,直接返回tag对应的信息
            return {xml.tag: xml.text}

        result = {}
        for child in xml:
            child_result = self.parse_xml_to_dict(child)  # 递归遍历标签信息
            if child.tag != 'object':
                result[child.tag] = child_result[child.tag]
            else:
                if child.tag not in result:  # 因为object可能有多个,所以需要放入列表里
                    result[child.tag] = []
                result[child.tag].append(child_result[child.tag])
        return {xml.tag: result}

3.关于json文件

如何在Python中优雅地处理JSON文件 - 知乎

JSON结构看起来和Python中的字典非常类似。需要注意的是,JSON格式通常是由key:<value> 结对组成,其中key是字符串形式,value是字符串、数字、布尔值、数组、对象或null。

为了更直观的进行说明,在下图中我们以蓝色突出显示了所有的key,同时以橙色突出显示了所有的value。

请注意,以下每组key/value间均使用逗号进行区分。

首先我们需要导入 json库, 接着我们使用open函数来读取JSON文件,最后利用json.load()函数将JSON字符串转化为Python字典形式.

4.提取出相应json文件的每个类别以及对应区域

注:中文的时候encoding=‘gbk’

import json
import torch
with open('test.json',encoding="gbk") as f:
    json_dict = json.load(f)

#print(type(json_dict))
data = json_dict['shapes']
for data_ in data:
    #print(data_)
    #print(data[0]['label'])
    #print(data[0]['points'])

    label=data_['label']
    xmin=float(data_['points'][0][0])
    xmax=float(data_['points'][1][0])
    ymin=float(data_['points'][0][1])
    ymax=float(data_['points'][1][1])

    print(label , xmin , xmax , ymin , ymax)

4.不支持png格式预测 

使用了几乎一样的

jpg文件基本都没问题

png文件没有成功的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/333568.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 异步: 使用和查询任务(8)

任务是异步程序的货币。在本节中&#xff0c;我们将仔细研究如何在我们的程序中与它们交互。 1. 任务生命周期 异步任务具有生命周期。首先&#xff0c;任务是从协程创建的。然后安排在事件循环中独立执行。在某个时候&#xff0c;它会运行。 在运行时它可能会被挂起&#xff0…

舆情监测方案主体需求,TOOM舆情监测预警应对处置方案

舆情监测预警是一种通过预先设定的告警机制&#xff0c;在发生重要事件或异常情况时及时通知相关人员的舆情监测方式。它旨在帮助企业和组织及时了解舆情变化&#xff0c;并采取必要的应对措施&#xff0c;舆情监测方案主体需求&#xff0c;TOOM舆情监测预警应对处置方案。 一…

在Unity中管理材质

Shader和Material的关系 Shader能够设置游戏物体的颜色或者能够通过材质来配置颜色。实际上&#xff0c;一个shader能够让许多物体看起来像是完全不同的物质。 Shader和材质作为一个整体工作&#xff1a;Shader定义了表面看起来可以像哪些东西&#xff0c;材质让表面真正看起来…

【手写 Vuex 源码】第一篇 - Vuex 的基本使用

一&#xff0c;前言 本篇开始&#xff0c;进入 vuex 源码学习&#xff0c;本篇主要介绍一下内容&#xff1a; 创建 vuex 源码项目&#xff1b;介绍 vuex 的基本使用&#xff1b; 二&#xff0c;创建 vuex 源码项目 1&#xff0c;使用 vue-cli 创建 vue2.x 脚手架 vue creat…

shell脚本(语法)

一、什么是shell脚本 1.1、shell 的两层含义&#xff1a;既是一种应用程序,又是一种程序设计语言 1.1.1、shell是一种应用程序 交互式地解释、执行用户输入的命令&#xff0c;将用户的操作翻译成机器可以识别的语言&#xff0c;完成相应功能称之为 shell 命令解析器。 shell 是…

阳离子交换树脂排钾,选择性吸附钾离子

Tulsimer T-42特级凝胶型强酸性阳离子交换树脂&#xff0c;适用于超纯水系统的混床用阳离子交换树脂 Tulsimer T-42是特级强酸型离子交换树脂&#xff0c;氢 H/钠 Na阳离子交换树脂&#xff0c; 是一款有较的交换容量 ,并同时拥有物理及化学稳定品质。可应用于汽电共生发电厂冷…

excel操作技巧:聊聊关于打印的一些事儿

在之前的学习中&#xff0c;小编给小伙伴们带来了许多关于Excel操作的小技巧&#xff0c;不过最近很多小伙伴在打印上又犯了难题&#xff0c;倒在了最后一步上&#xff0c;实在是亏得很。今天小编就来给大家讲讲打印的那些难事儿&#xff01;难题一&#xff1a; 多列数据打印不…

【Unity】Tomcat 部署项目(3种方式)

一、将Unity WebGL包丢进webapps这是最简单粗暴的方式&#xff1a;将Unity WebGL包丢进tomcat/webapps目录即可。无需修改任何配置文件即可完成部署。使用tomcat10与Unity Pong Game包来做测试。①启动tomcat②将Unity Pong Game包丢进webapps目录浏览器直接访问&#xff1a;lo…

HTTP和HTTPS协议

HTTP协议 HTTP协议是一种应用层的协议&#xff0c;全称为超文本传输协议。 URL URL值统一资源定位标志&#xff0c;也就是俗称的网址。 协议方案名 http://表示的就是协议方案名&#xff0c;常用的协议有HTTP协议、HTTPS协议、FTP协议等。HTTPS协议是以HTTP协议为基础&#…

java面经汇总

Java基础 什么是字节码&#xff1f; jvm可以理解的代码&#xff08;.class文件&#xff09; Java代码从源代码到运行过程&#xff1a; java代码 -> javac编译器->.class字节码文件 -> 解释器&JIT&#xff08;运行时编译器&#xff09;->机器码 JIT编译器会将热…

球面坐标系下的三重积分

涉及知识点 三重积分球面坐标系点火公式一些常见积分处理手法 球面坐标系定义 球面坐标系由方位角φ\varphiφ、仰角θ\thetaθ和距离rrr构成 直角坐标系(x,y,z)(x,y,z)(x,y,z)到球面坐标系的(r,φ,θ)(r,\varphi,\theta)(r,φ,θ)的转化规则如下&#xff1a; {xrsin⁡φco…

使用Python脚本修改Maya ASCII文件路径方法

以下脚本修改当前项目路径和子文件夹中扩展名为“.ma”的所有文件&#xff0c;这样您就可以轻松地一次编辑所有文件。此脚本搜索特定字符串replace_This变量并将其替换为with_This&#xff0c;您可以使用它更改引用路径、纹理路径等… 话不多说直接上脚本&#xff1a; import…

JavaWeb-JavaScropt入门(二)

目录函数语法传参函数表达式作用域对象使用 字面量 创建对象 [常用]使用 new Object 创建对象使用 构造函数 创建对象函数 语法 function 函数名(形参列表) {函数体return 返回值; }那么有了创建函数&#xff0c;肯定有调用函数&#xff1a; // 函数调用 函数名(实参列表) …

聊一聊,我对DDD的关键理解

作者&#xff1a;闵大为 阿里业务平台解决方案团队 当我们在学习DDD的过程中&#xff0c;感觉学而不得的时候&#xff0c;可能会问&#xff1a;我们还要学么&#xff1f;这的确引人深思。本文基于工作经验&#xff0c;尝试谈谈对DDD的一些理解。 一、序 《阿甘正传》中&#xf…

亚马逊要求UL94防火测试阻燃测试标准及项目

UL94认证是什么&#xff1f;分几个等级?是如何表示各等级?带电的产品上架亚马逊都需要相关的UL报告&#xff0c;需要有ISO 17025资质的实验室出具的测试报告才能正常销售和恢复链接&#xff0c;UL94防火测试则是其中一项。UL94试验共有五种&#xff1a;1.B级的水平燃烧试验2.…

Nginx负载均衡

1、概念 访问量太大&#xff0c;一个 Tomcat 扛不住&#xff0c;所以就搭建 Tomcat 集群。让集群中的多个 Tomcat 服务器实例分担负载。 纵向扩容和横向扩容&#xff1a; 纵向扩容&#xff1a;给单台服务器提升硬件的配置。例如&#xff1a;提升 CPU、增加内存、扩大带宽、扩…

关于华为网络设备操作系统的介绍

1、什么是VRP VRP是华为公司数据通信产品的通用操作系统平台&#xff0c;作为华为公司从低端到核心的全系列路由器、以太网交换机、业务网关等产品的软件核心引擎。 功能&#xff1a;实现统一的用户界面和管理界面、实现控制平面功能&#xff0c;并定义转发平面接口规范、实现…

量子比特大突破!原子薄材料成为“救世主”

&#xff08;图片来源&#xff1a;网络&#xff09;量子计算是一项极其复杂的技术&#xff0c;现阶段的一些挑战正严重阻碍着它的发展&#xff0c;尤其是量子比特的小型化和质量问题。IBM计划在2023年实现具有1121个超导量子比特的处理器。以目前的技术手段&#xff0c;要达到这…

大数据框架之Hadoop:入门(二)从Hadoop框架讨论大数据生态

第2章 从Hadoop框架讨论大数据生态 2.1 Hadoop是什么 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。主要解决&#xff0c;海量数据的存储和海量数据的分析计算问题。广义上来说&#xff0c;Hadoop通常是指一个更广泛的概念-Hadoop生态圈。 2.2 Hadoop发展历史 1&…

引入汇丰完成C+轮融资,镁信健康有何资本“魅力”?

近日&#xff0c;上海镁信健康科技股份有限公司&#xff08;下称“镁信健康”&#xff09;宣布完成C轮融资&#xff0c;引入汇丰集团作为战略投资者。镁信健康近两年是资本市场货真价实的“香饽饽”&#xff0c;2021年&#xff0c;完成B轮和C轮两轮融资&#xff0c;融资金额合计…