u-net代码(1):全卷积神经网络图像分割(U-net)-keras实现https://blog.csdn.net/u012931582/article/details/70215756
说明:此代码为关于u-net的Keras实现医学分割提供的较为早的源代码。
u-net代码(1.1):全卷积神经网络FCN模型Unet 图像分割项目实践
https://blog.csdn.net/y_marcel_h/article/details/90220624
说明:此代码对代码(1)进行了实践,并分享了思考过程以及代码改进。
u-net代码(1.2):U-net:运行你的第一个U-net进行图像分割
https://blog.csdn.net/awyyauqpmy/article/details/79290710
U-net入门–纠错过程(针对1.2的一点小纠错)https://blog.csdn.net/weixin_45494335/article/details/103153244
说明:此代码同样对代码(1)进行了实践,相对于代码(1.1),更加详细的说明了一些比如说文件夹排版等实践细节,并且对代码的改进比(1.1)更加简洁,前者有各种改进demo,理解起来无从下手,所以(1.2)对于小白更容易上手。
u-net代码(1.2.1):Unet:实现多通道输入的医学图像分割
https://blog.csdn.net/Yanhaoming1999/article/details/104430098
说明:对代码(1.2)进行了改进,实现了多通道输入。
以下是趟浑水随笔:
用改版后的彩色代码(1.2.1)加载200大小的彩色png,图片可以加载,但是训练出错
ValueError: A Concatenate
layer requires inputs with matching shapes except for the concat axis.向量的大小不一致
未改版的代码(1.2)可以运行512大小的8位深度图片(格式为tif)
用未改版的代码加载灰度化的200大小图片(格式为tif或png都试过),发现仍然是能加载数据但是训练时会产生以上错误。
预测是图片大小问题而不是格式问题
果然用代码1.2.1运行RGB的png图片也运行成功,3张图片训练,bitchsize为1,epoch为5,结果是黑白随机
猜测代码1.2.1可能做了某种二值化处理,里面到底能不能预测RGB图像暂时不知道,或者他处理灰度图像也是同样结果,而代码1.2改参数为3也可以迷惑性的预测RGB图像,所以暂时不管代码1.2.1,先搞定1.2.
运行1.2代码,用的细胞标准数据训练,同上参数,上次训练,一次全白,两次模糊的细胞边缘图片
运行1.2代码,用的细胞标准数据训练,同上参数,但是预测图片用的遥感图片,出现模糊的遥感图片边缘
运行1.2代码,用遥感图片训练,参数同上,预测图片用遥感,出现一次全黑两次遥感图片边缘
而代码1.2则是
训练数据太少
训练参数调太低
训练数据质量不够(大小不一)
网络结构是提取边缘的,要提取道路应该还要改进
总结:
1.加载图片的格式无影响,注意文件夹图片尺寸,维度,数量,格式正确。
2.加载图片的大小由你的load data编码方式决定,一般统一尺寸方便写代码。
3.unet可以训练不同大小的图片,但是输入图片必须一次一张,并且需要有特定的输入网络的算法,所以最好统一训练图片的尺寸;但是预测图片较少可以用不同的尺寸。
4.输入图片的尺寸虽然可以手动设定,但是必须要是32的倍数。
问题:经过彩色图片测试,代码中的RGB位为3或者1时,位深度为24的彩色图片和位深度为8的灰度图片都可以load,且可以输入网络,但是RGB为3时不能训练,推测是网络结构原因导致不能训练彩色图片,待解决。
3.参考:
知乎链接:https://www.zhihu.com/question/288867733/answer/471172135
全连接层要求固定的输入维度。而不同大小的图像,卷积模块(卷积+非线性激活+池化)输出的特征映射维度是不一样的。而你提到的FCN、U-Net、SegNet,都是全卷积神经网络(fully convolutional neural network)。实际上,FCN的全称就是Full Convolutional Networks(全卷积网络)。这些网络用卷积层替换掉了全连接层,这就支持了任意大小的输入图像。SegNet架构比如,上图为SegNet架构,可以看到,其中有卷积层、池化层、上采样层、Softmax层,就是没有FC(全连接)层。顺便提下,要支持任意尺寸输入图像,全卷积神经网络不是唯一的选择。比如,可以用全局平均池化(Global Average Pooling)层替换全连接层(Inception-V3),或者在卷积模块和全连接层之间加一个空间金字塔池化(Spatial Pyramid Pooling)层,整理一下卷积模块的输出,再传给全连接层。训练阶段,代码作者都将图片的输入尺寸固定了这个并不是模型架构本身的限制,而是工程上的一些因素(比如,为了训练效率,同一mini-batch中的图像大小必须一样),或者说,是实现上的简单性。通常情况下,你并不需要操心这个问题,因为这只是训练阶段。很多图像数据集中的图像都是统一的,即便不统一,你在传给网络前预处理一下也不是什么难事。这些模型架构确实具有支持任意尺寸图像的能力,但在训练阶段你不一定要利用这个能力。可以到测试阶段再发挥它支持任意尺寸图像的优势。还有就是把batch大小改到1,也就是每次训练一张图像。比如,MXNet上的FCN实现FCN-xs就是这么干的,训练阶段的batch_size = 1。PyTorch上的FCN实现pytorch-fcn 和TensorFlow上的FCN实现tensor_fcn都可以将batch_size设为1,从而支持使用不同大小的图像进行训练。理论上说,既然只是限制同一mini-batch大小都是一样,那么可以根据训练图像的不同大小进行分组,将相同大小的图像分到同一个mini-batch中进行训练。但是这比较复杂,因为据我所知主流框架的数据加载默认不支持这样的功能,可能需要自行实现(当然前提是defined-by-run框架,defined-and-run框架因为设计限制无法实现这样的功能)。
4.参考
将网络的输入定义的placeholder 大小设为:[None,None,c], 不设置固定的大小。但是出现问题: 前层特征图与后层特征图进行组合时,尺寸大小不一致: [32, 60, 256] 和[33, 60, 512]主要原因是:pooling 之后upsample ,特征图大小会变化
解决方法:
因为经过5层下采样,图像大小缩小32倍,小数值约掉了。 所以将图像大小先resize 为32 的倍数
https://www.lizenghai.com/archives/33413.html
到上周3月21日,从1月1日到现在也有4个月了,这四个月,就做了收集论文写开题报告,安装环境,做标签以及以上的一些代码心得,效率只能用十分糟糕来形容,一周大概只有周六日再认真学习,希望自己能快一点。
3.22-3.29
这周学习了关于图像分割的评价标准,实则是一天的工作量。。。(海贼王第二遍真香)
基础知识
https://blog.csdn.net/lingzhou33/article/details/87901365
注意,必须要0/1二值化图片(非0/255二值化图片)才能运行成功,此处我觉得需深刻理解FCN输出的单个像素的分类机制。
**问题:**为什么直接修改像素/255时,spyder显示是1,而imwrite之后保存的图片到不了1?
Miou,每个类别的iou以及批量图片的iou有待计算得出?
注意:OpenCV和matplotlib的图片读写方式有差异,不管是读出来的通道数还是RGB顺序,需要记住并熟练掌握;spyder有个好处就是变量的矩阵信息一目了然。