OCR อ่าน PDF สแกนอย่างไร และทำไมเครื่องมือนี้คืน Markdown
PDF สแกนคือภาพของข้อความ เอนด์พอยต์ OCR นี้คืน Markdown ไม่ใช่ PDF ที่มีเลเยอร์ซ่อนอยู่ Auto ใช้ข้อความเดิมในไฟล์ ส่วน Force OCR อ่านทุกหน้าใหม่

PDF สแกนเก็บหน้าเป็นภาพแรสเตอร์ ภาพถ่ายของข้อความ ไม่ใช่ตัวอักษรที่เลือกได้ OCR (optical character recognition) มองพิกเซลเหล่านั้น เดารูปร่างใดเป็นตัวอักษร แล้วปล่อยข้อความจริงออกมา บน PDF123 งานนี้รันเป็นเครื่องมือเบราว์เซอร์ฟรีและเป็น POST /api/v1/misc/ocr-pdf ผลลัพธ์คือ Markdown ไม่ใช่ PDF ที่เขียนใหม่
สแกนก็ยังเป็นภาพอยู่ดี
OCR ไม่ได้ทำความสะอาด ทำให้คม หรือแทนที่บิตแมป ไฟล์สแกนที่คมแต่ OCR อ่านผิด ก็ยังดูคม ปัญหาคอขวดไม่เคยอยู่ที่คุณภาพภาพ แต่อยู่ที่การรู้จำ สลับเอนจินรู้จำบนสแกนชุดเดียวกัน ความแม่นยำอาจเปลี่ยนไปมาก ทั้งที่พิกเซลเดิมไม่ถูกแตะต้องเลย
OCR บน PDF แบบคลาสสิกเขียนเลเยอร์ข้อความที่สองซึ่งมองไม่เห็น ซ้อนให้ตรงกับภาพด้านล่าง เพื่อให้การเลือกและค้นหาตกที่คำถูกต้อง ไดอะแกรมแสดงวิธีนี้ และเครื่องมือเดสก์ท็อปหลายตัวก็ยังทำแบบเดียวกัน
เอนด์พอยต์นี้คืนอะไรจริง ๆ
เส้นทาง OCR เรียก /api/v1/misc/ocr-pdf ซึ่งรันบน Rust crate แบบสแตนด์อโลนชื่อ pdf-inspector (คอมไพล์พร้อมฟีเจอร์ ocr) มันไม่ได้ส่ง PDF ทั้งไฟล์ให้โมเดลรู้จำ pdf-inspector จะจัดประเภทแต่ละหน้าก่อนว่ามีข้อความต้นฉบับที่ดึงออกมาได้อยู่แล้ว หรือเป็นภาพล้วน หน้าที่มีข้อความต้นฉบับจะเก็บข้อความนั้นไว้ตามเดิมและไม่แตะโมเดลรู้จำเลย ส่วนหน้าที่เป็นภาพล้วนจะผ่านไปป์ไลน์การรู้จำแทน—PDFium (ตัวเรนเดอร์โอเพนซอร์สตัวเดียวกับที่ Chrome ใช้ภายใน) จะแรสเตอร์หน้านั้น แล้ว ONNX Runtime จะรันโมเดล PP-OCRv6 Small เพื่ออ่านมัน ทั้งสองแบบของหน้าจะถูกเย็บรวมตามลำดับเป็นเอกสาร Markdown เดียว นี่คือเหตุผลที่การตอบกลับเป็น text/markdown และไฟล์ที่ดาวน์โหลดลงท้ายด้วย .md
สัญญาแบบนี้เพิ่งมีในการเขียนใหม่ครั้งนี้ แบ็กเอนด์ Java/Spring Boot เดิมที่โปรเจกต์นี้เคยรันเรียกใช้ OCRmyPDF วิธีคลาสสิกแบบ "ภาพบวกเลเยอร์ข้อความซ่อน" และคืนผลเป็น PDF การเขียนใหม่ด้วย Rust แทนที่เส้นทางนั้นทั้งหมดด้วย OCR แบบเลือกหน้าของ pdf-inspector และผลลัพธ์ก็ย้ายจาก PDF ไปเป็น Markdown ไปพร้อมกัน แบ็กเอนด์ Java เก่าถูกลบออกจากรีโพซิทอรีไปแล้วโดยสิ้นเชิงตั้งแต่นั้น มันไม่ใช่สวิตช์ที่จะสลับกลับไปใช้ได้
ถ้าต้องการ PDF ที่ค้นหาได้ (ภาพพร้อมเลเยอร์ข้อความ) ผลลัพธ์นี้ผิด แต่ถ้าต้องการข้อความที่เอเจนต์หรือไปป์ไลน์อ่านได้ Markdown คือคำตอบ
Auto กับ Force OCR
ฟอร์มมีฟิลด์ ocrType
- Normal (ค่าอื่นใดที่ไม่ใช่
force-ocr) แมปไปที่ Auto คือใช้ข้อความเดิมที่มีในไฟล์ และรัน OCR เฉพาะหน้าที่เป็นภาพล้วน บน PDF ดิจิทัลโดยตรง Auto จะไม่โหลดรันไทม์ OCR - Force OCR (
ocrType=force-ocr) รันการรู้จำใหม่ทุกหน้า รวมหน้าที่มีเลเยอร์ข้อความอยู่แล้ว คุณจ่ายด้วยเวลา ไม่ใช่ความแม่นยำที่เพิ่มขึ้น สำหรับหน้าที่เป็นภาพล้วนจริง แต่ได้รอบอ่านที่ไม่เชื่อเลเยอร์เดิมที่พังหรือไม่ครบ
ค่าเริ่มต้นของพอร์ทัลคือ Force OCR และไม่มีการเลือกภาษา เพราะรหัส tessdata ที่ตกค้างจากเส้นทาง Java เดิมถูกเพิกเฉย
การแยก Auto/Force เกิดขึ้นภายในคำขอเอง และทั้งพอร์ทัลและ capability probe ของ API ก็ไม่ได้ตรวจสอบให้ล่วงหน้า GET /api/v1/settings/get-endpoints-status จะรายงานว่า ocr-pdf "enabled" เสมอ โดยไม่ได้ตรวจจริงว่าติดตั้ง PDFium, ONNX Runtime หรือโมเดล PP-OCRv6 ไว้หรือไม่ การตรวจจริงจะเกิดขึ้นก็ต่อเมื่อคำขอนั้นไปกระตุ้นการรู้จำ: ถ้าขาดตัวใดตัวหนึ่งไป เอนด์พอยต์จะคืนค่า 503 ไม่ใช่ Markdown ที่ลดคุณภาพแล้วเงียบ ๆ ถอยไปใช้แค่ข้อความต้นฉบับ โมเดล PP-OCRv6 Small เองมีขนาดประมาณ 31 MB เว้นแต่จะถูกฝังไว้ล่วงหน้าในแคชท้องถิ่นตอนดีพลอย มันจะดาวน์โหลดผ่านเครือข่ายในครั้งแรกที่มีหน้าที่ต้องการการรู้จำจริง ๆ เครื่องที่ออฟไลน์และไม่มีโมเดลฝังไว้ล่วงหน้ามีแนวโน้มสูงที่จะล้มเหลวตั้งแต่คำขอ Force ครั้งแรกเลย แทนที่จะแค่ทำงานช้าลง
การรู้จำคือความน่าจะเป็น
เอ็นจินจับคู่แพทเทิร์นพิกเซลกับโมเดลตัวอักษรและคำ จึงทำได้ดีกับงานพิมพ์สะอาด คอนทราสต์สูง ฟอนต์มาตรฐาน แต่แย่ลงเมื่อเจอ
- ไฟล์สแกนความละเอียดต่ำหรือคอนทราสต์ต่ำ (คุณภาพระดับแฟกซ์เทียบกับต้นฉบับ 300 DPI)
- ลายมือเขียน ฟอนต์ตกแต่ง และเลย์เอาต์แปลก ๆ (ตารางหลายคอลัมน์ ข้อความหมุน ฟอร์มที่แน่น)
- หน้าเอียงที่ทำให้รูปทรง glyph บิดเบี้ยวพอจะหลอกการจับคู่
แฟกซ์ที่เบลอจะ OCR ได้ไม่เหมือนไฟล์สแกนที่สะอาด ไม่ว่าจะใช้ Auto หรือ Force นี่คือข้อจำกัดของตัวโมเดลเอง ไม่ใช่สิ่งที่พารามิเตอร์จะแก้ได้
OCR ไม่ทำอะไรบ้าง
OCR ให้ข้อความ แต่ไม่ประกอบย่อหน้า หัวเรื่อง ตาราง กลับคืนมา และไม่สร้างเอกสาร Word ที่ปรับการไหลข้อความได้ การทำเลย์เอาต์ให้แก้ไขได้เป็นปัญหาการแปลงที่ซ้อนบนความผิดพลาดของการรู้จำ ไม่ใช่งานเดียวกับการอ่านสแกน
OCR a PDF รันบนเซิร์ฟเวอร์โดยไม่ต้องมีบัญชี ดาวน์โหลดเป็น Markdown ถ้าเลเยอร์ข้อความเดิมดูผิด ให้ใช้ Force OCR เพื่อไม่ให้ Auto เชื่อเลเยอร์นั้น ส่วนการเช็กว่าเครื่องหนึ่ง ๆ มี PDFium และโมเดลติดตั้งจริงหรือไม่ การรันคำขอจริงเชื่อถือได้กว่าการอ่านค่าจาก capability probe เพราะ probe ยืนยันได้แค่ว่าเอนด์พอยต์มีอยู่ ไม่ใช่ว่ารันไทม์ของมันพร้อมแล้ว ส่วนคีย์งานอัตโนมัติและ OpenAPI ดูที่ Developers