14

Tôi đang tìm phương pháp phân loại các trang được quét bao gồm phần lớn văn bản.Phân loại hình ảnh trong python

Dưới đây là các chi tiết cụ thể của sự cố của tôi. Tôi có một bộ sưu tập lớn các tài liệu được quét và cần phát hiện sự hiện diện của một số loại trang nhất định trong các tài liệu này. Tôi có kế hoạch "bùng nổ" các tài liệu vào các trang thành phần của chúng (mỗi trang trong số đó là một hình ảnh riêng lẻ) và phân loại từng hình ảnh này là "A" hoặc "B". Nhưng tôi không thể tìm ra cách tốt nhất để làm điều này.

Thông tin chi tiết:

  • tôi có rất nhiều ví dụ về "A" và "B" hình ảnh (trang), vì vậy tôi có thể làm học có giám sát.
  • Nó không rõ ràng với tôi làm thế nào để trích xuất tốt nhất các tính năng từ những hình ảnh này cho đào tạo. Ví dụ. Các tính năng đó là gì?
  • Các trang đôi khi được xoay nhẹ, vì vậy sẽ rất tuyệt nếu phân loại hơi không nhạy cảm với việc xoay vòng và (ở mức độ thấp hơn).
  • Tôi muốn một giải pháp đa nền tảng, lý tưởng trong python tinh khiết hoặc sử dụng các thư viện phổ biến.
  • Tôi đã nghĩ về việc sử dụng OpenCV, nhưng điều này có vẻ giống như một giải pháp "nặng".

EDIT:

  • Các "A" và "B" trang khác nhau ở chỗ "B" trang có các hình thức trên chúng với cấu trúc chung giống nhau, trong đó có sự hiện diện của một mã vạch. Các trang "A" là văn bản miễn phí.
+0

Chúng khác nhau như thế nào? Phông chữ? Kích thước? Bạn có thể chỉ OCR một phần của nó (một tiêu đề hoặc tác giả trong một tiêu đề?) –

+0

Nick, tôi đã thêm một chỉnh sửa để làm rõ về điều đó. Trên thực tế, mục tiêu của tôi là vứt bỏ mọi thứ * sau * các trang B vì tôi không phải OCR chúng. Vì vậy, tôi thực sự cần phải phát hiện chúng trước khi thực hiện bất kỳ OCR nào. – Kyle

+3

Đây là một vấn đề khá khó khăn - trừ khi bộ sưu tập của bạn thật sự to lớn, sẽ không dễ dàng hơn khi chỉ phân loại các trang theo cách thủ công là 'A' hoặc' B'? Bạn có thể viết một ứng dụng GUI nhỏ để hiển thị chúng lần lượt để bạn có thể chỉ cần nhấn một phím trên mỗi trang. – katrielalex

Trả lời

4

Trước tiên, tôi muốn nói rằng trong tâm trí OpenCV của tôi là một công cụ rất tốt cho các loại thao tác này. Hơn nữa, nó có giao diện python được mô tả rõ ràng here.

OpenCV được tối ưu hóa cao và vấn đề của bạn không phải là dễ dàng.

[GLOBAL EDIT: tổ chức lại các ý tưởng của tôi]

Dưới đây là một vài ý tưởng về tính năng mà có thể được sử dụng:

  • Đối với việc phát hiện các mã vạch bạn có lẽ nên cố gắng làm một khoảng cách transform (DistTransform trong OpenCV) nếu mã vạch bị cô lập. Có lẽ bạn sẽ có thể tìm thấy mối quan tâm một cách thoải mái với trận đấu hoặc matchShapes. Tôi nghĩ rằng nó là khả thi vì các mã vạch shoudl có cùng một hình dạng (kích thước, vv). Điểm số của các điểm lãi suất có thể được sử dụng như một tính năng.

  • Những khoảnh khắc của hình ảnh có thể hữu ích ở đây vì bạn có các loại cấu trúc toàn cầu khác nhau. Đây sẽ là có thể đủ để làm cho sự khác biệt giữa A & trang B (xem there cho hàm OpenCV) (bạn sẽ nhận được mô tả bất biến bằng cách này :))

  • Bạn có lẽ nên cố gắng tính toán vertical gradienthorizontal gradient. Mã vạch là một địa điểm cụ thể trong đó vertical gradient == 0 và horizontal gradient! = 0. Lợi thế chính này là chi phí thấp của các hoạt động này vì mục tiêu của bạn chỉ là để kiểm tra xem có một khu vực như vậy trên trang của bạn hay không.Bạn có thể tìm thấy khu vực sở thích và sử dụng điểm số của nó làm đối tượng địa lý

Khi bạn có các tính năng, bạn có thể thử làm supervised learning và tổng quát kiểm tra. Vấn đề của bạn yêu cầu rất ít false negative (bởi vì bạn sẽ vứt bỏ một số trang), do đó bạn nên đánh giá hiệu suất của bạn với các đường cong ROC và xem xét cẩn thận về sự nhạy cảm (cần phải cao). Để phân loại, bạn có thể sử dụng hồi quy với sự trừng phạt Lasso để tìm các tính năng tốt nhất. Bài đăng của whatnick cũng đưa ra ý tưởng hàng hóa và các bộ mô tả khác (có thể tổng quát hơn).

2

Vì vậy, bạn muốn có thể phân biệt giữa hai loại trang sử dụng các phần tử cụ thể - về cơ bản, sự hiện diện của mã vạch. Có hai bước:

  1. tính năng trích xuất (computer vision): tìm điểm tham quan hoặc dòng đó sẽ là tính năng cụ thể của mã vạch và không phải văn bản.

  2. phân loại nhị phân (học thống kê): xác định xem có mã vạch hay không, dựa trên các tính năng được trích xuất.


Đối phó với những bước đầu tiên, bạn chắc chắn nên có một cái nhìn tại Hough transform. Đó là lý tưởng để xác định các dòng trong một hình ảnh, và có thể hữu ích cho việc phát hiện mã vạch. Đọc ví dụ two pages này. Dưới đây là examples với OpenCV.


Về bước thứ hai, các phân loại hữu ích nhất sẽ được dựa trên:

  • k láng giềng gần nhất
  • hồi quy logistic
  • rừng ngẫu nhiên (thực sự cũng thực hiện trong R, nhưng tôi làm không biết về Python)
+0

Bộ học tập Orange có một cách thực hiện rừng ngẫu nhiên tốt đẹp mà tôi từng sử dụng trước khi tôi tìm thấy nó trong R. – whatnick

9

Tôi sẽ trả lời trong 3 phần vì vấn đề của bạn rõ ràng là vấn đề lớn và Tôi rất muốn giới thiệu phương pháp thủ công với lao động rẻ nếu tập hợp các trang không vượt quá một 1000.

Phần 1: Feature Extraction - Bạn có một mảng rất lớn các tính năng để lựa chọn trong lĩnh vực phát hiện đối tượng. Vì một trong các yêu cầu của bạn là sự bất biến luân phiên, tôi khuyên bạn nên sử dụng lớp tính năng SIFT/SURF. Bạn cũng có thể tìm thấy Harris góc vv phù hợp. Quyết định các tính năng để sử dụng có thể yêu cầu kiến ​​thức chuyên môn và nếu bạn có sức mạnh tính toán tôi sẽ khuyên bạn nên tạo một nồi nóng chảy tốt đẹp của các tính năng và đi qua nó thông qua một đào tạo phân loại dựa trên ước tính tầm quan trọng.

Phần 2: Chọn bộ sưu tập - Tôi là người hâm mộ tuyệt vời của bộ phân loại Random Forest. Khái niệm này rất đơn giản để nắm bắt và nó rất linh hoạt và không tham số. Việc điều chỉnh yêu cầu rất ít tham số và bạn cũng có thể chạy nó trong chế độ chọn tham số trong khi đào tạo được giám sát.

Phần 3: Triển khai - Python thực chất là ngôn ngữ keo. Triển khai python tinh khiết để xử lý ảnh sẽ không bao giờ diễn ra nhanh chóng. Tôi khuyên bạn nên sử dụng kết hợp OpenCV để phát hiện tính năng và R cho công việc thống kê và phân loại.

Giải pháp có vẻ như được thiết kế nhưng máy học chưa bao giờ là một nhiệm vụ đơn giản ngay cả khi sự khác biệt giữa các trang đơn giản là các trang bên tay trái và bên phải của một cuốn sách.

+0

SIFT chắc chắn là một ý tưởng hay, nhưng trong trường hợp này, chúng tôi có thể xác định trực tiếp nhiều tính năng tùy chỉnh hơn. mã vạch hoặc bản rõ, vv ..) (xem bài đăng của tôi). Sử dụng đào tạo phân loại để tìm cách kết hợp các tính năng của chúng tôi để đưa ra câu trả lời là một lựa chọn tốt. (+1 nói chung cho bài viết) – ThR37

+0

@wok: Tôi nghĩ rằng whatnick muốn đề xuất một cách tiếp cận tổng quát hơn (và sạch) của vấn đề thay vì đi trực tiếp sâu hơn trong câu hỏi về "tính năng nào tôi nên sử dụng?". Chúng ta phải ghi nhớ rằng mã vạch không phải là giải pháp duy nhất cho vấn đề này và cố gắng kết hợp các cách khác nhau. Liên kết của bạn rất thú vị trong mọi trường hợp. – ThR37

+0

câu trả lời xuất sắc. Tôi thấy SIFT & SURF nhưng, than ôi, ứng dụng của tôi là thương mại và SIFT được cấp bằng sáng chế. – Kyle

0

Bạn có thể thử xây dựng một mô hình bằng cách tải lên dữ liệu đào tạo lại của A và B để demo.nanonets.ai (miễn phí để sử dụng)

1) Tải lên dữ liệu đào tạo của bạn ở đây:

demo.nanonets.ai

2) Sau đó, truy vấn API bằng cách sử dụng mã sau (Mã Python):

import requests 
import json 
import urllib 
model_name = "Enter-Your-Model-Name-Here" 
url = "https://cdn.pixabay.com/photo/2012/04/24/12/13/letter-39694_960_720.png" 
files = {'uploadfile': urllib.urlopen(url).read()} 
url = "http://demo.nanonets.ai/classify/?appId="+model_name 
r = requests.post(url, files=files) 
print json.loads(r.content) 

3) phản hồi có dạng như:

{ 
    "message": "Model trained", 
    "result": [ 
    { 
     "label": "A", 
     "probability": 0.97 
    }, 
    { 
     "label": "B", 
     "probability": 0.03 
    } 
    ] 
} 
Các vấn đề liên quan