【问题标题】:Logo recognition - how to improve performance徽标识别 - 如何提高性能
【发布时间】:2025-12-16 06:30:02
【问题描述】:

我正在做一个识别电视频道的项目。 我正在拍摄频道的照片,我试图避开背景并从徽标的中心获取样本。 我认出了 4 个不同的徽标,以下是模板:

我的模板匹配算法是如何工作的:
给定 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,您的模板匹配算法似乎不够好。白纸与您的徽标不同。
  • 我使用openCV的算法,我只使用了阈值并找到了最大值
  • 如果您使用的是OpenCV,您是否尝试过其他识别方法,例如EigenVecors (PCA)?

标签: image-processing template-matching


【解决方案1】:

这完全取决于您如何从模板中计算渠道概率。您是使用颜色直方图还是渐变直方图,然后查看模板与测试图像之间的直方图差异?

另一种方法是从测试图像中计算特征向量,例如梯度直方图和颜色直方图的串联。然后,手动创建一个训练数据库,在其中您知道标签(1、2、3 或 4,具体取决于图像中可见的标签),您可以将硬编码标签连同直方图特征输入分类器例程。我为此推荐LIBSVMscikits.learn 实现在 Python 中很容易使用。

这将产生一个支持向量机分类器,它将新图像的特征向量与训练集的支持向量进行比较,并确定最有可能出现在图像中的正确标签。然后,如果您想要产生概率而不仅仅是预测标签的东西,您可以在此 SVM 之上拟合一个逻辑模型。

要开始学习这种类型的机器学习,需要阅读两本好书:Pattern Classification,作者是 Duda、Hart 和 Stork,以及 Pattern Recognition and Machine Learning,作者是 Bishop。

我为在 Python 中实现 Poselets 和定向梯度直方图而编写的一些凌乱的 Python 代码可以在 linked here 找到;也许您可以在其中获取一些代码部分,它将适合您的任务。

【讨论】: