您的位置:首页 > 其它

论文笔记 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格式,直接命令行
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%。看一个检测到的图像与金标准的对比:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息