《专业创新实践Ⅱ》大作业 LeNet在眼疾识别数据集iChallenge-PM上的应用(上)

简介: 《专业创新实践Ⅱ》大作业 LeNet在眼疾识别数据集iChallenge-PM上的应用(上)

image.png


《专业创新实践Ⅱ》大作业

项目名称 LeNet在眼疾识别数据集iChallenge-PM上的应用

学    院  信息与通信工程学院        

                                     年级专业 20级智能科学与技术        

                                     姓    名   孙成                    

                                     学    号   20203101694            

                                     完成时间   2021-7-7                

                                     指导教师   邵春艳老师              

                          开 课 时 间 2020 2021 学年第  二  学期



一、引言


LeNet在眼疾识别数据集iChallenge-PM上的应用


iChallenge-PM是百度大脑和中山大学中山眼科中心联合举办的iChallenge比赛中,提供的关于病理性近视(Pathologic Myopia,PM)的医疗类数据集,包含1200个受试者的眼底视网膜图片,训练、验证和测试数据集各400张。



说明:


如今近视已经成为困扰人们健康的一项全球性负担,在近视人群中,有超过35%的人患有重度近视。近视会拉长眼睛的光轴,也可能引起视网膜或者络网膜的病变。随着近视度数的不断加深,高度近视有可能引发病理性病变,这将会导致以下几种症状:视网膜或者络网膜发生退化、视盘区域萎缩、漆裂样纹损害、Fuchs斑等。因此,及早发现近视患者眼睛的病变并采取治疗,显得非常重要。


二、方法


(1)数学模型


LeNet是最早的卷积神经网络之一[1]。1998年,Yann LeCun第一次将LeNet卷积神经网络应用到图像分类上,在手写数字识别任务中取得了巨大成功。LeNet通过连续使用卷积和池化层的组合提取图像特征,其架构如 图1 所示,这里展示的是用于MNIST手写体数字识别任务中的LeNet-5模型:


image.png


第一模块:包含5×5的6通道卷积和2×2的池化。卷积提取图像中包含的特征模式(激活函数使用Sigmoid),图像尺寸从28减小到24。经过池化层可以降低输出特征图对空间位置的敏感性,图像尺寸减到12。


第二模块:和第一模块尺寸相同,通道数由6增加为16。卷积操作使图像尺寸减小到8,经过池化后变成4。


第三模块:包含4×4的120通道卷积。卷积之后的图像尺寸减小到1,但是通道数增加为120。将经过第3次卷积提取到的特征图输入到全连接层。第一个全连接层的输出神经元的个数是64,第二个全连接层的输出神经元个数是分类标签的类别数,对于手写数字识别的类别数是10。然后使用Softmax激活函数即可计算出每个类别的预测概率。


(2)方法工具


1、运行环境:


image.png


image.png


百度人工智能平台Paddle


image.png


2、数据集:


眼疾识别数据集iChallenge-PM中既有病理性近视患者的眼底图片,也有非病理性近视患者的图片,命名规则如下:


病理性近视(PM):文件名以P开头

非病理性近视(non-PM):

高度近视(high myopia):文件名以H开头

正常眼睛(normal):文件名以N开头

我们将病理性患者的图片作为正样本,标签为1; 非病理性患者的图片作为负样本,标签为0。从数据集中选取两张图片,通过LeNet提取特征,构建分类器,对正负样本进行分类,并将图片显示出来。


image.png


实验过程

数据集准备

training.zip:包含训练中的图片和标签


validation.zip:包含验证集的图片


valid_gt.zip:包含验证集的标签


其中需要注意,需要将“/Users/suncheng/PycharmProjects/测试/MNIST数据集/眼疾识别/PALM-Validation-GT”目录下“PM_Label_and_Fovea_Location.xlsx”文件转存成.csv格式,本节代码示例中已经提前转成文件labels.csv。


(2)查看数据集图片


iChallenge-PM中既有病理性近视患者的眼底图片,也有非病理性近视患者的图片,命名规则如下:


病理性近视(PM):文件名以P开头

非病理性近视(non-PM):

高度近视(high myopia):文件名以H开头

正常眼睛(normal):文件名以N开头

我们将病理性患者的图片作为正样本,标签为1; 非病理性患者的图片作为负样本,标签为0。从数据集中选取两张图片,通过LeNet提取特征,构建分类器,对正负样本进行分类,并将图片显示出来。


代码如下:


  1. import os  
  2. import numpy as np  
  3. import matplotlib.pyplot as plt  
  4. %matplotlib inline  
  5. from PIL import Image  
  6.  
  7. DATADIR = '/home/aistudio/work/palm/PALM-Training400/PALM-Training400'  
  8. # 文件名以N开头的是正常眼底图片,以P开头的是病变眼底图片  
  9. file1 = 'N0012.jpg'  
  10. file2 = 'P0095.jpg'  
  11.  
  12. # 读取图片  
  13. img1 = Image.open(os.path.join(DATADIR, file1))  
  14. img1 = np.array(img1)  
  15. img2 = Image.open(os.path.join(DATADIR, file2))  
  16. img2 = np.array(img2)  
  17.  
  18. # 画出读取的图片  
  19. plt.figure(figsize=(16, 8))  
  20. f = plt.subplot(121)  
  21. f.set_title('Normal', fontsize=20)  
  22. plt.imshow(img1)  
  23. f = plt.subplot(122)  
  24. f.set_title('PM', fontsize=20)  
  25. plt.imshow(img2)  
  26. plt.show()  
  27. # 查看图片形状  
  28. img1.shape, img2.shape  
  29. ((2056, 2124, 3), (2056, 2124, 3))  
  30. 定义数据读取器
  31. 使用OpenCV从磁盘读入图片,将每张图缩放到224×224224×224大小,并且将像素值调整到[−1,1][−1,1]之间,代码如下所示:

  32. import cv2  
  33. import random  
  34. import numpy as np  
  35. import os  
  36.  
  37. # 对读入的图像数据进行预处理  
  38. def transform_img(img):  
  39.    # 将图片尺寸缩放道 224x224  
  40.    img = cv2.resize(img, (224, 224))  
  41.    # 读入的图像数据格式是[H, W, C]  
  42.    # 使用转置操作将其变成[C, H, W]  
  43.    img = np.transpose(img, (2,0,1))  
  44.    img = img.astype('float32')  
  45.    # 将数据范围调整到[-1.0, 1.0]之间  
  46.    img = img / 255.  
  47.    img = img * 2.0 - 1.0  
  48.    return img  
  49.  
  50. # 定义训练集数据读取器  
  51. def data_loader(datadir, batch_size=10, mode = 'train'):  
  52.    # 将datadir目录下的文件列出来,每条文件都要读入  
  53.    filenames = os.listdir(datadir)  
  54.    def reader():  
  55.        if mode == 'train':  
  56.            # 训练时随机打乱数据顺序  
  57.            random.shuffle(filenames)  
  58.        batch_imgs = []  
  59.        batch_labels = []  
  60.        for name in filenames:  
  61.            filepath = os.path.join(datadir, name)  
  62.            img = cv2.imread(filepath)  
  63.            img = transform_img(img)  
  64.            if name[0] == 'H' or name[0] == 'N':  
  65.                # H开头的文件名表示高度近似,N开头的文件名表示正常视力  
  66.                # 高度近视和正常视力的样本,都不是病理性的,属于负样本,标签为0  
  67.                label = 0  
  68.            elif name[0] == 'P':  
  69.                # P开头的是病理性近视,属于正样本,标签为1  
  70.                label = 1  
  71.            else:  
  72.                raise('Not excepted file name')  
  73.            # 每读取一个样本的数据,就将其放入数据列表中  
  74.            batch_imgs.append(img)  
  75.            batch_labels.append(label)  
  76.            if len(batch_imgs) == batch_size:  
  77.                # 当数据列表的长度等于batch_size的时候,  
  78.                # 把这些数据当作一个mini-batch,并作为数据生成器的一个输出  
  79.                imgs_array = np.array(batch_imgs).astype('float32')  
  80.                labels_array = np.array(batch_labels).astype('float32').reshape(-1, 1)  
  81.                yield imgs_array, labels_array  
  82.                batch_imgs = []  
  83.                batch_labels = []  
  84.  
  85.        if len(batch_imgs) > 0:  
  86.            # 剩余样本数目不足一个batch_size的数据,一起打包成一个mini-batch  
  87.            imgs_array = np.array(batch_imgs).astype('float32')  
  88.            labels_array = np.array(batch_labels).astype('float32').reshape(-1, 1)  
  89.            yield imgs_array, labels_array  
  90.  
  91.    return reader  

 

  1. # 定义验证集数据读取器  
  2. def valid_data_loader(datadir, csvfile, batch_size=10, mode='valid'):  
  3.    # 训练集读取时通过文件名来确定样本标签,验证集则通过csvfile来读取每个图片对应的标签  
  4.    # 请查看解压后的验证集标签数据,观察csvfile文件里面所包含的内容  
  5.    # csvfile文件所包含的内容格式如下,每一行代表一个样本,  
  6.    # 其中第一列是图片id,第二列是文件名,第三列是图片标签,  
  7.    # 第四列和第五列是Fovea的坐标,与分类任务无关  
  8.    # ID,imgName,Label,Fovea_X,Fovea_Y  
  9.    # 1,V0001.jpg,0,1157.74,1019.87  
  10.    # 2,V0002.jpg,1,1285.82,1080.47  
  11.    # 打开包含验证集标签的csvfile,并读入其中的内容  
  12.    filelists = open(csvfile).readlines()  
  13.    def reader():  
  14.        batch_imgs = []  
  15.        batch_labels = []  
  16.        for line in filelists[1:]:  
  17.            line = line.strip().split(',')  
  18.            name = line[1]  
  19.            label = int(line[2])  
  20.            # 根据图片文件名加载图片,并对图像数据作预处理  
  21.            filepath = os.path.join(datadir, name)  
  22.            img = cv2.imread(filepath)  
  23.            img = transform_img(img)  
  24.            # 每读取一个样本的数据,就将其放入数据列表中  
  25.            batch_imgs.append(img)  
  26.            batch_labels.append(label)  
  27.            if len(batch_imgs) == batch_size:  
  28.                # 当数据列表的长度等于batch_size的时候,  
  29.                # 把这些数据当作一个mini-batch,并作为数据生成器的一个输出  
  30.                imgs_array = np.array(batch_imgs).astype('float32')  
  31.                labels_array = np.array(batch_labels).astype('float32').reshape(-1, 1)  
  32.                yield imgs_array, labels_array  
  33.                batch_imgs = []  
  34.                batch_labels = []  
  35.  
  36.        if len(batch_imgs) > 0:  
  37.            # 剩余样本数目不足一个batch_size的数据,一起打包成一个mini-batch  
  38.            imgs_array = np.array(batch_imgs).astype('float32')  
  39.            labels_array = np.array(batch_labels).astype('float32').reshape(-1, 1)  
  40.            yield imgs_array, labels_array  
  41.  
  42.    return reader  
  43. # 查看数据形状  
  44. DATADIR = '/home/aistudio/work/palm/PALM-Training400/PALM-Training400'  
  45. train_loader = data_loader(DATADIR,  
  46.                           batch_size=10, mode='train')  
  47. data_reader = train_loader()  
  48. data = next(data_reader)  
  49. data[0].shape, data[1].shape  
  50.  
  51. eval_loader = data_loader(DATADIR,  
  52.                           batch_size=10, mode='eval')  
  53. data_reader = eval_loader()  
  54. data = next(data_reader)  
  55. data[0].shape, data[1].shape  




相关文章
|
机器学习/深度学习 人工智能 算法
一文让你了解AI产品的测试 评价人工智能算法模型的几个重要指标
一文让你了解AI产品的测试 评价人工智能算法模型的几个重要指标
1031 0
一文让你了解AI产品的测试 评价人工智能算法模型的几个重要指标
|
机器学习/深度学习 算法 搜索推荐
阿里云机器学习平台PAI与香港大学合作论文入选INFOCOM 2022,有效减少大规模神经网络训练时间
近日,阿里云机器学习平台 PAI 与香港大学吴川教授团队合作的论文”Efficient Pipeline Planning for Expedited Distributed DNN Training”入选INFOCOM(IEEE International Conference on Computer Communications) 2022,论文提出了一个支持任意网络拓扑的同步流水线并行训练算法,有效减少大规模神经网络的训练时间。
阿里云机器学习平台PAI与香港大学合作论文入选INFOCOM 2022,有效减少大规模神经网络训练时间
|
12天前
|
人工智能 测试技术 PyTorch
AI计算机视觉笔记二十四:YOLOP 训练+测试+模型评估
本文介绍了通过正点原子的ATK-3568了解并实现YOLOP(You Only Look Once for Panoptic Driving Perception)的过程,包括训练、测试、转换为ONNX格式及在ONNX Runtime上的部署。YOLOP由华中科技大学团队于2021年发布,可在Jetson TX2上达到23FPS,实现了目标检测、可行驶区域分割和车道线检测的多任务学习。文章详细记录了环境搭建、训练数据准备、模型转换和测试等步骤,并解决了ONNX转换过程中的问题。
|
4月前
|
人工智能
全方位解析PAI:数据准备、模型开发、模型训练一网打尽
全方位解析PAI:数据准备、模型开发、模型训练一网打尽 随着人工智能技术的飞速发展,越来越多的企业开始关注并投入到AI的研发中。然而,AI的研发并非易事,从数据准备、模型开发、模型训练到模型服务,每一个环节都需要专业的工具和平台来支持。阿里云的PAI(Powered by AI)正是一个涵盖了数据准备、模型开发、模型训练、模型服务全流程的AI工作平台。本文将为您详细介绍PAI的各个子产品的产品线上规格及使用指引。
107 2
|
4月前
|
人工智能 Ubuntu C++
极智AI | ncnn模型转换及量化流程
本文介绍一下 ncnn 模型转换及量化流程,以 from_darknet yolov4 为例。
277 0
|
机器学习/深度学习 数据可视化 算法
【机器学习入门与实践】数据挖掘-二手车价格交易预测(含EDA探索、特征工程、特征优化、模型融合等)
【机器学习入门与实践】数据挖掘-二手车价格交易预测(含EDA探索、特征工程、特征优化、模型融合等)
|
算法 数据可视化 计算机视觉
Swin-Transformer再次助力夺冠 | Kaggle第1名方案解读(工程人员建议必看)
Swin-Transformer再次助力夺冠 | Kaggle第1名方案解读(工程人员建议必看)
221 0
|
机器学习/深度学习 人工智能 算法
浙大团队基于ML的抗菌肽筛选模型,可识别整个肽库空间发现新药
浙大团队基于ML的抗菌肽筛选模型,可识别整个肽库空间发现新药
216 0
|
机器学习/深度学习 人工智能 运维
ECCV 2022 Oral | 无需微调即可推广,上交大、上海人工智能实验室等提出基于配准的少样本异常检测框架
ECCV 2022 Oral | 无需微调即可推广,上交大、上海人工智能实验室等提出基于配准的少样本异常检测框架
126 0
|
机器学习/深度学习 存储 人工智能
钻石价格预测的ML全流程!从模型构建调优道部署应用!⛵
本文结合 6000 颗钻石的数据,通过克拉重量、切工、颜色和其他特征等属性来预测钻石价格。这是一个完整的企业级建模案例,包含从探索性数据分析、数据准备、模型选择/训练/调优、模型保存和部署的全流程。案例用到的 PyCaret 和 FastAPI 是非常高效的工具,推荐!【代码与数据集亲测可运行】
4565 1
钻石价格预测的ML全流程!从模型构建调优道部署应用!⛵