Transformer实战-系列教程15:DETR 源码解读2(ConvertCocoPolysToMask类)

🚩🚩🚩Transformer实战-系列教程总目录

有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Pycharm中进行
本篇文章配套的代码资源已经上传
点我下载源码

DETR 算法解读
DETR 源码解读1(项目配置/CocoDetection类)
DETR 源码解读2(ConvertCocoPolysToMask类)
DETR 源码解读3(DETR类)
DETR 源码解读4(Joiner类/PositionEmbeddingSine类/位置编码/backbone)

3、ConvertCocoPolysToMask类

位置:datasets/coco.py/ConvertCocoPolysToMask类

ConvertCocoPolysToMask类主要是进行数据预处理,主要在CocoDetection类中被调用

从的ConvertCocoPolysToMask类的代码来看,主要涉及到以下几种计算机视觉任务的数据预处理步骤:

  1. 物体检测(Object Detection)
    • 体现:通过处理bbox(边界框)信息。代码中提取和调整bbox坐标来适应物体检测任务的需求。
  2. 实例分割(Instance Segmentation)
    • 体现:如果return_masks为True,将COCO多边形标注(segmentation)转换为掩码(mask)。这对于实例分割任务来说是必要的,因为它需要精确地区分图像中各个对象的形状。
  3. 姿态估计(Pose Estimation)
    • 体现:通过处理keypoints信息。当标注中包含关键点数据时,代码会提取这些数据,这些数据对于识别和估计图像中人物的姿态非常有用。
class ConvertCocoPolysToMask(object):def __init__(self, return_masks=False):self.return_masks = return_masksdef __call__(self, image, target):w, h = image.sizeimage_id = target["image_id"]image_id = torch.tensor([image_id])anno = target["annotations"]anno = [obj for obj in anno if 'iscrowd' not in obj or obj['iscrowd'] == 0]boxes = [obj["bbox"] for obj in anno] # x y w h# guard against no boxes via resizingboxes = torch.as_tensor(boxes, dtype=torch.float32).reshape(-1, 4)boxes[:, 2:] += boxes[:, :2]boxes[:, 0::2].clamp_(min=0, max=w)boxes[:, 1::2].clamp_(min=0, max=h)classes = [obj["category_id"] for obj in anno]classes = torch.tensor(classes, dtype=torch.int64)if self.return_masks:segmentations = [obj["segmentation"] for obj in anno]masks = convert_coco_poly_to_mask(segmentations, h, w)keypoints = Noneif anno and "keypoints" in anno[0]:keypoints = [obj["keypoints"] for obj in anno]keypoints = torch.as_tensor(keypoints, dtype=torch.float32)num_keypoints = keypoints.shape[0]if num_keypoints:keypoints = keypoints.view(num_keypoints, -1, 3)keep = (boxes[:, 3] > boxes[:, 1]) & (boxes[:, 2] > boxes[:, 0])boxes = boxes[keep]classes = classes[keep]if self.return_masks:masks = masks[keep]if keypoints is not None:keypoints = keypoints[keep]target = {}target["boxes"] = boxestarget["labels"] = classesif self.return_masks:target["masks"] = maskstarget["image_id"] = image_idif keypoints is not None:target["keypoints"] = keypointsarea = torch.tensor([obj["area"] for obj in anno])iscrowd = torch.tensor([obj["iscrowd"] if "iscrowd" in obj else 0 for obj in anno])target["area"] = area[keep]target["iscrowd"] = iscrowd[keep]target["orig_size"] = torch.as_tensor([int(h), int(w)])target["size"] = torch.as_tensor([int(h), int(w)])return image, target
  1. 定义ConvertCocoPolysToMask类,用于处理COCO数据集的转换
  2. 类的初始化方法,参数return_masks用于控制是否返回标注的掩码信息
  3. return_masks
  4. 可调用方法,接收两个参数:image(PIL图像对象)和target(包含图像标注信息的字典)
  5. 图像w、h, 427 ∗ 640 427*640 427640,每张图片读进来的长宽都可能不一样
  6. 获取图像id,image id: 538686]
  7. 将id转化为Tensor,image id: tensor([538686])
  8. 获取标签的标注信息,包含面积、bbox框的长宽xy四个值、类别id、图像id、分割的标注信息
  9. 过滤标注信息,过滤掉有重叠框的,只保留对单个物体的框,包含重叠物体的不要,如果iscrowd为1,表示这个标注包含的是一个对象群,而不是单个对象
  10. 获取所有框,[[62.37, 135.48, 184.94, 364.52],…, [107.99, 46.17, 101.51, 157.66]]
  11. 框的数据转化为Tensor
  12. 将x、y、w、h
  13. 转化为
  14. x1、y1、x2、y2,tensor([[ 62.3700, 135.4800, 247.3100, 500.0000],…, [107.9900, 46.1700, 209.5000, 203.8300]])
  15. 获取当前图像的所有类别标签(可能对应有多个类别),[19, 21, 21, 1]
  16. 转化为Tensor,tensor([19, 21, 21, 1])
  17. 是否进行掩码转换
  18. 提取分割信息
  19. 调用函数将分割信息转化为掩码
  20. 初始化 keypoints (姿态估计任务使用)变量
  21. 判断标注信息中是否包含 keypoints 信息
  22. 提取所有标注的 keypoints 信息
  23. 将 keypoints 列表转换为PyTorch张量
  24. 获取 keypoints 的数量
  25. 判断是否存在 keypoints
  26. 重塑 keypoints 张量
  27. 过滤掉不合逻辑的边界框(即右下角坐标不大于左上角坐标的边界框),因为在标注数据的时候,外包人员如果没有按照标注说明去标,拉框不是从上面往下框住物体,而是从下往上,这会影响两个点的顺序判断
  28. 使用keep数组过滤边界框,保留有效的边界框
  29. 同样使用keep数组过滤类别ID,保留与有效边界框对应的类别ID
  30. 判断是否有掩码
  31. 使用keep数组过滤掩码,保留与有效边界框对应的掩码
  32. 如果 keypoints 信息存在
  33. 使用keep数组过滤 keypoints 信息
  34. 初始化一个新的字典target,用于存储处理后的标注信息
  35. 将过滤后的边界框信息添加到target字典
  36. 将过滤后的类别ID添加到target字典
  37. 判断是否有掩码
  38. 将过滤后的掩码添加到target字典
  39. 将图像ID添加到target字典
  40. 如果存在关键点信息
  41. 将过滤后的关键点信息添加到target字典
  42. 提取所有标注的面积信息,并转换为PyTorch张量
  43. 将过滤后的iscrowd信息添加到target字典,如果iscrowd为1,表示这个标注包含的是一个对象群,而不是单个对象
  44. 分别将原始图像的高度和宽度作为orig_size和size添加到target字典。这两个字段通常用于后续的处理或数据恢复步骤
  45. 返回处理后的图像和更新后的target字典

DETR 算法解读
DETR 源码解读1(项目配置/CocoDetection类)
DETR 源码解读2(ConvertCocoPolysToMask类)
DETR 源码解读3(DETR类)
DETR 源码解读4(Joiner类/PositionEmbeddingSine类/位置编码/backbone)

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

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

相关文章

【51单片机】LCD1602(江科大)

1.LCD1602介绍 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符 显示容量:162个字符,每个字符为5*7点阵 2.引脚及应用电路 3.内部结构框图 屏幕: 字模库:类似于数码管的数…

代码随想录算法训练营|day31

第八章 贪心算法 455.分发饼干376.摆动序列53.最大子序和代码随想录文章详解 455.分发饼干 对饼干和胃口进行排序 遍历胃口&#xff0c;若当前饼干值<胃口值&#xff0c;饼干继续往后寻找更大值 否则计数1&#xff0c;向后遍历饼干值使其满足下一个胃口值 func findConten…

一起玩儿Proteus仿真(C51)——05. 红绿灯仿真(一)

摘要&#xff1a;本文介绍如何仿真红绿灯 今天来做一个红绿灯仿真的程序&#xff0c;这个程序主要包括一下这些功能&#xff1a; 模拟的路口为十字交叉路口&#xff0c;假设东西和南北方向都是双向行驶&#xff0c;因此需要设置4组红绿灯和4个倒计时显示屏。倒计时时间最长为9…

255.【华为OD机试真题】最小矩阵宽度(滑动窗口算法-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目二.解题思路三.题解代码Python题解代码JAVA题解…

【教程】C++语言基础学习笔记(七)——Array数组

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【C语言基础学习】系列文章 第一章 《项目与程序结构》 第二章 《数据类型》 第三章 《运算符》 第四章 《流程控制》 第五章…

Linux_进程概念

硬件系统 软件系统 进程概念 进程状态 孤儿进程 进程优先级 一.硬件系统 1.1 冯诺依曼体系结构 数学家冯诺依曼提出了计算机制造的三个基本原则&#xff0c;即采用二进制逻辑、程序存储执行以及计算机由五个部分组成&#xff08;运算器、控制器、存储器、输入设备、输出设备&a…

力扣-28. 找出字符串中第一个匹配项的下标

文章目录 力扣题目代码 力扣题目 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 示例 1&#xff1a…

Python学习之路-爬虫提高:scrapy基础

Python学习之路-爬虫提高:scrapy基础 为什么要学习scrapy 通过前面的学习&#xff0c;我们已经能够解决90%的爬虫问题了&#xff0c;那么scrapy是为了解决剩下的10%的问题么&#xff0c;不是&#xff0c;scrapy框架能够让我们的爬虫效率更高 什么是scrapy Scrapy是一个为了…

适应力和应变力是智能的重要组成部分

适应力和应变力在智能系统中扮演着非常重要的角色。在面对复杂、多变的环境和问题时&#xff0c;一个智能系统需要具备适应和调整自身行为的能力&#xff0c;这就需要依赖适应力和应变力。 适应力指的是系统对环境变化的感知、理解和调整能力。一个具有良好适应力的系统能够及时…

tee漏洞学习-翻译-3:TrustZone exploit for MSM8974

原文&#xff1a;http://bits-please.blogspot.com/2015/08/full-trustzone-exploit-for-msm8974.html 在这篇博文中&#xff0c;我们将介绍利用上一篇文章中描述的 TrustZone 漏洞的完整过程。 在开发此漏洞时&#xff0c;我只使用了我值得信赖的&#xff08;个人&#xff0…

120.乐理基础-五线谱-五线谱的多声部与指法问题

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;119.乐理基础-五线谱-五线谱的标记-CSDN博客 五线谱多声部与简谱的多声部一样&#xff1a;简谱的多声部 五线谱多声部例子&#xff1a;钢琴谱 另一个例子&#xff1a;在纵向上有多个音符 然后放大之后&#xff0c…

【51单片机】利用【时间延迟】的原理规避【按键抖动问题】

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 本章是51LCD单片机设计的一个环节&#xff0c;完整可前往相应博客查看完整传送门 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下…

详解CC++内存管理(new和delete)

文章目录 写在前面1. C&C内存分布2. C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free3. C内存管理方式&#xff08;语法&#xff09;3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4. new和delete的实现原理4.1 operator new与operator delete…

数据结构——6.2 图的存储与基本操作

6.2 图的存储与基本操作 概念 图的存储 邻接矩阵存有向图和无向图 根据邻接矩阵求度&#xff1a; 无向图&#xff1a;第i个结点的度 第i行 (或第列) 的非零元素个数 有向图&#xff1a; 第i个结点的出度 第i行的非零元素个数 第i个结点的入度 第i列的非零元素个数 第i个结…

Stable Diffusion教程——stable diffusion基础原理详解与安装秋叶整合包进行出图测试

前言 在2022年&#xff0c;人工智能创作内容&#xff08;AIGC&#xff09;成为了AI领域的热门话题之一。在ChatGPT问世之前&#xff0c;AI绘画以其独特的创意和便捷的创作工具迅速走红&#xff0c;引起了广泛关注。随着一系列以Stable Diffusion、Midjourney、NovelAI等为代表…

C#面:.NET中的错误(异常)处理机制是什么

.NET中的错误处理机制主要通过异常处理来实现&#xff0c;使用 try-catch 语句块来捕获和处理异常。 在C#中&#xff0c;异常是一种表示程序错误或异常情况的对象。当程序发生错误或异常时&#xff0c;会抛出一个异常对象&#xff0c;然后程序可以通过捕获和处理异常来进行错误…

linux信号机制[一]

目录 信号量 时序问题 原子性 什么是信号 信号如何产生 引入 信号的处理方法 常见信号 如何理解组合键变成信号呢&#xff1f; 如何理解信号被进程保存以及信号发送的本质&#xff1f; 为什么要有信号 信号怎么用&#xff1f; 样例代码 core文件有什么用呢&#…

vLLM vs Text Generation Interface:大型语言模型服务框架的比较

在大型语言模型&#xff08;LLM&#xff09;的世界中&#xff0c;有两个强大的框架用于部署和服务LLM&#xff1a;vLLM 和 Text Generation Interface (TGI)。这两个框架都有各自的优势&#xff0c;适用于不同的使用场景。在这篇博客中&#xff0c;我们将对这两个框架进行详细的…

Docker基础与持续集成

docker 基础知识&#xff1a; docker与虚拟机 !左边为虚拟机&#xff0c;右边为docker环境 – Server :物理机服务器Host OS &#xff1a;构建的操作系统Hypervisor &#xff1a;一种虚拟机软件&#xff0c;装了之后才能虚拟化操作系统Guest OS &#xff1a;虚拟化的操作系统…

突破编程_C++_基础教程(继承与多态)

1 继承 继承是面向对象编程的一个基本概念&#xff0c;它允许一个类&#xff08;派生类、子类&#xff09;继承另一个类&#xff08;基类、父类&#xff09;的属性和方法。继承可以减少代码冗余&#xff0c;提高代码重用性&#xff0c;并且有助于创建更复杂的类结构。 1.1 继…