当前位置: 首页 > news >正文

玩转肺癌目标检测数据集Lung-PET-CT-Dx ——④转换成PASCAL VOC格式数据集

文章目录

    • 关于PASCAL VOC数据集
      • 目录结构
    • ①创建VOC数据集的几个相关目录
      • XML文件的形式
    • ②读取dcm文件与xml文件的配对关系
    • ③创建VOC格式数据集
    • ④创建训练、验证集

本文所用代码见文末Github链接。

关于PASCAL VOC数据集

pascal voc数据集是关于计算机视觉,业内广泛使用的一套具有标准格式的数据集。包括了图像分类、目标检测、语义分割等任务。
许多深度学习框架如Pytorch中写好的一些模型都是可以默认读取这种Pascal VOC格式的数据集的,这样就方便我们对数据集进行各种处理、实验。

Pascal VOC2012 train/val数据集官方下载地址:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
更多信息见:官网。下载更多内容可参考:镜像站(可下载测试集)。

目录结构

它的格式信息(目录结构)如下

在这里插入图片描述

我们目标检测主要使用上面的Annotation、JPEGImages、ImageSets/Main文件夹。
ImageSets/Main文件夹下train.txt包含了被纳入训练集的图片,里面是JPEGImages文件夹下图片的文件名。
val.txt则是验证集的图片文件名集合。
trainval.txt是以上两者的合集。

展示:


在这里插入图片描述


图片

在这里插入图片描述


标注文件。
可以见到标注文件xml的格式和Lung-PET-CT-Dx数据集中的标注文件格式基本是一样的。

在这里插入图片描述

①创建VOC数据集的几个相关目录

与目标检测相关的只有:
VOCdevkit/VOC2012/Annotation (存放xml标注文件)
VOCdevkit/VOC2012/ImageSets/Main (存放train.txt、val.txt)
VOCdevkit/VOC2012/JPEGImages (存放图像文件)

在上一节我们已经进行了数据整理,并建立了简易的Dataset数据集对象。
我们已创建了 [dcm图片集] 和 [xml标注集] 的一个对应关系,我们试者重新创建一个Pascal VOC格式的数据集,顺便可以给数据集瘦瘦身。

我们先在项目目录下创建如下目录:
在这里插入图片描述

Windows资源管理器界面:
在这里插入图片描述


XML文件的形式

我们知道VOC数据集中,所有的图片文件存在了JPEGImages文件夹,且有自己的文件名。
在Annotation文件夹下,xml标注文件的文件名对应了图片的文件名,且xml文件中的 [filename] 项对应了图片的文件名+扩展名。
我们的目标是让Lung-PET-CT-Dx也改成这样的形式。
在这里插入图片描述

②读取dcm文件与xml文件的配对关系

在上一篇文章已经创建了这一配对表,直接读取csv文件。

import pydicom
import matplotlib.pyplot as plt
import os
from tqdm import tqdm
import pandas as pd
import numpy as np
import cv2 as cv
from PIL import Image
import xml.etree.ElementTree as ETxml_file_dataset = pd.read_csv('xml_file_dataset.csv', index_col=0)
xml_file_dataset

在这里插入图片描述


我们添加新的一列,赋予它们新的名字:编号从 000000~03883。

xml_file_dataset['filename'] = xml_file_dataset.index.values
xml_file_dataset['filename'] = xml_file_dataset['filename'].astype(str)
xml_file_dataset['filename'] = xml_file_dataset['filename'].str.zfill(6)
xml_file_dataset

在这里插入图片描述

这列filename就是新的文件名。


③创建VOC格式数据集

思路:

  1. 将xml列的xml文件中的 [filename] 标签写入“filename列对应名称.jpg”(如:000000.jpg),并命名为“ filename列对应名称.xml” (如:000000.xml)保存到 VOCdevkit/VOC2012/Annotations 文件夹下。
  2. 将dcm列的dcm文件另存为 “filename列对应名称.jpg”(如:000000.jpg),存到 VOCdevkit/VOC2012/JPEGImages文件夹下。
xml_list = xml_file_dataset['xml'].values
dcm_list = xml_file_dataset['dcm'].values
filename_list = xml_file_dataset['filename'].values# 将xml文件中的[filename]标签写入“filename列对应名称.jpg”(如:000000.jpg),并命名为“ filename列对应名称.xml” (如:000000.xml)保存到 VOCdevkit/VOC2012/Annotations 文件夹下。
def to_switch_xml(xml, filename):tree = ET.parse(xml)root = tree.getroot()sub1 = root.find('filename')sub1.text = filename + '.jpg'tree.write('./VOCdevkit/VOC2012/Annotations/{}.xml'.format(filename))# 将dcm文件另存为 “filename列对应名称.jpg”(如:000000.jpg),存到 VOCdevkit/VOC2012/JPEGImages文件夹下。
def to_switch_dcm(dcm, filename):img_open=pydicom.read_file(dcm)img_array=img_open.pixel_array# 将PETCT的三通道格式转成单通道格式if len(img_array.shape) == 3:img_array = cv.cvtColor(img_array, cv.COLOR_BGR2GRAY)img_array = np.array(img_array, dtype=np.float32)img = Image.fromarray(img_array)img = img.convert('L')# quality参数: 保存图像的质量,值的范围从1(最差)到95(最佳)。 默认值为75,使用中应尽量避免高于95的值; 100会禁用部分JPEG压缩算法,并导致大文件图像质量几乎没有任何增益。img.save('./VOCdevkit/VOC2012/JPEGImages/{}.jpg'.format(filename), quality=95)img.close()
# 在SSD上预计需要跑2分钟
for xml, filename in tqdm(zip(xml_list, filename_list), total=len(xml_list)):to_switch_xml(xml, filename)# 在SSD上预计需要跑10分钟
for dcm, filename in tqdm(zip(dcm_list, filename_list), total=len(dcm_list)):to_switch_dcm(dcm, filename)

在这里插入图片描述

xml文件创建成功:
在这里插入图片描述

图像文件创建成功:
在这里插入图片描述


测试一下。
(测试的详细代码见文末的Github地址)
在这里插入图片描述


④创建训练、验证集

ImageSets/Main文件夹下创建 train.txt、val.txt

import os
import randomrandom.seed(0)  # 设置随机种子,保证随机结果可复现files_path = "./VOCdevkit/VOC2012/Annotations"
assert os.path.exists(files_path), "path: '{}' does not exist.".format(files_path)val_rate = 0.3  # 设置多少归为验证集files_name = sorted([file.split(".")[0] for file in os.listdir(files_path)])
files_num = len(files_name)
val_index = random.sample(range(0, files_num), k=int(files_num*val_rate))
train_files = []
val_files = []
for index, file_name in enumerate(files_name):if index in val_index:val_files.append(file_name)else:train_files.append(file_name)try:train_f = open("./VOCdevkit/VOC2012/ImageSets/Main/train.txt", "x")eval_f = open("./VOCdevkit/VOC2012/ImageSets/Main/val.txt", "x")train_f.write("\n".join(train_files))eval_f.write("\n".join(val_files))
except FileExistsError as e:print(e)exit(1)

创建成功!
在这里插入图片描述


本文所用代码: 我的Github

相关文章:

玩转肺癌目标检测数据集Lung-PET-CT-Dx ——④转换成PASCAL VOC格式数据集

文章目录 关于PASCAL VOC数据集目录结构 ①创建VOC数据集的几个相关目录XML文件的形式 ②读取dcm文件与xml文件的配对关系③创建VOC格式数据集④创建训练、验证集 本文所用代码见文末Github链接。 关于PASCAL VOC数据集 pascal voc数据集是关于计算机视觉,业内广泛…...

两种使用 JavaScript 实现网页高亮关键字的方法

随着各种类型的信息源变得越来越多,我们常常需要通过搜索引擎来找到自己需要的信息。在搜索结果中,通常会高亮显示与我们搜索的关键词相关的内容,这样我们就能更快地找到自己需要的信息。 在本文中,我们将探讨如何使用 JavaScrip…...

【SpringBoot】SpringBoot集成ElasticSearch

文章目录 第一步,导入jar包,注意这里的jar包版本可能和你导入的不一致,所以需要修改第二步,编写配置类第三步,填写yml第四步,编写util类第五步,编写controller类第六步,测试即可 第一…...

从 Elasticsearch 到 Apache Doris,10 倍性价比的新一代日志存储分析平台

作者介绍:肖康,SelectDB 技术副总裁 导语 日志数据的处理与分析是最典型的大数据分析场景之一,过去业内以 Elasticsearch 和 Grafana Loki 为代表的两类架构难以同时兼顾高吞吐实时写入、低成本海量存储、实时文本检索的需求。Apache Doris…...

探讨Redis缓存问题及解决方案:缓存穿透、缓存击穿、缓存雪崩与缓存预热(如何解决Redis缓存中的常见问题并提高应用性能)

Redis是一种非常流行的开源缓存系统,用于缓存数据以提高应用程序性能。但是,如果我们不注意一些缓存问题,Redis也可能会导致一些性能问题。在本文中,我们将探讨Redis中的一些常见缓存问题,并提供解决方案。 一、缓存穿…...

【Python】怎么在pip下载的时候设置镜像?(常见的清华镜像、阿里云镜像以及中科大镜像)

一、清华镜像 在使用 pip 命令下载 Python 包时,可以通过设置 pip 的镜像源为清华镜像来加快下载速度。 以下是如何设置清华镜像源的步骤: 打开终端或命令行窗口执行以下命令添加清华镜像源: pip config set global.index-url https://py…...

【AI面试】目标检测中one-stage、two-stage算法的内容和优缺点对比汇总

在深度学习领域中,图像分类,目标检测和目标分割是三个相对来说较为基础的任务了。再加上图像生成(GAN,VAE,扩散模型),keypoints关键点检测等等,基本上涵盖了图像领域大部分场景了。 …...

stack、queue和priority_queue的使用介绍--C++

目录 一、stack介绍 使用方法 二、queue介绍 queue的使用 三、priority_queeue 优先级队列介绍 一、stack介绍 1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 2. stack是作为容器…...

python遍历数组

在Python中&#xff0c;有多种方式可以遍历数组&#xff0c;以下是其中的几种方式&#xff1a; 1. 使用for循环&#xff1a; my_list [1, 2, 3, 4, 5] for x in my_list: print(x) 2. 使用while循环和索引&#xff1a; my_list [1, 2, 3, 4, 5] i 0 while i < len(m…...

红黑树理论详解与Java实现

文章目录 基本定义五大性质红黑树和2-3-4树的关系红黑树和2-3-4树各结点对应关系添加结点到红黑树注意事项添加的所有情况 添加导致不平衡叔父节点不是红色节点&#xff08;祖父节点为红色&#xff09;添加不平衡LL/RR添加不平衡LR/RL 叔父节点是红色节点&#xff08;祖父节点为…...

container的讲解

我们做开发经常会遇到这样的一个需求&#xff0c;要开发一个响应式的网站&#xff0c;但是我们需要我们的元素样式跟随着我们的元素尺寸大小变化而变化。而我们常用的媒体查询&#xff08;Media Queries&#xff09;检测的是视窗的宽高&#xff0c;根本无法满足我们的业务需求&…...

JavaScript 箭头函数

&#xff08;许多人所谓的成熟&#xff0c;不过是被习俗磨去了棱角&#xff0c;变得世故而实际了。那不是成熟&#xff0c;而是精神的早衰和个性的消亡。真正的成熟&#xff0c;应当是独特个性的形成&#xff0c;真实自我的发现&#xff0c;精神上的结果和丰收。——周国平&…...

简单理解Transformer注意力机制

这篇文章是对《动手深度学习》注意力机制部分的简单理解。 生物学中的注意力 生物学上的注意力有两种&#xff0c;一种是无意识的&#xff0c;零一种是有意识的。如下图1&#xff0c;由于红色的杯子比较突出&#xff0c;因此注意力不由自主指向了它。如下图2&#xff0c;由于…...

Vue3面试题:20道含答案和代码示例的练习题

Vue3中响应式数据的实现原理是什么&#xff1f; 答&#xff1a;Vue3中使用Proxy对象来实现响应式数据。当数据发生变化时&#xff0c;Proxy会自动触发更新。 const state {count: 0 }const reactiveState new Proxy(state, {set(target, key, value) {target[key] valueco…...

Oracle数据库创建用户

文章目录 1 查看当前连接的容器2 查看pdb下库的信息3 将连接改到XEPDB1下&#xff0c;并查看当前连接4 创建表空间5 创建用户6 用户赋权7 删除表空间、用户7.1 删除表空间7.2 删除用户 8 CDB与PDB的概念 1 查看当前连接的容器 SQL> show con_name;CON_NAME ---------------…...

互联网摸鱼日报(2023-04-30)

互联网摸鱼日报&#xff08;2023-04-30&#xff09; InfoQ 热门话题 被ChatGPT带火的大模型&#xff0c;如何实际在各行业落地&#xff1f; Service Mesh的未来在于网络 百度 Prometheus 大规模业务监控实战 软件技术栈商品化&#xff1a;应用优先的云服务如何改变游戏规则…...

第二章--第一节--什么是语言生成

一、什么是语言生成 1.1. 说明语言生成的概念及重要性 语言生成是指使用计算机程序来生成符合人类自然语言规范的文本的过程。它是自然语言处理(NLP)领域中的一个重要分支,涉及到语言学、计算机科学和人工智能等领域的交叉应用。语言生成技术可以被广泛地应用于自动问答系…...

HTML <!--...--> 标签

实例 HTML 注释&#xff1a; <!--这是一段注释。注释不会在浏览器中显示。--><p>这是一段普通的段落。</p>浏览器支持 元素ChromeIEFirefoxSafariOpera<!--...-->YesYesYesYesYes 所有浏览器都支持注释标签。 定义和用法 注释标签用于在源代码中…...

TinyML:使用 ChatGPT 和合成数据进行婴儿哭声检测

故事 TinyML 是机器学习的一个领域,专注于将人工智能的力量带给低功耗设备。该技术对于需要实时处理的应用程序特别有用。在机器学习领域,目前在定位和收集数据集方面存在挑战。然而,使用合成数据可以以一种既具有成本效益又具有适应性的方式训练 ML 模型,从而消除了对大量…...

JavaScript中的Concurrency并发:异步操作下的汉堡制作示例

这篇文章想讲一下JavaScript中同步与异步操作在一个简单的示例中的应用。我们将以制作汉堡为例&#xff0c;展示如何使用同步方法、回调函数&#xff08;callbacks&#xff09;和Promise与async/await来实现该过程。 Let’s imagine we’re trying to make a burger: 1. Get …...

提示工程进阶:让AI原生应用更智能的7种方法

提示工程进阶&#xff1a;让AI原生应用更智能的7种方法关键词&#xff1a;提示工程、AI原生应用、LLM优化、Prompt设计、Few-shot学习、思维链、结构化输出摘要&#xff1a;当你在使用ChatGPT写代码卡壳时&#xff0c;或是用智能客服解决问题却得到“人工智障”回复时&#xff…...

从《贺花神》看AI趋势:当技术“理解人”,获客的方式彻底变了

今年春晚&#xff0c;一个节目让无数人屏住呼吸。故宫“白玉月令组佩”上的十二种花卉&#xff0c;化作十二位花神&#xff0c;在舞台上次第绽放。正月梅花、二月杏花、三月桃花……一人一景&#xff0c;一花一态。总导演于蕾说&#xff1a;“这非常非常难。”难在哪&#xff1…...

Blender置换贴图终极指南:5分钟掌握专业级表面细节的秘密武器

Blender置换贴图终极指南&#xff1a;5分钟掌握专业级表面细节的秘密武器 【免费下载链接】awesome-blender &#x1fa90; A curated list of awesome Blender addons, tools, tutorials; and 3D resources for everyone. 项目地址: https://gitcode.com/GitHub_Trending/aw…...

从零到国三:常州工学院Robocon团队的逆袭之路

1. 一支由"萌新"组成的硬核战队 当大多数高校机器人战队都在比拼谁家的研究生更多、实验室设备更先进时&#xff0c;常州工学院这支由大一、大二学生组成的"萌新战队"却显得格外特别。团队核心成员周潮回忆道&#xff1a;"第一次走进备赛区时&#xf…...

终极指南:如何在Rust中构建高性能物理仿真世界

终极指南&#xff1a;如何在Rust中构建高性能物理仿真世界 【免费下载链接】rapier 2D and 3D physics engines focused on performance. 项目地址: https://gitcode.com/gh_mirrors/ra/rapier Rapier物理引擎是专为Rust语言设计的高性能2D和3D物理仿真解决方案&#xf…...

本地部署SAP系统升级详细操作步骤:避开90%企业都会踩的5个坑

做了10年SAP实施&#xff0c;我见过超过70%的本地部署SAP升级项目&#xff0c;都会因为前期流程不规范踩坑&#xff0c;小到业务停摆几小时&#xff0c;大到核心数据丢失。我做项目的时候&#xff0c;通常会用上海瀚资 Tectura 这套成熟的升级方法论来梳理流程&#xff0c;能把…...

Kotlin协程flow缓冲buffer任务流,批次任务中选取优先级最高任务最先运行(十)

Kotlin协程flow缓冲buffer任务流&#xff0c;批次任务中选取优先级最高任务最先运行&#xff08;十&#xff09; 在 https://blog.csdn.net/zhangphil/article/details/159286201 基础上改进&#xff0c;简化LoadMgr提交简单任务的方法 。 Kotlin协程Flow结合缓冲(buffer)实现…...

新手必看:造相Z-Image文生图模型v2部署教程,10分钟搞定AI绘画

新手必看&#xff1a;造相Z-Image文生图模型v2部署教程&#xff0c;10分钟搞定AI绘画 1. 快速了解造相Z-Image模型 造相Z-Image是阿里通义万相团队开源的高性能文生图扩散模型&#xff0c;专为中文场景优化。这个20亿参数规模的模型能生成768768及以上分辨率的高清图像&#…...

计算机专业的大学生能参加哪些比赛?看完这篇就开干吧!

计算机专业的大学生能参加哪些比赛&#xff1f;看完这篇就开干吧&#xff01; 对于计算机专业大学生而言&#xff0c;网络安全相关比赛是提升实战能力、丰富简历亮点的最佳途径。尤其是CTF竞赛和护网行动&#xff0c;已成为企业招聘时的核心参考指标。 本文梳理了适合大学生参…...

英雄联盟智能助手:3分钟搞定繁琐操作,专注游戏乐趣

英雄联盟智能助手&#xff1a;3分钟搞定繁琐操作&#xff0c;专注游戏乐趣 【免费下载链接】LeagueAkari ✨兴趣使然的&#xff0c;功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari …...