赛题名称:脑PET疾病预测挑战赛
赛题类型:计算机视觉、图像分类
赛题报名链接?:https://challenge.xfyun.cn/topic/info?type=pet-2023&ch=vWxQGFU
赛题背景
脑PET全称为脑部正电子发射计算机断层显像(brain positron emission tomography PET),是反映脑部病变的基因、分子、代谢及功能状态的显像。它是利用正电子核素标记葡萄糖等人体代谢物作为显像剂,通过病灶对显像剂的摄取来反映其代谢变化,从而为临床提供疾病的生物代谢信息,为脑癫痫病、脑肿瘤、帕金森病、阿尔茨海默综合征等提供了有效的检测手段。
可利用脑PET图像检测出轻度认知障碍病灶,并提前介入治疗,从而延缓发病,对后续患者康复治疗有着积极的意义。因此本赛题以轻度认知障碍为例对脑PET图像进行分析与疾病预测。
赛事任务
为研究基于脑PET图像的疾病预测,本次大赛提供了海量脑PET数据集作为脑PET图像检测数据库的训练样本,参赛者需根据提供的样本构建模型,对轻度认知障碍进行分析和预测。
脑PET图像检测数据库,记录了老年人受试志愿者的脑PET影像资料,其中包括确诊为轻度认知障碍(MCI)患者的脑部影像数据和健康人(NC)的脑部影像数据。
被试者按医学诊断分为两类:
- NC:健康
- MCI:轻度认知障碍
赛题数据
本次大赛所用脑PET图像检测数据库,图像格式为nii。
评估指标
本次竞赛的评价标准采用F1_score,分数越高,效果越好。
解题思路
赛题是一个典型的图像分类的比赛,但需要单独的对数据格式进行读取,并进行数据增强。
步骤0:读取图片
import nibabel as nib
from nibabel.viewers import OrthoSlicer3D
train_path = glob.glob('./脑PET图像分析和疾病预测挑战赛公开数据/Train/*/*')
test_path = glob.glob('./脑PET图像分析和疾病预测挑战赛公开数据/Test/*')
np.random.shuffle(train_path)
np.random.shuffle(test_path)
for path in train_path:
img = nib.load(path) print(path, img.dataobj[:, :, :, 0].shape)
步骤1:定义模型
class XunFeiNet(nn.Module):
def __init__(self):
super(XunFeiNet, self).__init__()
model = models.resnet18(True)
model.avgpool = nn.AdaptiveAvgPool2d(1)
model.fc = nn.Linear(512, 9)
self.resnet = model
def forward(self, img):
out = self.resnet(img) return out
步骤2:模型训练
def train(train_loader, model, criterion, optimizer):
model.train()
train_loss = 0.0 for i, (input, target) in enumerate(train_loader):
input = input.cuda(non_blocking=True)
target = target.cuda(non_blocking=True)
# compute output output = model(input)
loss = criterion(output, target)
# compute gradient and do SGD step optimizer.zero_grad()
loss.backward()
optimizer.step()
if i % 20 == 0: print('Train loss', loss.item())
train_loss += loss.item() return train_loss/len(train_loader)
步骤3:模型预测
def predict(test_loader, model, criterion):
model.eval()
val_acc = 0.0
test_pred = []
with torch.no_grad():
end = time.time() for i, (input, target) in enumerate(test_loader):
input = input.cuda()
target = target.cuda()
# compute output output = model(input)
test_pred.append(output.data.cpu().numpy()) return np.vstack(test_pred)
方案开源地址:
https://github.com/datawhalechina/competition-baseline/tree/master/competition/%E7%A7%91%E5%A4%A7%E8%AE%AF%E9%A3%9EAI%E5%BC%80%E5%8F%91%E8%80%85%E5%A4%A7%E8%B5%9B2023