Làm cách nào để tìm Wally bằng Python?


83

Không biết xấu hổ khi nhảy vào bandwagon :-)

Lấy cảm hứng từ Cách tìm Waldo với Mathematica và phần tiếp theo Cách tìm Waldo với R , với tư cách là một người dùng python mới, tôi rất muốn xem cách này có thể được thực hiện. Có vẻ như python sẽ phù hợp với điều này hơn R và chúng ta không phải lo lắng về giấy phép như chúng ta làm với Mathematica hoặc Matlab.

Trong một ví dụ như dưới đây, rõ ràng là chỉ sử dụng sọc sẽ không hoạt động. Sẽ rất thú vị nếu một cách tiếp cận dựa trên quy tắc đơn giản có thể được thực hiện để làm việc cho các ví dụ khó như thế này.

Ở bãi biển

Tôi đã thêm thẻ [machine-learning] vì tôi tin rằng câu trả lời chính xác sẽ phải sử dụng các kỹ thuật ML, chẳng hạn như phương pháp Restricted Boltzmann Machine (RBM) được Gregory Klopper ủng hộ trong chủ đề gốc. Có một số mã RBM có sẵn trong python có thể là một nơi tốt để bắt đầu, nhưng rõ ràng dữ liệu đào tạo là cần thiết cho cách tiếp cận đó.

Tại Hội thảo Quốc tế IEEE 2009 về MÁY HỌC ĐỂ XỬ LÝ TÍN HIỆU (MLSP 2009), họ đã tổ chức Cuộc thi Phân tích Dữ liệu: Where's Wally? . Dữ liệu đào tạo được cung cấp ở định dạng matlab. Lưu ý rằng các liên kết trên trang web đó đã chết, nhưng dữ liệu (cùng với nguồn của phương pháp do Sean McLoone và các đồng nghiệp thực hiện có thể được tìm thấy tại đây (xem liên kết SCM). Có vẻ như một nơi để bắt đầu.


7
Xin lỗi ... là có bất kỳ chương trình mà tìm thấy thành công Waldo trong bức ảnh này? Dường như không có bất kỳ đặc điểm phân biệt nào của Waldo 'thật'. Tôi đã từng có cùng một cuốn sách Waldo đó, và từ những gì tôi nhớ, có một số manh mối ngôn ngữ tự nhiên phải được sử dụng, có thể rằng Waldo thật không cầm gậy hay thứ gì đó. Tôi không hiểu làm cách nào bạn có thể tìm thấy Waldo theo chương trình mà không cần chương trình của bạn hiểu manh mối ngôn ngữ tự nhiên trước.
AdamKG

Vâng, bạn nói đúng, xin lỗi ... mặc dù đó cũng là một nhiệm vụ thú vị! Tôi chuyển hình ảnh đến cũ "Tại bãi biển" một trong đó cũng có sọc ... (có một lý do khác cho việc lựa chọn hình ảnh này quá!)
tdc

Trong khi câu hỏi này rất thú vị, những gì bạn đang yêu cầu là không rõ ràng. Nó có phải là một triển khai của một giải pháp? Một gợi ý về thư viện ML nào cho python để sử dụng cho việc này?
Simon Bergot

@Simon một triển khai hoàn chỉnh có lẽ sẽ hơi nhiều điều để hỏi, nhưng một khung câu trả lời (tức là một số hàm thiếu định nghĩa) sẽ rất tuyệt. Tôi thậm chí không chắc mình sẽ tải hình ảnh vào (mặc dù tôi đã thấy điều này: stackoverflow.com/questions/94875/image-processing-in-python )
tdc

Câu trả lời:


63

Đây là cách triển khai với 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))

Chia thành các kênh màu đỏ, xanh lá cây và xanh lam. Tốt hơn là sử dụng số học dấu phẩy động bên dưới, vì vậy chúng tôi chuyển đổi ở trên cùng.

w = wfloat.mean(2)

w là kênh trắng.

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

Xây dựng mô hình + 1, + 1, -1, -1 trên trục tung. Đây là áo sơ mi của wally.

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

Chuyển đổi với màu đỏ trừ màu trắng. Điều này sẽ đưa ra phản hồi mạnh mẽ về vị trí của áo.

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

Tìm giá trị lớn nhất và giãn nó ra để hiển thị. Bây giờ, chúng tôi chỉnh sửa toàn bộ hình ảnh, ngoại trừ khu vực hoặc sở thích:

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

Và chúng tôi nhận được waldo!


3
Tôi đã thử hình ảnh bãi biển và nó không hoạt động tốt lắm :( mắt) trong khi khi tôi chỉ có một loạt các khu vực nhỏ, đó là dễ dàng.
luispedro

bạn đã có mã nguồn đầy đủ cho cái này chưa? Tôi đang nhận được np không được xác định
mã hóa

2

Bạn có thể thử đối sánh mẫu, sau đó gỡ bỏ mẫu nào tạo ra độ giống cao nhất, sau đó sử dụng máy học để thu hẹp nó nhiều hơn. Điều đó cũng rất khó và với độ chính xác của việc đối sánh mẫu, nó có thể chỉ trả về mọi khuôn mặt hoặc hình ảnh giống khuôn mặt. Tôi nghĩ rằng bạn sẽ cần nhiều hơn là chỉ học máy nếu bạn hy vọng làm được điều này một cách nhất quán.


2

có lẽ bạn nên bắt đầu bằng việc chia nhỏ vấn đề thành hai vấn đề nhỏ hơn:

  1. tạo ra một thuật toán phân tách mọi người khỏi nền.
  2. đào tạo một bộ phân loại mạng nơ-ron với càng nhiều ví dụ tích cực và tiêu cực càng tốt.

đó vẫn là hai vấn đề rất lớn cần giải quyết ...

BTW, tôi sẽ chọn c ++ và mở CV, nó có vẻ phù hợp hơn nhiều cho việc này.


1
Nếu sử dụng C ++ và OpenCV thì một giải pháp bằng Python càng tốt. OpenCV có thể được sử dụng trong Python.
Unapiedra

1

Điều này không phải là không thể nhưng rất khó vì bạn thực sự không có ví dụ về một trận đấu thành công. Thường có nhiều trạng thái (trong trường hợp này, có nhiều ví dụ hơn về tìm bản vẽ walleys), sau đó bạn có thể nạp nhiều hình ảnh vào một chương trình cải tạo hình ảnh và coi nó như một mô hình markov ẩn và sử dụng một cái gì đó giống như thuật toán viterbi để suy luận ( http: / /en.wikipedia.org/wiki/Viterbi_algorithm ).

Đó là cách tôi tiếp cận nó, nhưng giả sử bạn có nhiều hình ảnh, bạn có thể cho nó ví dụ về câu trả lời chính xác để nó có thể học. Nếu bạn chỉ có một bức ảnh, thì tôi rất tiếc có thể bạn cần phải thực hiện một cách tiếp cận khác.


1

Tôi nhận ra rằng có hai tính năng chính hầu như luôn hiển thị:

  1. áo sơ mi sọc trắng đỏ
  2. mái tóc nâu sẫm dưới chiếc mũ lưỡi trai lạ mắt

Vì vậy, tôi sẽ làm theo cách sau:

tìm kiếm áo sơ mi sọc:

  • lọc ra màu đỏ và trắng (với các ngưỡng trên hình ảnh chuyển đổi HSV). Điều đó cung cấp cho bạn hai hình ảnh mặt nạ.
  • thêm chúng với nhau -> đó là mặt nạ chính để tìm kiếm áo sơ mi sọc.
  • tạo một hình ảnh mới với tất cả màu đỏ đã lọc được chuyển thành đỏ thuần (# FF0000) và tất cả màu trắng đã lọc được chuyển thành trắng tinh (#FFFFFF).
  • bây giờ hãy tương quan hình ảnh màu đỏ-trắng tinh khiết này với hình ảnh mẫu sọc (tôi nghĩ rằng tất cả các waldo đều có các sọc ngang khá hoàn hảo, vì vậy không cần thiết phải xoay mô hình). Chỉ thực hiện mối tương quan bên trong mặt nạ chính được đề cập ở trên.
  • cố gắng nhóm các cụm lại với nhau mà có thể được tạo ra từ một chiếc áo sơ mi.

Nếu có nhiều hơn một 'áo sơ mi', tức là nhiều hơn một cụm có mối tương quan thuận, hãy tìm kiếm các đặc điểm khác, chẳng hạn như mái tóc màu nâu sẫm:

tìm kiếm tóc nâu

  • lọc ra màu tóc nâu cụ thể bằng cách sử dụng hình ảnh được chuyển đổi HSV và một số ngưỡng.
  • tìm kiếm một khu vực nhất định trong hình ảnh mặt nạ này - không quá lớn và không quá nhỏ.
  • bây giờ hãy tìm kiếm 'vùng tóc' nằm ngay phía trên một chiếc áo sơ mi sọc đã được phát hiện (trước đó) và có một khoảng cách nhất định đến tâm áo.

1

Đây là một giải pháp sử dụng mạng thần kinh hoạt động hiệu quả.

Mạng nơ-ron được đào tạo dựa trên một số ví dụ đã giải được đánh dấu bằng các hộp giới hạn cho biết vị trí Wally xuất hiện trong hình. Mục tiêu của mạng là giảm thiểu sai số giữa hộp dự đoán và hộp thực tế từ dữ liệu đào tạo / xác thực.

Mạng ở trên sử dụng API phát hiện đối tượng Tensorflow để thực hiện đào tạo và dự đoán.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.