5

背景: 我有2组来自图像的颜色像素,一组对应于背景,另一组对应于前景。接下来,我使用 OpenCV 的 EM 为每组训练 2 个高斯混合模型。我的目标是找出随机像素属于前景和背景的概率。因此,我对像素上的每个 EM 使用“预测”函数。

问题:

  • 我不明白这个函数返回的值。在 OpenCV 的文档中是这样写的:

该方法返回一个二元素双精度向量。零元素是样本的似然对数值。第一个元素是给定样本最可能的混合成分的索引。

http://docs.opencv.org/modules/ml/doc/expectation_maximization.html?highlight=predict#Vec2d%20EM::predict%28InputArray%20sample,%20OutputArray%20probs%29%20const

我不明白“似然对数”是什么意思。在我的结果中,我有时会有负值和值 > 1。是否有人使用相同的函数有这种结果或结果在 0 和 1 之间?我可以从我的结果中得出什么结论?

  • 如何获得像素属于整个 GMM 的概率(而不是属于 GMM 的每个集群的概率)?

这是我的代码:

Mat mask = imread("mask.tif", 0);
Mat formerImage = imread("ImageFormer.tif");
Mat currentImage = imread("ImageCurrent.tif");

// number of cluster in the GMM 
int nClusters = 5;

int countB=0, countF=0;

Vec3b color;

Vec2d probFg, probBg; // probabilities to belong to the foreground or background from GMMs

//count the number of pixels for each training data
for(int c=0; c<=40;c++) {
    for(int l=0; l<=40;l++) {
        if(mask.at<BYTE>(l, c)==255) {
            countF++;
        } else if(mask.at<BYTE>(l, c)==0) {
            countB++;
        }
    }
}


printf("countB %d countF %d \n", countB, countF);

Mat samplesForeground = Mat(countF,3, CV_64F);

Mat samplesBackground = Mat(countB,3, CV_64F);


// Expectation-Maximisation able to resolve the GMM and to predict the probability for a pixel to belong to the GMM.
EM em_foreground= EM(nClusters);
EM em_background= EM(nClusters);

countB=0;
countF=0;

// fill the training data from the former image depending of the mask
for(int c=0; c<=40;c++) {
    for(int l=0; l<=40;l++) {
        if(mask.at<BYTE>(l, c)==255) {
            color = formerImage.at<Vec3b>(l, c);
            samplesForeground.at<double>(countF,0)=color[0];
            samplesForeground.at<double>(countF,1)=color[1];
            samplesForeground.at<double>(countF,2)=color[2];
            countF++;
        } else if(mask.at<BYTE>(l, c)==0) {
            color = formerImage.at<Vec3b>(l, c);
            samplesBackground.at<double>(countB, 0)=color[0];
            samplesBackground.at<double>(countB, 1)=color[1];
            samplesBackground.at<double>(countB, 2)=color[2];
            countB++;
        }
    }
}

printf("countB %d countF %d \n", countB, countF);
em_foreground.train(samplesForeground);
em_background.train(samplesBackground);

Mat sample(1, 3, CV_64F);

// try every pixel of the current image and get the log likelihood
for(int c=0; c<=40;c++) {
    for(int l=0; l<=40;l++) {
        color = currentImage.at<Vec3b>(l,c);
        sample.at<double>(0)=color[0];
        sample.at<double>(1)=color[1];
        sample.at<double>(2)=color[2];
        probFg=em_foreground.predict(sample);
        probBg=em_background.predict(sample);
        if(probFg[0]>0 || probBg[0]>0)
            printf("probFg[0] %f probBg[0] %f \n", probFg[0], probBg[0]);
    }
}

编辑

在@BrianL 解释之后,我现在了解了对数可能性。

我的问题是预测函数的对数概率有时> 0。但它应该 <= 0。有没有人遇到过这个问题?

我已经编辑了上面的代码来显示问题。我已经尝试了以下图片的程序:

第一个图像是 ImageCurrent.tif,第二个是 ImageFormer.tif,最后一个是 mask.tif。

当前图像 以前的形象 面具

这可以被认为是 OpenCV 中的错误吗?我应该在 OpenCV 错误跟踪器上开票吗?

4

3 回答 3

4

“似然对数”是指概率的对数。因为对于概率p,我们期望 0 ≤ p ≤ 1,所以我期望值是负数:log( p ) ≤ 0。更大的负数意味着更小的概率。

当您处理概率非常小的乘积时,这种形式很有帮助:如果您以正常方式相乘,您很容易出现下溢并失去精度,因为概率变得非常小。但是在对数空间中,乘法变成了加法,这提高了准确性,也可能提高了计算的速度。

predict函数用于对数据点进行分类。如果您想为某个点属于模型中任何组件的可能性打分,您可以使用模型参数(请参阅get文档)自行计算。

于 2013-01-10T04:10:41.390 回答
1

我注意到您正在执行基于图形的图像分割。

您可能想查看以下博客文章,该文章使用 OpenCV 及其 GMM 类的方式与您执行基于图形切割的图像分割的方式非常相似。代码以 C++ 给出,并附有详细解释。这是链接:链接

基本上,我只能说对数概率,不管它是否正确,都不是你要找的。查看上面的链接了解详情。

于 2013-02-21T04:53:09.243 回答
1

据我了解,图像的前景和背景部分有两个单独的 GMM。在前景 GMM 中评估时,测试图像中样本像素“x”的总概率为

P_fg(x) = sum_over_j_1_to_k ( Wj_fg * Pj_fg( x ))
where 
k = number of clusters in foreground GMM
x = test sample
Pj_fg(x) = probability that sample x is in j-th  cluster according to the foreground GMM
Wj_fg = weight of the j-th cluster in foreground GMM
also, sum of all weights should be 1 for each GMM.

我们可以对背景 GMM 做类似的计算。

通过查看 opencv 中的 EM 代码,EM 返回的 2 个值的第一部分似乎是对数似然。对于前景 GMM,这是

log(P_fg(x_i))

我实现了您的算法,并且对于测试图像中的每个像素,我比较了两个 GMM-s 中的每一个返回的对数似然,并将像素与具有更高值的 GMM 进行分类。我得到了不错的结果。

在这方面,是的,这个值表示像素属于整个 GMM。

2)在我解决你的问题时,我总是得到所有测试样本像素的所有 GMMS 的对数似然值都低于 0。

于 2015-11-27T03:49:40.403 回答