图像分割算法综述

图像处理的许多任务都离不开图像分割。因为图像分割在cv中是如此重要(有用),所以我们先总结一下图像分割的常用算法。

接触机器学习和深度学习时间不短。我看过各种相关知识但从来没有总结过。在这篇文章之后,我会从工程的角度,从传统的机器学习算法和传统的计算机视觉库算法,到深度学习中常用的算法和论文,以及各种平台上模型的转换、量化和服务部署,尽可能详细的总结。

常用的图像分割算法大致可以分为以下几类。由于图像的能量范数,边缘跟踪等方法的效果只能解决具体问题,效果并不理想,这里就不细说了。当然,二值化本身也可以分割一些简单的图像。但是二值化算法有很多,我就做一篇文章总结一下。这里就不赘述了。

1.基于边缘的图像分割算法:

使用图像梯度传统算法算子的有sobel,roberts,prewitt,Laplace和canny。

这些算法的基本思想是使用合适的卷积算子对图像进行卷积。从而获得对应于该图像的梯度图像。(至于为什么图像的梯度图像可以通过算子卷积得到如图1,请复习下卷积和倒数的概念,自己推导。)因为图像的边缘往往是图像像素差大,梯度大的地方。因此,我们通过适当的卷积核得到图像的梯度图像,即得到图像的边缘图像。至于二阶算子的推导,和一阶类似。优点:传统的算子梯度检测只需用合适的卷积核进行卷积,就能快速获得相应的边缘图像。缺点:图像的边缘不一定准确。复杂图像的渐变不仅可以出现在图像的边缘,还可以出现在图像内部的颜色和纹理上。

?还有基于深度学习方法的hed和rcf。因为所有这些网络都有相同的严重缺陷,这里仅举hed网络为例。Hed是基于FCN和VGG的改进。同时引入六种损失进行优化训练,通过多层输出不同尺度的边缘,然后通过一个训练权重融合每层的边缘结果。hed网络结构如下:

可以得到比较完整的渐变图,可以参考github的hed实现。优点:图像的梯度细节和边缘完整性比传统的边缘算子好很多。然而,hed不能很好地区分边缘图像内部的边缘。当然,我们可以自己改变损失,尝试只拟合外部图像边缘。但最致命的问题是,基于vgg的hed的网络表达能力有限,对于图像与背景接近,或者图像与背景部分融合的图片,hed似乎无能为力。

2.基于区域分割的算法;

常用的区域分割方法有传统算法结合遗传算法、区域生长算法、区域分裂合并、分水岭算法等。这里传统算法的思路比较简单,容易理解。如果有不懂的地方,欢迎大家一起讨论学习。这里不做过多分析。

基于区域和语义的深度学习分割算法是图像分割和研究的主要方向。比如FCN级数的全卷积网络,经典医学图像分割常用的unet级数,rcnn级数下发展的maskrcnn,18结尾的PAnet。基于语义的图像分割技术无疑将成为图像分割技术的主流。

其中,其他基于深度学习语义的相关算法也可以间接或直接应用于图像分割。例如经典的图像抠图问题。18出现了很多优秀的算法和论文。如深度图像抠图,麻省理工学院的语义软分割(sss)效果极佳。

基于语义的图像分割明显优于其他传统算法。我在解决图像分割问题的时候,第一次尝试使用hed网络。最终效果并不理想。虽然我也参考github对hed做了一些微调,但是尝试了很多次之后还是因为上面提到的原因放弃了。切换到FCN系列网络。但是fcn不能解决图像和背景融合的问题。融合图像的分割既需要较大的感受野,又需要一些未融合的原始图像细节,因此很难对单个原始FCN网络进行精确分割。中间测试了很多其他相关网络,效果都不好。考虑到感受野和原始图像的细节,尝试将resnet和densenet作为图像特征提取的底层。最后,我测试了unet系列网络:

unet的原始模型如图所示。通过给自己和爬行动物拍照,我收集了近1000张图片。删除质量差的图片和内容相似的图片。爬虫最终收集到160多张图片。自行拍照,采集200张图片后,用ps手动更新边缘图像,采用图像增强变换,大概300*24的图片。原生unet网络性能相对一般。将unet的普通卷积层改为resnet后,网络的表达能力明显提高。当resnet改为resnet101时,即使是部分融合的图像,也能很好地分割。然而,unet的模型体积是不可接受的。

最后阶段,我们看到maskrcnn的实例分割。Maskrcnn由RCNN rcnn,fasterrcnn发展而来。于是我用maskrcnn加上自己的训练数据和标签图片进行训练。Maskrcnn的结果不尽如人意,边缘定位相对于其他算法略显粗糙。在产品应用上,显然不适合。?

3.基于图的分割算法

基于深度学习的Deepgrab并不是很令人满意。Backbone,deepgrab的git作者,采用了DeepGrab BV2的网络结构。原纸没有完全安装好做。

原始地址参考:https://arxiv.org/pdf/1707.00243.pdf.

整体结构类似于编码器和解码器。还没有进行过太细致的研究,因为基于resent101的结构在deeplab的模型体积、速度、分割精度等方面还不能满足当前的需求。我之前大致总结过计算机视觉的相关知识点。既然讨论了移动终端模型,那就来总结一下移动终端模型在模块中的应用。

因为时间真的有限。这里不详细解释每种算法。稍后,我将从基本的机器学习算法开始。