NYUv2生成边界GT(2)

news2025/7/22 22:57:29

由NYUv2生成边界GT(1)可知,我们每张GT图片都生成一个对应的.bin文件。存放在D:\datasets\data_proc\train\edge_labels_40文件夹下,下一步我们需要生成.png文件,即需要使用convert_bin_to_png.py。

# -*- coding: utf-8 -*-
import numpy as np
import torch
from PIL import Image
import cv2
import os
import shutil
import imageio
imsave = imageio.imsave

def convert_num_to_bitfield(label_data, h, w,root_folder,name,cls_num=40):
    label_list = list(label_data)
    all_bit_tensor_list = []
    for n in label_list:  # Iterate in each pixel
        # Convert a value to binary format in each bit.
        bitfield = np.asarray([int(digit) for digit in bin(n)[2:]])#用二进制表示n,从2开始因为前两个是符号0b
        bit_tensor = torch.from_numpy(bitfield)
        actual_len = bit_tensor.size()[0]
        padded_bit_tensor = torch.cat((torch.zeros(cls_num - actual_len).byte(), bit_tensor.byte()), dim=0)
        all_bit_tensor_list.append(padded_bit_tensor)
    y = list(set(all_bit_tensor_list))
    all_bit_tensor_list = torch.stack(all_bit_tensor_list).view(h, w, cls_num)#(307200,40)
    y_y = torch.unique(all_bit_tensor_list)#(0,1)

    label_png_dir = os.path.join("label_img",name)  # eg: label_img/label_img_test_2008_002687
    pixel = torch.unique(all_bit_tensor_list)
    print("label_png_dir:{0}".format(label_png_dir))
    print(pixel)
    if not os.path.exists(os.path.join(root_folder, label_png_dir)):
        os.makedirs(os.path.join(root_folder, label_png_dir))
    for cls_idx in range(cls_num):
        imsave(os.path.join(root_folder, label_png_dir, str(cls_idx) + '.png'),
               all_bit_tensor_list[:, :, cls_idx].numpy())

if __name__ == "__main__":
    f = open('D:/datasets/data_orig/train.txt', 'r')
    lines = f.readlines()
    edge_label_root_folder = 'D:/datasets/data_proc/train/edge_labels_40'
    rgb_root_folder = 'D:/datasets/data_proc/train/rgb'
    root_folder = 'D:/datasets/data_proc/train'
    cnt = 0
    for ori_line in lines:#'0003\n'
        cnt += 1
        line = ori_line.splitlines()
        name = line[0]

        img_path = os.path.join(rgb_root_folder, name + '.png')
        img = Image.open(img_path).convert('RGB')
        w, h = img.size
        label_path = os.path.join(edge_label_root_folder, name + '.bin')
        label_data = np.fromfile(label_path, dtype=np.uint64)
        convert_num_to_bitfield(label_data, h, w,root_folder,name,cls_num=40)

    # w, h = 640,480
    # label_path = os.path.join(edge_label_root_folder,'0003.bin')
    # label_data = np.fromfile(label_path, dtype=np.uint64)
    # convert_num_to_bitfield(label_data, h, w,root_folder)

1:首先从if name == “main”:开始,打开train.txt,其实生成的.bin文件有自己的txt文件,但是我觉得和rgb的train.txt一样,就直接使用train.txt是一样的。
2:读取每一行的内容,在python中使用f.readlines()读取,则lines 里面共有七百多个数值对应七百多张训练图片。
3:找到edge_label_root_folder ,rgb_root_folder ,分别存放的边界gt,.bin文件,rgb,.png文件。这里给出root_folder是因为需要在root_folder 文件夹下生成一个新的文件夹label_img来存放由.bin转换为.png的边界GT。
4:遍历 lines ,同时添加一个计数的,注这里因为lines会产生’0003\n’,需要将\n去掉,所以添加了.splitlines(),然后会生成一个[‘0003’],需要通过索引将’0003’取出来。
5:我们有路径,也有路径下对应的name,就可以找到对应的rgb文件下的.png文件。打开,转换为RGB,并获得对应.png文件的大小。
6:接着我们获得edge_label_root_folder文件下对应的.bin文件。
7:通过np.fromfile载入二进制文件,注:这里dtype=np.uint64,只有uint64可以存放下2的40次方这么大的数据,原来SBD数据集只有20个类别,所以dtype=np.uint32是可以的,但是NYUv2有40个类别,采用dtype=np.uint64会导致错误,生成的通道该有的边缘没有,最后一个通道甚至包含了全部的类别,上个星期没发现这个错误,导致生成的边界是错误的,被老师发现狠狠地批评了一顿。
载入文件后,输出的是(480x640,1)的array。
8:接着将标签数据进行转换:
8.1:将label转换为一个list,然后逐个进行处理。将n转换为二进制,然后取第二位之后的数字,因为数字转换为二进制后,前两个数字是0b。
8.2:将其转换为tensor,然后获取数据的长度。
8.3:生成一个(cls_num - actual_len)大小的0矩阵,和经过tensor转换后的二进制长度拼接在一起。这个地方就关系到之前的2的num_class次方,通过对不同的像素,即不同的类进行‘编码’,在这里对编码的数字进行解码。这样生成的数据就为当前像素值的二进制编码,从左往右第一个1开始,前面全部补0,直到总共40位。
8.4:然后将concat之后的数字堆叠在一起,每一个是长度为40,共有480x640个。然后转换为(h, w, cls_num)大小。每一个像素都有40位,那么reshape之后,假设第一个像素40位中位于第几位等于1,就转换为40个通道中位于第几个通道为1。即为该通道对应的类别。
在这里插入图片描述
8.5:接着执行label_png_dir,生成root_folder/label_png_dir路径。
8.6:逐个通道进行遍历,将每个通道保存到root_folder/label_png_dir路径下,执行40次。
在这里插入图片描述
9:对每一个通道可视化:以0003.bin转换后为例:
第39个通道
第0个通道
在这里插入图片描述

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

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

相关文章

【Azure 架构师学习笔记】-Azure Storage Account(1)- Queue Storage

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Storage Account】系列。 接上文 【Azure 架构师学习笔记】-Azure Storage Account(1)-类型简介 前言 Azure Storage Queues 是一个专门用来处理基于云环境队列的Azure 服务。每个队列都维护着…

Netty之ChannelHandler初解

目录 目标 Netty版本 Netty官方API 实战 Netty服务器 入栈ChannelHandler读入数据顺序案例 出栈ChannelHandler写出数据顺序案例 ChannelHandlerContext和NioSocketChannel写入数据时有什么不同 Pipeline添加多个ChannelHandler有什么意义 目标 掌握ChannelHandler基…

海康工业相机使用教程

工业相机使用一、硬件连接1、准备材料2、相机供电(1)区分电源适配器正负极(2)连接相机电源线缆(3)连接完成后,相机蓝色灯常亮则成功3、软件连接(1)MVS客户端下载地址&…

你真的会在阳光下拍照片么?

你好,我是小麥。 上节课我们讲了如何通过影子判断光的质量,也就是光的软硬,这节课我们来接着说一说光的方向和环境光的实际运用。 虽然在现实生活里,我们可能没有从软硬的角度观察过光线,但我相信你在拍照片的时候一…

第九章:Java集合

第九章:Java集合 9.1:Java集合框架概述 数组、集合都是对多个数据进行存储(内存层面,不涉及持久化)操作的结构,简称Java容器。 数组存储多个数据方面的特点 一旦初始化以后,其长度就确定了。数组一旦定义好&#xff…

计算机操作系统:实验三存储管理程序设计

一、目的和要求 目的 存储管理的主要功能之一是合理地分配主存空间。请求页式管理是一种常用的虚拟存储管理技术。 本实验的目的是通过请求页式存储管理中页面置换算法的模拟设计,来了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。 要求…

数字工厂管理系统的应用案例

数字工厂管理系统是制造企业应用数字化工厂技术实现研发设计数字化、生产准备数字化、 生产制造数字化、运营管理数字化和营销服务数字化的重要手段,即通过应用数字相关技术提升产品全生命周期数字化水平,从而提升企业经营的可靠性、安全性和经济性。 任…

C++回顾(十)—— 多态

10.1 问题引出 10.1.1 如果子类定义了与父类中原型相同的函数会发生什么? 函数重写 在子类中定义与父类中原型相同的函数,函数重写只发生在父类与子类之间 重载与重写区别: (1)重载:同一个作用域&#xf…

A、力扣刷题——数组

提示:这是力扣上数组类题目里的简单题,按顺序做下来的23道题。 第一题: 关键词:原地修改,有序数组 我的答案: (for循环) (1)有序数组 class Solution{pu…

平安大视野前瞻2023投资策略:资产格局“危中有机”,关注科技、绿色、安全领域

3月3日,平安私人银行全新云端沙龙《平安大视野》第一站在杭州举办,活动聚焦2023年宏观经济展望,邀请中国首席经济学家论坛理事、鹏扬基金首席经济学家陈洪斌,平安私人银行首席策略分析师彭伟伟就国内外宏观经济变化和资产配置策略…

干货系列:高通量测序后的下游实验验证方法——m6A RNA甲基化篇|易基因

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。此前,我们分享了m6A RNA甲基化研究的数据挖掘思路(点击查看详情),进而筛选出m6A修饰目标基因。做完MeRIP-seq测序后,如果需要对分…

【JavaWeb】Servlet详解

文章目录1. 前置知识2.servlet生命周期2.1 默认情况下,服务器启动时,servlet对象并没有被创建2.2 用户执行一次请求2.3用户执行第二次请求2.4 3,4,5,6....次请求2.5 关闭服务器3.servlet方法解析4.适配器模式改造servlet4.1不使用servlet模式4.2使用适配…

【微服务】(十五)—— Seata 的部署和集成

文章目录1. 部署Seata的tc-server1.1 下载Seata1.2 解压1.3 修改配置1.4 在nacos添加配置1.5 创建数据库表1.6 启动TC服务2. 微服务集成seata2.1 引入依赖2.2 修改配置文件3. TC服务的高可用和异地容灾3.1 模拟异地容灾的TC集群3.2 将事务组映射配置到nacos3.3 微服务读取nacos…

软测入门(八)Selenium项目实战

自动化项目实战 项目计划设计 测试计划测试范围设定目标规划活动 实际项目中,需要根据项目的实际情况创建自己的项目计划,没有固定的格式和内容要求: 项目简介自动化实现网上购票项目启动前置条件1.购票网站工作正常 2.自动化测试环境准备…

JAVA的16 个实用代码优化小技巧

一、类成员与方法的可见性最小化 举例:如果是一个private的方法,想删除就删除。 如果一个public的service方法,或者一个public的成员变量,删除一下,不得思考很多。 二、使用位移操作替代乘除法 计算机是使用二进制…

垒骰子(爆搜/DP)

动态规划方格取数垒骰子方格取数 题目描述 设有 NNN \times NNN 的方格图 (N≤9)(N \le 9)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 000。如下图所示(见样例): A0 0 0 0 0 0 0 00 0 13 0 …

ChatGPT助力校招----面试问题分享(一)

1 ChatGPT每日一题:期望薪资是多少 问题:面试官问期望薪资是多少,如何回答 ChatGPT:当面试官问及期望薪资时,以下是一些建议的回答方法: 1、调查市场行情:在回答之前,可以先调查一…

Python基础之while循环

一:while语法 while 条件:代码1 代码2 代码3....while的运行步骤: 步骤1:如果条件为真,那么依次执行:代码1、代码2、代码3、...... 步骤2:执行完毕后再次判断条件,如果条件为True则再次执行&#…

通用缓存存储设计实践

目录介绍 01.整体概述说明 1.1 项目背景介绍1.2 遇到问题记录1.3 基础概念介绍1.4 设计目标1.5 产生收益分析 02.市面存储方案 2.1 缓存存储有哪些2.2 缓存策略有哪些2.3 常见存储方案2.4 市面存储方案说明2.5 存储方案的不足 03.存储方案原理 3.1 Sp存储原理分析3.2 MMKV存储…

【数据挖掘】4、关联分析:Apriori、FP-Growth 算法、买面包是否也爱买啤酒

文章目录一、概念1.1 支持度1.2 置信度1.3 提升度二、Apriori 算法2.1 频繁项集的定义2.2 算法工作原理三、FP-Growth 算法3.1 算法步骤3.1.1 创建项头表3.1.2 构造 FP 树3.1.3 通过 FP 树挖掘频繁项集3.2 手动推导3.2.1 计算单一项的频率(支持度计数)3.…