Python으로 Wally를 어떻게 찾습니까?


83

뻔뻔하게 악 대차에 뛰어 들다 :-)

Mathematica 를 사용하여 Waldo를 찾는 방법R을 사용 하여 Waldo를 찾는 방법에 영감을 받았습니다 . 새로운 Python 사용자로서이 작업을 수행 할 수있는 방법을보고 싶습니다. Python이 R보다 여기에 더 적합 할 것 같으며 Mathematica 또는 Matlab 에서처럼 라이선스에 대해 걱정할 필요가 없습니다.

아래 예제와 같은 예에서는 단순히 스트라이프를 사용하면 작동하지 않습니다. 이와 같은 어려운 예에 대해 간단한 규칙 기반 접근 방식을 사용할 수 있다면 흥미로울 것입니다.

해변에서

정답은 원래 스레드에서 Gregory Klopper가 옹호 한 RBM (Restricted Boltzmann Machine) 접근 방식과 같은 ML 기법을 사용해야한다고 생각하므로 [machine-learning] 태그를 추가했습니다. Python에서 사용할 수있는 RBM 코드 가 있습니다.이 코드 는 시작하기에 좋은 곳일 수 있지만 분명히 해당 접근 방식을 위해서는 훈련 데이터가 필요합니다.

신호 처리를위한 머신 러닝 (MLSP 2009)에 대한 2009 년 IEEE 국제 워크숍에서 그들은 데이터 분석 대회를 개최했습니다. 월리는 어디에 있습니까? . 훈련 데이터는 MATLAB 형식으로 제공됩니다. 해당 웹 사이트의 링크는 작동하지 않지만 데이터 ( Sean McLoone 및 동료가 취한 접근 방식의 출처와 함께 여기 에서 찾을 수 있음)는 여기 에서 찾을 수 있습니다 (SCM 링크 참조).


7
죄송합니다 ...이 모든 성공적으로이 사진에 왈도을 발견 프로그램은? '진짜'월리의 특징은없는 것 같습니다. 저도 같은 Waldo 책을 가지고 있었는데 제가 기억하는 바에 따르면 실제 Waldo는 지팡이 같은 것을 들고 있지 않았을 수도 있습니다. 먼저 프로그램이 자연어 단서를 이해하지 않고 프로그래밍 방식으로 Waldo를 찾는 방법을 알 수 없습니다.
AdamKG

네 맞습니다, 미안합니다 ... 그것도 흥미로운 일 이겠지만! 나는 줄무늬가있는 오래된 "해변에서"이미지로 전환했습니다 ... (이 이미지를 선택하는 또 다른 이유가 있습니다!)
tdc

이 질문은 흥미롭지 만 무엇을 요구하는지 명확하지 않습니다. 솔루션의 구현입니까? 이를 위해 파이썬 용 ML 라이브러리를 사용할 수있는 힌트는 무엇입니까?
Simon Bergot

@Simon 완전한 구현은 아마도 물어볼 것이 조금 많 겠지만, 대답의 골격 (즉, 정의가 누락 된 일부 기능)은 훌륭 할 것입니다. 이미지를로드할지 확신 할 수 없습니다 (이것을 보았지만 : stackoverflow.com/questions/94875/image-processing-in-python )
tdc

답변:


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

이것에 대한 전체 소스 코드를 얻었습니까? 나는 np가 정의되지 않았다는 것을 얻고 있습니다
2013 년

2

템플릿 매칭을 시도한 다음 가장 유사성이 높은 항목을 삭제 한 다음 머신 러닝을 사용하여 범위를 더 좁힐 수 있습니다. 그것은 또한 매우 어렵고 템플릿 매칭의 정확성으로 모든 얼굴 또는 얼굴과 같은 이미지를 반환 할 수 있습니다. 이 일을 지속적으로 수행하려면 기계 학습 이상의 것이 필요하다고 생각합니다.


2

문제를 두 개의 작은 문제로 나누는 것으로 시작해야합니다.

  1. 사람과 배경을 구분하는 알고리즘을 만듭니다.
  2. 가능한 한 많은 긍정 및 부정 예제로 신경망 분류기를 훈련하십시오.

그것들은 여전히 ​​해결해야 할 두 가지 큰 문제입니다 ...

BTW, 나는 C ++을 선택하고 CV를 열 것입니다. 훨씬 더 적합합니다.


1
C ++ 및 OpenCV를 사용한다면 Python의 솔루션은 가능한 한 똑같습니다. OpenCV는 Python에서 사용할 수 있습니다.
Unapiedra 2012

1

이것은 불가능하지는 않지만 매우 어렵습니다. 왜냐하면 성공적인 경기의 예가 없기 때문입니다. 종종 여러 상태 (이 경우 월리 그림 찾기의 더 많은 예)가 있습니다. 그런 다음 여러 사진을 이미지 재구성 프로그램에 입력하고 숨겨진 markov 모델로 취급하고 추론을 위해 viterbi 알고리즘과 같은 것을 사용할 수 있습니다 ( http : / /en.wikipedia.org/wiki/Viterbi_algorithm ).

그게 내가 접근하는 방식이지만, 학습 할 수 있도록 정답의 예를 제공 할 수있는 여러 이미지가 있다고 가정합니다. 사진이 하나뿐이라면 다른 접근 방식을 취해야 할 수도 있습니다.


1

거의 항상 볼 수있는 두 가지 주요 기능이 있음을 깨달았습니다.

  1. 레드 화이트 스트라이프 셔츠
  2. 멋진 모자 아래에 짙은 갈색 머리

그래서 다음과 같은 방법으로 할 것입니다.

스트라이프 셔츠 검색 :

  • 빨간색과 흰색을 필터링합니다 (HSV 변환 이미지의 임계 값 포함). 그러면 두 개의 마스크 이미지가 제공됩니다.
  • 함께 추가-> 스트라이프 셔츠 검색을위한 메인 마스크입니다.
  • 필터링 된 모든 빨강은 순수한 빨강 (# FF0000)으로 변환되고 필터링 된 모든 흰색은 순수한 흰색 (#FFFFFF)으로 변환 된 새 이미지를 만듭니다.
  • 이제이 순수한 빨강-백색 이미지를 스트라이프 패턴 이미지와 연관 시키십시오 (모든 왈도의 가로 줄무늬가 매우 완벽한 것으로 생각하므로 패턴 회전이 필요하지 않습니다). 위에서 언급 한 메인 마스크 내에서만 상관 관계를 수행하십시오.
  • 하나의 셔츠 에서 발생할 수있는 클러스터를 함께 그룹화하십시오 .

두 개 이상의 '셔츠', 즉 양의 상관 관계 클러스터가 두 개 이상인 경우 짙은 갈색 머리카락과 같은 다른 기능을 검색합니다.

갈색 머리 검색

  • HSV 변환 이미지와 일부 임계 값을 사용하여 특정 갈색 머리 색깔을 필터링합니다.
  • 이 마스킹 된 이미지에서 너무 크지도 작지도 않은 특정 영역을 검색하십시오.
  • 이제 감지 된 스트라이프 셔츠 바로 위에 있고 셔츠 중앙까지 일정 거리가있는 '머리카락 영역'을 검색합니다.

1

다음 은 잘 작동하는 신경망 사용 하는 솔루션 입니다.

신경망은 그림에서 Wally가 나타나는 위치를 나타내는 경계 상자로 표시된 몇 가지 해결 된 예제에서 훈련됩니다. 네트워크의 목표는 훈련 / 검증 데이터에서 예측 된 상자와 실제 상자 사이의 오류를 최소화하는 것입니다.

위의 네트워크는 Tensorflow Object Detection API를 사용하여 학습 및 예측을 수행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.