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

2023-05-16

文章目录

    • 关于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 ET

xml_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 random

random.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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • MT7628处理器介绍,MT7628芯片原理图资料

    MT7628处理器 xff1a MT7628芯片上路由器包括802 11n MAC和基带 2 4GHz无线电和FEM 575 580 MHz MIPS 24KCPU核 5端口10 100快速以太网交换机 MT7628包括所有需要的东西 从单
  • MT7628 wifi模块,MTK路由器芯片介绍

    MT7628处理器 xff1a MT7628nn mt7628an 系列产品是新一代2T2R 802 11n Wi Fi AP 路由器 系统单芯片 MT7628可提升射频效能表现 减低功耗 xff0c 并将整体物料清单 BOM 成本优化 x
  • MT7621A路由器芯片参数/处理器资料(原理图/CPB)介绍

    MT7621A支持高级别AP 路由器的要求 xff0c 以及大量的接口以及巨大的最大RAM容量 feature MT7621A CPU MIPS1004Kc 880 MHz I Cache D Cache 32 KB 32 KB L2 Ca
  • 《大数据时代》读书总结

    这本书从以下几个方面阐述了我们所处的时代是如何展现 大数据 的 xff1a 1 首先是大数据时代的思维变革 思维为什么需要变革 xff1f 怎样变革 xff1f 思维需要变革的第一个原因是 xff0c 这个时代获取和处理数据的方式更加多元
  • 联发科RT3573无线wifi路由器模块芯片介绍

    RT3573是联发科推出的一款高效能又具成本效益的802 11n WiFi 传输器 dongle 解决方案平台 RT3573是一款高度整合式WiFi单芯片 xff0c 支持450 Mbps PHY速率 它完全符合IEEE 802 11n及I
  • K8S svc暴露的服务内部调用方法

    现象 xff1a 在Kubernetes集群内业务是通过ClusterIP或者服务名访问 k8s 的ingress nginx controller存在缺陷 xff0c 只有Ingress的Pod所在节点上 xff0c Pod才能访问通过I
  • CMake构建OpenCV项目

    文章目录 前言一 基本概念二 操作步骤1 创建OpenCV程序2 创建CMake文件3 编译项目4 运行项目 总结 前言 CMake是个一个开源的跨平台自动化建构系统 xff0c 用来管理软件建置的程序 xff0c 并不依赖于某特定编译器
  • 在立创商城上快速制作PCB原理图库

    以可调降压电源芯片TPS62130为例 xff1a 1 打开立创商城 xff0c 搜索元器件 2 点击 下载文件 3 出现下图 xff0c 点击 立即使用 4 保存原理图文件 5 保存完 xff0c 导出 6 打开导出文件 7 生成原理图库
  • 串口通信(232,485,422)及一些常见问题

    本文转载自21ic电子网 xff1a https www sohu com a 197785266 464086 本人对此文章进行了优化 xff0c 如有侵权 xff0c 请联系删除 xff01 并行通信与串行通信 与串行通信相对的是并行通
  • 运维排查篇 | 大量后台进程占用CPU资源怎么办?

    目录 案例现象定位问题解决问题pstree 案例现象 今天早上打开虚拟机终端 xff0c 发现一直有进程往我的 1 txt 文件里写东西 xff0c 删除之后又重新生成 而且 1 txt 大小已经五百多M了 使用 top 命令查看一下 xf
  • VTOL-垂起4+2构型电机电调校准(小白自用

    我也是个小白 有不对的地方欢迎指出 xff0c 有啥可以在评论区讨论 目录 VTOL 垂起4 43 2构型电机电调校准 xff08 小白自用参考链接 xff0c 感谢前辈博主前期准备校准四旋翼四轴电机电调双发电调校准 一些可能会出现的问题以
  • 理解浮点数的二进制表示

    目录 二进制的科学计数法 浮点数的二进制表示 符号位 尾数和指数 xff08 以64位浮点数为例 xff09 0 规约数和非规约数 无穷大和空值NaN 二进制的科学计数法 浮点数在电脑中用二进制储存 xff0c 约定以二进制的科学计数法来进
  • 最新版 如何获取OSS配置获取AccessKeyId、AccessKeySecret

    1 首先第一步 登录阿里云官网 https www aliyun com spm 61 5176 12901015 2 0 0 3c89525ce8lmgE 2 注册账号 可以直接使用 支付宝扫码登录 自动注册完成 3 注册成功后登录 可以
  • 消息邮箱和消息队列

    邮箱是一个通过在系统共享存储区内传递消息来实现同步和通信的对象 每个邮箱包含一个用于发送消息的消息队列和一个用来接受消息的消息队列 由于是在共享存储区域 xff0c 因此它对每个任务都是可见的 而一般的消息队列 xff0c 还可用来处理任务
  • git clone到本地之后切换分支

    Lenovo 64 DESKTOP GOJ0H91 MINGW64 d GitHub u boot khadas vims nougat git checkout 检查属于哪个分支 Your branch is up to date wit
  • win10开启自带移动热点以及解决无法设置移动热点,请打开WLAN问题

    1 选择Windows设置里的 网络和Internet 2 选择移动热点 xff0c 点击开 如果这一步显示 无法设置移动热点 xff0c 请打开WLAN 解决方法 xff1a 右键单击计算机 管理 设备管理器 xff0c 然后点击菜单栏的
  • 深度分析Java的枚举类型—-枚举的线程安全性及序列化问题

    写在前面 xff1a Java SE5提供了一种新的类型 Java的枚举类型 xff0c 关键字enum可以将一组具名的值的有限集合创建为一种新的类型 xff0c 而这些具名的值可以作为常规的程序组件使用 xff0c 这是一种非常有用的功能
  • excel截取前、中、后几个字符串的方法

    在对字符串进行处理时 xff0c 我们经常会用到取出某个单元格数据的前几位数 xff0c 中间几位数 xff0c 或者后几位数 xff0c 比如要取出省市区中的市 xff0c 该怎么办呢 xff1f 一 left函数用法 xff1a lef
  • Pixhawk6c编译

    以前一直用pixhawk4以及4mini xff0c 版本1 11 xff0c 这两款目前停产 xff0c 6x也快停产 xff0c 没什么货源了 只能试试6c 一 xff1a 下载 流程 xff1a 按照官网的流程 xff0c 先git
  • 结构体对齐详解

    1 结构体基础知识 a 认识结构体 结构体是一些值的集合 这些值称为成员变量 结构体的每个成员可以是不同类型的变量 声明一个结构体类型 声明一个学生类型 Stu就是你对这个结构体的称呼 struct Stu char name 20 cha

随机推荐