这学期期末做了一个image Segmentation的 project. 总结一下:
Project 要求用4中方法,其中两种是DNN。 我用了ISIB Challenge的数据,给定一张细胞的照片,把其中的细胞膜分出来(大概是这样)。 Training set 里面每个pixel都有对应的label(0 or 1),这与image classification 的数据不同。对于Image Segmentation,已经有很多基于DNN方法都被提出来了,准确率也非常高。我选用了其中的两种DNN, 包括 U-net 和 SegNet。 另外两种方法我选用了简单的RF和SVM。
RF和SVM都需要先做feature extraction。Python 有成熟的模块来做图片的feature extraction。 但是这种方法的问题在于,需要针对每个像素点都做 feature extraction,然后取每个像素点对应的label,这样来产生RF和SVM的输入(新的training data)。 事实证明,这样做非常慢因为图片大小是512x512,所以我在实验的时候随机取了1000个像素点(每张图片)来生成 training data。这样的效果当然是不好了。。。
用DNN就简单很多,直接输入图片,输出也是图片。但是,我遇到的实际问题是:图片本身太大了。用colab 的GPU总是中断,用自己的GPU也是OOM。 尝试了很多方法:
1. 用colab的GPU: 基于pytorch搭建网络,运行时总是中断;
2. 用colab的多个TPU来并行运算:基于Keras搭建网络时发现keras-tpu不支持某个模块(应该是upsampling);
3. 用实验室的GPU: 基于keras搭建网络,OOM;
这些我都没有找到解决方案,因为时间有限,我就从图片中随机的取小一点的patches来作为输入。在inference的时候我就需要把predicted small patches 拼接成 512x512 的样子。结果还行,但是很麻烦。
虽然结果已经提交了,但是我还是知道遇到这种现实的问题应该怎么办。。。Keep in mind. 以后来更新。
Code放在这里了: https://github.com/ray-hu/Image-Segmentation