Xử lý hình ảnh: Cải thiện thuật toán để nhận dạng 'Coca-Cola'


1658

Một trong những dự án thú vị nhất mà tôi đã thực hiện trong vài năm qua là một dự án về xử lý hình ảnh . Mục tiêu là phát triển một hệ thống để có thể nhận ra 'lon' của Coca-Cola (lưu ý rằng tôi đang nhấn mạnh từ 'lon', bạn sẽ thấy tại sao trong một phút). Bạn có thể thấy một mẫu bên dưới, với hình có thể được nhận ra trong hình chữ nhật màu xanh lá cây với tỷ lệ và xoay.

Khớp mẫu

Một số hạn chế về dự án:

  • Bối cảnh có thể rất ồn ào.
  • thể có bất kỳ tỷ lệ hoặc xoay hoặc thậm chí định hướng (trong giới hạn hợp lý).
  • Hình ảnh có thể có một số độ mờ (đường viền có thể không hoàn toàn thẳng).
  • Có thể có chai Coca-Cola trong hình ảnh, và các thuật toán chỉ nên phát hiện sự can !
  • Độ sáng của hình ảnh có thể thay đổi rất nhiều (vì vậy bạn không thể dựa vào "quá nhiều" để phát hiện màu).
  • Cái này thể được giấu một phần ở hai bên hoặc giữa và có thể một phần ẩn đằng sau một cái chai.
  • Không thể có thể có tất cả trong hình ảnh, trong trường hợp đó bạn không tìm thấy gì và viết một tin nhắn nói như vậy.

Vì vậy, bạn có thể kết thúc với những thứ khó khăn như thế này (trong trường hợp này là thuật toán của tôi hoàn toàn thất bại):

Tổng số thất bại

Tôi đã thực hiện dự án này một thời gian trước đây, và đã có rất nhiều niềm vui khi thực hiện nó, và tôi đã có một triển khai tốt. Dưới đây là một số chi tiết về việc thực hiện của tôi:

Ngôn ngữ : Thực hiện trong C ++ bằng thư viện OpenCV .

Xử lý trước : Để xử lý trước hình ảnh, tức là chuyển đổi hình ảnh thành dạng thô hơn để cung cấp cho thuật toán, tôi đã sử dụng 2 phương pháp:

  1. Thay đổi miền màu từ RGB sang HSV và lọc dựa trên màu "đỏ", bão hòa trên một ngưỡng nhất định để tránh các màu giống như màu cam và lọc giá trị thấp để tránh tông màu tối. Kết quả cuối cùng là một hình ảnh đen trắng nhị phân, trong đó tất cả các pixel trắng sẽ đại diện cho các pixel phù hợp với ngưỡng này. Rõ ràng vẫn còn rất nhiều crap trong hình ảnh, nhưng điều này làm giảm số lượng kích thước bạn phải làm việc với. Hình ảnh nhị phân
  2. Lọc nhiễu bằng cách sử dụng lọc trung vị (lấy giá trị pixel trung bình của tất cả các lân cận và thay thế pixel bằng giá trị này) để giảm nhiễu.
  3. Sử dụng Bộ lọc phát hiện cạnh Canny để có được các đường viền của tất cả các mục sau 2 bước trước đó. Phát hiện đường viền

Thuật toán : Bản thân thuật toán tôi chọn cho tác vụ này được lấy từ cuốn sách tuyệt vời này về trích xuất tính năng và được gọi là Generalized Hough Transform (khá khác với Hough Transform thông thường). Về cơ bản nó nói một vài điều:

  • Bạn có thể mô tả một đối tượng trong không gian mà không cần biết phương trình phân tích của nó (đó là trường hợp ở đây).
  • Nó có khả năng chống biến dạng hình ảnh như tỷ lệ và xoay, vì về cơ bản nó sẽ kiểm tra hình ảnh của bạn cho mọi sự kết hợp của yếu tố tỷ lệ và yếu tố xoay.
  • Nó sử dụng một mô hình cơ sở (một mẫu) mà thuật toán sẽ "học".
  • Mỗi pixel còn lại trong hình ảnh đường viền sẽ bỏ phiếu cho một pixel khác được cho là trung tâm (tính theo trọng lực) của đối tượng của bạn, dựa trên những gì nó học được từ mô hình.

Cuối cùng, bạn kết thúc với một bản đồ nhiệt của phiếu bầu, ví dụ ở đây tất cả các pixel của đường viền có thể sẽ bỏ phiếu cho trung tâm hấp dẫn của nó, vì vậy bạn sẽ có rất nhiều phiếu trong cùng một pixel tương ứng với trung tâm, và sẽ thấy một đỉnh trong bản đồ nhiệt như dưới đây:

GHT

Khi bạn đã có điều đó, một heuristic dựa trên ngưỡng đơn giản có thể cung cấp cho bạn vị trí của pixel trung tâm, từ đó bạn có thể lấy tỷ lệ và xoay và sau đó vẽ hình chữ nhật nhỏ của bạn xung quanh nó (tỷ lệ cuối cùng và hệ số xoay sẽ rõ ràng tương đối với mẫu gốc). Về lý thuyết ít nhất ...

Kết quả : Bây giờ, trong khi phương pháp này hoạt động trong các trường hợp cơ bản, nó đã bị thiếu trầm trọng ở một số lĩnh vực:

  • cực kỳ chậm ! Tôi không nhấn mạnh điều này đủ. Gần như cả ngày là cần thiết để xử lý 30 hình ảnh thử nghiệm, rõ ràng vì tôi có hệ số tỷ lệ rất cao để xoay và dịch, vì một số lon rất nhỏ.
  • Nó đã bị mất hoàn toàn khi các chai trong hình ảnh, và vì một số lý do hầu như luôn tìm thấy chai thay vì lon (có lẽ vì chai lớn hơn, do đó có nhiều pixel hơn, do đó nhiều phiếu hơn)
  • Hình ảnh mờ cũng không tốt, vì phiếu bầu kết thúc bằng pixel tại các vị trí ngẫu nhiên xung quanh trung tâm, do đó kết thúc bằng một bản đồ nhiệt rất ồn.
  • Sự khác biệt trong dịch thuật và xoay đã đạt được, nhưng không theo định hướng, có nghĩa là một hộp không trực tiếp đối diện với mục tiêu máy ảnh không được nhận ra.

Bạn có thể giúp tôi cải thiện thuật toán cụ thể của mình , sử dụng các tính năng OpenCV độc quyền , để giải quyết bốn vấn đề cụ thể được đề cập không?

Tôi hy vọng một số người cũng sẽ học được điều gì đó từ nó, sau tất cả, tôi nghĩ rằng không chỉ những người đặt câu hỏi nên học. :)


45
Có thể nói rằng câu hỏi này phù hợp hơn tại dsp.stackexchange.com hoặc stats.stackexchange.com, và bạn chắc chắn cũng nên xem xét hỏi lại tại các trang web đó.
ely

49
Điều đầu tiên cần làm ở đây là phân tích tại sao các trường hợp thất bại khác nhau đang xảy ra. Ví dụ, cô lập các ví dụ về các địa điểm nơi các chai chiến thắng, nơi các hình ảnh mờ, v.v. và thực hiện một số phân tích thống kê để tìm hiểu sự khác biệt giữa các đại diện Hough của chúng và các đại diện mà bạn muốn nó sẽ phát hiện. Một số nơi tuyệt vời để tìm hiểu về cách tiếp cận khác là ở đâyở đây
ely

7
@stacker làm cho một điểm tốt. Đối với tốc độ bạn muốn có được các tính năng giá rẻ để tính toán, như biểu đồ của độ dốc định hướng. Một cách tiếp cận đầu tiên thực sự ngây thơ sẽ là gắn nhãn thủ công một bó hình chữ nhật có thể trong một số hình ảnh đào tạo và sử dụng những ví dụ tiêu cực ngẫu nhiên này để huấn luyện một SVM hoặc phân loại cây quyết định. Việc đào tạo sẽ mất nhiều thời gian hơn, nhưng việc thực hiện trên các hình ảnh mới lạ sẽ nhanh hơn nhiều. Tôi dự định viết phương pháp này lên khi tôi có nhiều thời gian rảnh hơn để đưa vào các tài liệu tham khảo phù hợp.
ely

9
Làm thế nào về một cách tiếp cận tương tự như reCAPTCHA ? ;)
George Duckett

39
Tại sao điều này được chuyển từ dsp.stackexchange.com ? Có vẻ như trang web đó thậm chí còn phù hợp hơn so với stackoverflow o_O
BlueRaja - Danny Pflughoeft

Câu trả lời:


672

Một cách tiếp cận khác là trích xuất các tính năng (điểm chính) bằng cách sử dụng biến đổi tính năng bất biến tỷ lệ (SIFT) hoặc Tính năng tăng tốc mạnh mẽ (SURF).

Nó được thực hiện trong OpenCV 2.3.1.

Bạn có thể tìm thấy một ví dụ mã đẹp bằng cách sử dụng các tính năng trong Feature2D + Homography để tìm một đối tượng đã biết

Cả hai thuật toán đều bất biến đối với tỷ lệ và xoay. Vì chúng hoạt động với các tính năng, bạn cũng có thể xử lý tắc (miễn là có thể nhìn thấy đủ các điểm chính).

Nhập mô tả hình ảnh ở đây

Nguồn hình ảnh: ví dụ hướng dẫn

Quá trình xử lý mất vài trăm ms cho SIFT, SURF nhanh hơn một chút, nhưng nó không phù hợp với các ứng dụng thời gian thực. ORB sử dụng FAST yếu hơn về tính bất biến xoay vòng.

Giấy tờ gốc


6
Tôi đồng ý với @stacker - SIFT là một lựa chọn tuyệt vời. Nó rất mạnh mẽ chống lại các hoạt động quy mô và luân chuyển. Nó hơi mạnh mẽ chống lại biến dạng phối cảnh (điều này có thể được cải thiện theo đề xuất của stacker: cơ sở dữ liệu mẫu với các khung nhìn phối cảnh khác nhau của đối tượng mong muốn). Kinh nghiệm của tôi về Achilles theo kinh nghiệm của tôi sẽ là các biến thể ánh sáng mạnh và tính toán rất tốn kém. Tôi không biết về bất kỳ triển khai Java nào. Tôi biết về việc triển khai OpenCV và đã sử dụng triển khai GPU c ++ / Windows ( SiftGPU ) phù hợp với hiệu suất thời gian thực.

31
Một lưu ý cảnh báo: nhiều như tôi yêu Sift / SURF và những gì họ đã làm với tôi, họ bị đóng gói bằng sáng chế. Đây có thể là một vấn đề, tùy thuộc vào một số điều kiện bao gồm vị trí địa lý AFAIK.
Agos

12
Vì vậy, hãy thử ORB hoặc FREAK của OpenCV không có vấn đề về bằng sáng chế. ORB nhanh hơn nhiều so với SIFT. ORB nó hơi kém với các biến thể tỷ lệ và ánh sáng trong trải nghiệm của tôi nhưng hãy tự kiểm tra nó.
Rui Marques

66
Làm thế nào bạn có thể chấp nhận điều này như một câu trả lời ... Không có mô tả tính năng nào có thể phân biệt các chai với một lon .. Tất cả chúng chỉ xem các mô tả mô hình cục bộ bất biến. Tôi đồng ý rằng SIFT, SURF, ORB, FREAK, v.v. có GOOGLED vấn đề của bạn có lẽ kết quả đầu tiên sẽ chỉ là câu trả lời này.
G453

11
@ G453 bạn hoàn toàn đúng! Có lẽ anh ta đã bị mê hoặc bởi hiệu suất của SHIFT và quên rằng việc trích xuất và kết hợp tính năng KHÔNG PHẢI LÀ VẤN ĐỀ ...
sepdek

383

Để tăng tốc mọi thứ, tôi sẽ tận dụng thực tế là bạn không được yêu cầu tìm một hình ảnh / đối tượng tùy ý, mà cụ thể là một hình ảnh có logo Coca-Cola. Điều này rất có ý nghĩa vì logo này rất đặc biệt và nó phải có một chữ ký bất biến tỷ lệ đặc trưng trong miền tần số, đặc biệt là trong kênh màu đỏ của RGB. Điều đó có nghĩa là, mô hình xen kẽ từ đỏ sang trắng sang đỏ gặp phải bởi một đường quét ngang (được đào tạo trên logo theo chiều ngang) sẽ có một "nhịp điệu" đặc biệt khi nó đi qua trục trung tâm của logo. Nhịp điệu đó sẽ "tăng tốc" hoặc "chậm lại" ở các quy mô và định hướng khác nhau, nhưng sẽ vẫn tương đương theo tỷ lệ. Bạn có thể xác định / xác định một vài chục đường quét như vậy, cả theo chiều ngang và chiều dọc thông qua logo và một số đường chéo khác, trong một mô hình starburst. Gọi đây là "các dòng quét chữ ký."

Dòng quét chữ ký

Tìm kiếm chữ ký này trong hình ảnh mục tiêu là một vấn đề đơn giản là quét hình ảnh theo dải ngang. Tìm kiếm tần số cao trong kênh màu đỏ (biểu thị việc chuyển từ vùng màu đỏ sang vùng màu trắng) và sau khi tìm thấy, hãy xem liệu nó có được theo sau bởi một trong các nhịp tần số được xác định trong phiên đào tạo không. Khi một trận đấu được tìm thấy, bạn sẽ biết ngay định hướng và vị trí của đường quét trong logo (nếu bạn theo dõi những điều đó trong quá trình đào tạo), do đó, xác định ranh giới của logo từ đó là không đáng kể.

Tôi sẽ ngạc nhiên nếu đây không phải là một thuật toán hiệu quả tuyến tính, hoặc gần như vậy. Nó rõ ràng không giải quyết sự phân biệt đối xử trong chai của bạn, nhưng ít nhất bạn sẽ có logo của mình.

(Cập nhật: để nhận biết chai tôi sẽ tìm than cốc (chất lỏng màu nâu) bên cạnh logo - nghĩa là bên trong chai. Hoặc, trong trường hợp chai rỗng, tôi sẽ tìm một nắp luôn có nắp cơ bản giống nhau hình dạng, kích thước và khoảng cách từ logo và thường sẽ được tất cả màu trắng hoặc đỏ. Tìm kiếm một màu rắn hình dạng eliptical nơi một chiếc mũ nên được, liên quan đến logo. Không hết sức rõ ràng tất nhiên, nhưng mục tiêu của bạn ở đây nên đến tìm ra dễ dàng những người nhanh chóng .)

(Đã vài năm kể từ ngày xử lý hình ảnh của tôi, vì vậy tôi đã giữ đề xuất này ở mức độ cao và mang tính khái niệm. Tôi nghĩ rằng nó có thể hơi gần đúng với cách mắt người có thể hoạt động - hoặc ít nhất là cách não của tôi hoạt động!)


24
Đó là một gợi ý tuyệt vời, tôi đặc biệt thích thực tế là thuật toán này sẽ khá nhanh, ngay cả khi nó có thể sẽ có nhiều phủ định sai. Một trong những mục tiêu tiềm ẩn của tôi là sử dụng phát hiện này trong thời gian thực cho người máy, vì vậy đó có thể là một sự thỏa hiệp tốt!
Charles Menguy

42
Có, người ta thường quên (trong một lĩnh vực được đặc trưng bởi độ chính xác) rằng các thuật toán gần đúng là điều cần thiết cho hầu hết các nhiệm vụ mô hình hóa trong thế giới thực, thời gian thực. (Tôi dựa trên luận điểm của mình về khái niệm này.) Lưu các thuật toán đòi hỏi thời gian của bạn cho các khu vực hạn chế (để cắt tỉa các dương tính giả). Và hãy nhớ rằng: trong robot, bạn thường không bị giới hạn trong một hình ảnh duy nhất. Giả sử một robot di động, một alg nhanh có thể tìm kiếm hàng tá hình ảnh từ các góc độ khác nhau trong thời gian ngắn hơn so với các thuật toán tinh vi chi cho một, giảm đáng kể các tiêu cực sai.
kmote

29
Tôi thích ý tưởng sử dụng số tiền cho máy quét mã vạch để phát hiện logo Coca-Cola cực nhanh . +1!
Li-aung Yip

8
Vấn đề của việc tìm kiếm chữ ký trong trường hợp này là nếu chúng ta chuyển lon sang phía bên kia, tức là ẩn chữ ký, thuật toán sẽ không phát hiện được lon.
karlphillip

34
@karlphillip: Nếu bạn ẩn chữ ký, tức là logo, thì bất kỳ phương pháp nào dựa trên việc tìm kiếm logo sẽ thất bại.
Li-aung Yip

162

Vấn đề thú vị: khi tôi liếc nhìn hình ảnh chai của bạn, tôi nghĩ rằng nó cũng có thể. Nhưng, là một con người, điều tôi đã làm để nói lên sự khác biệt là sau đó tôi nhận thấy đó cũng là một cái chai ...

Vì vậy, để phân biệt lon và chai, làm thế nào về việc đơn giản là quét chai trước? Nếu bạn tìm thấy một, che dấu nhãn trước khi tìm lon.

Không quá khó để thực hiện nếu bạn đã làm lon. Nhược điểm thực sự là nó tăng gấp đôi thời gian xử lý của bạn. (Nhưng suy nghĩ trước các ứng dụng trong thế giới thực, cuối cùng bạn sẽ muốn làm chai ;-)


5
Bạn cũng đã nghĩ về điều đó, nhưng không có nhiều thời gian để làm điều đó. Làm thế nào bạn có thể nhận ra một chai, vì phần chính của nó sẽ trông giống như một cái hộp có tỷ lệ? Tôi đã suy nghĩ tìm kiếm phích cắm màu đỏ và xem nó có phù hợp với trung tâm đóng chai không, nhưng điều đó có vẻ không mạnh mẽ lắm.
Charles Menguy

42
Nếu có nắp màu đỏ (hoặc vòng) song song với "Coca cola" thì rất có thể đó là một chai.
Lukasz Madon

@linker Bạn đã đào tạo thuật toán của mình cho lon như thế nào? Bạn đã có ví dụ về lon? Làm thế nào về đào tạo với các ví dụ về chai?
siamii

1
Điểm mạnh của thuật toán này là bạn chỉ cần một mẫu để huấn luyện, và sau đó nó áp dụng tất cả các phép biến đổi để khớp nó với các lon tiềm năng khác. Tôi đã sử dụng một phiên bản được tạo theo kiểu nhị phân và dựa trên đường viền của mẫu này để huấn luyện, vì vậy sự khác biệt duy nhất giữa lon và chai sẽ là phích cắm, nhưng tôi sợ nó sẽ mang lại nhiều điểm tích cực hơn vì trung tâm trọng lực sẽ ở đâu đó trên rìa hoặc bên ngoài chai. Tôi đoán nó đáng để thử. Nhưng điều đó sẽ tăng gấp đôi thời gian xử lý của tôi và tôi sẽ khóc;)
Charles Menguy

7
Thực chất đây là một hướng đi hợp lý. Tôi muốn nói nó hơi khác một chút: Đầu tiên hãy tìm tất cả các ứng cử viên, sau đó cho mỗi ứng viên xác định xem đó là một cái chai, một cái hộp hay cái gì khác.
MSalters

131

Ngay cả con người có khó phân biệt giữa chai và lon trong hình ảnh thứ hai (với điều kiện là vùng trong suốt của chai bị ẩn đi)?

Chúng gần như giống nhau ngoại trừ một vùng rất nhỏ (nghĩa là chiều rộng ở đỉnh của lon hơi nhỏ trong khi vỏ bọc của chai có cùng chiều rộng trong suốt, nhưng chỉ là một thay đổi nhỏ phải không?)

Điều đầu tiên tôi nghĩ đến là kiểm tra đỉnh chai màu đỏ. Nhưng nó vẫn là một vấn đề, nếu không có đỉnh cho chai, hoặc nếu nó bị ẩn một phần (như đã đề cập ở trên).

Điều thứ hai tôi nghĩ là về độ trong suốt của chai. OpenCV có một số công việc tìm kiếm các đối tượng trong suốt trong một hình ảnh. Kiểm tra các liên kết dưới đây.

Đặc biệt nhìn vào điều này để xem họ phát hiện kính chính xác như thế nào:

Xem kết quả thực hiện của họ:

Nhập mô tả hình ảnh ở đây

Họ nói rằng đó là việc thực hiện bài báo "Khung đường viền hoạt động trắc địa để tìm kính" của K. McHenry và J. Ponce, CVPR 2006 .

Nó có thể hữu ích trong trường hợp của bạn một chút, nhưng vấn đề lại phát sinh nếu chai được đổ đầy.

Vì vậy, tôi nghĩ ở đây, bạn có thể tìm kiếm cơ thể trong suốt của các chai trước hoặc cho một vùng màu đỏ được kết nối với hai vật thể trong suốt bên đó rõ ràng là chai. (Khi làm việc lý tưởng, một hình ảnh như sau.)

Nhập mô tả hình ảnh ở đây

Bây giờ bạn có thể loại bỏ vùng màu vàng, nghĩa là nhãn của chai và chạy thuật toán của bạn để tìm lon.

Dù sao, giải pháp này cũng có những vấn đề khác nhau như trong các giải pháp khác.

  1. Nó chỉ hoạt động nếu chai của bạn trống rỗng. Trong trường hợp đó, bạn sẽ phải tìm kiếm vùng màu đỏ giữa hai màu đen (nếu chất lỏng Coca Cola có màu đen).
  2. Một vấn đề khác nếu phần trong suốt được bảo hiểm.

Nhưng dù sao, nếu không có bất kỳ vấn đề nào ở trên trong các bức ảnh, điều này có vẻ là một cách tốt hơn.


+1 Tôi đã nghĩ về điều này và theo cách của tôi để thực hiện phương pháp này. Tuy nhiên, @linker nên chia sẻ bộ ảnh của mình để chúng tôi có thể cố gắng thực hiện những phỏng đoán có giáo dục hơn.
karlphillip

yeah .. tôi quá nghĩ rằng nó là tốt nếu có nhiều hình ảnh.
Abid Rahman K

Xem xét nếu chúng ta chỉ có nhãn cho chai / lon và không có yếu tố phân biệt nào khác về nắp chai hoặc độ trong suốt hoặc có thể trên / dưới - Chiều rộng của chai khác với chiều rộng của lon.
Ken

Điều gì nếu một lon được đặt ở phía trước logo cho chai?
AlgoRy nhịp

51

Tôi thực sự thích câu trả lời của Darren Cookstacker cho vấn đề này. Tôi đang ở giữa những suy nghĩ của mình để bình luận về những điều đó, nhưng tôi tin rằng cách tiếp cận của tôi quá hình dạng câu trả lời để không rời khỏi đây.

Tóm lại, bạn đã xác định một thuật toán để xác định rằng logo Coca-Cola có mặt tại một vị trí cụ thể trong không gian. Bây giờ bạn đang cố gắng để xác định, đối với định hướng độc đoán và các yếu tố rộng tùy ý, một phù hợp heuristic cho việc phân biệt Coca-Cola lon từ các đối tượng khác, bao gồm: chai , biển quảng cáo , quảng cáo , và Coca-Cola đồ dùng cá nhân tất cả gắn liền với biểu tượng mang tính biểu tượng này. Bạn đã không gọi ra nhiều trường hợp bổ sung trong tuyên bố vấn đề của mình, nhưng tôi cảm thấy chúng rất quan trọng đối với sự thành công của thuật toán của bạn.

Bí mật ở đây là xác định những tính năng hình ảnh nào có thể chứa hoặc thông qua không gian âm, những tính năng nào có mặt cho các sản phẩm Coke khác không có trong lon. Cuối cùng, câu trả lời hàng đầu hiện tại phác thảo một cách tiếp cận cơ bản để chọn "có thể" nếu và chỉ khi không xác định được "chai", bởi sự hiện diện của nắp chai, chất lỏng hoặc các phương pháp chẩn đoán hình ảnh tương tự khác.

Vấn đề là điều này bị phá vỡ. Một chai có thể, ví dụ, trống rỗng và thiếu sự hiện diện của nắp, dẫn đến dương tính giả. Hoặc, nó có thể là một chai một phần với các tính năng bổ sung, dẫn đến phát hiện sai. Không cần phải nói, điều này không thanh lịch, cũng không hiệu quả cho mục đích của chúng tôi.

Để kết thúc này, tiêu chí lựa chọn chính xác nhất cho lon xuất hiện như sau:

  • Là hình dạng của hình bóng đối tượng, như bạn đã phác thảo trong câu hỏi của mình , đúng không? Nếu vậy, +1.
  • Nếu chúng ta giả sử sự hiện diện của ánh sáng tự nhiên hoặc nhân tạo, chúng ta có phát hiện đường viền chrome cho chai có nghĩa là liệu nó được làm bằng nhôm không? Nếu vậy, +1.
  • Chúng tôi có xác định rằng các thuộc tính cụ thể của đối tượng là chính xác, liên quan đến các nguồn sáng của chúng tôi ( liên kết video minh họa về phát hiện nguồn sáng ) không? Nếu vậy, +1.
  • Chúng ta có thể xác định bất kỳ thuộc tính nào khác về đối tượng xác định nó là có thể, bao gồm, nhưng không giới hạn ở độ nghiêng hình ảnh tôpô của logo, hướng của đối tượng, vị trí kề nhau của đối tượng (ví dụ: trên bề mặt phẳng như một bảng hoặc trong bối cảnh của các lon khác), và sự hiện diện của một tab kéo? Nếu vậy, với mỗi, +1.

Phân loại của bạn có thể trông giống như sau:

  • Đối với mỗi trận đấu ứng cử viên, nếu phát hiện thấy sự hiện diện của logo Coca Cola, hãy vẽ đường viền màu xám.
  • Đối với mỗi trận đấu trên +2, vẽ đường viền màu đỏ.

Điều này trực quan làm nổi bật cho người dùng những gì đã được phát hiện, nhấn mạnh vào những điểm tích cực yếu có thể, chính xác, có thể được phát hiện dưới dạng lon mangled.

Việc phát hiện mỗi thuộc tính mang một độ phức tạp không gian và thời gian rất khác nhau và đối với mỗi cách tiếp cận, việc truy cập nhanh qua http://dsp.stackexchange.com là hợp lý hơn để xác định thuật toán chính xác và hiệu quả nhất cho mục đích của bạn. Mục đích của tôi ở đây là, hoàn toàn và đơn giản, để nhấn mạnh rằng việc phát hiện nếu có gì đó có thể bằng cách vô hiệu hóa một phần nhỏ của không gian phát hiện ứng viên không phải là giải pháp mạnh mẽ hoặc hiệu quả nhất cho vấn đề này, và lý tưởng nhất, bạn nên thực hiện các hành động thích hợp phù hợp.

Và này, xin chúc mừng bài đăng của Hacker News! Nhìn chung, đây là một câu hỏi khá tuyệt vời xứng đáng với sự công khai mà nó nhận được. :)


2
Đó là một cách tiếp cận thú vị mà ít nhất là đáng để thử, tôi thực sự thích lý do của bạn về vấn đề này
Charles Menguy

Đây là loại suy nghĩ của tôi: không loại trừ các loại tích cực sai. Quy tắc trong nhiều tính năng của những gì làm cho một coke có thể. Nhưng tôi đang tự hỏi: bạn sẽ làm gì với một bình mực? Ý tôi là, nếu bạn bước lên một cái cốc thì nó vẫn có thể là một cái cốc. Nhưng nó sẽ không còn hình dạng nữa. Hay đó là vấn đề AI-Complete?
Ian

41

Nhìn vào hình dạng

Đi lang thang ở hình dạng của phần màu đỏ của lon / chai. Lưu ý làm thế nào có thể thon ra một chút ở phía trên trong khi nhãn chai là thẳng. Bạn có thể phân biệt giữa hai cái này bằng cách so sánh chiều rộng của phần màu đỏ trên chiều dài của nó.

Nhìn vào điểm nổi bật

Một cách để phân biệt giữa chai và lon là vật liệu. Một chai được làm bằng nhựa trong khi một lon được làm bằng kim loại nhôm. Trong các tình huống đủ ánh sáng, nhìn vào đặc điểm sẽ là một cách để nói nhãn chai từ nhãn có thể.

Theo như tôi có thể nói, đó là cách con người nói lên sự khác biệt giữa hai loại nhãn. Nếu điều kiện ánh sáng kém, chắc chắn sẽ có sự không chắc chắn trong việc phân biệt hai đường. Trong trường hợp đó, bạn sẽ phải có khả năng phát hiện sự hiện diện của chai trong suốt / mờ.


Tôi thích ý tưởng này, nhưng có vẻ như bạn cần một số điều kiện ánh sáng thực sự tốt. Trong hình ảnh ví dụ có cả can và chai, ví dụ, điều này có vẻ hơi khó để phân biệt.
Charles Menguy

Trong ví dụ của bạn, hãy chú ý làm thế nào đặc tính của nhãn nhựa khuếch tán hơn nhiều so với các điểm rất sáng trên lon? Đó là cách bạn có thể nói.
tskuzzy

Tôi thấy, bạn sẽ sử dụng loại biểu diễn không gian màu nào trong trường hợp này để nắm bắt tính đặc hiệu trong thuật toán của bạn? Điều này có vẻ khá khó khăn để có được trong RGB hoặc HSV
Charles Menguy

3
Nếu nguồn sáng nằm phía sau lon thì sao? Tôi nghĩ rằng bạn sẽ không nhìn thấy sự nổi bật.
Rui Marques

37

Xin hãy xem theo dõi Kẻ săn mồi của Zdenek Kalal . Nó đòi hỏi một số đào tạo, nhưng nó có thể chủ động tìm hiểu làm thế nào đối tượng được theo dõi nhìn vào các định hướng và quy mô khác nhau và thực hiện nó trong thời gian thực!

Mã nguồn có sẵn trên trang web của mình. Đó là trong MATLAB , nhưng có lẽ đã có một triển khai Java được thực hiện bởi một thành viên cộng đồng. Tôi đã thành công lại phần theo dõi của TLD trong C #. Nếu tôi nhớ chính xác, TLD đang sử dụng Ferns làm máy dò điểm chính. Tôi sử dụng SURF hoặc SIFT thay thế (đã được đề xuất bởi @stacker) để hỏi lại đối tượng nếu nó bị mất bởi trình theo dõi. Phản hồi của trình theo dõi giúp dễ dàng xây dựng theo thời gian một danh sách động các mẫu sàng / lướt mà theo thời gian cho phép lấy lại đối tượng với độ chính xác rất cao.

Nếu bạn quan tâm đến việc triển khai C # của trình theo dõi, vui lòng hỏi.


Cảm ơn các liên kết có vẻ thú vị. Về đào tạo, quy mô của bộ đào tạo sẽ hợp lý để đạt được kết quả hợp lý là gì? Nếu bạn có một triển khai ngay cả trong c # cũng sẽ rất hữu ích!
Charles Menguy

Trong khi nghiên cứu TLD, tôi đã tìm thấy một người dùng khác đang tìm kiếm triển khai C # --- có lý do gì để không đưa tác phẩm của bạn lên Github không? stackoverflow.com/questions/29436719/
hy

2
NB Năm, sau đó, liên kết bây giờ đã chết
J Evans

33

Nếu bạn không bị giới hạn chỉ với một máy ảnh không thuộc một trong những hạn chế của mình, có lẽ bạn có thể chuyển sang sử dụng cảm biến phạm vi như Xbox Kinect . Với điều này, bạn có thể thực hiện phân đoạn phù hợp với độ sâu và màu sắc của hình ảnh. Điều này cho phép phân tách nhanh hơn các đối tượng trong ảnh. Sau đó, bạn có thể sử dụng kết hợp ICP hoặc các kỹ thuật tương tự để thậm chí khớp với hình dạng của hộp thay vì chỉ là đường viền hoặc màu của nó và cho rằng nó có dạng hình trụ, đây có thể là một tùy chọn hợp lệ cho bất kỳ hướng nào nếu bạn quét 3D mục tiêu trước đó. Những kỹ thuật này thường khá nhanh, đặc biệt khi được sử dụng cho mục đích cụ thể như vậy sẽ giải quyết vấn đề tốc độ của bạn.

Ngoài ra tôi có thể đề xuất, không nhất thiết là về độ chính xác hay tốc độ nhưng để giải trí, bạn có thể sử dụng mạng thần kinh được đào tạo trên hình ảnh phân đoạn màu sắc của mình để xác định hình dạng của hộp. Đây là rất nhanh và thường có thể chính xác đến 80/90%. Đào tạo sẽ là một chút của một quá trình dài mặc dù bạn sẽ phải xác định thủ công có thể trong mỗi hình ảnh.


3
Trên thực tế tôi đã không giải thích điều đó trong bài viết, nhưng đối với bài tập này, tôi đã được cung cấp một bộ gồm khoảng 30 hình ảnh và phải thực hiện một thuật toán phù hợp với tất cả chúng trong các tình huống khác nhau như được mô tả. Tất nhiên một số hình ảnh đã được tổ chức để kiểm tra thuật toán cuối cùng. Nhưng tôi thích ý tưởng về cảm biến Kinect và tôi muốn đọc thêm về chủ đề này!
Charles Menguy

Điều gì sẽ là kích thước của tập huấn luyện với một mạng lưới thần kinh để có kết quả thỏa mãn? Điều tuyệt vời với phương pháp này là tôi chỉ cần một mẫu để khớp với hầu hết mọi thứ.
Charles Menguy

2
Nếu bộ ảnh của bạn được xác định trước và giới hạn, chỉ cần kết quả hoàn hảo trong prog của bạn;)
sne11ius

Vâng, nếu tôi huấn luyện bộ dữ liệu tôi sẽ chạy thuật toán, chắc chắn tôi sẽ nhận được kết quả hoàn hảo :) Nhưng ví dụ với bài tập này, chương trình đã được giáo viên kiểm tra cuối cùng trên một tập hợp các hình ảnh được tổ chức . Tôi muốn làm một cái gì đó sẽ mạnh mẽ và không phù hợp với dữ liệu đào tạo.
Charles Menguy

Số lượng bộ huấn luyện khác nhau, bạn phải cẩn thận một số điều mặc dù: Đừng quá đào tạo, bạn có thể muốn có một bộ kiểm tra để cho thấy độ chính xác của bạn đang diễn ra như thế nào. Ngoài ra số lượng tập huấn luyện sẽ phụ thuộc vào số lượng lớp bạn sẽ sử dụng.
Mr Mr tuyệt vời

24

Tôi sẽ phát hiện các hình chữ nhật màu đỏ: RGB -> HSV, lọc màu đỏ -> hình ảnh nhị phân, đóng (giãn rồi xói mòn, được gọi là imclosetrong matlab)

Sau đó nhìn qua các hình chữ nhật từ lớn nhất đến nhỏ nhất. Cả hai hình chữ nhật có hình chữ nhật nhỏ hơn ở một vị trí / tỷ lệ đã biết đều có thể được loại bỏ (giả sử tỷ lệ chai không đổi, hình chữ nhật nhỏ hơn sẽ là nắp chai).

Điều này sẽ để lại cho bạn các hình chữ nhật màu đỏ, sau đó bạn sẽ cần bằng cách nào đó phát hiện các logo để cho biết nếu chúng là hình chữ nhật màu đỏ hoặc một lon coca. Giống như OCR, nhưng với một logo được biết đến?


2
Giống như điều này đã được thảo luận trên DSP trong thời gian ngắn khi nó được di chuyển, một số chai có thể không có phích cắm;) hoặc phích cắm có thể bị ẩn một phần.
Charles Menguy

22

Đây có thể là một ý tưởng rất ngây thơ (hoặc có thể không hoạt động), nhưng kích thước của tất cả các lon coca đã được cố định. Vì vậy, có thể nếu cùng một hình ảnh chứa cả một lon và một chai thì bạn có thể phân biệt chúng bằng cách xem xét kích thước (chai sẽ lớn hơn). Bây giờ do thiếu độ sâu (tức là ánh xạ 3D sang ánh xạ 2D), có thể một chai có thể bị thu nhỏ và không có sự khác biệt về kích thước. Bạn có thể khôi phục một số thông tin độ sâu bằng cách sử dụng hình ảnh âm thanh nổi và sau đó khôi phục kích thước ban đầu.


3
Trên thực tế không: không có ràng buộc về kích thước hoặc định hướng (hoặc định hướng nhưng tôi không thực sự xử lý điều đó), vì vậy bạn có thể có một cái chai ở rất xa trong nền, và một cái hộp ở phía trước, và có thể lớn hơn hơn chai.
Charles Menguy

Tôi cũng đã kiểm tra tỷ lệ chiều rộng và chiều cao khá giống nhau đối với chai và có thể, vì vậy đó cũng không thực sự là một lựa chọn.
Charles Menguy

Tỷ lệ nhãn (là nhãn hiệu) là như nhau. Vì vậy, nếu chai (lớn hơn) nằm xa hơn một chút trên hình ảnh, kích thước của nó sẽ giống hệt như cái lon.
littleadv

3
Để giải thích thêm một chút. Giả sử có thể ở z = 0 và chai ở z = -100. Vì chai là xa phía sau nó sẽ trông nhỏ hơn. Nhưng nếu tôi biết rằng chai ở z = -100 và có thể tại z = 0, thì tôi có thể tính kích thước dự kiến ​​của lon / chai nếu cả hai được dịch thành z = 0. Vì vậy, bây giờ chúng ở cùng độ sâu và do đó tôi có thể đưa ra quyết định dựa trên kích thước.
Sharad

2
Đây chỉ là một bình luận, không phải là một câu trả lời, nhưng nó gần giống như một câu trả lời hơn là một câu trả lời như một câu trả lời ở trên với 120 phiếu.
Fattie

22

Hmm, tôi thực sự nghĩ rằng tôi đang hỏi một điều gì đó (đây giống như câu hỏi thú vị nhất từ ​​trước đến nay - vì vậy thật đáng tiếc nếu không tiếp tục cố gắng tìm câu trả lời "hoàn hảo", mặc dù đã tìm thấy một câu hỏi chấp nhận được) .. .

Một khi bạn tìm thấy logo, rắc rối của bạn đã được thực hiện một nửa. Sau đó, bạn chỉ phải tìm ra sự khác biệt giữa những gì xung quanh logo. Ngoài ra, chúng tôi muốn làm càng ít càng tốt. Tôi nghĩ rằng đây thực sự là phần dễ dàng này ...

Có gì xung quanh biểu tượng? Đối với một lon, chúng ta có thể thấy kim loại, mặc dù có tác dụng của ánh sáng, không thay đổi bất cứ điều gì trong màu sắc cơ bản của nó. Miễn là chúng ta biết góc của nhãn, chúng ta có thể nói những gì trực tiếp bên trên nhãn, vì vậy chúng ta đang xem xét sự khác biệt giữa những điều này:

Ở đây, những gì bên trên và bên dưới logo hoàn toàn tối, nhất quán về màu sắc. Tương đối dễ dàng trong khía cạnh đó.

Ở đây, những gì bên trên và bên dưới là ánh sáng, nhưng vẫn nhất quán về màu sắc. Nó hoàn toàn bằng bạc và kim loại bạc hoàn toàn có vẻ khá hiếm, cũng như màu bạc nói chung. Ngoài ra, nó ở dạng dốc mỏng và đủ gần với màu đỏ đã được xác định để bạn có thể theo dõi hình dạng của nó trong toàn bộ chiều dài của nó để tính tỷ lệ phần trăm của vòng kim loại có thể được coi là. Thực sự, bạn chỉ cần một phần nhỏ của bất cứ nơi nào dọc theo lon để nói nó là một phần của nó, nhưng bạn vẫn cần tìm một sự cân bằng đảm bảo nó không chỉ là một cái chai rỗng với thứ gì đó đằng sau nó.

Và cuối cùng, một trong những khó khăn. Nhưng không quá khó khăn, một khi chúng ta chỉ đi theo những gì chúng ta có thể thấy trực tiếp bên trên (và bên dưới) trình bao bọc màu đỏ. Nó trong suốt, có nghĩa là nó sẽ hiển thị bất cứ điều gì đằng sau nó. Điều đó tốt, bởi vì những thứ đằng sau nó không có khả năng đồng nhất về màu sắc như kim loại tròn màu bạc của lon. Có thể có nhiều thứ khác nhau đằng sau nó, nó sẽ cho chúng ta biết rằng đó là một chai rỗng (hoặc chứa đầy chất lỏng trong suốt), hoặc một màu nhất quán, có thể có nghĩa là nó chứa đầy chất lỏng hoặc chai chỉ đơn giản là ở phía trước màu đặc. Chúng tôi đang làm việc với những gì gần nhất trên cùng và dưới cùng, và cơ hội màu sắc phù hợp ở đúng vị trí là tương đối mỏng. Chúng tôi biết đó là một cái chai, vì nó không có yếu tố hình ảnh quan trọng của cái lon,

(cái cuối cùng là thứ tốt nhất tôi có thể tìm thấy trong một chai coca cola lớn rỗng - thú vị là nắp VÀ vòng có màu vàng, cho thấy màu đỏ của nắp có lẽ không nên dựa vào)

Trong trường hợp hiếm hoi là một màu bạc tương tự ở phía sau chai, ngay cả sau khi trừu tượng hóa nhựa, hoặc chai bằng cách nào đó chứa đầy bóng màu của chất lỏng bạc, chúng ta có thể dựa vào thứ mà chúng ta có thể ước tính là hình dạng của bạc - mà như tôi đã đề cập, là hình tròn và theo hình dạng của hộp. Nhưng mặc dù tôi thiếu bất kỳ kiến ​​thức nhất định trong xử lý hình ảnh, điều đó nghe có vẻ chậm. Tốt hơn nữa, tại sao không suy luận điều này bằng cách kiểm tra xung quanh các mặt của logo để đảm bảo không có màu bạc nào giống nhau ở đó? À, nhưng nếu có cùng một màu bạc đằng sau một cái lon thì sao? Sau đó, chúng ta thực sự phải chú ý nhiều hơn đến hình dạng, nhìn vào đỉnh và đáy của lon một lần nữa.

Tùy thuộc vào mức độ hoàn hảo của tất cả những gì cần phải có, nó có thể rất chậm, nhưng tôi đoán khái niệm cơ bản của tôi là kiểm tra những thứ dễ nhất và gần nhất trước tiên. Đi bằng sự khác biệt màu sắc xung quanh hình dạng đã được khớp (dường như là phần tầm thường nhất của điều này) trước khi đi đến nỗ lực tìm ra hình dạng của các yếu tố khác. Để liệt kê nó, nó đi:

  • Tìm điểm thu hút chính (nền logo màu đỏ và có thể là chính logo để định hướng, mặc dù trong trường hợp có thể quay lưng đi, bạn cần tập trung vào màu đỏ một mình)
  • Xác nhận hình dạng và hướng, một lần nữa thông qua màu đỏ rất đặc biệt
  • Kiểm tra màu sắc xung quanh hình dạng (vì nó nhanh và không đau)
  • Cuối cùng, nếu cần, hãy xác minh hình dạng của những màu đó xung quanh điểm thu hút chính để có độ tròn phù hợp.

Trong trường hợp bạn không thể làm điều này, điều đó có thể có nghĩa là phần trên và dưới của hộp có thể được che lại, và những thứ khả dĩ duy nhất mà con người có thể sử dụng để phân biệt một cách đáng tin cậy giữa cái lon và cái chai là sự che khuất và phản chiếu của lon, đó sẽ là một trận chiến khó khăn hơn nhiều để xử lý. Tuy nhiên, để đi xa hơn, bạn có thể theo góc của hộp / chai để kiểm tra các đặc điểm giống chai hơn, sử dụng các kỹ thuật quét bán trong suốt được đề cập trong các câu trả lời khác.

Những cơn ác mộng bổ sung thú vị có thể bao gồm việc có thể thuận tiện ngồi sau chai ở khoảng cách mà kim loại của nó chỉ xuất hiện ở trên và dưới nhãn, vẫn sẽ thất bại miễn là bạn quét dọc theo toàn bộ chiều dài của màu đỏ nhãn - thực sự là một vấn đề nhiều hơn bởi vì bạn không phát hiện ra một nơi bạn có thể có, trái ngược với việc xem xét rằng bạn thực sự phát hiện ra một chai, bao gồm cả tình cờ có thể. Kính là một nửa trống, trong trường hợp đó!


Từ chối trách nhiệm, tôi không có kinh nghiệm và cũng chưa từng nghĩ về việc xử lý hình ảnh ngoài câu hỏi này, nhưng thật thú vị đến nỗi tôi đã suy nghĩ khá sâu sắc về nó, và sau khi đọc tất cả các câu trả lời khác, tôi cho rằng điều này có thể là cách dễ nhất hiệu quả nhất để hoàn thành nó. Cá nhân, tôi rất vui vì tôi không thực sự phải nghĩ về việc lập trình này!

BIÊN TẬP

vẽ xấu của một lon trong sơn MS Ngoài ra, hãy nhìn vào bản vẽ này tôi đã làm trong MS Paint ... Nó hoàn toàn khủng khiếp và khá chưa hoàn chỉnh, nhưng chỉ dựa vào hình dạng và màu sắc, bạn có thể đoán nó có thể sẽ ra sao. Về bản chất, đây là những điều duy nhất mà người ta cần bận tâm để quét. Khi bạn nhìn vào hình dạng rất đặc biệt và sự kết hợp màu sắc rất gần nhau, nó có thể là gì khác? Bit tôi không vẽ, nền trắng, nên được coi là "bất cứ điều gì không nhất quán". Nếu nó có nền trong suốt, nó có thể vượt qua hầu hết các hình ảnh khác và bạn vẫn có thể nhìn thấy nó.


10
Màu sắc đặc biệt của màu đỏ chủ yếu là chủ quan và bị ảnh hưởng mạnh mẽ bởi những cân nhắc về ánh sáng và cân bằng trắng. Bạn có thể ngạc nhiên bởi bao nhiêu có thể thay đổi. Hãy xem xét, ví dụ, ảo ảnh bàn cờ này .
Bạch tuộc

2
Một bản cập nhật cho liên kết mà @Octopus đã đăng: Persci.mit.edu/gallery/checkershadow
Hat

Một ảo giác nhận thức không ảnh hưởng đến những gì webcam của bạn nhìn thấy - tức là mã của bạn nhận được - chỉ cách mắt người giúp đỡ (?) Đánh lừa bộ não.
Barny

17

Tôi không biết về OpenCV nhưng nhìn vào vấn đề một cách logic, tôi nghĩ rằng bạn có thể phân biệt giữa chai và có thể bằng cách thay đổi hình ảnh mà bạn đang tìm kiếm, ví dụ như Coca Cola. Bạn nên kết hợp cho đến phần trên cùng của hộp vì trong trường hợp có thể có lớp lót bạc ở trên cùng của coca cola và trong trường hợp chai sẽ không có lớp lót bạc như vậy.

Nhưng rõ ràng thuật toán này sẽ thất bại trong trường hợp ẩn đầu, nhưng trong trường hợp đó, ngay cả con người cũng không thể phân biệt được giữa hai (nếu chỉ nhìn thấy phần coca cola của chai / lon)


1
Tôi cũng có suy nghĩ tương tự, nhưng tôi nghĩ lớp lót bạc trên đầu có thể thay đổi đáng kể tùy thuộc vào góc của cái lon trên bức tranh. Nó có thể là một đường thẳng hoặc một vòng tròn. Có lẽ anh ta có thể sử dụng cả hai như là tài liệu tham khảo?
Alexis Dufrenoy

15

Tôi thích thử thách và muốn đưa ra câu trả lời, giải quyết vấn đề, tôi nghĩ vậy.

  1. Trích xuất các tính năng (điểm chính, mô tả như SIFT, SURF) của logo
  2. Khớp các điểm với hình ảnh mô hình của logo (sử dụng Matcher như Brute Force)
  3. Ước tính tọa độ của cơ thể cứng nhắc (vấn đề PnP - SolvePnP)
  4. Ước tính vị trí nắp theo cơ thể cứng nhắc
  5. Thực hiện chiếu ngược và tính toán vị trí pixel hình ảnh (ROI) của nắp chai (Tôi giả sử bạn có các thông số nội tại của máy ảnh)
  6. Kiểm tra với một phương pháp xem nắp có ở đó hay không. Nếu có, thì đây là chai

Phát hiện nắp là một vấn đề khác. Nó có thể phức tạp hoặc đơn giản. Nếu tôi là bạn, tôi chỉ cần kiểm tra biểu đồ màu trong ROI để có quyết định đơn giản.

Xin vui lòng, cho ý kiến ​​phản hồi nếu tôi sai. Cảm ơn.


13

Là một vài năm muộn trong việc trả lời câu hỏi này. Với tình trạng của nghệ thuật được các CNN đẩy đến giới hạn của nó trong 5 năm qua, tôi sẽ không sử dụng OpenCV để thực hiện nhiệm vụ này ngay bây giờ! ( Tôi biết bạn đặc biệt muốn các tính năng OpenCv trong câu hỏi ) Tôi cảm thấy các thuật toán phát hiện đối tượng như Faster-RCNNs, YOLO, SSD, v.v. sẽ khắc phục vấn đề này với biên độ đáng kể so với các tính năng OpenCV. Nếu bây giờ tôi phải giải quyết vấn đề này (sau 6 năm !!) tôi chắc chắn sẽ sử dụng Faster-RCNN .


5
OP cho biết có 30 hình ảnh độ phân giải cao, có lẽ không phải là kịch bản tốt nhất để đào tạo ConvNets. Không chỉ có quá ít (thậm chí tăng cường), phần độ phân giải cao sẽ phá hủy ConvNets.
Kostas Mouratidis

11

Tôi thích câu hỏi của bạn, bất kể nó có lạc đề hay không: P

Một bên thú vị; Tôi vừa hoàn thành một môn học ở mức độ của chúng tôi, nơi chúng tôi bảo vệ robot và thị giác máy tính. Dự án của chúng tôi cho học kỳ rất giống với dự án bạn mô tả.

Chúng tôi đã phải phát triển một robot sử dụng Xbox Kinect để phát hiện chai coca và lon theo bất kỳ hướng nào trong nhiều điều kiện ánh sáng và môi trường. Giải pháp của chúng tôi liên quan đến việc sử dụng bộ lọc thông dải trên kênh Huế kết hợp với biến đổi vòng tròn hough. Chúng tôi có thể hạn chế môi trường một chút (chúng tôi có thể chọn vị trí và cách đặt vị trí của cảm biến robot và Kinect), nếu không chúng tôi sẽ sử dụng các biến đổi SIFT hoặc SURF.

Bạn có thể đọc về cách tiếp cận của chúng tôi trên bài viết trên blog của tôi về chủ đề này :)


2
Dự án thú vị nhưng nó chỉ áp dụng cho thiết lập rất cụ thể của bạn.
Rui Marques

10

Có một loạt các mô tả màu được sử dụng để nhận ra các đối tượng, bài báo dưới đây so sánh rất nhiều trong số chúng. Chúng đặc biệt mạnh mẽ khi kết hợp với SIFT hoặc SURF. Chỉ riêng SURF hoặc SIFT không hữu ích trong coca cola có thể hình ảnh vì chúng không nhận ra nhiều điểm quan tâm, bạn cần thông tin màu sắc để trợ giúp. Tôi sử dụng BIC (Border / Class Pixel Classi's cation) với SURF trong một dự án và nó hoạt động rất tốt để nhận ra các đối tượng.

Mô tả màu cho truy xuất hình ảnh Web: một nghiên cứu so sánh


10

Học kĩ càng

Tập hợp ít nhất vài trăm hình ảnh có chứa lon cola, chú thích hộp giới hạn xung quanh chúng dưới dạng các lớp dương, bao gồm các chai cola và các sản phẩm cola khác dán nhãn cho chúng các lớp âm cũng như các đối tượng ngẫu nhiên.

Trừ khi bạn thu thập một tập dữ liệu rất lớn, hãy thực hiện thủ thuật sử dụng các tính năng học sâu cho tập dữ liệu nhỏ. Lý tưởng nhất là sử dụng kết hợp Máy Vector Hỗ trợ (SVM) với lưới thần kinh sâu.

Khi bạn cung cấp hình ảnh cho mô hình học sâu đã được đào tạo trước đó (ví dụ GoogleNet), thay vì sử dụng lớp quyết định (cuối cùng) của mạng thần kinh để phân loại, hãy sử dụng dữ liệu của lớp trước làm các tính năng để huấn luyện trình phân loại của bạn.

OpenCV và Google Net: http://docs.opencv.org/trunk/d5/de7/tutorial_dnn_googlenet.html

OpenCV và SVM: http://docs.opencv.org/2.4/doc/tutorials/ml/int sinhtion_to_svm / int sinhtion_to_svm.html


9

Bạn cần một chương trình học và cải thiện độ chính xác phân loại một cách hữu cơ từ kinh nghiệm.

Tôi sẽ đề nghị học sâu, với học sâu, điều này trở thành một vấn đề nhỏ.

Bạn có thể đào tạo lại mô hình v3 khởi động trên Tensorflow:

Làm thế nào để kiềm chế lớp cuối cùng của Inception cho các danh mục mới .

Trong trường hợp này, bạn sẽ đào tạo một mạng lưới thần kinh tích chập để phân loại một đối tượng là một coca-cola có thể hoặc không.


2
Hot dog hay không hot dog?
YellowPvel

6

Thay thế cho tất cả các giải pháp tốt đẹp này, bạn có thể đào tạo trình phân loại của riêng mình và làm cho ứng dụng của bạn mạnh mẽ đến các lỗi. Ví dụ: bạn có thể sử dụng Haar Training , cung cấp nhiều hình ảnh tích cực và tiêu cực về mục tiêu của bạn.

Nó có thể hữu ích để chỉ trích xuất lon và có thể được kết hợp với việc phát hiện các đối tượng trong suốt.


3

Có một gói tầm nhìn máy tính được gọi là HALCON từ MVTec mà các bản demo của họ có thể cung cấp cho bạn những ý tưởng thuật toán tốt. Có rất nhiều ví dụ tương tự như vấn đề của bạn mà bạn có thể chạy trong chế độ demo và sau đó xem xét các toán tử trong mã và xem cách triển khai chúng từ các toán tử OpenCV hiện có.

Tôi đã sử dụng gói này để nhanh chóng tạo ra các thuật toán phức tạp cho các vấn đề như thế này và sau đó tìm cách triển khai chúng bằng các tính năng OpenCV hiện có. Đặc biệt đối với trường hợp của bạn, bạn có thể thử triển khai trong OpenCV chức năng được nhúng trong toán tử find_scaled_shape_model . Một số toán tử chỉ ra bài báo khoa học về triển khai thuật toán có thể giúp tìm ra cách thực hiện một cái gì đó tương tự trong OpenCV. Hi vọng điêu nay co ich...


0

Nếu bạn quan tâm đến nó là thời gian thực, thì điều bạn cần là thêm vào bộ lọc tiền xử lý để xác định những gì được quét với các công cụ nặng. Một bộ lọc tiền xử lý nhanh, rất nhanh, thời gian thực sẽ cho phép bạn quét những thứ có khả năng là coca-cola hơn là không trước khi chuyển sang nhiều thứ iffy hơn như thế này: tìm kiếm hình ảnh cho các bản vá lớn nhất màu sắc là một dung sai nhất định từ sqrt(pow(red,2) + pow(blue,2) + pow(green,2))lon coca-cola của bạn. Bắt đầu với dung sai màu rất nghiêm ngặt và làm việc theo cách dung sai màu sắc nhẹ nhàng hơn. Sau đó, khi robot của bạn hết thời gian quy định để xử lý khung hiện tại, nó sử dụng các chai hiện được tìm thấy cho mục đích của bạn. Xin lưu ý rằng bạn sẽ phải điều chỉnh các màu RGB sqrt(pow(red,2) + pow(blue,2) + pow(green,2))để có được chúng vừa phải.

Ngoài ra, điều này có vẻ rất ngu ngốc, nhưng bạn có chắc chắn bật -oFasttối ưu hóa trình biên dịch khi bạn biên dịch mã C của mình không?


0

Có thể quá muộn nhiều năm, nhưng vẫn là một lý thuyết để thử.

Tỷ lệ hình chữ nhật giới hạn của vùng logo màu đỏ so với kích thước tổng thể của chai / lon là khác nhau. Trong trường hợp của Can, nên là 1: 1, trong khi đó sẽ khác với chai (có hoặc không có nắp). Điều này sẽ làm cho nó dễ dàng để phân biệt giữa hai.

Cập nhật: Độ cong ngang của vùng logo sẽ khác nhau giữa Can và Chai do chênh lệch kích thước tương ứng của chúng. Điều này có thể đặc biệt hữu ích nếu robot của bạn cần nhặt lon / chai và bạn quyết định độ bám phù hợp.


-1

Điều đầu tiên tôi tìm kiếm là màu sắc - như RED, khi thực hiện phát hiện Mắt đỏ trong hình ảnh - có một dải màu nhất định để phát hiện, một số đặc điểm về nó khi xem xét khu vực xung quanh và như khoảng cách với mắt kia nếu nó thực sự có thể nhìn thấy trong hình ảnh.

1: Đặc điểm đầu tiên là màu sắc và màu đỏ rất nổi trội. Sau khi phát hiện Coca Cola Red, có một số mục đáng quan tâm 1A: Vùng màu đỏ này lớn đến mức nào (có đủ số lượng để xác định một lon thực sự hay không - 10 pixel có lẽ là không đủ), 1B: Nó có chứa màu của Nhãn - "Coca-Cola" hoặc sóng. 1B1: Có đủ để xem xét khả năng cao đó là nhãn.

Mục 1 là một kiểu cắt ngắn - tiền xử lý nếu snot đó tồn tại trong hình ảnh - di chuyển trên.

Vì vậy, nếu đó là trường hợp tôi có thể sử dụng phân đoạn hình ảnh đó của mình và bắt đầu thu nhỏ hơn khu vực được đề cập một chút - về cơ bản hãy nhìn vào vùng / cạnh xung quanh ...

2: Cho ID khu vực hình ảnh ở trên vào 1 - xác minh các điểm xung quanh [các cạnh] của mục được đề cập. Trả lời: Có thứ gì có vẻ là đỉnh hoặc đáy - bạc không? B: Một cái chai có thể trông trong suốt, nhưng cũng có thể là một cái bàn thủy tinh - vì vậy có một cái bàn / kệ kính hoặc một khu vực trong suốt - nếu vậy có nhiều cái có thể xuất hiện. Một chai MIGHT có nắp màu đỏ, có thể không, nhưng nó phải có hình dạng của ốc vít trên cùng / ốc vít hoặc nắp. C: Ngay cả khi điều này không thành công A và B, nó vẫn có thể là một phần - Điều này phức tạp hơn khi nó là một phần vì một phần chai / một phần có thể trông giống nhau, do đó, việc xử lý thêm phép đo cạnh khu vực Đỏ để cạnh .. chai nhỏ có thể có kích thước tương tự ..

3: Sau phân tích ở trên đó là khi tôi nhìn vào chữ và logo sóng - bởi vì tôi có thể định hướng tìm kiếm một số chữ cái trong các từ Vì bạn có thể không có tất cả các văn bản do không có tất cả các văn bản có thể, sóng sẽ căn chỉnh tại một số điểm nhất định với văn bản (khoảng cách khôn ngoan) để tôi có thể tìm kiếm xác suất đó và biết những chữ cái nào sẽ tồn tại tại điểm đó của sóng ở khoảng cách x.


-9

Đây là một dự án cũ tôi đã làm việc. Hình ảnh MAP rất dễ sử dụng với javascript. Tôi cung cấp cho bạn đối tượng, bạn đọc nó và biết cách sử dụng nó. Chúng tôi không cần JQuery và các hệ thống khác để sử dụng hình ảnh MAP.

    //Copyright Cherif yahiaoui, by ELEBAN.FR

//variables de flottement.
var myInstOne = null;
var globalize = null;

var eleban_preload_images = function (name, imgs, url){
try{
    var oThis = this;
    this.images = new Array();
    this.imageshover = new Array();
    this.imagesNames = new Array(imgs.split(";"));


        for(var i=0; i < this.imagesNames[0].length; i++){
            this.images[i] = new Image();
            this.imageshover[i] = new Image();
        }

    this.url = url;

    this.GetAbsoluteurl = function () {

    var img = new Image(); img.src = url;
    url = img.src; img = null; 
        this.url = url; 

    };

    this.Preload = function () {

        for(var i=0; i < this.imagesNames[0].length; i++){
            this.images[i].src = this.url+("btn-"+this.imagesNames[0][i]+".png");
            this.imageshover[i].src = this.url+("btn-"+this.imagesNames[0][i]+"-hover.png");
        }

    };
    this.GetAbsoluteurl();
    this.Preload();
}
finally {return;}
}

var g_preloaderhover = new eleban_preload_images("loaderhover","menu;malette;reservation;cabine;facebook;map;amis","./images/");


//variable arret flottement
var g_stopflo = false;

var myObjfloater = function(name, idname, itop, differ ) {
var oThis = this; // création d'une référence vers l'objet courant
this.name = name;
this.id =idname;
this.xstep= 0.3;
this.itime = 30;
this.obj = null;
this.y = itop;
this.yadd = 0;
this.up = true;
this.pause = false;
this.differ = differ;
this.coordsimage = null;
this.objimg = null;
this.initimages = false;
this.compteur = 0;
this.over = false;
this.timeoutstop = null;
try{
this.initimage = function(){
var img = this.obj.getElementsByTagName('img')[0];
this.coordsimage = new Array(img.width, img.height);
this.objimg = img;
this.initimages = true;
};


this.myMethod = function() {
if(!g_stopflo){
    if(this.differ != 0){ 
this.differ=this.differ-0.1; 
}else{

if(this.obj){
if(this.over == false){
    this.yadd=this.yadd+0.1; this.itime = this.itime + 10;
this.obj.style.visibility = "hidden";
this.y = ((this.up)? this.y - this.yadd : this.y + this.yadd);
this.obj.style.marginTop = this.y +"%" ;
this.obj.style.visibility = "visible";

if (this.yadd > this.xstep){ 
    this.up = (this.up)? false : true;
    this.yadd = -0.1; this.itime=180;
}
}
}else{
    if (document){
        if(document.getElementById) {
         this.obj = document.getElementById(this.id); 
        //this.y = this.obj.offsetTop;
        }else{
        if(document.getElementByTagName) { this.obj = document.getElementByTagName(this.id); this.y = this.obj.offsetTop;}
        }

    }
}
}
this.timeoutstop=setTimeout(function() { oThis.myMethod(); }, this.itime);
}    
};

this.callDelayed = function() {
    // utilisation de la référence vers l'objet
if(!g_stopflo){
    this.timeoutstop=setTimeout(function() { oThis.myMethod(); }, this.itime);
}
};
}
finally {return;}
};

// special creation des zones AREA
function eleban_createallarea(){
try{
var measur = new Array("w", "h");
measur["w"] = new Array(330,570,185,300,115,390,225);
measur["h"] = new Array(460,570,295,450,100,190,115);
var ititle = new Array("Voir les menus  et nos suggestions","Repas &agrave; emporter","R&eacute;servation d&rsquo;une table","Nous contacter","Nous rejoindre sur FaceBook","Calculer votre trajet","liste des amis");
var ihref = new Array("menus.html","emporter.html","reservation.html","contact.html","likebox.html","google.html","amis.html");
var b_map = new Array(0,1,2,3,4,5,6);
b_map[0] = "71,32,240,32,249,43,289,352,280,366,102,385,90,371,51,38";
b_map[1] = "66,52,95,14,129,56,115,91,100,93,112,273,128,284,122,366,176,343,193,296,191,194,147,189,145,166,201,111,199,84,545,105,532,354,509,388,412,478,32,401,77,383,87,375,82,286,95,269,94,221,24,195,11,165,9,120,89,123,89,94,78,92,77,92,77,93,75,93,77,93,76,93,79,92";
b_map[2] = "19,25,169,38,173,112,161,113,105,103,90,125,91,262,121,269,124,281,96,293,62,289,49,281,56,268,83,264,84,121,71,98,16,90";
b_map[3] = "60,0,216,1,226,20,225,403,168,421,42,410,45,10";
b_map[4] = "31,7,72,10,82,18,88,45,88,71,76,81,29,80,17,68,16,18";
b_map[5] = "91,40,141,38,178,27,184,4,211,5,223,24,240,23,386,135,229,121,103,180,6,156,49,94";
b_map[6] = "6,32,69,18,79,6,118,7,141,2,149,10,211,17,202,28,209,30,189,62,195,70,178,74,180,90,164,90,154,107,68,101,34,104,34,98,18,97,28,84,15,84,30,65";

if (document.getElementById){
for (var i=0; i<b_map.length;i++){
var obj = document.getElementById("pc_menu"+i);
    if(obj){
    var ct = '<img class=\"pc_menu\" src=\"'+g_preloaderhover.images[i].src+'\" alt=\"\" width=\"'+measur["w"][i]+'\" height=\"'+measur["h"][i]+'\" usemap=\"#MAP_INDEX'+i+'\" \/>';
    ct+='<map name=\"MAP_INDEX'+i+'\">';
    ct+='<area shape=\"poly\" coords=\"'+b_map[i]+'\" title=\"'+ititle[i]+'\" href=\"'+ihref[i]+'\" \/>';
    ct+='<\/map>';
    obj.innerHTML = ct;
    }
}
}
}
finally {return;}
}

//preload, creation et gestion de tous les evenements


var image_resizer = function(g_layer){


    b_org_elm = new Array("w",  "h");
    b_org_elm["w"] = new Array(330,570,185,300,115,390,225);
    b_org_elm["h"] = new Array(460,570,295,450,100,190,115);

    b_map = new Array(0,1,2,3,4,5,6);
    b_map[0] = new Array(71,32,240,32,249,43,289,352,280,366,102,385,90,371,51,38);
    b_map[1] = new Array(66,52,95,14,129,56,115,91,100,93,112,273,128,284,122,366,176,343,193,296,191,194,147,189,145,166,201,111,199,84,545,105,532,354,509,388,412,478,32,401,77,383,87,375,82,286,95,269,94,221,24,195,11,165,9,120,89,123,89,94,78,92,77,92,77,93,75,93,77,93,76,93,79,92);
    b_map[2] = new Array(19,25,169,38,173,112,161,113,105,103,90,125,91,262,121,269,124,281,96,293,62,289,49,281,56,268,83,264,84,121,71,98,16,90);
    b_map[3] = new Array(60,0,216,1,226,20,225,403,168,421,42,410,45,10);
    b_map[4] = new Array(31,6,70,10,78,18,84,23,88,44,88,70,78,80,75,81,33,82,23,76,18,69,16,22,21,13);
    b_map[5] = new Array(91,40,141,38,178,27,184,4,211,5,223,24,240,23,386,135,229,121,103,180,6,156,49,94);
    b_map[6] = new Array(6,32,69,18,79,6,118,7,141,2,149,10,211,17,202,28,209,30,189,62,195,70,178,74,180,90,164,90,154,107,68,101,34,104,34,98,18,97,28,84,15,84,30,65);


    b_layer = g_layer;

//gere mouseover
    this.mouseover = function(e){
        if (!e) var e = window.event;
        var tg = (window.event) ? e.srcElement : e.target
            if (tg.nodeName){
                if(tg.nodeName == "AREA"){
                var divpar = (tg.parentNode)? tg.parentNode.parentNode : tg.parentElement.parentElement;
                    if (divpar){
                        if(divpar.nodeName == "DIV"){
                            var iiobjimg = divpar.getElementsByTagName('img');
                                if (iiobjimg){
                                    ii = parseInt(divpar.id.substring(divpar.id.length-1,divpar.id.length));
                                    iiobjimg[0].src = g_preloaderhover.imageshover[ii].src;
                                }
                        }
                    }
                }
            }
    };

//gere mouseout
    this.mouseout = function(e){
        if (!e) var e = window.event;
        tg = (window.event) ? e.srcElement : e.target
            if (tg.nodeName){
                if(tg.nodeName == "AREA"){
                divpar = (tg.parentNode)? tg.parentNode.parentNode : tg.parentElement.parentElement;
                    if (divpar){
                        if(divpar.nodeName == "DIV"){
                            var iiobjimg = divpar.getElementsByTagName('img');
                                if (iiobjimg){
                                    ii = parseInt(divpar.id.substring(divpar.id.length-1,divpar.id.length));
                                    iiobjimg[0].src = g_preloaderhover.images[ii].src;
                                }
                        }
                    }
                }
            }
    };

//ajout evenements entree sortie à la page web lors du chargement de la page
    this.init = function () {

        for(var i=0; i<b_org_elm["w"].length;i++){
            w = document.getElementById("pc_menu"+i).offsetWidth;
            h = document.getElementById("pc_menu"+i).offsetHeight;

            xa = w/parseFloat(b_org_elm["w"][i]);
            ya = h/parseFloat(b_org_elm["h"][i]);

            area = document.getElementById("pc_menu"+i).getElementsByTagName('area')[0];

            b_map2 = area.coords.split(",");
            yswitch = true;
                for(m=0; m<b_map2.length;m++){
                b_map2[m] = Math.round(parseFloat(b_map[i][m]) * ((yswitch)? xa: ya));
                yswitch = (yswitch)? false :  true;
                }
            area.coords = b_map2.join(',');
        }
    }; 


    this.resize = function () {
    clearTimeout(myInstOne.timeoutstop);
    g_stopflo=true;

    globalize.init();
    g_stopflo=false;
    myInstOne.obj = null;
    myInstOne.callDelayed();
    };


    nar = document.getElementsByTagName('area').length;

        for(var i=0; i<nar;i++){
            var elem = document.getElementsByTagName('area')[i];
            if (elem.addEventListener){
                    elem.addEventListener("onmouseover",this.mouseover,true);
                elem.addEventListener("onmouseout",this.mouseout,true);
            }else if (elem.attachEvent) {
                    elem.attachEvent("onmouseover", this.mouseover);
                    elem.attachEvent("onmouseout", this.mouseout);
            }else{
                    elem["onmouseover"] = this.mouseover;
                    elem["onmouseout"] = this.mouseout;
            }
        }

            window.onresize = this.resize;
        window.onmouseover = this.mouseover;
        window.onmouseout = this.mouseout;
}


//permet de temporiser et éviter les erreurs de chargement des objets
function temporise_Init(Lastdiv){
if(document.getElementById){
    if(document.getElementById(Lastdiv)){

    eleban_createallarea();

    myInstOne = new myObjfloater('b_menumap11', 'pc_menu1', 1, 0);

    globalize = new image_resizer(document.getElementById('pc_redim'));
    globalize.init();
        globalize.resize();



    }else{
    setTimeout(temporise_Init(Lastdiv), 30);
    }
}
}


window.onload = function () {
temporise_Init("pc_bandeau");
}

3
cái này làm gì
dùng8408080
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.