如何上百倍加速病理图像的全扫描层面预测

引言

在病理图像分析领域,针对肿瘤组织区域检测浸润性组织检测等问题,绝大部分都是采用图像块分类的策略达到特定类别检测,因为直接分割的思路并不适用于ROI面积过大的病理全扫描图像。

通常来说,我们通过在病理全扫描切片图像上的ROI区域进行取patch并给定正样本标签,同时在非ROI区域中取patch并给定负标签,以此当作一个分类任务,训练得到模型。然后在推断阶段,我们采用滑动窗遍历的策略对一张病理全扫描切片进行逐patch的样本预测,同时将预测结果按照patch的位置顺序进行拼接,最终得到全扫描切片上的ROI预测结果

然而, 我们都知道,经典的分类网络中最后都会接一个全局池化,然后接全连接层得到类别输出概率值。这在自然图像中没有问题,但是在我们这个从slide到patch的问题中,就带来一个弊端——

滑动窗取patch的过程就是要保证patch连续、逐次,但是经过全局池化和全连接层后,特征反而被压缩为向量,这时候,原本相邻patch的重叠区域的特征也一并被压缩为向量了。这导致了重叠区域特征的浪费。也就是说,对于某一区域,滑动窗步长越小,重叠区域越多,重复的特征就会越多,重复的计算极大地浪费了算力

因此,这里学习一个方法,能否在病理全扫描切片图像的滑动窗预测过程中,对于重复的区域,我们只计算一次特征,这样就不会浪费算力,自然把推断效率提上来了!

这也就引出来本博客介绍的方法:ScanNet一种快速全扫描病理切片预测方法

将原本的全局池化和全连接层替换为固定kernel size大小的池化和1x1的卷积层。在patch-level训练测试时,本质和原本VGG一样,最终输出类别概率值。但是在slide-level推断阶段,因为网络结构中没有了全局池化和全连接,全卷积这种方式允许了更大的图像输入从而输出更大尺寸的概率输出,因此在推断阶段通过输入更大的block,没有了重复区域,也就避免了特征的重复计算,如此也就提高了推断效率

实现思路

  1. 用全卷积层的VGG_fullyConv替换原来的经典VGG进行训练;
  2. 对全卷积VGG_fullyConv模型进行分类训练,与原始训练过程一致;
  3. 基于验证集查看模型性能,并根据评估指标选择最优模型;
  4. 在Patch-level测试数据集上测试,评估训练好的VGG-fullyConv模型;
  5. 针对病理全扫描切片图像预测,输入尺寸不再局限于patch大小,在GPU允许的前提下,输入更大的block,进行快速推断ROI区域概率热图!

实现细则

self.avgpool = nn.AvgPool2d(kernel_size=2, stride=2)
self.classifier = nn.Sequential(
nn.Conv2d(out_channel, out_channel, kernel_size=1, stride=1),
nn.BatchNorm2d(out_channel),
nn.ReLU(inplace=True),
nn.Conv2d(out_channel, num_classes, kernel_size=1, stride=1))

实现代码

博客代码已经实现,开源托管在Github: Fast-WSI-Prediction,欢迎star,fork.