1、点云(Point clouds)
三维空间(xyz坐标)点的集合
2、体素网络(voxel grids)
体素是3D空间的像素。量化的,大小固定的点云。每个单元都是固定大小和离散坐标。
占据栅格地图(Occupancy Grid Map)
一个二维网格,每个网格单元里有实体的话就为占据状态(1),空(0)。
体素就是固定分辨率的三维栅格地图
八叉树地图(Octomap):可变分辨率的网格
3、多边形网格(polygon meshes)
TP(True Positive):预测答案正确
FP(False Positive):错将其他类预测为本类
FN(False Negative):本类标签预测为其他类标
precision(精准度 / 查准率): 指被分类器判定正例中的正样本的比重
recall (召回率 / 查全率): 指的是被预测为正例的占总的正例的比重
accuracy(准确率): 代表分类器对整个样本判断正确的比重
机器学习将分类问题定义一个决策面,决策面位于两个不同类之间的某个位置
逻辑函数公式:
z = ax + b
过程:
分类结果标签只有两个
脑PET:脑部正电子发射计算机断层显像(brain positron emission tomography PET),
是反映脑部病变的基因、分子、代谢及功能状态的显像。它是利用正电子核素标记葡萄糖等人体代谢物作为显像剂,通过病灶对显像剂的摄取来反映其代谢变化,从而为临床提供疾病的生物代谢信息,为脑癫痫病、脑肿瘤、帕金森病、阿尔茨海默综合征等提供了有效的检测手段。可利用脑PET图像检测出轻度认知障碍病灶,并提前介入治疗,从而延缓发病,对后续患者康复治疗有着积极的意义。因此本赛题以轻度认知障碍为例对脑PET图像进行分析与疾病预测。
MCI: 轻度认知障碍
NC: 健康人
数据格式:nii—— nifti 格式
特点:它包含两个能够将每个体素的索引(i,j,k)和它的空间位置(x,y,z)关联起来的仿射坐标。
可视化数据
数据转换方法:
1、NiBabel取出每层切片数据
2、使用Nilearn进行高层次的绘图
数据分布和清洗:
图像特征统计:指对图像中的像素或图像区域进行统计分析,以提取和描述图像的特征信息。
占比特征:通过统计图像中不同像素值或颜色通道的像素数量,计算其在整个图像中的比例或占比。
边缘特征:边缘是图像中像素值或颜色发生剧烈变化的区域,通常表示物体的边界或纹理的边界。
纹理特征:描述了图像中的纹理信息,反映了图像的细节和结构。
思路简单,不需要GPU就可以运行完成。
精度较差,且容易受到形态比较形似的影响。
import glob # 获取文件路径
import numpy as np
import pandas as pd
import nibabel as nib # 处理医学图像数据
from nibabel.viewers import OrthoSlicer3D # 图像可视化
from collections import Counter # 计数统计
# 读取训练集文件路径
train_path = glob.glob('./脑PET图像分析和疾病预测挑战赛公开数据/Train/*/*')
test_path = glob.glob('./脑PET图像分析和疾病预测挑战赛公开数据/Test/*')
# 打乱训练集和测试集的顺序
np.random.shuffle(train_path)
np.random.shuffle(test_path)
# 对PET文件提取特征
def extract_feature(path):
# 加载PET图像数据
img = nib.load(path)
# 获取第一个通道的数据
img = img.dataobj[:, :, :, 0]
# 随机筛选其中的10个通道提取特征
random_img = img[:, :, np.random.choice(range(img.shape[2]), 10)]
# 对图片计算统计值
feat = [
(random_img != 0).sum(), # 非零像素的数量
(random_img == 0).sum(), # 零像素的数量
random_img.mean(), # 平均值
random_img.std(), # 标准差
len(np.where(random_img.mean(0))[0]), # 在列方向上平均值不为零的数量
len(np.where(random_img.mean(1))[0]), # 在行方向上平均值不为零的数量
random_img.mean(0).max(), # 列方向上的最大平均值
random_img.mean(1).max() # 行方向上的最大平均值
]
# 根据路径判断样本类别('NC'表示正常,'MCI'表示异常)
if 'NC' in path:
return feat + ['NC']
else:
return feat + ['MCI']
# 对训练集进行30次特征提取,每次提取后的特征以及类别('NC'表示正常,'MCI'表示异常)被添加到train_feat列表中。
train_feat = []
for _ in range(30):
for path in train_path:
train_feat.append(extract_feature(path))
# 对测试集进行30次特征提取
test_feat = []
for _ in range(30):
for path in test_path:
test_feat.append(extract_feature(path))
# 使用训练集的特征作为输入,训练集的类别作为输出,对逻辑回归模型进行训练。
from sklearn.linear_model import LogisticRegression
m = LogisticRegression(max_iter=1000)
m.fit(
np.array(train_feat)[:, :-1].astype(np.float32), # 特征
np.array(train_feat)[:, -1] # 类别
)
# 对测试集进行预测并进行转置操作,使得每个样本有30次预测结果。
test_pred = m.predict(np.array(test_feat)[:, :-1].astype(np.float32))
test_pred = test_pred.reshape(30, -1).T
# 对每个样本的30次预测结果进行投票,选出最多的类别作为该样本的最终预测类别,存储在test_pred_label列表中。
test_pred_label = [Counter(x).most_common(1)[0][0] for x in test_pred]
# 生成提交结果的DataFrame,其中包括样本ID和预测类别。
submit = pd.DataFrame(
{
'uuid': [int(x.split('/')[-1][:-4]) for x in test_path], # 提取测试集文件名中的ID
'label': test_pred_label # 预测的类别
}
)
# 按照ID对结果排序并保存为CSV文件
submit = submit.sort_values(by='uuid')
submit.to_csv('submit1.csv', index=None)
glob
用来查找文件目录和文件,并将搜索的到的结果返回到一个列表中
numpy
用于数值计算
pandas
用于数据处理
nibabel
用于处理医学图像数据
OrthoSlicer3D
用于图像可视化
collections 数据结构常用的模块,collections包含了一些特殊的容器,针对Python内置的容器
counter 方便、快速的计数,将元素数量统计,然后计数并返回一个字典,键为元素,值为元素个数。
glob.glob() 可同时获取所有的匹配路径
glob.iglob() 一次只能获取一个匹配路径
使用np.random.shuffle
函数分别打乱训练集和测试集的顺序,以消除数据的有序性,确保模型训练和评估的随机性。
定义了一个名为extract_feature
的函数,用于从医学图像数据中提取特征。该函数接受一个图像文件的路径作为输入,加载图像数据,并从中随机选择10个通道。然后,对于这10个通道的数据,计算一系列统计值,例如非零像素的数量、零像素的数量、平均值、标准差、在列和行方向上平均值不为零的数量等。最后,根据文件路径判断样本的类别,返回提取的特征值以及类别('NC'表示正常,'MCI'表示异常)。
使用上述extract_feature
函数对训练集和测试集中的图像进行特征提取,并将提取的特征值和类别存储在train_feat
和test_feat
列表中。这里,为了增加模型的鲁棒性,对训练集和测试集进行了30次特征提取,即每个样本会有30组特征及类别的组合。
导入LogisticRegression
类,创建一个逻辑回归模型,并使用训练集的特征作为输入,训练集的类别作为输出进行模型训练。
使用训练好的逻辑回归模型对测试集进行预测,并对预测结果进行转置操作,使得每个样本有30次预测结果。
对每个样本的30次预测结果进行投票,选出其中预测类别最多的作为该样本的最终预测类别。最终的预测结果存储在test_pred_label
列表中。
counter记录
将预测结果生成一个DataFrame,其中包括样本ID和预测类别。样本ID从测试集文件路径中提取,并根据ID对结果进行排序。最后将结果保存为CSV文件submit1.csv
,用于提交到挑战赛或评估模型性能。
二分类问题
Linux和windows 编码格式不一样 —— 乱码
数据格式(128,128,47,1)四维
x轴维度,宽度
y轴维度,高度
z轴维度,深度,切片数量
数据的通道数
可以修改的参数: 特征提取次数、随机选择通道数
sklearn
深度学习
卷积神经网络
循环神经网络
transformer
unet分割
逻辑回归
counter
目前进度只是浅浅的跑通了baseline。关于baseline中还有很多基础知识需要先学习一下。并且对于baseline的修改还需要再花时间研究。