脑PET图像分析和疾病预测挑战赛baseline——结果可达0.76左右——科大讯飞2020年度开发者大赛

大赛网址:http://challenge.xfyun.cn/topic/info?type=PET

赛事说明及要求请查看上面网址。数据下载需要实名认证,这里提供[百度网盘下载地址] (提取码:4hz2)。

赛题数据

赛题数据分训练集和测试集。

  • 训练集分CN和AD两种类别的图像,每个类别一个文件夹共1千张,因此训练集共2千张图像。
  • 测试集有1千张图像,当然是没有标签的,需要我们训练模型预测是AD还是CN,结果以CSV形式提交。大赛网站提供了提交模板。

      

  

  

可以发现训练集中图像尺寸各不一样,为了清楚地了解图像中都有哪些尺寸,可使用如下代码进行遍历:

import cv2
import globtrain_image_path = glob.glob(r"data\train\*\*.png")
sizeSet = set()for i in train_image_path:img = cv2.imread(i)sizeSet.add(img.shape[:2])print(sizeSet)

输出:

{(256, 256), (168, 168), (336, 336), (128, 128)}

因此,需要注意:赛题图像有四种大小:128*128、168*168、256*256、336*336。

0. 导入所需的库

# -*- coding: utf-8 -*-
import os, sys, glob, argparse
import pandas as pd
import numpy as np
from tqdm import tqdmimport time, datetime
import pdb, tracebackimport cv2
# import imagehash
from PIL import Imagefrom sklearn.model_selection import train_test_split, StratifiedKFold, KFold# from efficientnet_pytorch import EfficientNet
# model = EfficientNet.from_pretrained('efficientnet-b4') import torch
torch.manual_seed(0)
torch.backends.cudnn.deterministic = False
torch.backends.cudnn.benchmark = Trueimport torchvision.models as models
import torchvision.transforms as transforms
import torchvision.datasets as datasets
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.autograd import Variable
from torch.utils.data.dataset import Datasetfor i in (pd, np, torch):print("{}: {}".format(i.__name__, i.__version__))

输出:

pandas: 0.24.2
numpy: 1.17.4
torch: 1.5.1+cu101

1. 训练代码:

# input dataset
train_jpg = np.array(glob.glob(r'data\train\*\*.png'))class QRDataset(Dataset):def __init__(self, train_jpg, transform=None):self.train_jpg = train_jpgif transform is not None:self.transform = transformelse:self.transform = Nonedef __getitem__(self, index):start_time = time.time()img = Image.open(self.train_jpg[index]).convert('RGB')if self.transform is not None:img = self.transform(img)return img,torch.from_numpy(np.array(int('AD' in self.train_jpg[index])))def __len__(self):return len(self.train_jpg)def accuracy(output, target, topk=(1,)):"""Computes the accuracy over the k top predictions for the specified values of k"""with torch.no_grad():maxk = max(topk)batch_size = target.size(0)_, pred = output.topk(maxk, 1, True, True)pred = pred.t()correct = pred.eq(target.view(1, -1).expand_as(pred))res = []for k in topk:correct_k = correct[:k].view(-1).float().sum(0, keepdim=True)res.append(correct_k.mul_(100.0 / batch_size))return resclass AverageMeter(object):"""Computes and stores the average and current value"""def __init__(self, name, fmt=':f'):self.name = nameself.fmt = fmtself.reset()def reset(self):self.val = 0self.avg = 0self.sum = 0self.count = 0def update(self, val, n=1):self.val = valself.sum += val * nself.count += nself.avg = self.sum / self.countdef __str__(self):fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})'return fmtstr.format(**self.__dict__)class ProgressMeter(object):def __init__(self, num_batches, *meters):self.batch_fmtstr = self._get_batch_fmtstr(num_batches)self.meters = metersself.prefix = ""def pr2int(self, batch):entries = [self.prefix + self.batch_fmtstr.format(batch)]entries += [str(meter) for meter in self.meters]print('\t'.join(entries))def _get_batch_fmtstr(self, num_batches):num_digits = len(str(num_batches // 1))fmt = '{:' + str(num_digits) + 'd}'return '[' + fmt + '/' + fmt.format(num_batches) + ']'class VisitNet(nn.Module):def __init__(self):super(VisitNet, self).__init__()model = models.resnet34(True)model.avgpool = nn.AdaptiveAvgPool2d(1)model.fc = nn.Linear(512, 2)self.resnet = modeldef forward(self, img):        out = self.resnet(img)return outdef validate(val_loader, model, criterion):batch_time = AverageMeter('Time', ':6.3f')losses = AverageMeter('Loss', ':.4e')top1 = AverageMeter('Acc@1', ':6.2f')top5 = AverageMeter('Acc@2', ':6.2f')progress = ProgressMeter(len(val_loader), batch_time, losses, top1, top5)# switch to evaluate modemodel.eval()with torch.no_grad():end = time.time()for i, (input, target) in enumerate(val_loader):input = input.cuda()target = target.cuda().long()# compute outputoutput = model(input)loss = criterion(output, target)# measure accuracy and record lossacc1, acc5 = accuracy(output, target, topk=(1, 2))losses.update(loss.item(), input.size(0))top1.update(acc1[0], input.size(0))top5.update(acc5[0], input.size(0))# measure elapsed timebatch_time.update(time.time() - end)end = time.time()# TODO: this should also be done with the ProgressMeterprint(' * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}'.format(top1=top1, top5=top5))return top1def predict(test_loader, model, tta=10):# switch to evaluate modemodel.eval()test_pred_tta = Nonefor _ in range(tta):test_pred = []with torch.no_grad():end = time.time()for i, (input, target) in enumerate(test_loader):input = input.cuda()target = target.cuda()# compute outputoutput = model(input, path)output = output.data.cpu().numpy()test_pred.append(output)test_pred = np.vstack(test_pred)if test_pred_tta is None:test_pred_tta = test_predelse:test_pred_tta += test_predreturn test_pred_ttadef train(train_loader, model, criterion, optimizer, epoch):batch_time = AverageMeter('Time', ':6.3f')# data_time = AverageMeter('Data', ':6.3f')losses = AverageMeter('Loss', ':.4e')top1 = AverageMeter('Acc@1', ':6.2f')# top5 = AverageMeter('Acc@5', ':6.2f')progress = ProgressMeter(len(train_loader), batch_time, losses, top1)# switch to train modemodel.train()end = time.time()for i, (input, target) in enumerate(train_loader):input = input.cuda(non_blocking=True)target = target.cuda(non_blocking=True).long()# compute outputoutput = model(input)loss = criterion(output, target)# measure accuracy and record lossacc1, acc5 = accuracy(output, target, topk=(1, 2))losses.update(loss.item(), input.size(0))top1.update(acc1[0], input.size(0))# top5.update(acc5[0], input.size(0))# compute gradient and do SGD stepoptimizer.zero_grad()loss.backward()optimizer.step()# measure elapsed timebatch_time.update(time.time() - end)end = time.time()if i % 100 == 0:progress.pr2int(i)skf = KFold(n_splits=10, random_state=233, shuffle=True)
for flod_idx, (train_idx, val_idx) in enumerate(skf.split(train_jpg, train_jpg)):    train_loader = torch.utils.data.DataLoader(QRDataset(train_jpg[train_idx],transforms.Compose([# transforms.RandomGrayscale(),transforms.Resize((512, 512)),transforms.RandomAffine(10),# transforms.ColorJitter(hue=.05, saturation=.05),# transforms.RandomCrop((450, 450)),transforms.RandomHorizontalFlip(),transforms.RandomVerticalFlip(),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])#), batch_size=10, shuffle=True, num_workers=20, pin_memory=True), batch_size=10, shuffle=True, num_workers=0, pin_memory=True)val_loader = torch.utils.data.DataLoader(QRDataset(train_jpg[val_idx],transforms.Compose([transforms.Resize((512, 512)),# transforms.Resize((124, 124)),# transforms.RandomCrop((450, 450)),# transforms.RandomCrop((88, 88)),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])#), batch_size=10, shuffle=False, num_workers=10, pin_memory=True), batch_size=10, shuffle=False, num_workers=0, pin_memory=True)model = VisitNet().cuda()# model = nn.DataParallel(model).cuda()criterion = nn.CrossEntropyLoss().cuda()optimizer = torch.optim.SGD(model.parameters(), 0.01)scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=4, gamma=0.85)best_acc = 0.0for epoch in range(10):scheduler.step()print('Epoch: ', epoch)train(train_loader, model, criterion, optimizer, epoch)val_acc = validate(val_loader, model, criterion)if val_acc.avg.item() > best_acc:best_acc = val_acc.avg.item()torch.save(model.state_dict(), r'model_pytorch\resnet18_fold{0}.pt'.format(flod_idx))break

输出:

Epoch:  0
[  0/180]	Time 11.350 (11.350)	Loss 8.3745e-01 (8.3745e-01)	Acc@1  50.00 ( 50.00)
[100/180]	Time  0.358 ( 0.471)	Loss 1.2588e+00 (8.5685e-01)	Acc@1  50.00 ( 57.43)* Acc@1 68.000 Acc@5 100.000
Epoch:  1
[  0/180]	Time  0.280 ( 0.280)	Loss 2.0223e-01 (2.0223e-01)	Acc@1  90.00 ( 90.00)
[100/180]	Time  0.365 ( 0.365)	Loss 1.0570e+00 (5.5575e-01)	Acc@1  50.00 ( 74.06)* Acc@1 49.500 Acc@5 100.000
Epoch:  2
[  0/180]	Time  0.271 ( 0.271)	Loss 4.6693e-01 (4.6693e-01)	Acc@1  80.00 ( 80.00)
[100/180]	Time  0.364 ( 0.364)	Loss 7.1321e-01 (4.3906e-01)	Acc@1  70.00 ( 81.09)* Acc@1 50.500 Acc@5 100.000
Epoch:  3
[  0/180]	Time  0.286 ( 0.286)	Loss 9.2954e-01 (9.2954e-01)	Acc@1  50.00 ( 50.00)
[100/180]	Time  0.360 ( 0.367)	Loss 4.1622e-01 (3.5760e-01)	Acc@1  80.00 ( 84.55)* Acc@1 79.000 Acc@5 100.000
Epoch:  4
[  0/180]	Time  0.261 ( 0.261)	Loss 4.8178e-01 (4.8178e-01)	Acc@1  70.00 ( 70.00)
[100/180]	Time  0.363 ( 0.363)	Loss 7.1621e-01 (3.2671e-01)	Acc@1  60.00 ( 85.74)* Acc@1 95.000 Acc@5 100.000
Epoch:  5
[  0/180]	Time  0.268 ( 0.268)	Loss 3.6726e-01 (3.6726e-01)	Acc@1  90.00 ( 90.00)
[100/180]	Time  0.362 ( 0.367)	Loss 1.1221e-01 (2.2348e-01)	Acc@1 100.00 ( 90.79)* Acc@1 92.000 Acc@5 100.000
Epoch:  6
[  0/180]	Time  0.257 ( 0.257)	Loss 3.8822e-02 (3.8822e-02)	Acc@1 100.00 (100.00)
[100/180]	Time  0.365 ( 0.366)	Loss 7.4892e-01 (2.6901e-01)	Acc@1  80.00 ( 88.81)* Acc@1 86.000 Acc@5 100.000
...

2. 测试代码:

# -*- coding: utf-8 -*-
import os, sys, glob, argparse
import pandas as pd
import numpy as np
from tqdm import tqdmimport time, datetime
import pdb, tracebackimport cv2
# import imagehash
from PIL import Imagefrom sklearn.model_selection import train_test_split, StratifiedKFold, KFold# from efficientnet_pytorch import EfficientNet
# model = EfficientNet.from_pretrained('efficientnet-b4') import torch
torch.manual_seed(0)
torch.backends.cudnn.deterministic = False
torch.backends.cudnn.benchmark = Trueimport torchvision.models as models
import torchvision.transforms as transforms
import torchvision.datasets as datasets
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.autograd import Variable
from torch.utils.data.dataset import Datasetclass QRDataset(Dataset):def __init__(self, train_jpg, transform=None):self.train_jpg = train_jpgif transform is not None:self.transform = transformelse:self.transform = Nonedef __getitem__(self, index):start_time = time.time()img = Image.open(self.train_jpg[index]).convert('RGB')if self.transform is not None:img = self.transform(img)return img,torch.from_numpy(np.array(int('AD' in self.train_jpg[index])))def __len__(self):return len(self.train_jpg)class VisitNet(nn.Module):def __init__(self):super(VisitNet, self).__init__()model = models.resnet34(True)model.avgpool = nn.AdaptiveAvgPool2d(1)model.fc = nn.Linear(512, 2)self.resnet = model#         model = EfficientNet.from_pretrained('efficientnet-b4') 
#         model._fc = nn.Linear(1792, 2)
#         self.resnet = modeldef forward(self, img):        out = self.resnet(img)return outdef predict(test_loader, model, tta=10):# switch to evaluate modemodel.eval()test_pred_tta = Nonefor _ in range(tta):test_pred = []with torch.no_grad():end = time.time()for i, (input, target) in enumerate(test_loader):input = input.cuda()target = target.cuda()# compute outputoutput = model(input)output = output.data.cpu().numpy()test_pred.append(output)test_pred = np.vstack(test_pred)if test_pred_tta is None:test_pred_tta = test_predelse:test_pred_tta += test_predreturn test_pred_ttatest_jpg = [r'data\test\AD&CN\{0}.png'.format(x) for x in range(1, 1001)]
test_jpg = np.array(test_jpg)test_pred = None
for model_path in ['resnet18_fold0.pt', 'resnet18_fold1.pt', 'resnet18_fold2.pt','resnet18_fold3.pt', 'resnet18_fold4.pt', 'resnet18_fold5.pt','resnet18_fold6.pt', 'resnet18_fold7.pt', 'resnet18_fold8.pt',#'resnet18_fold9.pt'][:1]:'resnet18_fold9.pt']:test_loader = torch.utils.data.DataLoader(QRDataset(test_jpg,transforms.Compose([transforms.Resize((512, 512)),# transforms.CenterCrop((450, 450)),transforms.RandomHorizontalFlip(),transforms.RandomVerticalFlip(),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])#), batch_size=10, shuffle=False, num_workers=10, pin_memory=True), batch_size=10, shuffle=False, num_workers=0, pin_memory=True)model = VisitNet().cuda()model_path = os.path.join("model_pytorch", model_path)model.load_state_dict(torch.load(model_path))# model = nn.DataParallel(model).cuda()if test_pred is None:test_pred = predict(test_loader, model, 5)else:test_pred += predict(test_loader, model, 5)test_csv = pd.DataFrame()
test_csv['uuid'] = list(range(1, 1001))
test_csv['label'] = np.argmax(test_pred, 1)
test_csv['label'] = test_csv['label'].map({1: 'AD', 0: 'CN'})
test_csv.to_csv('tmp.csv', index=None)

测试结果将保存到tmp.csv文件中,可以将此文件作为结果提交到大赛网站,如下图所示:

刚提交完的状态:

提交完刷新一下,新快就能出结果:

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/36826.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

脑机接口005 | “中国脑计划”:向最后的前沿进发!

Hello, 大家好,这里是壹脑云科技圈,我是叮叮~ 在很长的历史时期,我们都以为是心在操纵着我们人类的思维!历史上也有很多“心”学理论。 其中最著名的莫过于王阳明先生,而致良知则是王阳明先生心学的核心…

脑机接口科普0013——中枢神经与周围神经

本文禁止转载!!! 提到脑机接口,不得不提到生物学中的中枢神经与周围神经。下图中左边即为中枢神经,右边即为周围神经。 可以用下面这个图概括神经系统: 也就是说,人的所有行为:行走…

转发,脑机接口领域又一重要成果!

来源:传感器技术 作者:余淼 硕士学历,长期从事智能传感控制、信息通信领域研究工作。 “ 以脑-机交互(BCI)为核心的神经工程技术,让人类真正可以做到“心想事成”。 据首都医科大学官网报道,首都…

TUH癫痫脑电数据集下载

TUH癫痫脑电数据集下载 一、准备工作 1.wget安装 数据集的下载需要用到wget工具,如果是linux或者是macos操作系统可以直接下载,我这里是Windows操作系统,就需要先安装wget,首先打开 weget下载网址去下载wget,我下载…

CHB-MIT波士顿儿童医院癫痫EEG脑电数据处理-2D-CNN(四)

主要内容 1、数据提取2、提取过程 1、数据提取 本次教程做适用于整体数据集上的处理工作,以不同的的处理代码展示整体的数据处理! 本次数据处理教程是没有做STFT变换,之间将提取的数据变换为适合2D-CNN输入的数据,以适应使用2D-C…

脑机接口实例二:脑电信号CSP处理

文章目录 前言一、实例说明1.1 期望目标1.2 数据解读 二、实例代码及结果分析2.1 MATLAB代码2.2 运行结果及分析 三、问题与反思四、下一阶段计划 前言 本文在实例一的基础之上,选用BCI大赛08年数据集,基于CSP的特征提取,运用AdaBoost算法进…

人工智能在生物信号领域的应用——脑机接口

4月1日愚人节,雾帜智能发了一篇文章,内容是关于“雾帜智能成功完成基于脑机接口技术的梦境捕捉与还原技术的概念验证,并发布了一款新的人工智能产品:智能睡枕HoneyPillow‍。该产品将一举解决你我所有关于做梦的系列问题。”但是呢…

CHB-MIT波士顿儿童医院癫痫EEG脑电数据处理-通道选择(五)

CHB-MIT波士顿儿童医院癫痫EEG脑电数据处理-通道选择(五) 概述通道选择模型通道选择LightGBM模块代码LightGBM模型训练 概述 由于癫痫发作时不是整个大脑区域都有相关的反映,因此 EEG 信号在不同的 EEG 通道上有着不同的表现形式。癫痫发作时…

《脑机接口导论》学习笔记 3.记录大脑的信号和刺激大脑

本章,我们将对大脑中神经元电信号的记录与对神经元进行刺激的技术手段进行了解,并分析各项技术的优劣性与适用性,从而探究这些技术用于BCI输入信号的获取以及通过此类技术使BCI达成交互的可行性。 目录 3.记录大脑的信号和刺激大脑 3.1 记…

CHB-MIT波士顿儿童医院癫痫EEG脑电数据处理(二)

主要内容 1、数据提取2、制作数据样本-数据分快3、过程展示 1、数据提取 本次教程以chb01患者的数据为例: 首先提取该患者的eeg数据: 在数据提取中就完成滤波:(0~50Hz) from mne import Epochs, pick_types, events_…

脑机接口信号基本操作回顾

2023/1/2 -1/3脑机接口学习内容一览: 这一篇博客主要是对自己这几个星期学习脑机接口基本操作情况的总结,对刚进入这个领域、感觉有些迷茫的同学来说可能会有一定的参考价值。 这项工作主要考验自己对脑电信号基本处理流程的熟悉程度,在写代码…

《考试脑科学》

给大家推荐《考试脑科学》这本书。 作者介绍:池谷裕二,日本东京大学药学系研究科教授,脑科学研究者。1970年生于日本静冈县,1998年取得日本东京大学药学博士学位,2002年起担任美国哥伦比亚大学客座研究员。专业为神经…

正经聊一聊脑机接口的发展现状|脑科学开放日

杨净 发自 凹非寺 量子位 报道 | 公众号 QbitAI 众所周知,睡眠是维持生命的必需品。 先前的研究已经表明,睡眠不足会导致许多严重的疾病,比如…… 好,不要说了。 srds(虽然但是),说了那么多次&a…

017利用颅内和头皮脑电图进行癫痫预测的卷积神经网络2018

Convolutional neural networks for seizure prediction using intracranial and scalp electroencephalogram ABSTRACT 癫痫发作预测作为改善耐药癫痫和强直性癫痫患者生活的最具挑战性的预测数据分析工作之一,越来越受到关注。许多杰出的研究报告了在提供合理的间…

003基于神经网络的癫痫脑电信号检测与分类

Neural Network Based Epileptic EEG Detection and Classification ABSTRACT 及时诊断对挽救癫痫患者的生命至关重要。在过去的几年里,有很多治疗癫痫的方法。这些治疗需要使用抗癫痫药物,但对控制癫痫发作频率无效。需要通过手术切除受影响的区域。 …

脑机接口科普0010——研究脑机接口的大学和机构

本文禁止转载!!!! 之前脑机接口科普0003——Hans Berger_sgmcy的博客-CSDN博客介绍了,德国的精神病学教授,Hans Berger ,在耶拿大学工作研究记录了EEG脑电图。 本文就介绍一下,目前…

chatgpt赋能python:Python如何屏蔽鼠标输入

Python如何屏蔽鼠标输入 介绍 在进行Python编程时,我们经常需要在程序中进行键盘输入操作,但是有些情况下需要屏蔽鼠标输入,以避免产生干扰。本文将介绍Python如何屏蔽鼠标输入的方法。 屏蔽鼠标输入的方法 Python提供了多种方法屏蔽鼠标…

某211本科程序员:我才不想去大厂!我当外包18k,大厂才22k,面试难,绩效费心血,外包混混不爽吗?

现在的年轻人都摆烂到什么程度了呢? 一位211本科毕业的前端程序员发帖称“自己对大厂毫无感觉”“不想去大厂”,因为找工作时外包18k,大厂才22k,面试难太多,还有绩效费心血,在外包混混不爽吗? …

如何使用multipart/form-data格式上传文件

------------------------------------------------------------------大家好,我是许飞,微软拼音的开发实习生。在网络编程中,经常用到从服务器上“下载”一些数据,有时却要向服务器“上传”数据。曾在一个原型中使用了“multipart/form-data”格式向Web服务器上传文件,这…

http post 使用multipart/form-data 格式数据 上传文件(图片)

由于工作上的需求,这两天对接了个php的接口,上传文件必须使用固定格式,下面看下需要上传的格式,从图片中可以看出,多个图片数据是使用boundary分割的,并且在每个数据体内(即从分割符到下一个分割…