Phát hiện văn bản c ++

Nhận diện văn bản tiếng Anh là OCR (Optical Character Recognition). Chuyên dùng để đọc các ký tự trong ảnh rồi chuyển thành văn bản để giảm sức đánh máy. Trong đó, biến phổ biến nhất là nhận diện văn bản bằng Tesseract

Cũng giống như các ứng dụng Thị giác máy tính khác, nhận dạng là bước cuối cùng. Các bạn nên xử lý cấu hình rõ ràng, dễ đọc trước khi đưa vào nhận dạng





Giới thiệu

Tesseract là thư viện OCR nổi tiếng có độ chính xác cao hơn hẳn các thư viện khác. Tesseract could run theđộc lập hoặc tích hợp với OpenCV đều được. Nếu chạy độc lập thì Tesseract sử dụng thư viện leptonica để đọc ảnh

Github của Tesseract. https. //github. com/tesseract-ocr/tesseract

Data training of Tesseract. https. //github. com/tesseract-ocr/tessdata. Có sẵn tiếng Việt, tiếng Anh, tiếng Đức cho nhu cầu thông thường

Bên dưới là ảnh để kiểm tra và kết quả đọc được

Phát hiện văn bản c ++

Phát hiện văn bản c ++

Tải xuống

Ứng dụng bên dưới được viết bằng C++ sử dụng Tesseract, giao diện Console. Các bạn tải về giải nén, copy ảnh vào thư mục vừa giải nén, sau đó chạy file exe để nhận văn bản. Chương trình sẽ tải tất cả ảnh cùng thư mục chung rồi đọc văn bản và vào cửa sổ Console. Mình có để 1 ảnh để các bạn test

Có một câu nói phổ biến, "Một bức tranh đáng giá ngàn lời nói". Trong bài đăng này, chúng tôi sẽ hiểu theo nghĩa đen và cố gắng tìm các từ trong một bức tranh. Trong một bài đăng trước về Nhận dạng văn bản, chúng ta đã thảo luận về cách thức hoạt động của Tesseract và cách sử dụng nó cùng với OpenCV để phát hiện cũng như nhận dạng văn bản. Lần này, chúng ta sẽ xem xét cách tiếp cận mạnh mẽ để Phát hiện văn bản bằng OpenCV, dựa trên một bài báo gần đây. PHÍA ĐÔNG. Trình phát hiện văn bản cảnh hiệu quả và chính xác

 

 

Cần lưu ý rằng phát hiện văn bản khác với nhận dạng văn bản. Trong phát hiện văn bản, chúng tôi chỉ phát hiện các hộp giới hạn xung quanh văn bản. Nhưng, trong nhận dạng văn bản, chúng tôi thực sự tìm thấy những gì được viết trong hộp. Ví dụ: trong hình ảnh được cung cấp bên dưới, tính năng phát hiện văn bản sẽ cung cấp cho bạn hộp giới hạn xung quanh từ và tính năng nhận dạng văn bản sẽ cho bạn biết hộp có chứa từ STOP

Phát hiện văn bản c ++

Các công cụ Nhận dạng văn bản như Tesseract yêu cầu hộp giới hạn xung quanh văn bản để có hiệu suất tốt hơn. Do đó, bộ phát hiện này có thể được sử dụng để phát hiện các hộp giới hạn trước khi thực hiện Nhận dạng văn bản

Việc triển khai lại tensorflow của bài báo đã báo cáo tốc độ sau trên hình ảnh 720p (độ phân giải 1280×720) (nguồn)

 

  • Card đồ họa. GTX 1080ti
  • mạng fprop. ~50 mili giây
  • NMS (C++). ~6 mili giây
  • Tổng thể. ~16 khung hình/giây

Mô hình tensorflow đã được chuyển sang sử dụng với OpenCV và họ cũng đã cung cấp mã mẫu. Chúng tôi sẽ thảo luận về cách nó hoạt động từng bước. Bạn sẽ cần OpenCV >= 3. 4. 3 để chạy mã. Hãy phát hiện một số văn bản trong hình ảnh

Phát hiện văn bản c ++

ƯU ĐÃI ĐƯỢC CHỜ NHẤT TRONG NĂM DÀNH CHO CÁC AI ĐAM MÊ LÀ ĐÂY

MUA NGAY

Các bước liên quan như sau

  1. Tải xuống Mô hình ĐÔNG
  2. Nạp Model vào bộ nhớ
  3. Chuẩn bị hình ảnh đầu vào
  4. Chuyển tiếp vượt qua blob qua mạng
  5. Xử lý đầu ra

Bước 1. Tải xuống Mô hình ĐÔNG

Có thể tải xuống Mô hình EAST từ liên kết dropbox này. https. //www. dropbox. com/s/r2ingd0l3zt8hxs/frozen_east_text_detection. hắc ín. gz?dl=1

Khi tệp đã được tải xuống (~85 MB), hãy giải nén tệp đó bằng cách sử dụng

tar -xvzf frozen_east_text_detection.tar.gz

Bạn cũng có thể trích xuất nội dung bằng Trình xem tệp của HĐH

Sau khi giải nén, copy. tệp mô hình pb vào thư mục làm việc

Bước 2. tải mạng

Chúng tôi sẽ sử dụng cv. dnn. readnet hoặc cv2. dnn. Hàm ReadNet() để tải mạng vào bộ nhớ. Nó tự động phát hiện cấu hình và khung dựa trên tên tệp được chỉ định. Trong trường hợp của chúng tôi, đó là tệp pb và do đó, nó sẽ cho rằng Mạng Tensorflow sẽ được tải

C++

Net net = readNet(model);

con trăn

net = cv.dnn.readNet(model)

Bước 3. Chuẩn bị hình ảnh đầu vào

Chúng ta cần tạo một đốm màu đầu vào 4-D để cung cấp hình ảnh cho mạng. Điều này được thực hiện bằng chức năng blobFromImage

Tải xuống mã Để dễ dàng làm theo hướng dẫn này, vui lòng tải xuống mã bằng cách nhấp vào nút bên dưới. Nó miễn phí.

Tải xuống mã

C++

blobFromImage(frame, blob, 1.0, Size(inpWidth, inpHeight), Scalar(123.68, 116.78, 103.94), true, false);

con trăn

blob = cv.dnn.blobFromImage(frame, 1.0, (inpWidth, inpHeight), (123.68, 116.78, 103.94), True, False)

Có một vài tham số chúng ta cần chỉ định cho chức năng này. Chúng như sau

  1. Đối số đầu tiên là chính hình ảnh
  2. Đối số thứ hai chỉ định tỷ lệ của từng giá trị pixel. Trong trường hợp này, nó không bắt buộc. Vì vậy, chúng tôi giữ nó như là 1
  3. Đầu vào mặc định cho mạng là 320×320. Vì vậy, chúng ta cần chỉ định điều này trong khi tạo đốm màu. Bạn cũng có thể thử nghiệm với bất kỳ thứ nguyên đầu vào nào khác
  4. Chúng tôi cũng chỉ định giá trị trung bình sẽ được trừ khỏi mỗi hình ảnh vì giá trị này được sử dụng trong khi đào tạo mô hình. Giá trị trung bình được sử dụng là (123. 68, 116. 78, 103. 94)
  5. Đối số tiếp theo là liệu chúng tôi có muốn hoán đổi kênh R và B hay không. Điều này là bắt buộc vì OpenCV sử dụng định dạng BGR và Tensorflow sử dụng định dạng RGB
  6. Đối số cuối cùng là liệu chúng ta có muốn cắt hình ảnh và cắt trung tâm hay không. Chúng tôi chỉ định Sai trong trường hợp này

Bước 4. Chuyển tiếp qua

Bây giờ chúng tôi đã chuẩn bị đầu vào, chúng tôi sẽ chuyển nó qua mạng. Có hai đầu ra của mạng. Một chỉ định hình học của Hộp văn bản và cái kia chỉ định điểm tin cậy của hộp được phát hiện. Chúng được đưa ra bởi các lớp

  • feature_fusion/concat_3
  • feature_fusion/Conv_7/Sigmoid

Điều này được chỉ định trong mã như sau

C++

std::vector outputLayers(2);
outputLayers[0] = "feature_fusion/Conv_7/Sigmoid";
outputLayers[1] = "feature_fusion/concat_3";

con trăn

outputLayers = []
outputLayers.append("feature_fusion/Conv_7/Sigmoid")
outputLayers.append("feature_fusion/concat_3")

Tiếp theo, chúng tôi nhận được đầu ra bằng cách chuyển hình ảnh đầu vào qua mạng. Như đã thảo luận trước đó, đầu ra bao gồm hai phần. điểm số và hình học

C++

std::vector output;
net.setInput(blob);
net.forward(output, outputLayers);

Mat scores = output[0];
Mat geometry = output[1];

con trăn

________số 8

Bước 5. Xử lý đầu ra

Như đã thảo luận trước đó, chúng tôi sẽ sử dụng kết quả đầu ra từ cả hai lớp ( i. e. hình học và điểm số) và giải mã vị trí của các hộp văn bản cùng với hướng của chúng. Chúng tôi có thể nhận được nhiều ứng cử viên cho một hộp văn bản. Vì vậy, chúng ta cần lọc ra các hộp văn bản đẹp nhất từ ​​​​rất nhiều. Điều này được thực hiện bằng cách sử dụng Non-Maximum Suppression

giải mã

C++

std::vector boxes;
std::vector confidences;
decode(scores, geometry, confThreshold, boxes, confidences);

con trăn

Net net = readNet(model);
0

Ngăn chặn không tối đa

Chúng tôi sử dụng hàm OpenCV NMSBoxes ( C++ ) hoặc NMSBoxesRotated ( Python ) để lọc ra các kết quả dương tính giả và nhận dự đoán cuối cùng

C++

Net net = readNet(model);
1

con trăn

Net net = readNet(model);
2

Kết quả

Đưa ra dưới đây là một vài kết quả

Phát hiện văn bản c ++

Phát hiện văn bản c ++

Phát hiện văn bản c ++

Phát hiện văn bản c ++

Phát hiện văn bản c ++

Phát hiện văn bản c ++

Phát hiện văn bản c ++

Phát hiện văn bản c ++

Phát hiện văn bản c ++

Như bạn có thể thấy, nó có thể phát hiện các văn bản có Nền, Phông chữ, Hướng, Kích thước, Màu sắc khác nhau. Trong cái cuối cùng, nó hoạt động khá tốt ngay cả đối với Văn bản bị biến dạng. Tuy nhiên, có một số phát hiện sai nhưng có thể nói, nhìn chung nó hoạt động rất tốt

Như các ví dụ gợi ý, nó có thể được sử dụng trong nhiều ứng dụng như Phát hiện biển số, Phát hiện biển báo giao thông, phát hiện văn bản trên Thẻ ID, v.v.