Logo识别 - 如何提高性能

3

我正在开展一个识别电视频道的项目。 我拍摄频道的照片,避免背景干扰,并从标志的中心取样本。 我识别了4个不同的标志,以下是模板:

Channel1 Channel2Channel3Channel4

我的模板匹配算法如何工作:
给定4个大小为100x100的模板,每个模板代表一个不同的电视频道,每个模板具有不同的阈值(概率)。 用户拍摄电视上的标志,然后算法是: - 对每个模板运行4个独立的模板匹配,以接收每个模板与捕获图像匹配的概率。 - 对于每个频道的概率,如果频道的概率低于频道的阈值,则将该概率更改为0; - 宣布识别出的标志是概率最高的标志。 如果所有概率都为0,则宣布“无法识别”。

例如,如果我得到一个频道的概率为0.85,阈值为0.9,第二个频道的概率为0.8,阈值为0.75,则第二个频道“赢得”了。

当我拍摄其中一个标志的照片时,有95%的可能性识别出这些照片。

目前的结果:

  • 在尝试检测第一个(“微笑脸”标志)时,我进行了10次检测,其中有10次正确检测。对于正确模板和图像之间的模板匹配,我得到了0.91到0.94之间的概率。对于其他标志,我得到了0.77到0.91之间的概率。
  • 在尝试检测第二个(“绿色”标志)时,我进行了10次检测,其中有10次正确检测。对于正确模板和图像之间的模板匹配,我得到了0.78到0.91之间的概率。对于其他标志,我得到了0.71到0.83之间的概率(但因为阈值高,检测成功)。
  • 在尝试检测第三个(“圆形”标志)时,我进行了10次检测,其中有9次正确检测。对于正确模板和图像之间的模板匹配,我得到了0.83到0.92之间的概率。对于其他标志,我得到了0.73到0.91之间的概率。
  • 在尝试检测第四个(“黑白”标志)时,我进行了10次检测,其中有10次正确检测。对于正确模板和图像之间的模板匹配,我得到了0.91到0.94之间的概率。对于其他标志,我得到了0.78到0.92之间的概率。
  • 在尝试检测“负面”图像时,很多时候我会得到一个标志检测结果(这是不好的)。例如,如果我拍摄一张完全白色的纸张图像,则第一个、第三个和第四个标志的概率超过0.9。

如何改进或更改我的算法,以获得更好的“负面”图像结果?

谢谢您的帮助,

Eyal


请看一下编辑 - 我已经添加了决策算法和我进行的测试结果。 - Eyal
@Eyal,看起来你的模板匹配算法还不够好。白色背景与你的标志不相似。 - Roman Shapovalov
我使用了 openCV 的算法,仅使用了阈值,并找到了最大值。 - Eyal
1
如果您正在使用OpenCV,是否尝试过其他识别方法,例如特征向量(PCA)? - TomP89
@Eyal 我试图实现完全相同的事情。你能否开源你的代码或给我一些提示,告诉我你如何从opencv和其他库/算法中受益? - Murat Derya Özen
显示剩余2条评论
1个回答

3
这完全取决于您从模板中计算通道概率的方式。您是使用颜色直方图还是梯度直方图,然后查看模板和测试图像之间的直方图差异?
另一种方法是从测试图像中计算特征向量,例如梯度直方图和颜色直方图的串联。然后,手动创建一个训练数据库,在其中知道标签(1、2、3或4,具体取决于图像中可见的标签),并且您可以将硬编码标签以及直方图特征馈入分类器例程中。我建议使用LIBSVM进行此操作,而scikits.learn实现在Python中易于使用。
这将产生一个支持向量机分类器,该分类器将比较新图像的特征向量与训练集中的支持向量,并确定最可能存在于图像中的正确标签。然后,如果您想要产生概率而不仅仅是预测标签,则可以在此SVM上拟合逻辑模型。

两本入门机器学习的好书是模式分类, 作者为Duda, Hart和Stork,以及模式识别与机器学习,作者为Bishop。

我写的一些混乱的Python代码用于在Python中实现Poselets和方向梯度直方图可以在这里链接找到;也许你可以从其中获取一些代码部分并适用于你的任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接