论文笔记 Ensemble of Deep Convolutional Neural Networks for Learning to Detect Retinal Vessels in Fundus
2017-01-12 12:16
1296 查看
最近读了几篇关于DRIVE数据集的文章,来完成斯坦福公开课cs231n最后的Final Project,还有zju两门课的作业,哈哈哈,一举三得(^__^) ~~
大概目标就是分割血管,如下图:
虽然是个很老的数据库,不过近几年在深度学习的热度下,又有很多人拿来做,尤其是这几个印度学(a)者(san),Ensemble of Deep Convolutional Neural Networks for Learning to Detect Retinal Vessels in Fundus Images最近两三年使用机器学习、统计方法、深度学习发了好多文章,这里就是复现了他们最新的工作。
其实,详细的内容都写在作业里了,很官方的paper的语言风格,憋了好几个小时诌完了,这里就随意记录点心得而已。
文章的重点感觉一句话就可以概括,使用卷积神经网络,基于“端到端”的思想,不做任何预处理,逐像素地预测该像素处有没有血管,也就是输出的图像上是黑的(0)还是白的(1)。这也是目前最流行的图像分割的方法
具体操作方法就是逐像素地裁剪出周围的31*31*3(Width*Height*Channel)的小块,送入训练好的CNN,输出预测值是0还是1。
然后他们使用CNN的网络结构大概就是[conv-relu]-[conv-relu-pool]*2-fc-relu-fc-最后接一个softmax二分类器,用RMSProp方法,minibatch取200,学习率1e-4,动量项0.95,倒数第二个全连接层采用Dropout,概率为0.5,采用二范数形式的正则项,系数为1e-3。
当然他们最骄傲的是他们使用了ensemble的方法,翻译为集合学习?,就是改变上面那些参数,独立训练了12个网络,每个网络分别做预测最后取平均值,但是我发现即使我不用ensemble,就按上面的参数训练出来的一个网络做预测,也比他们的准确率高啊。也许是框架代码的优化,我用的是caffe
然后使用caffe的话,就是写好定义网络的prototxt文件,写好定义训练参数的solver.prototxt文件。然后使用convert_imagenet.sh将原始图像格式转化为caffe需要的lmdb格式,直接命令行
经过 100 次训练后正确率已收敛达到 90%,5000 次后可以达到95%,将训练第 5000 次时的网络模型参数snapshot保存用于接下来的测试。
测试的时候我们不仅只要一个准确率的数字,还要它输出的预测值啊,不然怎么可视化怎么得到特异性、敏感性、ROC等其他指标呢。一开始想用python接口调用test命令,输出预测值,参考了这几篇文章,caffe的python接口学习(1):生成配置文件,caffe的python接口学习(6):用训练好的模型(caffemodel)来分类新的图片搞了一天,决定还是改caffe test命令的源码,使用gdb调试,主要参考这篇博文linux下如何用GDB调试c++程序,基本上常用的命令他都列出来了。
最后关键就是在
这样test每次运行到计算softmax层输出的分类概率值时都会把输出是1的概率值保存到文件中。
这样测试的话,最后300000个图片大概1分钟就全部测完了,就得到了逐像素的预测值。与金标准对比,准确率大概是95.9%。看一个检测到的图像与金标准的对比:
大概目标就是分割血管,如下图:
虽然是个很老的数据库,不过近几年在深度学习的热度下,又有很多人拿来做,尤其是这几个印度学(a)者(san),Ensemble of Deep Convolutional Neural Networks for Learning to Detect Retinal Vessels in Fundus Images最近两三年使用机器学习、统计方法、深度学习发了好多文章,这里就是复现了他们最新的工作。
其实,详细的内容都写在作业里了,很官方的paper的语言风格,憋了好几个小时诌完了,这里就随意记录点心得而已。
文章的重点感觉一句话就可以概括,使用卷积神经网络,基于“端到端”的思想,不做任何预处理,逐像素地预测该像素处有没有血管,也就是输出的图像上是黑的(0)还是白的(1)。这也是目前最流行的图像分割的方法
具体操作方法就是逐像素地裁剪出周围的31*31*3(Width*Height*Channel)的小块,送入训练好的CNN,输出预测值是0还是1。
然后他们使用CNN的网络结构大概就是[conv-relu]-[conv-relu-pool]*2-fc-relu-fc-最后接一个softmax二分类器,用RMSProp方法,minibatch取200,学习率1e-4,动量项0.95,倒数第二个全连接层采用Dropout,概率为0.5,采用二范数形式的正则项,系数为1e-3。
当然他们最骄傲的是他们使用了ensemble的方法,翻译为集合学习?,就是改变上面那些参数,独立训练了12个网络,每个网络分别做预测最后取平均值,但是我发现即使我不用ensemble,就按上面的参数训练出来的一个网络做预测,也比他们的准确率高啊。也许是框架代码的优化,我用的是caffe
然后使用caffe的话,就是写好定义网络的prototxt文件,写好定义训练参数的solver.prototxt文件。然后使用convert_imagenet.sh将原始图像格式转化为caffe需要的lmdb格式,直接命令行
caffe train -solver /..../fundus_train_test.prototxt
经过 100 次训练后正确率已收敛达到 90%,5000 次后可以达到95%,将训练第 5000 次时的网络模型参数snapshot保存用于接下来的测试。
测试的时候我们不仅只要一个准确率的数字,还要它输出的预测值啊,不然怎么可视化怎么得到特异性、敏感性、ROC等其他指标呢。一开始想用python接口调用test命令,输出预测值,参考了这几篇文章,caffe的python接口学习(1):生成配置文件,caffe的python接口学习(6):用训练好的模型(caffemodel)来分类新的图片搞了一天,决定还是改caffe test命令的源码,使用gdb调试,主要参考这篇博文linux下如何用GDB调试c++程序,基本上常用的命令他都列出来了。
最后关键就是在
softmax_loss_layer.cu中加了两句话:
std::ofstream fpzfq("/home/zfq/fundus_img/predict.txt"); //save predict probability const Dtype* prob_data_cpu_data = prob_.cpu_data(); //获取cpu_data fpzfq << *(prob_data_cpu_data + 1) << "\n";
这样test每次运行到计算softmax层输出的分类概率值时都会把输出是1的概率值保存到文件中。
这样测试的话,最后300000个图片大概1分钟就全部测完了,就得到了逐像素的预测值。与金标准对比,准确率大概是95.9%。看一个检测到的图像与金标准的对比:
相关文章推荐
- CUDA搭建
- 稀疏自动编码器 (Sparse Autoencoder)
- 白化(Whitening):PCA vs. ZCA
- softmax回归
- 卷积神经网络初探
- Prisma修图软件的图片风格转换算法
- TensorFlow人工智能引擎入门教程之九 RNN/LSTM循环神经网络长短期记忆网络使用
- TensorFlow人工智能引擎入门教程之十 最强网络 RSNN深度残差网络 平均准确率96-99%
- TensorFlow人工智能入门教程之十一 最强网络DLSTM 双向长短期记忆网络(阿里小AI实现)
- TensorFlow人工智能入门教程之十四 自动编码机AutoEncoder 网络
- TensorFlow人工智能引擎入门教程所有目录
- 如何用70行代码实现深度神经网络算法
- 近200篇机器学习&深度学习资料分享(含各种文档,视频,源码等)
- 轻量级深度学习框架 Keras简介
- 基于 10 大编程语言的 30 个深度学习库
- 深度学习 - 环境安装
- 深度学习 - 入门
- TF-IDF与余弦相似性的应用(一):自动提取关键词