玩转肺癌目标检测数据集Lung-PET-CT-Dx ——②预览数据集,绘制锚框

news/2024/7/24 3:42:09 标签: 目标检测, 计算机视觉, 人工智能

文章目录

    • 数据集预览
      • CT图片和xml文件的对应关系
      • 查看dcm文件信息
      • 将dcm图像与xml标注文件配对

本文接着预览数据集的概况,看看图像文件和标注文件该如何处理。
本文所用代码: 我的Github

数据集预览

数据集分成三部分:
Images 为我们需要下载的影像资料。
Annotation Files 是目标检测的标注数据(即XML注释文件,标注了肿瘤位置和分类)。
Clinical Data 是患者相关的临床资料。

我们主要关注前两个部分。


Image部分含355个子文件夹,命名为"Lung_Dx-Xxxxx"。比如A0002,意为A分类(腺癌)的0002号病例。

在这里插入图片描述
在这里插入图片描述


Annotation Files 下是一些xml格式的标注文件,即目标检测的标注数据,标注了肿瘤位置和分类。
我们看到下图xml文件中标注了一个 A类 的物体(即 Bounding Box),以及它的四个坐标。
之后也有可能碰到一个xml文件标注了多个Bounding Box的情况,即一张CT标注了两个结节病灶。

在这里插入图片描述


这里有个问题,我们的CT图像和xml标注文件如何对应起来呢?即如何知道xml文件中描述的bounding box框对应的是哪一张CT图片呢?

CT图片和xml文件的对应关系

我们知道xml文件的文件名是一长串数字组成的,比如“1.3.6.1.4.1.14519.5.2.1.6655.2359.122259036515695905512549026864.xml”。
这是CT序列片中,一张CT图片的全局唯一标识,称为 SOP Instance UID。

我们可以用dcm软件(如RadiAnt)打开一张dcm影像文件,打开dcm文件的标签就可以看到SOP Instance UID。就是这个东西与xml文件一一对应了起来。
在这里插入图片描述


查看dcm文件信息

由于RadiAnt软件收费,我们完全可以使用python的pydicom库来查看处理dcm文件。
先通过pip install pydicom命令安装这个库。

然后,我们可以载入需要的dcm文件。
SOPInstanceUID属性即可查看 SOP Instance UID。
还可以获取像素矩阵,绘制出CT影像。
代码如下:

import pydicom
import matplotlib.pyplot as plt

im = pydicom.read_file('manifest-1608669183333/Lung-PET-CT-Dx/Lung_Dx-A0001/04-04-2007-NA-Chest-07990/2.000000-5mm-40805/1-01.dcm')

# 获取 UID
uid = im.SOPInstanceUID

# 获取像素矩阵
img_arr = im.pixel_array
# 打印矩阵大小
print(img_arr.shape)

# 绘制图像
plt.imshow(img_arr,cmap=plt.cm.gray)
plt.title("UID:{}".format(uid))

效果:
在这里插入图片描述


将dcm图像与xml标注文件配对

我们需要处理一下数据,将dcm图像与xml标注文件配对起来,并看看最后的锚框效果。

比如我们想要看看 A0001 号数据。

# 查看 A0001 号数据的图像文件和xml标注文件
import os

# 查看指定目录下所有的dcm文件名
dcm_file=[]
for root, dirs, files in os.walk('manifest-1608669183333/Lung-PET-CT-Dx/Lung_Dx-A0001'):
    for file in files:
        file_path = os.path.join(root, file)
        if 'dcm' in file_path:
            dcm_file.append(file_path)
print(dcm_file[0])

# 查看指定目录下所有的dcm文件的 SOP Instance UID
dcm_file_uid=[]
for dcm in dcm_file:
    im=pydicom.read_file(dcm)
    dcm_uid=im.SOPInstanceUID
    dcm_file_uid.append(dcm_uid)
print(dcm_file_uid[0])

# 查看指定Annotation的指定目录下所有的XML文件
xml_file=[]
for root, dirs, files in os.walk('Lung-PET-CT-Dx-Annotations-XML-Files-rev12222020/Annotation/A0001'):
    for file in files:
        file_path = os.path.join(root, file)      
        if 'xml' in file_path:
            xml_file.append(file_path)
print(xml_file[0])

在这里插入图片描述


# 从dcm_file找出“SOP Instance UID”与xml_file一致的文件
to_select_dcm = []
for xml in xml_file:
    xml_file_name = xml[66:-4]
    if xml_file_name in dcm_file_uid:
        idx = dcm_file_uid.index(xml_file_name)
        to_select_dcm.append(dcm_file[idx])
to_select_dcm[:5]

在这里插入图片描述


我们取第一张配对好的 dcm图片 和 XML标注文件,预览一下锚框的效果。

# 我们取第一张配对好的 dcm图片 和 XML标注文件
im, xml = to_select_dcm[0], xml_file[0]

# 查看dcm图片文件
im = pydicom.read_file(im)

# 获取 UID
uid = im.SOPInstanceUID
# 获取像素矩阵
img_arr = im.pixel_array
# 打印矩阵大小
print(img_arr.shape)
# 绘制图像
plt.imshow(img_arr,cmap=plt.cm.bone)
plt.title("UID:{}".format(uid))

在这里插入图片描述


# 取第1组标注框和类别
bbox, label = get_labelFromXml(xml)
bbox, label = bbox[0], label[0]  # 一张dcm图片可能对应多个标注框,这里取第1个

def bbox_to_rect(bbox, color):
    # 将边界框(左上x,左上y,右下x,右下y)格式转换成matplotlib格式:
    # ((左上x,左上y),宽,高)
    return plt.Rectangle(
        xy=(bbox[0], bbox[1]), width=bbox[2]-bbox[0], height=bbox[3]-bbox[1],
        fill=False, edgecolor=color, linewidth=2)

fig = plt.imshow(img_arr,cmap=plt.cm.bone)
plt.title("UID:{}".format(uid))

fig.axes.add_patch(bbox_to_rect(bbox, 'red'))
fig.axes.text(bbox[0]+12, bbox[1]+12, label,
                      va='center', ha='center', fontsize=12, color='red')

在这里插入图片描述

这样,我们就可以绘制锚框进行数据的预览了。


http://www.niftyadmin.cn/n/179535.html

相关文章

【算法题】2466. 统计构造好字符串的方案数

题目: 给你整数 zero ,one ,low 和 high ,我们从空字符串开始构造一个字符串,每一步执行下面操作中的一种: 将 ‘0’ 在字符串末尾添加 zero 次。 将 ‘1’ 在字符串末尾添加 one 次。 以上操作可以执行任…

【K8S系列】深入解析 ReplicaSet

目录 序言 1 基础介绍 1.1 重要特性 1.2 控制器 1.3 标签选择器 示例配置文件: 1.4 自动伸缩 示例配置文件: 2 拓展 2.1 Deployment 水平扩展 思考问题: 3 投票 序言 要从容地着手去做一件事,但一旦开始,…

线程的生命周期

从操作系统的角度理解: 线程是在调用start方法之后,它才变成就绪状态,在就绪状态下,线程开始去抢夺CPU的执行权,它是正在抢,但是还没有抢到,没有抢到就无法执行代码。所以就绪状态它是有执行资…

Git-分布式版本控制工具

目录 Git的简单介绍 软件基本理论/原理的介绍 软件的下载、安装、配置 软件实际应用案例 Git的简单介绍 版本控制概念 正如文章标题所写,git是一个分布式版本控制工具。 什么是版本控制呢? 下面给出一个场景:老板让你写一个方案&…

C++————构造函数与析构函数

在C中,我们有一个专门有一个函数给类的成员赋值,这个赋初值的工作由构造函数来完成。 说明: 1.构造函数的名字必须与类名相同,否则编译程序将把它当成一般的成员函数来处理。 2.构造函数没有返回值,在定义构造函数时&a…

文章生成器-免费的文章生成器

随着信息爆炸的时代,自媒体人员不仅需要创造性的策略,还需要快速产生具有高质量文章的能力,这样才能快速响应趋势并保持优势。文章生成器,一款基于人工智能和自然语言处理技术的文本生成软件,可在没有任何人工干预的情…

蓝桥杯算法心得——小明的彩灯(差分)

大家好,我是晴天学长,今天的题目类型是前缀和的亲戚(差分),两个互逆,实际运用非常广泛,加油!需要的小伙伴请自取哦!💪💪💪 1 &#xf…

整懵了,蚂蚁金服4面成功拿下测开offer,涨薪10k,突然觉得跳槽也不是那么难

蚂蚁的面试挺独特的,每轮面试都没有HR约时间,一般是晚上8点左右面试官来一个电话,问是否能面试,能的话开始面,不能就约一个其他时间。 全程4面,前四面技术面,电话面试,最后一面是HR面…