社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

浅谈深度学习图像分割

小白学视觉 • 4 年前 • 348 次点击  

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达


本文转自:机器学习实验室

最近遇到很多人问我图像分割技术发展怎么样了,落地了吗?有三只想说,岂止落地了,都贴在地上摩擦了。老规矩,分几块说起。


闲聊往事


想当年,大学的时候。同学们进进出出图书馆,手里揣着的都是什么微积分,明朝那些事儿之类的书。而我几年下来,全是adobe photoshop,adobe premiere,adobe after effects,adobe flash,总之就是adobe全家桶。别人在网吧打游戏,我经常鼓捣七八个小时的绘声绘影,premiere,nero等等。


要不是因为穷,就去武大修动漫双学位了,日语二级都考好了,这会儿可能奔我的玄机科技去了,哪里还在这里码代码。


到后来从传统方法搞到cnn,一直未曾脱离关系。


这一次,咱不谈高深的技术,而是谈历史,谈故事,说的轻松一点,尽量短一些,毕竟长文读着累,留几手,下次说。


没有深度学习那些年


图像处理算法都是从传统方法开始的,我们就简单理解为非深度学习的方法吧。

图像分割是什么?如果下学术定义,就是把图像分割成想要的语义上相同的若干子区域,看上面的自动驾驶的分割任务,路是路,车是车,树是树。


这些子区域,组成图像的完备子集,相互之间不重叠。图像分割可以被看作是一个逐像素的图像分类问题


没有深度学习的那些年,也发展出了非常多的图像分割技术,下面挑重点长话短说。


2.1 边缘与阈值法

 
 

简单的边缘检测也曾被用于图像分割,但是因为要做复杂后处理以及后面和其他方法有重叠,这里就不再说了,而是从阈值法开始说。


阈值法的基本思想是基于图像的灰度特征来计算一个或多个灰度阈值,并将图像中每个像素的灰度值与阈值相比较。


其中,最广泛使用也最具有代表性质就是OTSU【1】方法,它是用于灰度图像分割的方法,核心思想就是使类间方差最大


这样的方法,非常简单,要求被分割的物体颜色纹理比较紧凑,类内方差小,只适合一些文本图像的处理,比如车牌,比如指纹。

如果感兴趣,有很多的综述的,大家可以去关注。虽然简单,读研时也用它水了一篇文章和专利。


2.2 区域增长,分裂

 
 

阈值法的一个硬伤是太粗暴简单,哪怕是自适应的局部阈值法,一样难逃无法分割类内方差较大的目标的宿命。它完全没有利用好像素的空间信息,导致分割结果极其容易受噪声干扰,经常出现断裂的边缘,需要后处理。


所以,区域生长法出现了,它通过一些种子点,再加上相似性准则来不断扩充区域直到达到类别的边界,这时候分割结果是连续的了。


区域分裂则是反过程,不再详述。区域增长法的佼佼者,就是分水岭算法【2】。


分水岭算法是一种基于拓扑理论的数学形态学的分割方法,将图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值称为集水盆,而集水盆的边界则是分水岭。分水岭算法有很多种实现算法,常用浸水模拟法。


分水岭算法对于弱边缘有不错的响应,因此常被用于材料图像的分割,以及产生超像素用于提高其他方法的分割效率。咱在硕士期间也与师姐鼓捣过半导体材料的分割,还不错。

说到这里,超像素也是很重要的一种方法,某种程度上也能被归为图像分割的方法。SLIC,Meanshift等都是非常经典的方法,去文【3】中做更详细解读吧。笔者在很多的实际项目中都使用过,配合下面要讲的方法一起使用,绝配。


2.3 图割

 
 

以graphcut【4】为代表的图割方法,是传统图像分割里面鲁棒性最好的方法,它是一种概率无向图模型(Probabilistic undirected graphical model),又被称Markov random field马尔可夫随机场。


Graphcut的基本思路,就是建立一张图,看下面这张图,其中以图像像素或者超像素作为图像顶点,然后优化的目标就是要找到一个切割,使得各个子图不相连从而实现分割,前提是移除边的和权重最小。


后来图割方法从MRF发展到CRF,也就是条件随机场。它通常包含两个优化目标,一个是区域的相似度,被称为区域能量项,即piecewise能量。一个是被切断边的相似度,被称为边缘能量项,即pairwise能量。它追求区域能量项的最大化以及边缘能量的最小化,也就是区域内部越相似越好,区域间相似度越低越好。


图割方法很通用,对于纹理比较复杂的图像分割效果也不错。缺点是时间复杂度和空间复杂度较高,所以通常使用超像素进行加速计算,上面的分水岭算法就可以拿来用用。

graphcut的迭代版本,也就是grabcut【5】更好用,它的基本思路是;使用混合高斯模型(Gaussian Mixture Model,GMM)替代了graphcut基于灰度的模型,初始的混合高斯模型的构建,通过用户交互来指定,只需要指定确定性的背景像素区域即可,通常是画一个框。


多年以后再看下面这张图,效果依然是惊艳的,边缘很不错。不像上面的几个方法,图割方法仍然被广泛使用,deeplab系列的前几篇文章就用到了全连接的crf,它与mrf的区别可以参考这篇文章【Discriminative fields for modeling spatial dependencies in natural images】。

图割方法很好用,是每个想做图像分割的同学必须掌握的,我从硕士论文,从第一个实习项目一直用到了现在。


2.4 轮廓模型

 
 

轮廓模型大部分人可能不知道,它的基本思想是使用连续曲线来表达目标轮廓,并定义一个能量泛函,其自变量为曲线,将分割过程转变为求解能量泛函的最小值的过程。数值实现可通过求解函数对应的欧拉(Euler-Lagrange)方程来实现。包括以snake模型为代表的参数活动轮廓模型和以水平集方法为代表的几何活动轮廓模型。



当能量达到最小时的,曲线位置就处于正确的目标轮廓。


该类分割方法具有几个显著的特点:(1)由于能量泛函是在连续状态下实现,所以最终得到的图像轮廓可以达到较高的精度;(2)通过约束目标轮廓为光滑,同时融入其它关于目标形状的先验信息,算法可以具有较强的鲁棒性;(3)使用光滑的闭合曲线表示物体的轮廓,可获取完整的轮廓,从而避免传统图像分割方法中的预/后处理过程。


不过,缺点也很明显,比较敏感,容易陷入局部极值。


下面是我的硕士论文【6】中采用水平集方法分割出的肿瘤,就是白色那一块。这个方法的数学味有点浓,考虑到咱们是闲聊,就不摆公式了,毕竟后面还有很多事。

传统方法远不止于此,但是我们应该接着说深度学习的方法了。


有了深度学习之后



大家认可的第一篇采用深度学习方法来做图像分割的是FCN【7】。分类任务到了最后,图像被表征成了一个一维的向量,而分割任务则需要恢复一张与原图大小相等的图,所以全连接自然是不行了。

不可免俗也放这张图,说的是在从最小分辨率的featuremap上采样的过程中,融合了卷积过程中同一分辨率大小的特征图。这种将网络浅层和深层信息融合的思想是分割网络的必备了,关于网络的结构,其实我们看segnet【8】会更有感觉,对称,优美,更符合我的审美。

有了FCN之后,各路方法大显神通。不同的上采样方法,带孔卷积等增加感受野的方法,图片与特征的多尺度信息融合,增加crf等后处理方法


万变不离其宗,最终分割结果的好坏往往取决于网络的表征能力,问题的简化,以及好的标注数据。刷比赛的那些技巧,我也不丰富就不多说了。


更多的细节,先按下不表,下一期专门讲,如果等不及,看文【9】,上个图先简单的爽上一爽。


分割不仅仅是分类问题


我们前面说的,都还是将分割当成一个分类问题来解读的,就是每个像素要被归为明确的类别。

然而分割的终极目标不只这一个,比如为了做背景替换的抠图这件事。


二分类的问题,前背景能完美融合才怪,经不起仔细观察。所以,我们需要带透明度通道的分割,或者先分割出来再利用泊松融合等技术进行边缘融合


这就是一个image matting问题。image matting问题可以用一个简单的数学表达式表达,I = aF + (1-a)B,其中F是前景,B是背景,a是透明度,一张图可以看作是在透明度图像的控制下,前景和背景的线性融合。


只是,解这个问题有点病态,对于三通道的RGB图像,只有3个方程,却需要解出6个变量。所以像closed matting等方法都要做局部区域颜色不变的约束才能求出解析解。


image matting问题也从传统方法发展到了深度学习, www.alphamatting.com这里有主流方法的比较,尽管一看。


之所以大家重新想起来这档事,是因为adobe前几年搞的end to end的方案deep image matting【10】重新吊起了大家的胃口。

在这个基础上,抠脑袋做个表情包【11】也未必不可能,只是实际效果仍然欠缺。

技术当然不会止步于此,关注这个领域的朋友自然又会看到siggraph2018有人【12】出来搞事情,原来是MIT和Adobe,也是,没有Adobe谁有这能力。

我们只看文中的几个关键词,谱分割(spectral segmentation),Laplacian矩阵,soft transitions与layers,SLIC等。谱分割与laplacian矩阵是graphcut的归一化版本Normalized Cut的核心,而soft transitions与layers是photoshop最核心的思想,SLIC则是用于减少计算量的超像素方法。


再加上深度学习,彻底的牛逼图像分割方法大融合了。



终于,传统方法又和深度学习走到了一起。咱们闲聊也该结束了,下次再说技术细节。


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/117360