计算机系统应用教程网站

网站首页 > 技术文章 正文

CNN+RNN(ConvLSTM2D) 确认过眼神 你定寻之良久矣

btikc 2024-10-11 11:29:01 技术文章 15 ℃ 0 评论

Don't be surprised,今天先暂时把传统图像处理进程鸽一鸽,给大家分享一个自己在用的很棒网络,耗时两个多月终于弄明白并且成功交差,希望对你有所帮助哦。

背景

第一次看到这个思想是在2018MICCAI会议论文(CFCM:Segmentation via Coarse to Fine Context Memory),做医学图像分割。

正好工作中碰到了较难分割的器官,然后也被安排分享这篇论文和实现,头铁就开始呗。

在网上找了很多版本,都没有自己想要的现成框架,就在一个普通的U-net加Res上修改的。

所以过程中自己填坑踩坑再填坑,先看网络图,好像有点长,但它强啊,有问题讨论随时Call。

实现

训练网络主要用来做图像分割,加入LSTM为了让网络学习到长期依赖的信息。

U-net就不多赘述了,搞计算机视觉的应该都有接触,但是在CNN中加入RNN提取图像特征的确实不多,LSTM(长短期记忆机制)属于RNN中的衍生品,之后还有GRU(门控单元)是简化了的LSTM。

说白了就是在提取图像信息特征的时候类似提取序列特征思想一样提取图像的上下文信息(上文指单向LSTM,上下文指双向LSTM,双向LSTM也测试过了,这里双向LSTM通过使用Bidirectional包装器,后面会介绍),还想了深入解LSTM机制的请自行头条。

CNN可以提取空间特性,LSTM可以提取时间特性,ConvLSTM可以同时利用时空特性。

ConvLSTM核心本质还是和LSTM一样,将上一层的输出作下一层的输入。不同的地方在于加上卷积操作之后,为不仅能够得到时序关系,还能够像卷积层一样提取特征,提取空间特征。这样就能够得到时空特征,并且将状态与状态之间的切换也换成了卷积计算。

ConvLSTM2D层,也是一个LSTM网络,但它的输入变换和循环变换是通过卷积实现的,ConvLSTM2D的输入和输出形状如下:

输入形状:

5D tensor(samples,time,channels,row,cols)

输出形状可选:

5D tensor(samples,time,output_row,output_col,filters) 返回每个序列的结果

4D tensor(samples,output_row,output_col,filters)只返回最后一个序列的结果

其中,time代表每一个输入样本的图像序列所具有的图像帧数,这样就用到了TimeDistributed包装器。

老规矩,能明白我描述的东西就够了,理论性的东西感觉没有必要理解得太深入,知道在干什么就好啦。

直接实操,还需要掌握的有上面提到的两个包装器:TimeDistributed层Bidirectional层

1.使用TimeDistributed包装器,将一个图层应用于输入的每个时间片(就是把time维每一序列单独做卷积操作提取特征)

keras.layers.TimeDistributed(layer)

2.使用Bidirectional双向封装器,将单向LSTM扩展,前向传播的时候增加学习参数,利用到后面序列(未来)的信息提取特征,使用时包装在想使用的LSTM层就好

keras.layers.Bidirectional(layer, merge_mode='concat', weights=None)

测试结果:

实测效果不错,在推广使用,有效避免2D断层,3D上下界假阳假阴问题。

前处理的话针对不同领域分割图有不同的前处理方法,数据增强时可以使用平移/旋转/噪点/场强增强等方法

个人建议序列值为10左右做尝试,除此之外还需考虑算力和效率之间的平衡

(1)输入序列增加后单双向LSTM最优dice值均升高

(2)双向LSTM较单向收敛更稳定更快

头条限制,想要原生代码请点赞关注,并在后台私信Code For ConvLSTM ,see u again。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表