赞
踩
学 院 信息与通信工程学院
年级专业 20级智能科学与技术
姓 名 孙成
学 号 20203101694
完成时间 2021-7-7
指导教师 邵春艳老师
开 课 时 间 2020 至 2021 学年第 二 学期
一、引言
iChallenge-PM是百度大脑和中山大学中山眼科中心联合举办的iChallenge比赛中,提供的关于病理性近视(Pathologic Myopia,PM)的医疗类数据集,包含1200个受试者的眼底视网膜图片,训练、验证和测试数据集各400张。
说明:
如今近视已经成为困扰人们健康的一项全球性负担,在近视人群中,有超过35%的人患有重度近视。近视会拉长眼睛的光轴,也可能引起视网膜或者络网膜的病变。随着近视度数的不断加深,高度近视有可能引发病理性病变,这将会导致以下几种症状:视网膜或者络网膜发生退化、视盘区域萎缩、漆裂样纹损害、Fuchs斑等。因此,及早发现近视患者眼睛的病变并采取治疗,显得非常重要。
二、方法
(1)数学模型
LeNet是最早的卷积神经网络之一[1]。1998年,Yann LeCun第一次将LeNet卷积神经网络应用到图像分类上,在手写数字识别任务中取得了巨大成功。LeNet通过连续使用卷积和池化层的组合提取图像特征,其架构如 图1 所示,这里展示的是用于MNIST手写体数字识别任务中的LeNet-5模型:
第一模块:包含5×5的6通道卷积和2×2的池化。卷积提取图像中包含的特征模式(激活函数使用Sigmoid),图像尺寸从28减小到24。经过池化层可以降低输出特征图对空间位置的敏感性,图像尺寸减到12。
第二模块:和第一模块尺寸相同,通道数由6增加为16。卷积操作使图像尺寸减小到8,经过池化后变成4。
第三模块:包含4×4的120通道卷积。卷积之后的图像尺寸减小到1,但是通道数增加为120。将经过第3次卷积提取到的特征图输入到全连接层。第一个全连接层的输出神经元的个数是64,第二个全连接层的输出神经元个数是分类标签的类别数,对于手写数字识别的类别数是10。然后使用Softmax激活函数即可计算出每个类别的预测概率。
(2)方法工具
1、运行环境:
百度人工智能平台Paddle
2、数据集:
眼疾识别数据集iChallenge-PM中既有病理性近视患者的眼底图片,也有非病理性近视患者的图片,命名规则如下:
我们将病理性患者的图片作为正样本,标签为1; 非病理性患者的图片作为负样本,标签为0。从数据集中选取两张图片,通过LeNet提取特征,构建分类器,对正负样本进行分类,并将图片显示出来。
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中既有病理性近视患者的眼底图片,也有非病理性近视患者的图片,命名规则如下:
我们将病理性患者的图片作为正样本,标签为1; 非病理性患者的图片作为负样本,标签为0。从数据集中选取两张图片,通过LeNet提取特征,构建分类器,对正负样本进行分类,并将图片显示出来。
代码如下:
使用OpenCV从磁盘读入图片,将每张图缩放到224×224224×224大小,并且将像素值调整到[−1,1][−1,1]之间,代码如下所示:
(5)参数调整:
文件报错:invalid literal for int() with base 10: ''
从网上找相关资料发现因为python不能直接将包含小数点的字符串转化为整数,而原始数据的格式经常是不一致的,故类型转化时造成ValueError异常。
解决方法:先将字符串转换为浮点数float,在将浮点数转化为整数int。
第一次改正:label = int(float(line[2]))
依旧报错:ValueError: could not convert string to float: ''
之后继续检阅资料发现原因:空字符串无法转成整型
解决办法:加入异常值抛出。若遇到ValueError错误,直接pass,否则执行else下面的程序。
修改后程序:
(6)除此之外就是一些文件地址的修改
以下是改正后的代码
(7)文件顺利执行,得出结果:
loss=0.6918540149927139.acc=0.46750000305473804
可以看出效果并不是很理想,需要进一步调整学习率优化准确度
在老师布置了创新创业大作业以后,我便开始选择题目,在浏览了十多题后,我最终选择了眼疾识别问题作为此次创新创业课程设计的大作业。如今近视已经成为困扰人们健康的一项全球性负担,在近视人群中,有超过35%的人患有重度近视。因此,及早发现近视患者眼睛的病变并采取治疗,显得非常重要。定题后,我便开始后面的设计。
我们是这学期学的Python语言和百度Paddle人工智能平台,一下子接触很多新的概念,多多少少有点不适应,平时忙着复习预习物理数学等科目,就仅仅周末有一些时间练习Python语言和百度Paddle人工智能平台,于是把paddle平台和python的训练给丢下了,在最后一个月,才开始抓紧学习两个平台的搭配使用。
从Paddle平台获得程序后,我首先下载平台提供的数据集,并对已完成的代码更改程序中打开的本地文件地址。
在检查好滴之后,第一次运行,出现了左右两只眼球的图,把我高兴坏了,但高兴没过一会儿,出现了一个文件报错,内容是:invalid literal for int() with base 10: '' 从CSDN上检索了相关问题的解决办法,首先尝试的是将数据先转为float类型,再用int函数强行变为整型,但是发现改正后运行还是继续报错,报错内容为:ValueError: could not convert string to float: '' 这个时候,心里是有点害怕的,到底是接着int(float())改还是退回int()改,再冷静思考后,我决定还是退回int()改,以防代码出现大面积更换,不利于后期程序运行和理解。
在CSDN上继续检索后,又发现一个解决的方案,就是用pass函数跳过,
将代码处理后,再次运行,完美得到结果,并且没有出现任何大面积的程序改动。
顿时,好像一下子从暗无天日的盲目中找到了方向,心中一下子开阔起来。
这个过程出现了曲折大致可以认为是编程软件的更新,以及本地环境的不匹配导致的,网上很多的代码的都是基于个人本地环境实现的,相关的代码我不能直接套用,针对这个问题,我首先是阅读他的程序,判断哪些是我能自主修改最终能在我本地运行的。
检阅python相关的语法,接着学习paddle的使用方法,在进行改码时,还是出现了很多错误,在一遍遍的修改查资料后,还是不能一下子就很快地将程序调出来,这个时候我们想到了学长,在学长的指导下,我们很快地找到了问题的症结———相关文件尺寸的问题。
接下来的过程就很轻松,一遍遍的运行代码,一遍遍的优化代码,最终获得了实验得出最优的眼疾识别代码。
最后一点最重要的体会就是:要学会查找资料,要学会请教他人,学会坚持和钻研。不要怕!不要悔!
五、参考文献
1、代码高亮处理http://www.codeinword.com
2、paddle人工智能平台飞桨PaddlePaddle-源于产业实践的开源深度学习平台
3、第一次处理方法https://blog.csdn.net/weixin_44034883/article/details/112918440
4、第二次处理办法
https://blog.csdn.net/zcs_xueli/article/details/107458068?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242
六、以下是完整代码:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。