如何使用Python找到Wally?


83

无耻地跳上了潮流:-)

我如何通过Mathematica查找Waldo以及后续如何使用R查找Waldo的启发,作为一个新的python用户,我很想知道如何做到这一点。似乎python比R更适合于此,并且我们不必像Mathematica或Matlab那样担心许可证。

在下面的示例中,显然仅使用条纹将不起作用。如果可以使基于简单规则的方法适用于诸如此类的困难示例,那将很有趣。

在沙滩上

我添加了[machine-learning]标签,因为我认为正确的答案必须使用ML技术,例如Gregory Klopper在原始线程中倡导的Restricted Boltzmann Machine(RBM)方法。有一些在python中RBM代码可能是一个不错的起点,但是显然该方法需要训练数据。

2009 IEEE信号处理机器学习国际研讨会上(MLSP 2009),他们举办了数据分析竞赛:Wally在哪里?。训练数据以matlab格式提供。请注意,该网站上的链接已失效,但数据(以及Sean McLoone和同事采用的方法的来源都可以在此处找到(请参阅SCM链接)。似乎是一个起点。


7
抱歉...是否有任何程序可以在这张照片中成功找到Waldo?“真正的”沃尔多似乎没有任何区别特征。我曾经有过同一本Waldo书,从我记得的东西来看,必须使用一些自然语言的线索,也许真正的Waldo没有握着拐杖或其他东西。我看不到如何在不首先使您的程序了解自然语言线索的情况下如何以编程方式找到Waldo。
AdamKG

是的,您是对的,对不起……尽管那也是一件有趣的事!我将图像切换为旧的“ At the beach”,该图像上也有条纹……(还有选择此图像的另一个原因!)
tdc 2012年

尽管这个问题很有趣,但是您要问的内容还不清楚。它是解决方案的实现吗?提示使用哪个ML python库?
西蒙·贝格

@Simon一个完整的实现可能要问很多,但是答案的骨架(即某些函数缺少定义)会很棒。我什至不确定我是否会加载图像(尽管我已经看到了这一点:stackoverflow.com/questions/94875/image-processing-in-python
tdc 2012年

Answers:


63

这是mahotas的实现

from pylab import imshow
import numpy as np
import mahotas
wally = mahotas.imread('DepartmentStore.jpg')

wfloat = wally.astype(float)
r,g,b = wfloat.transpose((2,0,1))

分为红色,绿色和蓝色通道。最好在下面使用浮点算法,因此我们在顶部进行转换。

w = wfloat.mean(2)

w 是白色通道。

pattern = np.ones((24,16), float)
for i in xrange(2):
    pattern[i::4] = -1

在垂直轴上建立+ 1,+ 1,-1,-1模式。这是沃利的衬衫。

v = mahotas.convolve(r-w, pattern)

与红色减去白色卷积。这将在衬衫所在的位置产生强烈的响应。

mask = (v == v.max())
mask = mahotas.dilate(mask, np.ones((48,24)))

寻找最大值并将其扩大以使其可见。现在,我们调低整个图像,但不包括区域或兴趣点:

wally -= .8*wally * ~mask[:,:,None]
imshow(wally)

我们得到了瓦尔多


3
我尝试了海滩图片,但效果不佳:(沃利(Wally)排在前6或7位,但它并不是最佳匹配。该处理确实有所帮助,因为我自己找不到(与我一起眼),而当我只用了一帮小区域,很容易。
luispedro

你有完整的源代码吗?我没有定义
编码为

2

您可以尝试模板匹配,然后删除哪个模板产生了最高的相似度,然后使用机器学习来缩小它的范围。这也是非常困难的,并且由于模板匹配的准确性,它可能只返回每个人脸或类似人脸的图像。我认为,如果您希望一贯地做到这一点,那么您将不仅需要机器学习。


2

也许您应该先将问题分解为两个较小的问题:

  1. 创建一种将人物与背景分开的算法。
  2. 训练带有尽可能多的正面和负面例子的神经网络分类器。

这些仍然是要解决的两个非常大的问题...

顺便说一句,我会选择c ++并打开CV,这似乎更适合于此。


1
如果要使用C ++和OpenCV,则Python中的解决方案是尽可能的。OpenCV可以在Python下使用。
Unapiedra'2

1

这不是不可能,但非常困难,因为您确实没有成功比赛的例子。通常存在多种状态(在这种情况下,这是查找walleys图纸的更多示例),然后您可以将多张图片输入到图像协调程序中,并将其视为隐藏的马尔可夫模型,并使用类似viterbi的算法进行推断(http:/ /en.wikipedia.org/wiki/Viterbi_algorithm)。

那就是我处理它的方式,但是假设您有多个图像,则可以为它提供正确答案的示例,以便它可以学习。如果您只有一张照片,那么很抱歉,您可能需要采取另一种方法。


1

我认识到,几乎总是可以看到两个主要功能:

  1. 红白色条纹衬衫
  2. 花式帽下的深棕色头发

因此,我将通过以下方式进行操作:

搜索条纹衬衫:

  • 滤除红色和白色(在HSV转换的图像上带有阈值)。这样可以得到两个蒙版图像。
  • 将它们加在一起->这是搜索条纹衬衫的主要遮罩。
  • 创建一个新图像,将所有滤出的红色转换为纯红色(#FF0000),将所有滤出的白色转换为纯白色(#FFFFFF)。
  • 现在将这个纯红白色图像与一个条纹图案图像相关联(我认为所有的waldo都具有相当完美的水平条纹,因此不需要旋转图案)。仅在上述主掩码内进行相关。
  • 尝试将可能是一件衬衫造成的聚类分组。

如果有不止一件“衬衫”,也就是说,不止一类正相关,则搜索其他特征,例如深棕色头发:

寻找棕色的头发

  • 使用HSV转换后的图像和一些阈值过滤掉特定的棕色头发颜色。
  • 在此蒙版图像中搜索特定区域-不能太大也不能太小。
  • 现在,搜索“头发区域”,该区域位于(之前)检测到的条纹衬衫的上方,并且距衬衫中心有一定距离。

1

这是一个使用神经网络的解决方案,效果很好。

在几个已解决的示例上训练了神经网络,这些示例用边界框标记,这些边界框指示Wally在图片中出现的位置。网络的目标是使来自训练/验证数据的预测框与实际框之间的误差最小。

上面的网络使用Tensorflow对象检测API进行训练和预测。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.