《专业创新实践Ⅱ》大作业 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  




相关文章
|
异构计算 Python
《专业创新实践Ⅱ》大作业 LeNet在眼疾识别数据集iChallenge-PM上的应用(中)
《专业创新实践Ⅱ》大作业 LeNet在眼疾识别数据集iChallenge-PM上的应用(中)
310 0
《专业创新实践Ⅱ》大作业 LeNet在眼疾识别数据集iChallenge-PM上的应用(中)
|
机器学习/深度学习 人工智能 计算机视觉
《专业创新实践Ⅱ》大作业 LeNet在眼疾识别数据集iChallenge-PM上的应用(下)
《专业创新实践Ⅱ》大作业 LeNet在眼疾识别数据集iChallenge-PM上的应用(下)
282 0
《专业创新实践Ⅱ》大作业 LeNet在眼疾识别数据集iChallenge-PM上的应用(下)
|
机器学习/深度学习 数据可视化
机器学习实战三: 预测汽车油耗效率 MPG
机器学习实战三: 预测汽车油耗效率 MPG
机器学习实战三: 预测汽车油耗效率 MPG
|
机器学习/深度学习 人工智能 算法
浙大团队基于ML的抗菌肽筛选模型,可识别整个肽库空间发现新药
浙大团队基于ML的抗菌肽筛选模型,可识别整个肽库空间发现新药
269 0
|
机器学习/深度学习 数据可视化 算法
工业蒸汽量预测比赛全流程解析(附详细Python代码)
本文所采用的数据集来自于阿里云天池比赛,描述了整个数据挖掘的过程及详细代码,共尝试了5套机器学习算法
3478 0
工业蒸汽量预测比赛全流程解析(附详细Python代码)
|
机器学习/深度学习 人工智能 Android开发
【直播】机器学习就用PAI,带你一起现场训练热狗识别模型!
看过美剧《硅谷》的同学都知道人工智能识别热狗曾是硅谷最赚钱的技术之一。去年 HBO 发布了官方的 Not Hotdog 应用,支持 iOS 和 Android 平台,据说是用 TensorFlow、Keras 和 React Native 打造的,但是源码没有公开。
2009 0
|
机器学习/深度学习 数据采集 算法
【机器学习PAI实践一】搭建心脏病预测案例
产品地址:https://data.aliyun.com/product/learn?spm=a21gt.99266.416540.102.OwEfx2 一、背景 心脏病是人类健康的头号杀手。全世界1/3的人口死亡是因心脏病引起的,而我国,每年有几十万人死于心脏病。 所以,如果可以通过提取人体相关的体侧指标,通过数据挖掘的方式来分析不同特征对于心脏病的影响,对于预测和
2913 0
|
机器学习/深度学习 SQL 分布式计算
【机器学习PAI实践二】人口普查统计
产品地址:https://data.aliyun.com/product/learn?spm=a21gt.99266.416540.102.OwEfx2 一、背景 感谢大家关注玩转数据系列文章,我们希望通过在阿里云机器学习平台上提供demo数据并搭建相关的实验流程的方式来帮助大家学习如何通过算法来挖掘数据中的价值。本系列文章包含详细的实验流程以及相关的文档教程,欢迎大
1742 0
|
9月前
|
人工智能
全方位解析PAI:数据准备、模型开发、模型训练一网打尽
全方位解析PAI:数据准备、模型开发、模型训练一网打尽 随着人工智能技术的飞速发展,越来越多的企业开始关注并投入到AI的研发中。然而,AI的研发并非易事,从数据准备、模型开发、模型训练到模型服务,每一个环节都需要专业的工具和平台来支持。阿里云的PAI(Powered by AI)正是一个涵盖了数据准备、模型开发、模型训练、模型服务全流程的AI工作平台。本文将为您详细介绍PAI的各个子产品的产品线上规格及使用指引。
233 2

热门文章

最新文章