【DETR系列目标检测算法代码精讲】01 DETR算法03 Dataloader代码精讲

2024-04-02 02:04

本文主要是介绍【DETR系列目标检测算法代码精讲】01 DETR算法03 Dataloader代码精讲,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

与一般的Dataloader的区别在于我们对图像进行了随机裁剪,需要进行额外的操作才能将其打包到dataloader里面

在这里插入图片描述
这一段的代码如下:

    if args.distributed:sampler_train = DistributedSampler(dataset_train)sampler_val = DistributedSampler(dataset_val, shuffle=False)else:sampler_train = torch.utils.data.RandomSampler(dataset_train)sampler_val = torch.utils.data.SequentialSampler(dataset_val)batch_sampler_train = torch.utils.data.BatchSampler(sampler_train, args.batch_size, drop_last=True)data_loader_train = DataLoader(dataset_train,batch_sampler=batch_sampler_train,collate_fn=utils.collate_fn,# num_workers=args.num_workers)data_loader_val = DataLoader(dataset_val,args.batch_size,sampler=sampler_val,drop_last=False,collate_fn=utils.collate_fn,# num_workers=args.num_workers)

对于训练数据集,使用RandowSampler类进行随机采样
对于验证数据集,使用SequentialSampler进行顺序采样

采样以后,使用BatchSampler打包成batch
然后再使用Dataloader

Dataloader中有个函数
collate_fn

在这里插入图片描述
这个函数又调用了一个函数nested_tensor_from_tensor_list
这个函数重新定义了我们输入数据的格式

在这里插入图片描述

默认的batch为2,我们输入的就是包含了两个元素的list,其中每个元素都是我们从dataset的__getitem__方法获得的输出

然后通过zip函数进行解析
在这里插入图片描述
可以看到之前的形式是一个元素中是img+target
现在变成了一个元素里面都是img,另一个元素里面都是target
batch[0] = nested_tensor_from_tensor_list(batch[0])
然后通过索引0取出图像部分

传入到nested_tensor_from_tensor_list方法中
这个方法的全部代码如下

def nested_tensor_from_tensor_list(tensor_list: List[Tensor]):# TODO make this more generalif tensor_list[0].ndim == 3:if torchvision._is_tracing():# nested_tensor_from_tensor_list() does not export well to ONNX# call _onnx_nested_tensor_from_tensor_list() insteadreturn _onnx_nested_tensor_from_tensor_list(tensor_list)# TODO make it support different-sized imagesmax_size = _max_by_axis([list(img.shape) for img in tensor_list])batch_shape = [len(tensor_list)] + max_sizeb, c, h, w = batch_shapedtype = tensor_list[0].dtypedevice = tensor_list[0].devicetensor = torch.zeros(batch_shape, dtype=dtype, device=device)mask = torch.ones((b, h, w), dtype=torch.bool, device=device)for img, pad_img, m in zip(tensor_list, tensor, mask):pad_img[: img.shape[0], : img.shape[1], : img.shape[2]].copy_(img)m[: img.shape[1], :img.shape[2]] = Falseelse:raise ValueError('not supported')return NestedTensor(tensor, mask)

定义了一个函数nested_tensor_from_tensor_list,该函数接受一个Tensor列表(tensor_list)作为输入,并返回一个NestedTensor对象。NestedTensor是一个特殊的数据结构,通常用于表示图像数据,其中可以包含不同大小的图像,并且有一个与之对应的掩码(mask)来表示每个图像的实际大小。

检查tensor_list中的第一个Tensor的维度是否为3。

通过_max_by_axis函数来确定tensor_list中所有图像的最大尺寸。这意味着最终生成的NestedTensor将包含所有图像的最大高度和宽度。

这个_max_by_axis函数的代码如下:

def _max_by_axis(the_list):# type: (List[List[int]]) -> List[int]maxes = the_list[0]for sublist in the_list[1:]:for index, item in enumerate(sublist):maxes[index] = max(maxes[index], item)return maxes

在这里插入图片描述
对于归一化处理后的图像,我们的输入是一个三维的矩阵

在这里插入图片描述
在这里插入图片描述
将两个三维矩阵传入这个方法

这个list有两个元素,maxes列表首先被初始化为第一个子列表
遍历the_list中除了第一个子列表之外的所有子列表,
对于当前子列表中的每个元素,我们将其与maxes列表中对应索引的当前最大值进行比较。我们使用max函数来确定这两个值中的较大值,并将其赋值给maxes列表的相应位置。

进行比较的这个索引值就是宽和高的值

比如
在这里插入图片描述
这里第二个子列表的的index是2,值是512
就要与第一个子列表的第2个值进行比较,就是911

所以输出的就是这个batch里面所有图像中最长的宽度和高度

这个尺寸就是这个batch最终的目标尺寸

接下来的操作就是需要将这个batch中的每一张图像加上padding
使得它们的尺寸都满足这个要求

在这里插入图片描述

在batch的维度前面加上batch中图像的个数

然后创造一个这个尺寸的底图 值全为0

将所有图像按照左上角点对齐的方式填充到这个底图上

在这里插入图片描述
再生成一个batch_size为2,宽和高分别为最大宽和高的全1矩阵

它的作用是记录图像中哪些部分是图像 哪些部分是padding
接下来通过循环记录图像中的每个位置,图像部分都记为false
表示这个位置不是padding

在这里插入图片描述
然后用输出的结果替换掉batch的第一个元素,也就是image的部分

在这里插入图片描述

这个时候输出的就是
在这里插入图片描述
以上就是dataloader的部分

这篇关于【DETR系列目标检测算法代码精讲】01 DETR算法03 Dataloader代码精讲的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/868691

相关文章

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

Python脚本轻松实现检测麦克风功能

《Python脚本轻松实现检测麦克风功能》在进行音频处理或开发需要使用麦克风的应用程序时,确保麦克风功能正常是非常重要的,本文将介绍一个简单的Python脚本,能够帮助我们检测本地麦克风的功能,需要的... 目录轻松检测麦克风功能脚本介绍一、python环境准备二、代码解析三、使用方法四、知识扩展轻松检测麦

IDEA与MyEclipse代码量统计方式

《IDEA与MyEclipse代码量统计方式》文章介绍在项目中不安装第三方工具统计代码行数的方法,分别说明MyEclipse通过正则搜索(排除空行和注释)及IDEA使用Statistic插件或调整搜索... 目录项目场景MyEclipse代码量统计IDEA代码量统计总结项目场景在项目中,有时候我们需要统计

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

MySQL实现多源复制的示例代码

《MySQL实现多源复制的示例代码》MySQL的多源复制允许一个从服务器从多个主服务器复制数据,这在需要将多个数据源汇聚到一个数据库实例时非常有用,下面就来详细的介绍一下,感兴趣的可以了解一下... 目录一、多源复制原理二、多源复制配置步骤2.1 主服务器配置Master1配置Master2配置2.2 从服

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Java对接MQTT协议的完整实现示例代码

《Java对接MQTT协议的完整实现示例代码》MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛,:本文主要介绍Ja... 目录前言前置依赖1. MQTT配置类代码解析1.1 MQTT客户端工厂1.2 MQTT消息订阅适配器1.

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用