数字图像处理成长之路15:前景提取(最大似然估计EM算法与高斯混合模型)

本文主要是介绍数字图像处理成长之路15:前景提取(最大似然估计EM算法与高斯混合模型),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先实践一下何为前景提取:
原始图像

这里写图片描述

这里写图片描述

如果画面中有移动的物体,会以白色表现出来。

这里写图片描述

我理解的前景提取就是把画面中移动的物体提取出来。

这里写图片描述

这是opencv中给的示意图,来简单看看opencv代码:

- 代码

// Global variables
Mat frame; //current frame
Mat fgMaskMOG2; //fg mask fg mask generated by MOG2 method
Ptr<BackgroundSubtractor> pMOG2; //MOG2 Background subtractormyOpencv::myOpencv()
{//create Background Subtractor objectspMOG2 = createBackgroundSubtractorMOG2(); //MOG2 approach
}cv::Mat myOpencv::BS(cv::Mat srcMat)
{pMOG2->apply(srcMat, fgMaskMOG2);return fgMaskMOG2;//返回值为二值图,白色代表前景
}

代码不多,下面来看看该算法的理论基础:
再来看看这幅图:

这里写图片描述

- 算法的猜测

如果最开始我们有一张静止的背景,并且背景始终保持不变,此时前景提取最为简单,即用带有前景的画面与背景做差即可。

现在让问题变得复杂些,实际上背景很少情况是保持不变的,比如上图左下角出现了第二艘船并停泊在那,这就导致勒背景的变化。而从这句话中我们似乎也能分析出,所谓背景就是在时间轴上很少变化的部分,是相对静止。所谓前景就是在时间轴上变化较频繁的部分。所以前景提取的算法应该和时间有关。

- 高斯分布

具体是怎样的关系,目前不得而知,回过头来看看opencv代码寻找线索。可以发现用了一个叫MOG的算法,查了一下,是混合高斯模型,网上也称之为GMM,混合高斯模型的出现又是为了解决什么样的问题呢?

先来回忆一下高斯分布,或者叫做正态分布。以一维为例,函数图像有中间高两边低,某点函数值的大小代表了该点出现的概率。高斯分布能很好的描述自然现象和社会现象的某些问题,比如一个地区男性成年人的身高,测量某零件长度的误差等。

但是某些问题是单一高斯分布或其他分布描述不了的,比如一张图片的归一化灰度直方图(横坐标代表像素强度,纵坐标代表同一强度的像素出现的频率),如果也简单画出它的曲线,可以想像会出现多个波峰。如果想借助数学工具对该图像进行拟合,显然超出了单一高斯分布的应用范围。

- 混合高斯模型

混合模型的出现正是为了解决类似上面的问题,所谓混合模型是把多个分布叠加在一起,从而可以更灵活的拟合数据。如果混合的分布是高斯分布,就称作高斯混合模型。

很容易想象把两个不同参数的高斯分布叠加在一起,就可以拟合拥有两个波峰的曲线。

混合模型中存在着一种思想,即用已知近似代替未知,用现有的构造没有的。这也是数学中常用到的思想,如以直代曲,如傅立叶变换。

在回到MOG算法,一般来说3-5个高斯分布叠加在一起就能达到很好的拟合效果。具体是几个不是重点,重点是,这些高斯分布的参数是不同的,如何确定它们的参数?

这就又涉及到参数估计的问题。

- 参数估计

本来只是想学习前景提取,可越学习遇到的问题越多,那就继续顺藤摸瓜,跟着这条主线下去,一探机器视觉的世界。

搜索高斯混合模型,出现概率比较高的是两个参数估计方法,即最大似然估计和EM。

- 最大似然估计(MLE,Maximum Likelihood Estimation)

这几个字看起来是那么的生硬难懂,让我们看看生活中的例子。

让我们看一个人的健康情况。口渴,多饮食,多尿,日渐消瘦,等症状往往预示着某种疾病。假如一个人只得口渴症状的概率是pa,多饮食的概率是pb,多尿的概率是pc,日渐消瘦的概率是pd。那么这些症状同时集中在一个人身上的概率是:paxpbxpcxpd,这个概率是联合概率。一个人神上的这些症状(数据)是可以观测的,然而引起这些症状的原因(参数)是不确定的。现在想来估计原因(参数),这个将要被估计的(原因)参数会使我们刚才观测的数据成立的可能性最大。一般来说得了糖尿病最有可能同时出现上述症状,于是我们判断这个人得了糖尿病(确定参数)。

这个例子并不是非常贴切,但是比较形象,有助于理解概念。

实际上,联合概率是值得关注的,这是最大似然估计常常出现的情况,由于是多项相乘,因此容易出现指数的形式,这也是为什么该算法会用到对数求导法,使指数形式变成对数相加,然后在求导进行下一步运算。

- EM算法

据说EM算法是机器学习十大算法之一,虽然我目前还未涉足机器学习,但也隐约感受到了EM算法的重要性,有必要把该算法弄懂。

要弄懂EM算法也并非易事,当我在网上搜索EM算法时,得到的结果大多是数学公式的罗列,真正的例子很少。

http://www.jianshu.com/p/1121509ac1dc 这个例子总算通俗易懂,然而要想真正的理解,需要我们自己动手推演一遍。

我们要进行抛硬币实验来计算硬币正面朝上的概率。也许你会说随着实验次数的增多,正面朝上的概率应该是0.5,在一般的情况下是这样的。

但是这个硬币和普通的不太一样,由于制造时出了差错或者硬币某一面粘了一小块异物,使得它的密度不是均匀分布的,中心也不是在硬币的几何中心的。因此抛在空中后也会出现不同以往的翻转效果,这可能导致其正面朝上的概率严重偏离0.5。

下面我们找来两个这样的硬币A,B来进行实验。A,B是两个同的硬币,分别对每个硬币做4组实验,每组抛5次。结果如下:

这里写图片描述

可以算出,A经过2组共10次实验之后计算正面朝上的概率是0.6,B是0.3。

下面做一下改变,假如刚开始抛硬币时只顾着记正反,错乱了抛硬币的顺序和抛的是哪个硬币,只知道每一组抛的是同一枚硬币,如何计算两个硬币正面朝上的概率?

这里写图片描述

这组图和上组图的区别仅在于并不知道一到四组硬币的顺序,这对我们来说的隐藏的条件,或者说有人故意把这个顺序藏起来不让你知道,来看看你到底有多聪明来找出这个顺序。

我们用向量Z来代表这一条件,Z=(Z1,Z2,Z3,Z4),现在只要求出Z中Z币的顺序就能求出两个硬币各自的朝上概率。

而情况是,只有我们知道了两个硬币朝上的概率,才能估计出这四组实验的顺序。

陷入了循环怪圈怎么办?我们可以先设定两个硬币的概率,然后用这个概率去估计Z的顺序,有了Z的顺序就回到了我们最开始那一过程,就可以重新计算出两个硬币的概率。然后比较一下我们设定的概率和新计算出的概率相差多少,如果相差不多说明我们已经找到了最有可能的情况,如果相差很大则需要继续估计。

下面假设A的概率是0.7,B的概率是0.6。如果第一组抛的硬币是A,则A抛出3正2反的概率是,0.7x0.7x0.7x(1-0.7)x(1-0.7)=0.03087。如果第一组是B,则B抛出3正2反的概率是0.6x0.6x0.6x(1-0.6)x(1-0.6)=0.03456。

此时如果用之前提到的最大似然估计法的话,第一组选择硬币B会最有可能出现3正2反的结果。

这里写图片描述

在每一组中,抛的硬币不是A就是B,是必然事件,概率是1,因此第一组抛的是A的概率是0.03087/(0.03087+0.03456)=0.47,是B的概率是1-0.47=0.53。依次列出其他组:

这里写图片描述

现在我们有些接近问题的解决了,即找到了隐变量Z相关的一些概率。

下面把A组的概率归一化:
这里写图片描述

于是这个问题可以换成这样的描述,从两个硬币中随机拿出一个,进行4组抛硬币实验,已知四组中选中硬币A的概率分别是如上图所示,抛硬币正反面结果如下图所示:

这里写图片描述

分别求硬币A正面朝上和反面朝上的期望。这是一个不难的期望计算问题,经过计算硬币A正面朝上的期望约是2.39,反面朝上的期望是2.61。下一步该计算什么了?从这两个期望就能够计算出硬币A正面朝上的概率是2.39/(2.39+2.61) 约等于0.49。同理可求B的概率。

上面就是EM算法的“E”了。

在得到A和B的新概率后,又可以回到上面重新计算,直到收敛了。

这就是EM算法的“M”了。

下图是网上一个外国人写的也可以做为参考。

这里写图片描述
这里写图片描述

至此,前景提取所需的理论基础大致介绍完毕,但说实话,仅仅介绍完这些仍无法使我理解高斯混合模型和前景提取究竟有什么关系,上述往往是从数学角度的理解,下面我要分析一下高斯模型和前景或者背景的关系。

- 背景的数学建模

为了简单起见,我们从单一高斯模型开始分析,看看它和背景的联系。

如果我们初次研究背景,就需要先研究背景的特征,正如最开始我的猜想,画面的某一点的像素值随时间不做变化或变化很小的应该认为是背景,或者虽然在短时间有巨大变化,但在大部分时间不变或者很少变化的是背景。

现在有这样一个视频片段,tree.avi,来自opencv数据文件夹。视频中有一棵树,基本是静止的,只是在风的作用下,来回小幅摆动。

这里写图片描述

在接近视频的结束时,一只手从视频右上角出现,滑动到中间又左上角划出。

这里写图片描述

视频的描述大致是如此。

选择一个固定点(x=5,y=5),其随时间的图像如下:

这里写图片描述

可以看到前50个点基本没有变化,在第15个点附近有小幅变化,应该是背景光线变化(树的摆动导致局部光线变化)所致,因为我确定这个点从始至终没有被手覆盖过,而第59点之后变化剧烈,因为大约在这个阶段,有一只手划过图像影响了整体光线。

前50个点是一个比较理想的背景实例。

再看下面这张图:

这里写图片描述

这张图是x=50,y=50点。可以看出该点在50点之前有小幅(幅度为5左右)变动,原因是这个点接近树叶,而树叶随风摆动。这个点也可以看作是一直处在背景上的点。

好了,下面我们分析最简单的那个点(5,5):

这里写图片描述

这个点随时间取得不同值可以看作是符合一维高斯模型,只是参数未知,该如何由已知的观测数据求出未知的参数?用最大似然估计法。

到此我们该把数学公式拿出来了。

假设该坐标点不同时间的像素值X1,X2…Xn,符合正太分布,则其似然函数为:

这里写图片描述

其对数似然函数为:

这里写图片描述

求偏导数组成似然方程:

这里写图片描述

解为:

这里写图片描述

至此就可以估计出点(5,5)随时间变化产生的数据所服从的高斯分布,其他点的同理。只不过在用程序实现时还需要考虑一些细节,这就因人而异了,懂了上述原理,理解其这些算法的程序实现上也容易很多。

上述为单一高斯分布,换成混合高斯分布就出现了隐蔽变量,就会用到EM算法。

至此前景提取所需要的大部分学习内容都已经有了分析,该算法的学习也可以先告一段落了。
(完)

这篇关于数字图像处理成长之路15:前景提取(最大似然估计EM算法与高斯混合模型)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026008

相关文章

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

使用Python提取PDF大纲(书签)的完整指南

《使用Python提取PDF大纲(书签)的完整指南》PDF大纲(Outline)​​是PDF文档中的导航结构,通常显示在阅读器的侧边栏中,方便用户快速跳转到文档的不同部分,大纲通常以层级结构组织,包含... 目录一、PDF大纲简介二、准备工作所需工具常见安装问题三、代码实现完整代码核心功能解析四、使用效果控

Linux从文件中提取特定内容的实用技巧分享

《Linux从文件中提取特定内容的实用技巧分享》在日常数据处理和配置文件管理中,我们经常需要从大型文件中提取特定内容,本文介绍的提取特定行技术正是这些高级操作的基础,以提取含有1的简单需求为例,我们可... 目录引言1、方法一:使用 grep 命令1.1 grep 命令基础1.2 命令详解1.3 高级用法2

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查