5 điểm bởi GN⁺ 2024-01-04 | 1 bình luận | Chia sẻ qua WhatsApp
  • Dùng ứng dụng Shortcuts trên macOS, bạn có thể tạo shortcut OCR cục bộ mà không cần dịch vụ trả phí riêng, rồi chạy trích xuất văn bản từ ảnh trong terminal/CLI/Python
  • Cấu hình cốt lõi là nối Shortcut Input vào action Extract Text from Image, rồi sao chép kết quả vào clipboard
  • Tên shortcut nên đặt bằng chữ thường không có khoảng trắng như ocr-text hoặc extract-text để dễ gọi từ CLI, và phải nhấn Enter sau khi nhập tên để lưu
  • Trong terminal, chạy bằng shortcuts run ocr-text -i , và kết quả trích xuất sẽ được sao chép vào clipboard để kiểm tra bằng Command-V
  • Trong Python, có thể gọi cùng lệnh shortcuts run bằng subprocess.check_output() để tái sử dụng shortcut OCR

Tạo shortcut OCR trong Shortcuts

  • Mở ứng dụng Shortcuts trên macOS và tạo shortcut mới bằng nút +
  • Trong thanh bên phải, tìm extract text, rồi kéo action Extract Text from Image vào vùng làm việc bên trái
  • Nhấp vào đầu vào Image màu xanh của action Extract text from ... và chọn Shortcut Input
    • Action Receive sẽ xuất hiện ở phía trên, cứ để nguyên như vậy
  • Tìm copy trong thanh bên phải rồi đặt action Copy to Clipboard bên dưới Extract Text from Image
    • Ở action cuối cùng, cần kiểm tra phần sau Copy có phải là Text from Image hay không
    • Quá trình kéo action Copy to Clipboard xuống dưới có thể hơi bất tiện
  • Tên shortcut nên đơn giản, viết thường và không có khoảng trắng như extract-text hoặc ocr-text
    • Sau khi nhập tên, phải nhấn Enter thì tên mới được lưu

Chạy từ CLI và Python

  • Lệnh chạy shortcut trong terminal như sau
shortcuts run ocr-text -i
  • Sau khi chạy, nếu dán bằng Command-V và thấy văn bản đã được trích xuất thì nghĩa là thiết lập đã đúng
  • Trong Python, có thể chạy cùng lệnh bằng subprocess.check_output()
import subprocess
file_path = '... some file path ...'
ocr_out = subprocess.check_output(
    f'shortcuts run ocr-text -i "{file_path}"', shell=True
)
print(ocr_out)
  • Việc chia sẻ Shortcuts đôi khi có thể hoạt động không ổn định nên cần thiết lập thủ công, nhưng hầu hết các bước chỉ cần làm một lần

1 bình luận

 
GN⁺ 2024-01-04
Ý kiến trên Hacker News
  • Bài của OP rất hay. Framework Vision của Apple khá ấn tượng, và tôi đã dùng nó cho một dự án cá nhân để OCR hàng chục nghìn ảnh chụp màn hình bảng tính rồi đưa vào cơ sở dữ liệu PostgreSQL
    Vì macOS và Nvidia vẫn chưa thực sự hợp nhau, tôi cũng đã thử các giải pháp OCR chạy trên CPU như Tesseract, nhưng kết quả sai quá thường xuyên. Framework Vision cho chất lượng đầu ra tốt nhất mà tôi từng thấy, đồng thời dùng ít tài nguyên tính toán nhất
    Nó khá thiếu ổn định, nhưng cũng có thể là do tôi triển khai sai. Trong phần triển khai thực tế, tôi dùng vision.py của RHetTbull https://gist.github.com/RhetTbull/1c34fc07c95733642cffcd1ac5... và dùng ocrmac https://github.com/straussmaximilian/ocrmac để thử nghiệm; hiệu năng trên chiếc Hackintosh i7 6700k cũng tốt ngoài mong đợi
    Tôi không tự gọi mình là lập trình viên, nhưng nếu có đủ thời gian thì thường vẫn giải quyết được vấn đề, chỉ là sẽ tốn khá nhiều thời gian

    • Nếu nó tốt hơn Tesseract thì thật sự rất ấn tượng. Tôi cũng tò mò không biết có thể vận hành nhiều máy macOS để biến nó thành một dịch vụ API kiếm tiền hay không, và liệu điều đó có hợp pháp về mặt pháp lý không
    • Dùng riêng Tesseract hiện giờ đã khá nổi tiếng là chỉ ở mức tàm tạm
      Chỉ cần nhìn vào các framework RAG là thấy nhiều nơi dùng hoặc hỗ trợ nhiều cách triển khai khác nhau; Tesseract gần như lúc nào cũng được hỗ trợ nhưng thường không phải lựa chọn lý tưởng. Các dự án như Unstructured https://github.com/Unstructured-IO/unstructured-inference hay DocTR https://github.com/mindee/doctr thường được ưa chuộng hơn
      Chúng nhìn chung tận dụng các mô hình thị giác hiện đại https://github.com/mindee/doctr#models-architectures https://github.com/Unstructured-IO/unstructured-inference#mo... nên vượt xa Tesseract
      Tôi chưa so sánh trực tiếp với framework Apple Vision, nhưng chắc chắn là tốt hơn Tesseract, và thậm chí có thể còn tốt hơn cả Apple Vision. Cũng có cách tiếp cận kết hợp nhiều phương pháp, nhưng sẽ khá phức tạp
    • Tôi muốn biết có hướng dẫn nào về việc dùng Apple Vision Framework để trích xuất cấu trúc bảng từ PDF hoặc ảnh hay không. Tôi đã thử hai liên kết trong bài, nhưng chúng chỉ trích xuất văn bản mà không giữ lại cấu trúc bảng
      AWS Textract có cung cấp mã mẫu Python để xuất bảng ra CSV, và nó hoạt động tốt
  • Khi làm điều tương tự trên Windows, tôi phát hiện ra PowerToys của Microsoft, vốn đã cài sẵn trên máy, có tích hợp một công cụ OCR khá tốt
    Nhấn Win+Shift+T rồi chọn vùng cần quét là văn bản sẽ được sao chép vào clipboard
    https://learn.microsoft.com/en-us/windows/powertoys/
    https://learn.microsoft.com/en-us/windows/powertoys/text-ext...

    • Tôi đang dùng AutoHotkey cùng với PowerToys để thêm dữ liệu ảnh chụp màn hình vào CSV, và nó hoạt động tốt với cả thiết lập gán phím riêng của tôi
  • Tôi đã làm một công cụ mã nguồn mở có cả CLI lẫn UI khá ổn, và nó miễn phí
    https://trex.ameba.co

    • Tôi dùng Trex hằng ngày. Nó xử lý tốt cả chữ viết tay lẫn ảnh chụp màn hình lộn xộn, rất ấn tượng
  • Tôi nhận ra rằng nhiều ứng dụng trên Mac, bao gồm Safari, Preview và Notes, tự động thực hiện OCR cho hình ảnh. Bạn có thể dễ dàng chọn văn bản trong ảnh rồi sao chép và dán sang nơi khác, rất tiện

    • Chất lượng tốt đến mức hơi khó tin. Ngay cả khi video YouTube đang phát, bạn vẫn có thể chọn văn bản trong video, hoặc tạm dừng nếu cần
      Nếu đó là URL, tên miền hoặc mã QR, bạn có thể nhấn giữ hoặc click giữ ngay trên ảnh để mở liên kết trực tiếp từ ảnh, kể cả trong ảnh poster hay trong video
    • Ứng dụng Photos cũng vậy. Cực kỳ hữu ích ở hội nghị hoặc khi cần số hóa các chuỗi dài, ví dụ như mật khẩu mặc định của router
      Bạn có thể chọn và sao chép từ ảnh, rồi dùng tính năng Handoff để dán vào điện thoại hoặc máy Mac
  • Tôi rất thích một công cụ OCR nhỏ trên MacBook, cài bằng brew: https://github.com/schappim/macOCR

    • Tôi cũng vậy. Với nhu cầu của tôi, chỉ cần bọc tiện ích đó trong Shortcut của macOS để có thể bấm từ thanh menu hoặc chạy bằng Quicksilver là đủ
  • Trên Windows, tôi khuyên dùng Text Extractor của PowerToys
    https://learn.microsoft.com/en-us/windows/powertoys/text-ext...

  • Tôi cũng góp thêm một cách của mình: cái này đây: https://skaplanofficial.github.io/PyXA/tutorial/images.html#...
    PyXA dùng framework Vision để trích xuất văn bản từ một hoặc nhiều hình ảnh. Đây chỉ là một phần nhỏ của gói nên có thể hơi quá tay cho tác vụ dùng một lần, nhưng vẫn là một lựa chọn

    • Lưu ý là nó đang dùng VNRecognizeTextRequest, một API cũ hơn và độ chính xác thấp hơn
      ImageAnalyzer mới hơn và tốt hơn nhiều. Shortcut của OP cũng rất có thể đang dùng API cũ ở bên trong
  • Trên macOS Ventura trở lên, chức năng OCR thực sự đã được tích hợp sẵn vào giao diện Image Capture
    Khi quét PDF bằng máy quét tương thích AirPrint, sẽ xuất hiện ô chọn “OCR” ở bảng bên phải

  • Nếu muốn ghi nội dung vào file thì có thể làm như sau. Không dám nói đây là cách hiệu quả nhất, nhưng nó hoạt động
    OCRTHISFILE="ocr-test.jpg"
    shortcuts run ocr-text -i "${OCRTHISFILE}"
    pbpaste > ${OCRTHISFILE}.txt
    Hoặc nếu muốn vừa xem đầu ra vừa ghi vào file:
    OCRTHISFILE="ocr-test.jpg"
    shortcuts run ocr-text -i "${OCRTHISFILE}"
    pbpaste | tee ${OCRTHISFILE}.txt

    • Bạn cũng có thể để macOS Shortcuts xuất văn bản OCR ra file. Hành động cần dùng là “Append to Text File
  • Tôi tự hỏi liệu tính năng Copy Subject của Apple Vision có kỹ thuật tương tự không. Dạo này tôi phụ thuộc vào tính năng này khá nhiều, nhưng cảm giác cách tiếp cận của nó quá hạn chế

    • Tôi phải tra mới biết, chắc là đang nói tới tính năng “tách” đối tượng trong ảnh trên Photos di động để biến thành sticker. Có vẻ Apple gọi việc này là “lifting subjects” https://support.apple.com/guide/iphone/lift-a-subject-from-t... https://developer.apple.com/videos/play/wwdc2023/10176/
      Có vẻ chỉ cần đổi hành động “Extract text” thành “Remove background”. Khi chạy shortcut, có thể chỉ định tên file ảnh đầu ra bằng “-o”
      shortcuts run remove-background -i ~/Downloads/portrait-beard.avif -o beard.jpg