我有以下问题: 我获得了一组图像,我需要使用OpenCV库将它们分配给照片和图片(图形)。
我已经尝试了
所以我有7%的错误(在2000张图片上测试过)。我有点困惑,因为我在很多计算机视觉方面都没有很多经验。
例如,下面这张照片。它的直方图(RGB和HSV)非常差,轮廓数量相当小。此外还有很多背景颜色,所以我需要找到一个对象来计算它的直方图(我为此使用了findContours())。但无论如何我的算法会将此图像检测为图片。
还有一个例子:
图片问题是噪音。我有小尺寸(200 * 150)的图像,在某些情况下噪点是如此明显,我的算法将此图像检测为照片。我试图模糊图像,但在这种情况下,由于混合像素,颜色数量增加,并且它减少了轮廓的数量(一些暗淡的边界变得无法区分)。
图片示例:
我也尝试了颜色分割和MSER,但我最好的结果仍然是7%。
你能告诉我我还可以尝试哪些方法吗?
答案 0 :(得分:3)
我已经使用你的数据集来创建非常简单的模型。为此,我在R中使用了Rattle库。
输入数据
rgbh1 - number of bins in RGB histogram, which value > @param@, in my case @param@ = 30 (340 is maximum value)
rgbh2 - number of bins in RGB histogram, which value > 0 (not empty)
hsvh1 - number of bins in HSV histogram, which value > @param@, in my case @param@ = 30 (340 is maximum value)
hsvh2 - number of bins in HSV histogram, which value > 0 (not empty)
countours - number of contours on image
PicFlag - flag indicating picture/photo (picture = 1, photo = 0)
数据探索
为了更好地理解您的数据,下面是按照图片/照片组分布各个变量的图表(y轴上有百分比):
它清楚地表明存在具有预测能力的变量。其中大部分都可以在我们的模型中使用。接下来,我创建了简单的散点图矩阵,以查看某些变量组合是否有用:
你可以看到例如countours和rgbh1的组合看起来很有希望。
在下面的图表中,您可以注意到变量之间也存在很强的相关性。 (通常,我们希望有很多变量具有低相关性,而您只有有限数量的相关变量)。饼图显示相关性有多大 - 全圆表示1,空圆表示0,我的观点是如果相关性超过.4,则在模型中同时包含两个变量可能不是一个好主意。
<强>模型强>
然后我使用决策树,随机森林,逻辑回归和神经网络创建了简单的模型(保持Rattle的默认值)。作为输入,我已将您的数据用于60/20/20拆分(培训,验证,测试数据集)。这是我的结果(如果你不理解错误矩阵,请参考谷歌):
Error matrix for the Decision Tree model on pics.csv [validate] (counts):
Predicted
Actual 0 1
0 167 22
1 6 204
Error matrix for the Decision Tree model on pics.csv [validate] (%):
Predicted
Actual 0 1
0 42 6
1 2 51
Overall error: 0.07017544
Rattle timestamp: 2013-01-02 11:35:40
======================================================================
Error matrix for the Random Forest model on pics.csv [validate] (counts):
Predicted
Actual 0 1
0 170 19
1 8 202
Error matrix for the Random Forest model on pics.csv [validate] (%):
Predicted
Actual 0 1
0 43 5
1 2 51
Overall error: 0.06766917
Rattle timestamp: 2013-01-02 11:35:40
======================================================================
Error matrix for the Linear model on pics.csv [validate] (counts):
Predicted
Actual 0 1
0 171 18
1 13 197
Error matrix for the Linear model on pics.csv [validate] (%):
Predicted
Actual 0 1
0 43 5
1 3 49
Overall error: 0.07769424
Rattle timestamp: 2013-01-02 11:35:40
======================================================================
Error matrix for the Neural Net model on pics.csv [validate] (counts):
Predicted
Actual 0 1
0 169 20
1 15 195
Error matrix for the Neural Net model on pics.csv [validate] (%):
Predicted
Actual 0 1
0 42 5
1 4 49
Overall error: 0.0877193
Rattle timestamp: 2013-01-02 11:35:40
======================================================================
<强>结果
正如您所看到的,整体错误率介于6.5%和8%之间。我不认为通过调整使用方法的参数可以显着改善这一结果。有两种方法可以降低整体错误率:
使用过的软件:
用于创建corrgram和scatterplot的代码(其他输出是使用Rattle GUI生成的):
# install.packages("lattice",dependencies=TRUE)
# install.packages("car")
library(lattice)
library(car)
setwd("C:/")
indata <- read.csv2("pics.csv")
str(indata)
# Corrgram
corrgram(indata, order=TRUE, lower.panel=panel.shade,
upper.panel=panel.pie, text.panel=panel.txt,
main="Picture/Photo correlation matrix")
# Scatterplot Matrices
attach(indata)
scatterplotMatrix(~rgbh1+rgbh2+hsvh1+hsvh2+countours|PicFlag,main="Picture/Photo scatterplot matrix",
diagonal=c("histogram"),legend.plot=TRUE,pch=c(1,1))
答案 1 :(得分:1)
一般的建议是增加功能的数量(或获得更好的功能),并使用这些功能构建分类器,并使用适当的机器学习算法进行训练。 OpenCV已经有了几个很好的machine learning算法,您可以使用它们。
我从来没有解决过这个问题,但是快速的谷歌搜索让我看到了Cutzu et。的这篇论文。 al。 Distinguishing paintings from photographs
答案 2 :(得分:1)
一个应该有用的功能是渐变直方图。自然图像具有特定的梯度强度分布。