5 คะแนน โดย GN⁺ 2024-01-04 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ใช้แอป Shortcuts บน macOS เพื่อสร้างชอร์ตคัต OCR แบบโลคัลได้โดยไม่ต้องใช้บริการแบบเสียเงินเพิ่มเติม และสามารถสั่งดึงข้อความจากภาพผ่านเทอร์มินัล/CLI/Python ได้
  • องค์ประกอบหลักคือเชื่อม Shortcut Input เข้ากับแอ็กชัน Extract Text from Image แล้วคัดลอกผลลัพธ์ไปยังคลิปบอร์ด
  • ชื่อชอร์ตคัตควรเป็นตัวพิมพ์เล็กไม่มีเว้นวรรค เช่น ocr-text หรือ extract-text เพื่อให้เรียกจาก CLI ได้ง่าย และต้องกด Enter หลังป้อนชื่อเพื่อบันทึก
  • ในเทอร์มินัล ให้รันด้วย shortcuts run ocr-text -i และผลลัพธ์ที่ดึงได้จะถูกคัดลอกไปยังคลิปบอร์ด สามารถตรวจสอบได้ด้วย Command-V
  • ใน Python สามารถเรียกคำสั่ง shortcuts run เดียวกันผ่าน subprocess.check_output() เพื่อใช้ชอร์ตคัต OCR เดิมซ้ำได้

สร้างชอร์ตคัต OCR ใน Shortcuts

  • เปิดแอป Shortcuts บน macOS แล้วกดปุ่ม + เพื่อสร้างชอร์ตคัตใหม่
  • ค้นหา extract text ในแถบด้านขวา จากนั้นลากแอ็กชัน Extract Text from Image ไปยังพื้นที่ทำงานด้านซ้าย
  • คลิกอินพุต Image สีน้ำเงินของแอ็กชัน Extract text from ... แล้วเลือก Shortcut Input
    • แอ็กชัน Receive จะปรากฏขึ้นด้านบน ซึ่งปล่อยไว้แบบนั้นได้
  • ค้นหา copy ในแถบด้านขวา แล้ววางแอ็กชัน Copy to Clipboard ไว้ใต้ Extract Text from Image
    • ต้องตรวจสอบว่าในแอ็กชันสุดท้าย ส่วนหลัง Copy เป็น Text from Image
    • ระหว่างลากแอ็กชัน Copy to Clipboard ลงด้านล่าง อาจรู้สึกใช้งานค่อนข้างลำบากเล็กน้อย
  • ชื่อชอร์ตคัตควรเรียบง่าย เป็นตัวพิมพ์เล็ก และไม่มีช่องว่าง เช่น extract-text หรือ ocr-text
    • หลังป้อนชื่อต้องกด Enter เพื่อบันทึกชื่อ

รันจาก CLI และ Python

  • คำสั่งสำหรับรันชอร์ตคัตจากเทอร์มินัลมีดังนี้
shortcuts run ocr-text -i
  • ถ้าหลังรันแล้วกดวางด้วย Command-V และเห็นข้อความที่ถูกดึงออกมา แปลว่าตั้งค่าได้ถูกต้อง
  • ใน Python สามารถรันคำสั่งเดียวกันได้ด้วย 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)
  • การแชร์ใน Shortcuts อาจทำงานแปลก ๆ ได้ จึงอาจต้องตั้งค่าด้วยตนเอง แต่ขั้นตอนส่วนใหญ่ทำเพียงครั้งเดียวก็พอ

1 ความคิดเห็น

 
GN⁺ 2024-01-04
ความคิดเห็นจาก Hacker News
  • โพสต์ของ OP ดีมาก เฟรมเวิร์ก Vision ของ Apple ค่อนข้างน่าประทับใจ และผมเคยลองใช้กับโปรเจกต์ส่วนตัวที่อ่านภาพหน้าจอสเปรดชีตหลายหมื่นภาพด้วย OCR แล้วนำเข้าไปใส่ในฐานข้อมูล PostgreSQL
    เนื่องจาก macOS กับ Nvidia ยังเข้ากันได้ไม่ค่อยดี ผมจึงลอง OCR แบบใช้ CPU อย่าง Tesseract ด้วย แต่ผลลัพธ์ผิดบ่อยเกินไป เฟรมเวิร์ก Vision ให้คุณภาพเอาต์พุตดีที่สุดเท่าที่ผมเคยเห็น และใช้ทรัพยากรคำนวณน้อยที่สุดด้วย
    มันค่อนข้างไม่เสถียรอยู่บ้าง แต่ก็อาจเป็นความผิดพลาดในการ implement ของผมเองก็ได้ ในการใช้งานจริงผมใช้ vision.py ของ RHetTbull https://gist.github.com/RhetTbull/1c34fc07c95733642cffcd1ac5... และใช้ ocrmac https://github.com/straussmaximilian/ocrmac ร่วมด้วยสำหรับการทดลอง ซึ่งแม้บน Hackintosh i7 6700k ประสิทธิภาพก็ออกมาดีเกินคาด
    ผมไม่ได้เรียกตัวเองว่าเป็นโปรแกรมเมอร์ แต่ถ้ามีเวลาพอ โดยทั่วไปก็แก้ปัญหาได้ เพียงแต่ใช้เวลาค่อนข้างมาก

    • ถ้าดีกว่า Tesseract ก็ถือว่าน่าประทับใจจริง ๆ สงสัยเหมือนกันว่าจะเอาเครื่อง macOS หลายเครื่องมารันแล้วทำเป็น บริการ API เพื่อหารายได้ได้ไหม และทำได้ถูกกฎหมายหรือเปล่า
    • การใช้ Tesseract อย่างเดียวตอนนี้เป็นที่รู้กันค่อนข้างแพร่หลายว่าอยู่ในระดับ พอใช้ได้เท่านั้น
      แค่ดูเฟรมเวิร์ก RAG ก็จะเห็นว่าหลายตัวใช้หรือรองรับ implementation หลายแบบ และ Tesseract แทบจะได้รับการรองรับเสมอ แต่โดยปกติไม่ใช่ตัวเลือกในอุดมคติ โปรเจกต์อย่าง Unstructured https://github.com/Unstructured-IO/unstructured-inference หรือ DocTR https://github.com/mindee/doctr มักเป็นที่นิยมมากกว่า
      โดยทั่วไปสิ่งเหล่านี้ใช้โมเดล vision ระดับสมัยใหม่ https://github.com/mindee/doctr#models-architectures https://github.com/Unstructured-IO/unstructured-inference#mo... จึงเหนือกว่า Tesseract อย่างชัดเจน
      ผมยังไม่ได้เทียบโดยตรงกับเฟรมเวิร์ก Apple Vision แต่แน่นอนว่าดีกว่า Tesseract และมีโอกาสที่จะดีกว่า Apple Vision ด้วยซ้ำ มีแนวทางที่ผสมหลายวิธีเข้าด้วยกันด้วย แต่จะซับซ้อนขึ้นพอสมควร
    • สงสัยว่ามี tutorial สำหรับดึง โครงสร้างตาราง จาก PDF หรือรูปภาพด้วย Apple Vision Framework ไหม ผมลองสองลิงก์ในบทความแล้ว แต่มันดึงออกมาแค่ข้อความโดยไม่รักษาโครงสร้างตารางไว้
      AWS Textract มีโค้ดตัวอย่าง Python สำหรับดึงตารางออกมาเป็น CSV และตัวนั้นทำงานได้ดี
  • ตอนลองทำอะไรคล้าย ๆ กันบน Windows ผมพบว่าโปรเจกต์ของ Microsoft ที่ติดตั้งไว้อยู่แล้วอย่าง PowerToys มีเครื่องมือ OCR ที่ค่อนข้างดีรวมอยู่ด้วย
    กด Win+Shift+T แล้วเลือกพื้นที่ที่จะสแกน ข้อความก็จะถูกคัดลอกไปยังคลิปบอร์ด
    https://learn.microsoft.com/en-us/windows/powertoys/
    https://learn.microsoft.com/en-us/windows/powertoys/text-ext...

    • ผมใช้ AutoHotkey ร่วมกับ PowerToys เพื่อ เพิ่ม ข้อมูลจากสกรีนช็อต ลงใน CSV อยู่ และมันทำงานได้ดีเมื่อใช้กับการแมปปุ่มของตัวเอง
  • ผมสร้าง เครื่องมือโอเพนซอร์ส ที่มีทั้ง CLI และ UI ที่ใช้ได้ดี และใช้งานฟรี
    https://trex.ameba.co

    • ผมใช้ Trex ทุกวัน น่าประทับใจที่มันจัดการ ลายมือเขียน และภาพแคปหน้าจอที่เละ ๆ ได้ดี
  • เพิ่งรู้ว่าแอป Mac หลายตัว รวมถึง Safari, Preview, Notes จะ ทำ OCR ให้โดยอัตโนมัติ กับรูปภาพ สามารถเลือกข้อความในรูปแล้วคัดลอกไปวางที่อื่นได้ง่าย ๆ ซึ่งดีทีเดียว

    • คุณภาพดีแบบแทบไม่น่าเชื่อ ตอนวิดีโอ YouTube กำลังเล่นอยู่ก็ยังเลือกข้อความในวิดีโอได้ และถ้าจำเป็นก็หยุดวิดีโอชั่วคราวได้
      ถ้าเป็น URL หรือข้อความโดเมน หรือ QR code แม้อยู่ในรูปโปสเตอร์หรือในวิดีโอ ก็สามารถกดค้างหรือคลิกค้างเพื่อเปิดลิงก์จากรูปภาพได้โดยตรง
    • แอป Photos ก็เช่นกัน ดีมากตอนอยู่ในงานประชุมหรือเมื่อต้องทำให้สตริงยาว ๆ กลายเป็นดิจิทัล เช่น รหัสผ่านเราเตอร์เริ่มต้น
      เลือกและคัดลอกจากรูป แล้วนำไปวางบนโทรศัพท์หรือ Mac ได้ผ่านฟีเจอร์ Handoff
  • ผมชอบเครื่องมือ OCR เล็ก ๆ ตัวหนึ่งที่ติดตั้งผ่าน brew แล้วใช้บน MacBook มาก: https://github.com/schappim/macOCR

    • ผมก็เหมือนกัน สำหรับการใช้งานของผม แค่นำยูทิลิตีนั้นไปห่อด้วย macOS Shortcut เพื่อให้คลิกจาก menu bar หรือเรียกผ่าน Quicksilver ได้ก็เพียงพอแล้ว
  • บน Windows ขอแนะนำ Text Extractor ของ PowerToys
    https://learn.microsoft.com/en-us/windows/powertoys/text-ext...

  • ถ้าจะเพิ่มวิธีแก้ของผมอีกอย่าง ก็อันนี้: https://skaplanofficial.github.io/PyXA/tutorial/images.html#...
    PyXA ใช้ Vision framework เพื่อดึงข้อความจากรูปภาพหนึ่งรูปหรือหลายรูป เป็นเพียงส่วนเล็ก ๆ ของแพ็กเกจ ดังนั้นอาจจะเกินจำเป็นสำหรับงานครั้งเดียว แต่ก็เป็นอีกทางเลือกหนึ่ง

    • สำหรับข้อมูลเพิ่มเติม ใช้ VNRecognizeTextRequest ซึ่งเป็น API ที่เก่ากว่าและมีความแม่นยำต่ำกว่า
      ImageAnalyzer ใหม่กว่าและดีกว่ามาก shortcut ของ OP ก็ดูมีโอกาสสูงที่จะใช้ API เก่าอยู่ภายในเช่นกัน
  • ตั้งแต่ macOS Ventura เป็นต้นมา ใน UI ของ Image Capture มีการรวม ฟีเจอร์ OCR พื้นฐานไว้จริง ๆ
    เมื่อสแกน PDF ด้วยสแกนเนอร์ที่รองรับ AirPrint จะมีเช็กบ็อกซ์ “OCR” ปรากฏในแผงด้านขวา

  • ถ้าต้องการใส่เนื้อหาลงไฟล์ สามารถทำแบบนี้ได้ ไม่ได้จะบอกว่าเป็นวิธีที่มีประสิทธิภาพที่สุด แต่ใช้งานได้
    OCRTHISFILE="ocr-test.jpg"
    shortcuts run ocr-text -i "${OCRTHISFILE}"
    pbpaste > ${OCRTHISFILE}.txt
    หรือถ้าต้องการดูผลลัพธ์ไปด้วยและใส่ลงไฟล์ด้วย:
    OCRTHISFILE="ocr-test.jpg"
    shortcuts run ocr-text -i "${OCRTHISFILE}"
    pbpaste | tee ${OCRTHISFILE}.txt

    • ใน macOS Shortcuts จะให้ส่งออกข้อความ OCR เป็นไฟล์ก็ได้ ให้ใช้แอ็กชัน “Append to Text File
  • สงสัยว่าในฟีเจอร์ Copy Subject ของ Apple Vision มีเทคนิคคล้าย ๆ กันหรือไม่ เริ่มพึ่งพาฟีเจอร์นี้ค่อนข้างมากแล้ว แต่รู้สึกว่าวิธีเข้าถึงถูกจำกัดเกินไป

    • ต้องไปค้นดู อาจหมายถึงฟีเจอร์ใน Photos บนมือถือที่ “แยก” วัตถุในภาพออกมาแล้วทำเป็นสติกเกอร์ ดูเหมือน Apple จะเรียกสิ่งนี้ว่า “lifting subjects” https://support.apple.com/guide/iphone/lift-a-subject-from-t... https://developer.apple.com/videos/play/wwdc2023/10176/
      น่าจะลองเปลี่ยนแอ็กชัน “Extract text” เป็น “Remove background” ได้ ตอนรัน shortcut ให้ระบุชื่อไฟล์รูปภาพเอาต์พุตด้วย “-o”
      shortcuts run remove-background -i ~/Downloads/portrait-beard.avif -o beard.jpg