《专业创新实践Ⅱ》大作业 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产品的测试 评价人工智能算法模型的几个重要指标
1082 0
一文让你了解AI产品的测试 评价人工智能算法模型的几个重要指标
|
2月前
|
人工智能 测试技术 PyTorch
AI计算机视觉笔记二十四:YOLOP 训练+测试+模型评估
本文介绍了通过正点原子的ATK-3568了解并实现YOLOP(You Only Look Once for Panoptic Driving Perception)的过程,包括训练、测试、转换为ONNX格式及在ONNX Runtime上的部署。YOLOP由华中科技大学团队于2021年发布,可在Jetson TX2上达到23FPS,实现了目标检测、可行驶区域分割和车道线检测的多任务学习。文章详细记录了环境搭建、训练数据准备、模型转换和测试等步骤,并解决了ONNX转换过程中的问题。
|
2月前
|
机器学习/深度学习 人工智能 算法
利用机器学习预测股市趋势:一个实战案例
【9月更文挑战第5天】在这篇文章中,我们将探索如何使用机器学习技术来预测股市趋势。我们将通过一个简单的Python代码示例来演示如何实现这一目标。请注意,这只是一个入门级的示例,实际应用中可能需要更复杂的模型和更多的数据。
|
3月前
|
机器学习/深度学习 数据采集 人工智能
使用机器学习进行用户行为预测的技术探索
【8月更文挑战第9天】使用机器学习进行用户行为预测是一项复杂而充满挑战的任务。它要求开发者具备扎实的机器学习基础、丰富的数据处理经验和深入的业务理解。通过不断的数据收集、处理、特征工程、模型训练和优化,可以构建出高效、准确的用户行为预测模型,为企业决策提供有力支持。未来,随着技术的不断发展和数据的不断积累,用户行为预测领域将迎来更加广阔的发展前景。
|
6月前
|
测试技术 决策智能
专业智能体指导让小模型学会数学推理!微调Mistral-7B实现86.81%准确率
【5月更文挑战第13天】Orca-Math研究展示如何用小模型解决小学数学题,通过70亿参数的SLM在GSM8K基准测试上达到86.81%准确率。采用合成数据集和迭代学习技术,包括多智能体协作创建问题集及“偏好学习”优化解决方案。虽优于其他大、小模型,但可能不适用于复杂数学问题,且依赖高质量合成数据集的创建。[论文链接](https://arxiv.org/abs/2402.14830)
166 4
|
安全
基于SEIR模型的传染病预测软件开发(完整代码+数据集+报告)
基于SEIR模型的传染病预测软件开发(完整代码+数据集+报告)
244 0
基于SEIR模型的传染病预测软件开发(完整代码+数据集+报告)
|
6月前
|
机器学习/深度学习 人工智能 算法
基于AidLux的工业视觉少样本缺陷检测实战应用---深度学习分割模型UNET的实践部署
  工业视觉在生产和制造中扮演着关键角色,而缺陷检测则是确保产品质量和生产效率的重要环节。工业视觉的前景与发展在于其在生产制造领域的关键作用,尤其是在少样本缺陷检测方面,借助AidLux技术和深度学习分割模型UNET的实践应用,深度学习分割模型UNET的实践部署变得至关重要。
159 1
|
6月前
|
人工智能 Ubuntu C++
极智AI | ncnn模型转换及量化流程
本文介绍一下 ncnn 模型转换及量化流程,以 from_darknet yolov4 为例。
337 0
|
机器学习/深度学习 人工智能 数据可视化
人工智能创新挑战赛:助力精准气象和海洋预测Baseline[2]:数据探索性分析(温度风场可视化)、CNN+LSTM模型建模
人工智能创新挑战赛:助力精准气象和海洋预测Baseline[2]:数据探索性分析(温度风场可视化)、CNN+LSTM模型建模
人工智能创新挑战赛:助力精准气象和海洋预测Baseline[2]:数据探索性分析(温度风场可视化)、CNN+LSTM模型建模
|
机器学习/深度学习 人工智能 算法
浙大团队基于ML的抗菌肽筛选模型,可识别整个肽库空间发现新药
浙大团队基于ML的抗菌肽筛选模型,可识别整个肽库空间发现新药
242 0