飞桨常规赛:PALM病理性近视预测 6月第3名方案
【常规赛:PALM病理性近视预测】方案
比赛地址: https://aistudio.baidu.com/aistudio/competition/detail/85
一、赛题介绍
1. 赛题简介
PALM病理性近视预测常规赛的重点是研究和发展与病理性近视诊断相关的算法。该常规赛的目标是评估和比较在一个常见的视网膜眼底图像数据集上检测病理性近视的自动算法。具体任务是将提供的图像分为病理性近视眼底彩照和非病理性近视眼底彩照,其中,非病理性近视眼底彩照包括正常眼底和高度近视眼底彩照。
2.数据简介
PALM病理性近视预测常规赛由中山大学中山眼科中心提供800张带病理性近视分类标注的眼底彩照供选手训练模型,另提供400张带标注数据供平台进行模型测试。
3. 数据说明
本次常规赛提供的病理性近视分类金标准是从临床报告中获取,不仅基于眼底彩照,还结合了OCT、视野检查等结果。
4. 训练数据集
文件名称:Train
Train文件夹里有一个fundus_image文件夹和一个Classification.xlsx文件。fundus_image文件夹中数据均为眼底彩照,分辨率为1444×1444,或2124×2056。命名形如N0001.jpg、H0001.jpg、P0001.jpg和V0001.jpg。Classification.xlsx文件中为各眼底图像是否属于病理性近视,属于为1,不属于为0。
5.测试数据集
文件名称:PALM-Testing400-Images 文件夹里包含400张眼底彩照,命名形如T0001.jpg。
6.提交内容及格式
分类结果应在一个名为“Classification_Results.csv”的CSV文件中提供,第一列对应测试眼底图像的文件名(包括扩展名“.jpg”),对应title为FileName;第二列包含诊断为PM的患者图像的分类预测概率(值从0.0到1.0),对应title为PM Risk。示例如下:
7.权重文件
时间太久删除了,不过使用此项目你也可以得到同样的效果
项目结构
-|data
-|work
-README.MD
-xxx.ipynb
使用方式
A:在AI Studio上运行本项目
GitHub链接:https://github.com/xuejishu/-PALM-6-3-/edit/main/README.md
二、数据处理
#1.数据初步处理
#解压缩
#重命名文件夹
#删除临时文件夹
In [3]
!unzip -qao data/data85133/常规赛:PALM病理性近视预测.zip
In [4]
!mv '常规赛:PALM病理性近视预测' dataset
In [5]
!rm __MACOSX/ -rf
#2.划分训练集和测试集
In [6]
# 划分训练集和测试集
import pandas as pd
import random
train_excel_file = 'dataset/Train/Classification.xlsx'
pd_list=pd.read_excel(train_excel_file)
pd_list_lenght=len(pd_list)
# 乱序
pd_list=pd_list.sample(frac=1)
offset=int(pd_list_lenght*0.9)
trian_list=pd_list[:offset]
eval_list=pd_list[offset:]
trian_list.to_csv("train_list.txt", index=None, header=None, sep=' ')
eval_list.to_csv("eval_list.txt", index=None, header=None, sep=' ')
三、PaddleX配置
#1.paddlex安装
In [1]
! pip install paddlex -i https://mirror.baidu.com/pypi/simple
#2.GPU设置、包引入
In [2]
# 设置使用0号GPU卡(如无GPU,执行此代码后仍然会使用CPU训练模型)
import matplotlib
matplotlib.use('Agg')
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
import paddlex as pdx
3.数据增强配置
from paddlex.cls import transforms
train_transforms = transforms.Compose([
transforms.RandomCrop(crop_size=1440),
transforms.RandomHorizontalFlip(),
transforms.Normalize()
])
eval_transforms = transforms.Compose([
transforms.ResizeByShort(short_size=1444),
transforms.CenterCrop(crop_size=1440),
transforms.Normalize()
])
4.数据集配置
train_dataset = pdx.datasets.ImageNet(
data_dir='dataset/Train/fundus_image',
file_list='train_list.txt',
label_list='train_list.txt',
transforms=train_transforms,
shuffle=True)
eval_dataset = pdx.datasets.ImageNet(
data_dir='dataset/Train/fundus_image',
file_list='eval_list.txt',
label_list='train_list.txt',
transforms=eval_transforms)
四、开始训练
model = pdx.cls.MobileNetV3_small_ssld(num_classes=2)
model.train(num_epochs=64,
train_dataset=train_dataset,
train_batch_size=32,
eval_dataset=eval_dataset,
lr_decay_epochs=[4, 6, 8],
save_interval_epochs=1,
learning_rate=0.025,
save_dir='output/mobilenetv3_small_ssld',
# resume_checkpoint='output/mobilenetv3_small_ssld/epoch_18',
use_vdl=True)
五、开始预测
# 设置使用0号GPU卡(如无GPU,执行此代码后仍然会使用CPU训练模型)
import matplotlib
matplotlib.use('Agg')
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
import paddlex as pdx
# 预测数据集val_list
val_list=[]
for i in range(1,401,1):
# for i in range(1,201,1):
filename='T'+ str(i).zfill(4)+'.jpg'
# print(filename)
val_list.append(filename+'\n')
with open('val_list.txt','w') as f:
f.writelines(val_list)
val_list=[]
with open('val_list.txt', 'r') as f:
for line in f:
line='dataset/PALM-Testing400-Images/'+line
val_list.append(line.split('\n')[0])
# print(line.split('\n')[0])
# print(val_list)
print(len(val_list))
import paddlex as pdx
result_list=[]
model = pdx.load_model('output/mobilenetv3_small_ssld/best_model')
for image_name in val_list:
result = model.predict(image_name, topk=2)
result_list.append(result)
print("Predict Result:", result)
保存结果
# 结果列
pd_B=[]
for item in result_list:
# print(item)
if item[0]['category_id']==1:
pd_B.append(item[0]['score'])
else:
pd_B.append(item[1]['score'])
# 文件名列
pd_A=[]
with open('val_list.txt', 'r') as f:
for line in f:
pd_A.append(line.split('\n')[0])
# print(line.split('\n')[0])
import pandas as pd
df= pd.DataFrame({'FileName': pd_A, 'PM Risk':pd_B})
# 保存为提交文件
df.to_csv("Classification_Results.csv", index=None)