web-dev-qa-db-ja.com

PythonでWallyを見つけるにはどうすればよいですか?

恥ずかしがらずにバンドワゴンに飛び乗る:-)

MathematicaでWaldoを見つけるにはどうすればよいですか とフォローアップ RでWaldoを見つけるには 、新しいpythonユーザーとしてpythonはRよりもこれに適しているようで、MathematicaやMatlabの場合のようにライセンスについて心配する必要はありません。

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

At the beach

[machine-learning]タグを追加しました。元のスレッドでGregory Klopperによって提唱された制限付きボルツマンマシン(RBM)アプローチなどのMLテクニックを使用する必要があると考えているためです。いくつかの Pythonで利用可能なRBMコード がありますが、これは開始するのに適した場所かもしれませんが、そのアプローチには明らかにトレーニングデータが必要です。

2009 IEEE International Workshop on MACHINE LEARNING FOR SIGNAL PROCESSING(MLSP 2009)Data Analysis Competition:Where's Wally? が開催されました。トレーニングデータは、MATLAB形式で提供されます。そのウェブサイト上のリンクは死んでいるが、データは( Sean McLoone によって取られたアプローチのソースとともに)==同僚が見つかります here (SCMリンクを参照) 。1つの場所から始めるようです。

82
tdc

これが 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)

そして私たちは waldo

62
luispedro

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

2
a sandwhich

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

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

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

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

2
WeaselFox

これは不可能ではありませんが、試合の成功例は実際にはないため、非常に困難です。多くの場合、複数の状態があります(この場合、find walleysの図面の例)、複数の画像を画像調整プログラムに送り、それを隠れマルコフモデルとして扱い、推論にビタビアルゴリズムのようなものを使用できます( http://en.wikipedia.org/wiki/Viterbi_algorithm )。

それが私がそれに取り組む方法ですが、あなたがそれに複数の画像を持っていると仮定して、それが学習できるように正しい答えの例を与えることができます。写真が1つしかない場合は、別の方法を使用する必要があると思います。

1
Lostsoul

これが解決策です うまく機能するニューラルネットワークを使用します。

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

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

1
Tadej Magajna

私はほとんど常に目に見える2つの主要な機能があることを認識しました:

  1. 赤白の縞模様のシャツ
  2. ファンシーキャップの下のダークブラウンの髪

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

縞模様のシャツを検索:

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

「シャツ」が複数ある場合、つまり正の相関のクラスタが複数ある場合は、濃い茶色の髪など、他の特徴を検索します。

茶色の髪を検索

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