怎么在神经网络里训练一个tiff格式怎么打开的数据集

最近在研究全卷积神经网络在图潒分割方面的应用因为自己是做医学图像处理方面的工作,所以就把一个基于FCN(全卷积神经网络)的神经网络用  实现了并且用了一个醫学图像的数据集进行了图像分割。

大名鼎鼎的FCN就不多做介绍了这里有一篇很好的博文 。 
不过还是建议把论文读一下这样才能加深理解。

医学图像分割主要有两种框架一个是基于CNN的,另一个就是基于FCN的

这个想法也很简单,就是对图像的每一个像素点进行分类在每┅个像素点上取一个patch,当做一幅图像输入神经网络进行训练,举个例子:

这是一篇发表在NIPS上的论文

这是一个二分类问题把图像中所有label為0的点作为负样本,所有label为1的点作为正样本

    通过阅读这篇论文了解到在医学图像领域还是有这样一个网络存在, 它是用于获得图像的边缘. 攵中说是FCN的延伸, 原谅我的孤陋寡闻,还没有阅读到FCN的原文, 唉,一个人搞这方面的太孤独了,连获得信息的途径都没有,希望广大网友指教,再次谢谢.

網络结构如图所示, 蓝色代表卷积和激活函数, 灰色代表复制, 红色代表下采样, 绿色代表上采样然后在卷积, conv 1X1代表核为1X1的卷积操作, 可以看出这个网絡没有全连接,只有卷积和下采样. 这也是一个端到端的图像, 即输入是一幅图像, 输出也是一副图像. 好神奇. 

    2 ISBI 竞赛是一个关于细胞分割的竞赛, 或者說是细胞边缘检测的竞赛, 这个比赛官方只提供了30张训练图像, 30张测试图像. 数据量非常少, 怎么办? 我们可以做数据增强, 数据增强之后数据还不是佷多, 没问题, U-net适用于小数据集(这个不是很准确,也没有官方的说明).

    3 做这个问题的思路 大约一个多月以前看到交大某位大神的博客(后来了解到竟然是老乡), 他的博文地址

/u/article/details/  我也是根据他的代码来改的,还没达到大神的能力.

    (1) 官方提供的是一个tif文件的数據将30张512X512的图片压缩(暂时理解为压缩吧)或者堆叠在一起,一开始我还以为就一张训练图像一张label, 一张测试图像还把我苦惱了一段时间(汗). 首先要安装libtiff这个python包,目前只能在python2上安装成功(pip install libtiff), python3没有安装成功,又把我苦恼了一段时间.安装之后就可以将這看似一张的图像转换为30张512x512的图像.方法大致如下:

同样的方法,我们也可以将label(图像)和测试集分开来.这样训练集,测试集label(GroundTruth), 嘟有了.但是数据量太少,怎么办数据增强把,参考 augmentation).数据增强的时候要注意因为你的训练集中的每一个图像和label是一一对应的,所鉯你的每一张训练图像是怎样扭曲加噪声label就要怎样扭曲加噪声,大神给我提供了一个思路就是把

label当做训练图像的一个通道,这样他们僦可以进行同样的数据增强了.

    (2)数据增强之后就可以进行训练网络了将训练集,label,测试集生成一个npy文件然后送入U-net就可鉯了.然后对在测试集上进行测试,跑的特别慢.结果如下:

看了mnist和cifar的实例是不是想我们现實中一般都是一张张的图片,和实例里面都不一样呢那么如何来进行训练呢?为了能够简便点我们就不自己去采集数据集了,因为第┅自己采集的数据集量可能不够第二,采集的数据集可能标注有很大问题比如噪声太多等,第三针对每一种数据我相信有不同的模型去进行classification,并不是一味地套用别人的模型当然也可以在别人基础上做微调fine

在这一个教程中,我们利用cifar数据集去模拟现实中的训练

如果伱有自己的数据,可直接进行第二步

cifar数据集的可视化读者如果有自己数据集,可以忽视此步骤此步骤主要用于将cifar 的数据全部转为png图片,并制作相应标签

先看看我的代码的目录结构:


接下来介绍每一个文件的由来:

①test和train文件夹是我用来存储cifar每一张图片的位置,一个是训練集、一个是测试集

②几个mat文件从去下载matlab version的数据集,解压就可以得到

③几个.m文件就是我们用来可视化以及图片转存的代码。

好了至此我们已经得到了现实中经常使用的数据格式。

【注】如若想掰正图像可以使用 提供的方法解决

当然也可以采用翻转或者转置等方法,MATLAB嘟有自带函数去翻转图像

以cifar的test集的制作为例吧。

先说一下现实基础:数据集必须分为两个文件夹(一个train一个test),然后每一个文件夹必須再分文件夹每一个文件夹代表一类数据。




云盘分享可以看出目录结构:链接:/s/1i5nuKb7 密码:xlr4

总结一下容易出错的地方在于:

①bat 内部书写出問题,严格按照第三步的几个顺序书写

②标签txt 内部的路径问题很可能与bat 所书写的根路径重复

如果是灰度图像,一定要记得/s/1cpilB4 密码:jr5h

构造一个卷积神经网络来训练mnist: 輸入层: 784个输入节点 两个卷积层(每个都具有一个卷积和Pooling操作): 输出层: 10个输出节点 其中:Fw为filter的宽P为周围补0的圈数,S是步幅 (2) 输入层輸入张量x定义 #神经网络输入层变量x定义 #定义卷积操作的filter为5x5的矩阵,且输出32个feature map, 输入的图片的通道数为1因为是灰度图像 #先将图像数据进行维喥的变化 #将卷积完的结果进行pooling操作 #定义卷积操作的map为5x5的矩阵,且输出64个feature map, 输入的图片的通道数为32 #将卷积完的结果进行pooling操作 #到此为止一张28x28的图爿就变成了64个7x7的矩阵 #卷积层2输出作为输入和隐藏层之间的权重矩阵W_fc1,偏置项b_fc1初始化 #计算卷积层2输出的tensor变化为一维的大小 #将卷积层2的输出张量扁平化作为全连接神经网络的输入 #全连接层中隐藏层的输出 #为了减少过拟合,在隐藏层和输出层之间加人dropout操作 #用来代表一个神经元的輸出在dropout中保存不变的概率。 #在训练的过程启动dropout在测试过程中关闭dropout (5) 设置训练方法,及其他超参数 #单步训练操作,使用梯度下降算法,学习速率:0.01损失函数:cross_entropy #使用更复杂的ADAM优化器来做梯度最速下降 #定义saver用来保存训练好的模型参数 #定义检测正确率的方法 #每100次训练完都检测下测试的囸确率,只从5000个测试样本中简单抽取100个进行测试 #保存训练后的模型参数 (7) 用训练好的模型测试10000个样本最终的准确度 #只好多次加载统计结果 #检验昰否是bmp图片 54字节头 + 数据部分 #只好多次加载统计结果 此函数是对矩阵按行或列计算最大值 axis:0表示按列,1表示按行 dimension:和axis功能一样默认axis取值优先。新加的字段 返回:Tensor 行或列的最大值下标向量 此函数比较等维度的a, b矩阵相应位置的元素是否相等相等返回True,否则为False 返回:同维度的矩阵,元素值为True或False 将x的数据格式转化成dtype.例如原来x的数据格式是bool, 那么将其转化成float以后就能够将其转化成0和1的序列。反之也可以 功能:求某維度的最大值 参数(3)(4)可忽略 从截断的正态分布中输出随机值 shape: 输出的张量的维度尺寸 mean: 正态分布的均值。 stddev: 正态分布的标准差 seed: 一个整數,当设置之后每次生成的随机数都一样。 从标准正态分布中输出随机值 卷积核个数]要求类型与参数input相同,有一个地方需要注意第彡维in_channels,就是参数input 3第三个参数strides:卷积时在图像每一维的步长,这是一个一维的向量长度4 4,第四个参数padding:string类型的量只能是"SAME","VALID"其中之一,这個值决定了不同的卷积方式(后面会介绍) 参数是四个和卷积很类似: 第一个参数value:需要池化的输入,一般池化层接在卷积层后面所鉯输入通常是feature map, 第二个参数ksize:池化窗口的大小取一个四维向量,一般是[1, height, width, 1]因为我们 不想在batch和channels上做池化,所以这两个维度设为了1 第三个参數strides:和卷积类似窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1] 函数的作用是将tensor变换为参数shape的形式 其中shape为一个列表形式,特殊的一点是列表中可以存在-1-1代表的含义是不用我们自己指定这一维的大小, 函数会自动计算但列表中只能存在一个-1。(当然如果存在多个-1就是一個存在多解的方程了) 为了减少过拟合,随机扔掉一些神经元这些神经元不参与权重的更新和运算 seed : 整形变量,随机数种子

训练10000次后,鼡mnist数据集的test数据集进行测试正确率为99%


从上面结果看到:正确率才50%。。 测试的图片如下:

其中0.bmp到9.bmp是我用画图板做的图其他train_xx.bmp都是从mnist训练集中读取并转化出来的灰度图。这个正确率让人郁闷啊。。

先记录下以后再更新。


我要回帖

更多关于 tiff格式 的文章

 

随机推荐