Pythonでウォーリーを見つけるにはどうすればよいですか?


83

恥知らずに時流に乗る:-)

Mathematicaでウォーリーを見つける方法とフォローアップRでウォーリーを見つける方法に触発されました。新しいPythonユーザーとして、これがどのように行われるかを知りたいです。PythonはRよりもこれに適しているようで、MathematicaやMatlabのようにライセンスについて心配する必要はありません。

以下のような例では、明らかに単にストライプを使用するだけでは機能しません。このような難しい例で、単純なルールベースのアプローチを機能させることができれば興味深いでしょう。

ビーチで

正解は、元のスレッドでGregoryKlopperが提唱した制限付きボルツマンマシン(RBM)アプローチなど、ML手法を使用する必要があると思われるため、[machine-learning]タグを追加しました。Python利用できるRBMコードがいくつかあり、開始するのに適している可能性がありますが、そのアプローチには明らかにトレーニングデータが必要です。

で、機械学習のための信号処理(MLSP 2009)2009 IEEE国際ワークショップ彼らは走ったのウォーリー:データ解析コンペの?。トレーニングデータはmatlab形式で提供されます。そのWebサイトのリンクは無効になっていますが、データ(Sean McLooneと同僚が採用したアプローチのソースはここにあります(SCMリンクを参照)に注意してください)。


7
申し訳ありません...この写真でWaldoを正常に見つけるプログラムはありますか?「本物の」ウォルドの際立った特徴はないようです。私は以前同じウォーリーの本を持っていましたが、覚えていることから、使用しなければならない自然言語の手がかりがいくつかありました。おそらく、本物のウォーリーが杖などを持っていなかったのかもしれません。最初にプログラムに自然言語の手がかりを理解させることができなければ、プログラムでウォーリーを見つける方法がわかりません。
AdamKG 2012年

はい、その通りです、ごめんなさい...それも面白い仕事になるでしょうが!画像を古い「ビーチで」に切り替えました。これにも縞模様があります...(この画像を選択する別の理由もあります!)
tdc 2012年

この質問は興味深いものですが、何を求めているのかは不明です。それはソリューションの実装ですか?これに使用するPython用のMLライブラリのヒントは?
サイモンベルゴット2012年

@Simonの完全な実装はおそらく少し質問する必要がありますが、答えの骨組み(つまり、定義が欠落している一部の関数)は素晴らしいでしょう。私は画像をロードするかどうかさえ
わかり

回答:


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
ビーチの画像を試してみましたが、うまくいきませんでした:(ウォーリーはトップ6または7のヒットに含まれていましたが、最適な一致ではありませんでした。自分で彼を見つけることができなかったため、処理は役に立ちました(目)私は小領域の束を持っていたとき、それは簡単であった。
luispedro

これの完全なソースコードを入手しましたか?npが定義されていません
2013年

2

テンプレートマッチングを試してから、最も類似性の高いものを削除し、機械学習を使用してさらに絞り込むことができます。これも非常に困難であり、テンプレートマッチングの精度により、すべての顔または顔のような画像が返される場合があります。これを一貫して行うには、機械学習以上のものが必要になると思います。


2

多分あなたは問題を2つの小さな問題に分割することから始めるべきです:

  1. 人々を背景から分離するアルゴリズムを作成します。
  2. 可能な限り多くの正と負の例を使用してニューラルネットワーク分類器をトレーニングします。

これらはまだ取り組むべき2つの非常に大きな問題です...

ところで、私はc ++を選択してCVを開きますが、これにははるかに適しているようです。


1
C ++とOpenCVを使用する場合、Pythonでのソリューションは可能な限りです。OpenCVはPythonで使用できます。
unapiedra 2012

1

これは不可能ではありませんが、成功した試合の例が実際にはないため、非常に困難です。多くの場合、複数の状態があり(この場合、ウォリーの描画を見つける例が増えます)、複数の画像を画像再構成プログラムにフィードして、隠れマルコフモデルとして扱い、推論にビタビアルゴリズムのようなものを使用できます(http:/ /en.wikipedia.org/wiki/Viterbi_algorithm)。

それは私がそれにアプローチする方法ですが、あなたがそれを学ぶことができるようにあなたがそれに正しい答えの例を与えることができる複数の画像を持っていると仮定します。写真が1枚しかない場合は、別のアプローチが必要になる可能性があります。


1

私は、ほとんど常に表示される2つの主要な機能があることを認識しました。

  1. 赤白のストライプのシャツ
  2. ファンシーキャップの下の濃い茶色の髪

だから私はそれを次のようにします:

ストライプのシャツを検索する:

  • 赤と白の色をフィルターで除去します(HSV変換された画像のしきい値を使用)。それはあなたに2つのマスク画像を与えます。
  • それらを一緒に追加します->それはストライプのシャツを検索するためのメインマスクです。
  • フィルターで除去されたすべての赤が純粋な赤(#FF0000)に変換され、フィルターで除去されたすべての白が純粋な白(#FFFFFF)に変換された新しい画像を作成します。
  • ここで、この純粋な赤白の画像を縞模様の画像と関連付けます(すべてのワルドには完全な横縞があると思うので、パターンを回転させる必要はありません)。上記のメインマスク内でのみ相関を行います。
  • 1枚のシャツから生じた可能性のあるクラスターをグループ化してみてください。

複数の「シャツ」がある場合、たとえば、正の相関のクラスターが複数ある場合は、濃い茶色の髪などの他の機能を検索します。

茶髪を探す

  • HSV変換された画像といくつかのしきい値を使用して、特定の茶色の髪の色を除外します。
  • このマスクされた画像で特定の領域を検索します-大きすぎず小さすぎません。
  • ここで、(前に)検出されたストライプのシャツのすぐ上にあり、シャツの中心から一定の距離にある「髪の領域」を検索します。

1

これは、うまく機能するニューラルネットワークを使用したソリューションです。

ニューラルネットワークは、ウォーリーが写真のどこに現れるかを示す境界ボックスでマークされたいくつかの解決された例でトレーニングされています。ネットワークの目標は、トレーニング/検証データから予測されたボックスと実際のボックスの間のエラーを最小限に抑えることです。

上記のネットワークは、Tensorflow Object DetectionAPIを使用してトレーニングと予測を実行します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.