【计算机视觉】阶编码本模型(Multi phase codebook model)
转自:http://www.cnblogs.com/xrwang/archive/2012/04/24/MPCBBGM.html
多阶编码本模型(Multi phase codebook model)
作者:王先荣
注:这是2010年所写的文章,因为要发论文到杂志上的缘故,这篇文章放到博客几天便隐藏起来了,最近论文正是刊出,所以文章又重见天日了。您可以在后面的地址查看或者下载论文。
http://www.ceaj.org/Jweb_gcyyy/CN/abstract/abstract27730.shtml
前言
本文将介绍一种名为多阶编码本的背景模型,该模型借用《Wallflower:Principles and Practice of Background Maintenance》中的三层模型思路,试图达到适应性更广,更精确,性能更好的目标。像素级处理采用《Real-time foreground-background segmentation using codebook model》中提出的编码本模型,不过对其进行了必要的扩展;区域级处理采用《学习OpenCV》中的形态学及轮廓处理方法;帧间处理以每帧的全局平均灰度值为依据,动态建立多个编码本以适应各种情况。因为博客文章格式比较随意,我在这里只写出要点,并给出实现代码,套话之类的都省了。
题外话
在开始正文之前,我要向大家隆重的介绍一幅我女儿的作品,画中有一座城堡及四个人,分别代表家、王子(??)、公主(女儿)、国王(我)及王后(我老婆)。最近在小孩身上连续发生了一些问题,希望能尽快好起来。
帧间处理
帧间处理的目的是为了让背景模型能适应尽可能的场景(相对固定及多变的场景)。在更新背景模型及背景减除的之前,需要先计算图像的全局平均灰度值,然后根据平均灰度值选择(或创建)一个合适的编码本,并在选定的编码本中执行更新或者减除。如果需要,也可以选择关闭帧间处理,这样多阶编码本模型就退化成编码本模型。多个编码本分别对应场景的多种可能。为了能够鉴别编码本的适用范围,增加了两个成员,分别是:ymin——最小灰度值,ymax——最大灰度值。在训练背景模型的过程中,ymin和ymax可能会缓慢的扩展。
像素级处理
像素级处理本质上是对编码本模型的处理,每个像素可能包含多个码元(CodeWord),每个码元的box上限和下限包容了像素值的小幅度变化,多个码元包容了像素的多种可能性。为了能够反映每个码元的重要性,我为码元增加了成员weight(权重);而为了计算出权重,又为码元增加了成员frequency(表示该码元出现的次数),为编码本增加了成员frequencyCounts(用来存储每个像素中所有码元的出现次数之和)。编码本的详细介绍请看kim的论文。增加权重和码元出现次数的灵感来自《Nonparametric
Background Generation》,详见原文或者我翻译的博文。
区域级处理
这里的区域级处理跟通常的不太一样,并非在建模和背景减除时进行采用区域级信息。而是在背景减除之后,使用区域级处理对结果进行加工,达到消除噪声、杂点及过小目标的目的。为什么不在背景建模及背景减除时使用区域级信息呢?原因有两点:(1)为了使计算量不至于过大;(2)即使糅合了区域级信息,结果也没有显著的改善。
算法主要流程
1.更新背景模型
(1)计算图像的全局平均灰度值;
(2)根据全局平均灰度值选择合适的编码本;
(3)如果没有找到合适的编码本,则创建一个新的编码本;
(4)在合适的编码本或者新编码本中,遍历每个像素;
(5)遍历每个码元,寻找匹配当前像素值的码元;
(6)如果找到了匹配的码元,则更新匹配码元及不匹配的码元;
(7)如果没有找到匹配的码元,则新增一个码元,并更新不匹配的码元。
2.背景减除
(1)计算图像的全局平均灰度值;
(2)根据全局平均灰度值选择合适的编码本;
(3)如果没有找到合适的编码本,则认为所有的像素都是前景;
(4)如果找到了合适的编码本,遍历每个像素;
(5)遍历每个码元,如果存在匹配像素当前值的码元,则该像素为背景;如果没有匹配的码元,则像素为背景。
3.区域级处理
(1)用形态学开、闭操作消除图像中的杂点和噪声;
(2)用轮廓操作来剔除过小的前景:遍历图像的每个轮廓,如果轮廓的周长小于阀值,则剔除该轮廓;用多边形或者凸包近似余下的轮廓;重新绘制近似轮廓。
4.获取最可靠背景
(1)选择命中次数最多的编码本;
(2)遍历每个像素,选择像素中权重最大的码元;
(3)将最佳码元中box的平均值作为像素值。
5.清除背景模型中消极或权重过小的码元
(1)遍历每个编码本,若编码本的tAfterClear大于阀值,则执行清除;
(2)遍历需要清除编码本中的每个像素;
(3)遍历每个码元,若消极帧数大于阀值,或者权重小于阀值,则删除码元;
(4)重新计算相关的数据。
6.查表技巧
在处理的过程中,为了提高计算像素扩展值的速度,采用查表的做法来代替每次都计算:在初始化时先计算好256种可能的扩展值并存入数组,然后再直接从数组中取值。
如何使用多阶编码本模型
您可以按下列方式来使用编码本模型:
//(1)初始化编码本模型
MultiPhaseCodeBookModel mpcbModel =new MultiPhaseCodeBookModel(imageWidth, imageHeight);
//(2)为了训练背景模型而多次更新背景模型,训练次数自己决定
mpcbModel.Update(image);
//(3)执行背景减除
mpcbModel.Diff(image2);
//(4)使用结果(前景掩码图像)
pictureBox1.Image = mpcbModel.ForegroundMask.Bitmap;
//(5)结束时释放资源
mpcbModel.Dispose();
完整的示例请参看下列代码:
使用参考
1.MultiPhaseCodeBookModel类包含以下公共属性:
int Width; //获取图像的宽度
int Height; //获取图像的高度
MultiPhaseCodeBookModelParameter Parameter; //获取或者设置多阶编码本模型参数
List<CodeBook> CodeBooks; //获取编码本列表
double TotalFrameCount; //获取已经更新的总帧数
Image<Gray, Byte> ForegroundMask; //获取前景掩码图像
2.MultiPhaseCodeBookModel类包含以下公共方法:
ClearStale——清除消极或者权重过小的码元
Diff——背景减除
GetAverageGrayValue——获取图像的全局平均灰度值
GetMrbm——获取最可靠背景图像
Update——更新背景模型
UpdateAndDiff——更新背景模型,然后执行背景减除
实现多阶编码本模型
实现方法遵循上面提到的算法,完整的多阶编码本模型实现代码如下所示:
实现多阶编码本模型
实现方法遵循上面提到的算法,完整的多阶编码本模型实现代码如下所示:
试验
我用PETS2009中的图像序列对多阶编码本模型进行了一些测试,测试结果还不错,达到了预期的目标。测试环境为:CPU AMD闪龙3200+,内存1.5G。处理768x576大小的图像大致需要150~200M内存。不过性能不够好,更新背景模型大约需要300ms/帧,背景减除大约需要150ms/帧,更新的同时执行背景减除大约需要390ms/帧。如果使用C语言来实现多阶编码本模型,大约可以提高30%的性能;如果采用并行编程,每增加一个CPU大约又可以提高30%的性能。
个人见解
这段时间看了不少关于背景建模及前景检测方面的资料,并动手实践了固定摄像机的多种方法,而运动摄像机的情况没有涉及。为了适应更复杂的场景,背景模型越来越复杂;复杂的背景模型需要更多的内存和更大的计算量,相应的需要更加强劲的硬件。然而真的需要这么复杂的背景模型吗?我看未必,我倾向于选择刚好够用的背景模型,用牛刀去杀鸡是得不偿失的做法。
改进
今天早上在刷牙的时候突然想到,现在的多阶编码本模型能够做得更好:
(1)数据结构上,其实每个码元中的权重不需要每次都去计算再保存,只需在比较权重之前,计算权重阀值跟像素总帧数的乘积weight',然后用weight'与每个码元的帧数去比较,效果也一样。这样做的好处有:减小了模型的内存占用量,三通道图像中每个码元占用的字节数从28减少到24;在更新模型时不必计算权重,可以为每个码元减少一次乘法运算,减少一次循环。
(2)算法能够优化,例如使用一维数组替代二维数组就能在大循环中节约数十毫秒级的时间。
感谢您耐心看完本文,希望对您有所帮助。
【计算机视觉】阶编码本模型(Multi phase codebook model)的更多相关文章
- 『计算机视觉』Mask-RCNN_训练网络其三:训练Model
Github地址:Mask_RCNN 『计算机视觉』Mask-RCNN_论文学习 『计算机视觉』Mask-RCNN_项目文档翻译 『计算机视觉』Mask-RCNN_推断网络其一:总览 『计算机视觉』M ...
- Codebook model 视频抠像 xp sp3 + vs2005 + OpenCV 2.3.1
Codebook model 视频抠像 xp sp3 + vs2005 + OpenCV 2.3.1 源码及详细文档下载 svn checkout http://cvg02.googlecode.co ...
- 理论沉淀:隐马尔可夫模型(Hidden Markov Model, HMM)
理论沉淀:隐马尔可夫模型(Hidden Markov Model, HMM) 参考链接:http://www.zhihu.com/question/20962240 参考链接:http://blog. ...
- NLP —— 图模型(一)隐马尔可夫模型(Hidden Markov model,HMM)
本文简单整理了以下内容: (一)贝叶斯网(Bayesian networks,有向图模型)简单回顾 (二)隐马尔可夫模型(Hidden Markov model,HMM) 写着写着还是写成了很规整的样 ...
- 3d模型 手办制作 3d model manual production
3d模型 手办制作 3d model manual production 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313 ...
- .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)
本文内容 异步编程类型 异步编程模型(APM) 参考资料 首先澄清,异步编程模式(Asynchronous Programming Patterns)与异步编程模型(Asynchronous Prog ...
- JAVA内存模型(Java Memory Model ,JMM)
http://blog.csdn.net/hxpjava1/article/details/55189077 JVM有主内存(Main Memory)和工作内存(Working Memory),主内存 ...
- 隐变量模型(latent variable model)
连续隐变量模型(continuous latent model)也常常被称为降维(dimensionality reduction) PCA Factor Analysis ICA 连续的情形比离散的 ...
- 向量空间模型(Vector Space Model)
搜索结果排序是搜索引擎最核心的构成部分,很大程度上决定了搜索引擎的质量好坏.虽然搜索引擎在实际结果排序时考虑了上百个相关因子,但最重要的因素还是用户查询与网页内容的相关性.(ps:百度最臭名朝著的“竞 ...
随机推荐
- django 之视图层及模板层 04
目录 视图层 render方法是Template和Contex两个对象的组合使用 JsonResponse对象 CBV及源码分析 CBV 加装饰器的方式 模板层 模板语法传值 模板语法 变量 过滤器( ...
- PIXI屏幕自适应以及强制横屏
canvas屏幕适配可以用css样式自适应, 可以设置transform旋转角度和transfrom-origin:center以中心点旋转位置以及宽高width和height来实现对canvas的适 ...
- sql DATEDIFF函数使用
date_part abbreviations year yy, yyyy quarter qq, q month mm, m dayofyear dy, y day dd, d week wk, w ...
- 小程序上传wx.uploadFile - 小程序请假-请求
小程序上传wx.uploadFile UploadTask wx.uploadFile(Object object) 将本地资源上传到服务器.客户端发起一个 HTTPS POST 请求,其中 cont ...
- B. Chocolates
B. Chocolates time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- [CSP-S模拟测试]:中间值(二分)
题目背景 $Maxtir$喜欢序列的中间值. 题目传送门(内部题127) 输入格式 第一行输入两个正整数$n,m$,其中$m$是操作和询问次数. 接下来两行每行输入$n$个非负整数,每一行分别表示两个 ...
- scrollWidth、clientWidth、offsetWidth、width的区别
scrollWidth:对象的实际内容的宽度,不包边线宽度,会随对象中内容超过可视区后而变大. clientWidth:对象内容的可视区的宽度,不包滚动条等边线,会随对象显示大小的变化而改变. off ...
- java中的基本数据类型简谈
在java里面有八大基本的数据类型,分别是 byte,short,char,int,long,float,double,boolean 然后需要说的就是几个特殊的基本数据类型的取值范围 先来说说byt ...
- linux下快速查找文件(转载)
权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/xxmonstor/article/deta ...
- TensorFlow基本计算单元——变量
# -*- coding: utf-8 -*- import tensorflow as tf a = 3 # 创建变量 w = tf.Variable([[0.5, 1.0]]) #行向量 x = ...