AI夏令营-CV实践教程-学习笔记-脑PET图像分析和疾病预测挑战赛

一个纯小白的以赛带学记录过程。

基础知识拓展:

3D数据的不同表示:

        1、点云(Point clouds)

                三维空间(xyz坐标)点的集合

        2、体素网络(voxel grids)

                体素是3D空间的像素。量化的,大小固定的点云。每个单元都是固定大小和离散坐标。

                占据栅格地图(Occupancy Grid Map) 

                      一个二维网格,每个网格单元里有实体的话就为占据状态(1),空(0)。    

                体素就是固定分辨率的三维栅格地图 

                八叉树地图(Octomap):可变分辨率的网格

      3、多边形网格(polygon meshes)

AI夏令营-CV实践教程-学习笔记-脑PET图像分析和疾病预测挑战赛_第1张图片

F1_score 

 AI夏令营-CV实践教程-学习笔记-脑PET图像分析和疾病预测挑战赛_第2张图片

TP(True Positive):预测答案正确

FP(False Positive):错将其他类预测为本类

FN(False Negative):本类标签预测为其他类标

precision(精准度 / 查准率): 指被分类器判定正例中的正样本的比重

precision = \frac{​{TP}}{TP +FP}

recall (召回率 / 查全率):      指的是被预测为正例的占总的正例的比重

recall = \frac{​{TP}}{TP +FN}

accuracy(准确率):               代表分类器对整个样本判断正确的比重

accuracy = \frac{​{TP + TN }}{TP +FP + TN + FN}

分类问题:

机器学习将分类问题定义一个决策面,决策面位于两个不同类之间的某个位置

逻辑回归:

逻辑函数公式:

y = S(z) = \frac{1}{1 + ^{_{e}^{-z}}}

z = ax + b

AI夏令营-CV实践教程-学习笔记-脑PET图像分析和疾病预测挑战赛_第3张图片

过程:

AI夏令营-CV实践教程-学习笔记-脑PET图像分析和疾病预测挑战赛_第4张图片

二分类:

分类结果标签只有两个

赛题信息:

脑PET:脑部正电子发射计算机断层显像(brain positron emission tomography PET),

是反映脑部病变的基因、分子、代谢及功能状态的显像。它是利用正电子核素标记葡萄糖等人体代谢物作为显像剂,通过病灶对显像剂的摄取来反映其代谢变化,从而为临床提供疾病的生物代谢信息,为脑癫痫病、脑肿瘤、帕金森病、阿尔茨海默综合征等提供了有效的检测手段。可利用脑PET图像检测出轻度认知障碍病灶,并提前介入治疗,从而延缓发病,对后续患者康复治疗有着积极的意义。因此本赛题以轻度认知障碍为例对脑PET图像进行分析与疾病预测。

AI夏令营-CV实践教程-学习笔记-脑PET图像分析和疾病预测挑战赛_第5张图片

MCI: 轻度认知障碍

NC:  健康人

数据格式:nii—— nifti 格式

        特点:它包含两个能够将每个体素的索引(i,j,k)和它的空间位置(x,y,z)关联起来的仿射坐标。

可视化数据

AI夏令营-CV实践教程-学习笔记-脑PET图像分析和疾病预测挑战赛_第6张图片

数据转换方法:

1、NiBabel取出每层切片数据

2、使用Nilearn进行高层次的绘图

AI夏令营-CV实践教程-学习笔记-脑PET图像分析和疾病预测挑战赛_第7张图片

数据分布和清洗:

baseline精读:

图像特征统计:指对图像中的像素或图像区域进行统计分析,以提取和描述图像的特征信息。

  1. 占比特征:通过统计图像中不同像素值或颜色通道的像素数量,计算其在整个图像中的比例或占比。

  2. 边缘特征:边缘是图像中像素值或颜色发生剧烈变化的区域,通常表示物体的边界或纹理的边界。

  3. 纹理特征:描述了图像中的纹理信息,反映了图像的细节和结构。

  • 思路简单,不需要GPU就可以运行完成。

  • 精度较差,且容易受到形态比较形似的影响。

AI夏令营-CV实践教程-学习笔记-脑PET图像分析和疾病预测挑战赛_第8张图片 代码流程图

 baseline代码

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)

1、导入所需的库

glob      用来查找文件目录和文件,并将搜索的到的结果返回到一个列表中

numpy      用于数值计算

pandas      用于数据处理

nibabel     用于处理医学图像数据

OrthoSlicer3D 用于图像可视化

collections         数据结构常用的模块,collections包含了一些特殊的容器,针对Python内置的容器

        counter    方便、快速的计数,将元素数量统计,然后计数并返回一个字典,键为元素,值为元素个数。

2、获取文件路径

glob.glob()  可同时获取所有的匹配路径

glob.iglob()  一次只能获取一个匹配路径

3、打乱数据

使用np.random.shuffle函数分别打乱训练集和测试集的顺序,以消除数据的有序性,确保模型训练和评估的随机性。

4、特征提取函数

定义了一个名为extract_feature的函数,用于从医学图像数据中提取特征。该函数接受一个图像文件的路径作为输入,加载图像数据,并从中随机选择10个通道。然后,对于这10个通道的数据,计算一系列统计值,例如非零像素的数量、零像素的数量、平均值、标准差、在列和行方向上平均值不为零的数量等。最后,根据文件路径判断样本的类别,返回提取的特征值以及类别('NC'表示正常,'MCI'表示异常)。

5、特征提取与数据标记

使用上述extract_feature函数对训练集和测试集中的图像进行特征提取,并将提取的特征值和类别存储在train_feattest_feat列表中。这里,为了增加模型的鲁棒性,对训练集和测试集进行了30次特征提取,即每个样本会有30组特征及类别的组合。

6、训练逻辑回归模型

导入LogisticRegression类,创建一个逻辑回归模型,并使用训练集的特征作为输入,训练集的类别作为输出进行模型训练。

7、对测试集进行预测

使用训练好的逻辑回归模型对测试集进行预测,并对预测结果进行转置操作,使得每个样本有30次预测结果。

8、投票策略

对每个样本的30次预测结果进行投票,选出其中预测类别最多的作为该样本的最终预测类别。最终的预测结果存储在test_pred_label列表中。

counter记录

9、生成提交结果

将预测结果生成一个DataFrame,其中包括样本ID和预测类别。样本ID从测试集文件路径中提取,并根据ID对结果进行排序。最后将结果保存为CSV文件submit1.csv,用于提交到挑战赛或评估模型性能。

直播笔记:基于传统机器学习方法的CV竞赛流程

二分类问题

Linux和windows 编码格式不一样 —— 乱码

数据格式(128,128,47,1)四维

        x轴维度,宽度

        y轴维度,高度

        z轴维度,深度,切片数量

        数据的通道数 

可以修改的参数: 特征提取次数、随机选择通道数

sklearn

深度学习

卷积神经网络

循环神经网络

transformer

unet分割

逻辑回归

 counter 

总结:

目前进度只是浅浅的跑通了baseline。关于baseline中还有很多基础知识需要先学习一下。并且对于baseline的修改还需要再花时间研究。

你可能感兴趣的:(人工智能,学习,笔记)