trOCR: ปฏิวัติการจดจำข้อความด้วย Transformers
บรรลุความแม่นยำระดับมนุษย์ในการดึงข้อความจากทั้งเอกสารพิมพ์ ลายมือเขียน และหลายภาษา
trOCR API คืออะไร?
trOCR (Optical Character Recognition แบบ Transformer) เป็นโมเดล OCR แบบก้าวล้ำจาก Microsoft ที่ใช้สถาปัตยกรรม Transformer เพื่อให้ความแม่นยำ unmatched ในการจดจำข้อความ ต่างจากระบบ OCR แบบดั้งเดิมที่ใช้เพียง convolutional networks, trOCR รวม vision transformers (ViT) กับการสร้างแบบจำลอง sequence-to-sequence ทำให้เข้าใจบริบทและความสัมพันธ์เชิงพื้นที่ในข้อความ - แม้กับ input ที่ท้าทายเช่น เอกสารลายมือเขียน ภาพสแกนความละเอียดต่ำ หรือตัวอักษรที่ซับซ้อน
จุดเด่นหลักของ trOCR:
- การจดจำระดับมนุษย์: ดีเยี่ยมกับการอ่านลายมือเขียนและข้อความบิดเบี้ยวที่ OCR แบบดั้งเดิมทำไม่ได้
- รองรับหลายภาษา: โมเดลที่ฝึกไว้ล่วงหน้ารองรับ อังกฤษ ฝรั่งเศส เยอรมัน และอื่นๆ พร้อมความสามารถปรับแต่งสำหรับภาษาอื่น
- กระบวนการแบบ end-to-end: รวมการตรวจจับและจดจำข้อความในขั้นตอนเดียว
- การผสานรวมง่าย: สร้างบน Hugging Face's Transformers library สำหรับการใช้งานใน workflow ที่มีอยู่
ตั้งแต่การแปลงเอกสารประวัติศาสตร์เป็นดิจิทัลจนถึงการประมวลผลใบแจ้งหนี้ - trOCR กำหนดมาตรฐานใหม่สำหรับประสิทธิภาพ OCR ในแอปพลิเคชันจริง
ทำไมต้องเลือก trOCR?
- ใช้ Transformer: ทำได้ดีกว่าโมเดล CNN 15-20% ใน benchmark เช่น IAM Handwriting
- เชี่ยวชาญลายมือเขียน: โมเดล
trocr-base-handwritten
ทำความแม่นยำได้มากกว่า 90% กับข้อความลายมือ - preprocessing น้อยที่สุด: ทนทานต่อความแตกต่างของฟอนต์ การวางแนว และสัญญาณรบกวนพื้นหลัง
- ประมวลผลแบบแบตช์: ประมวลผลหลายภาพพร้อมกันด้วยความเร็วเกือบเชิงเส้นบน GPU
- ปรับแต่งได้: ปรับแต่งกับข้อมูลเฉพาะโดเมน (เช่น ใบสั่งยา ใบเสร็จ)
การติดตั้ง
trOCR ต้องการ PyTorch หรือ TensorFlow และ Hugging Face Transformers library สำหรับประสิทธิภาพที่ดีที่สุดแนะนำให้ใช้สภาพแวดล้อม GPU:
ติดตั้งด้วย PyTorch (แนะนำ GPU)
pip install transformers torch torchvision
pip install datasets # ไม่จำเป็นสำหรับการปรับแต่ง
หมายเหตุ: โมเดล microsoft/trocr-base
ต้องการพื้นที่ดิสก์ ~1.5GB ต่อรูปแบบ (พิมพ์/ลายมือเขียน) ตรวจสอบให้แน่ใจว่ามีพื้นที่เก็บข้อมูลและ RAM เพียงพอ (8GB+ สำหรับการประมวลผลแบบแบตช์)
ตัวอย่างโค้ด
สำรวจความสามารถของ trOCR ผ่านตัวอย่างการใช้งานจริงเหล่านี้ ตัวอย่างทั้งหมดถือว่าติดตั้ง dependencies แล้ว
ตัวอย่าง 1: การจดจำข้อความลายมือเขียน
ตัวอย่างนี้แสดงความสามารถของ trOCR ในการอ่านลายมือเขียน โมเดล (trocr-base-handwritten
) ถูกฝึกด้วย IAM Handwriting Database เหมาะสำหรับโน้ต จดหมาย หรือเอกสารประวัติศาสตร์
การจดจำลายมือเขียน
from transformers import TrOCRProcessor, VisionEncoderDecoderModel
from PIL import Image
# โหลด processor และโมเดล (เฉพาะลายมือเขียน)
processor = TrOCRProcessor.from_pretrained("microsoft/trocr-base-handwritten")
model = VisionEncoderDecoderModel.from_pretrained("microsoft/trocr-base-handwritten")
# เปิดภาพและเตรียมข้อมูล
image = Image.open("โน้ตลายมือ.jpg").convert("RGB") # ตรวจสอบให้แน่ใจว่าเป็นรูปแบบ RGB
pixel_values = processor(image, return_tensors="pt").pixel_values # ปรับขนาดและ normalize
# สร้างการทำนายข้อความ
generated_ids = model.generate(pixel_values)
text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(f"ข้อความที่ได้: {text}")
เคล็ดลับ: สำหรับผลลัพธ์ที่ดีที่สุดกับลายมือเขียน:
- ใช้ภาพสแกน 300+ DPI
- ตรวจสอบให้แน่ใจว่าแสงเพียงพอไม่มีเงา
- ครอปเฉพาะส่วนข้อความถ้าเป็นไปได้
ตัวอย่าง 2: การประมวลผลเอกสารพิมพ์
สำหรับข้อความพิมพ์ (หนังสือ ใบแจ้งหนี้ ฯลฯ) โมเดล trocr-base-printed
ให้ความแม่นยำเกือบสมบูรณ์แบบ ตัวอย่างนี้แสดงวิธีการประมวลผลเอกสารสแกน:
การดึงข้อความพิมพ์
from transformers import pipeline
from PIL import Image
# ใช้ pipeline ของ Hugging Face เพื่อความง่าย
ocr = pipeline("image-to-text", model="microsoft/trocr-base-printed")
# ประมวลผลเอกสาร
image = Image.open("สัญญา.png").convert("RGB") # แปลงเป็น RGB
results = ocr(image)
# แสดงผลลัพธ์เป็นโครงสร้าง
for idx, item in enumerate(results):
print(f"หน้า {idx + 1}: {item['generated_text']}")
ประสิทธิภาพ: บน GPU NVIDIA T4 สามารถประมวลผลได้ ~3 หน้า/วินาที สำหรับการทำงานจำนวนมากให้ใช้การประมวลผลแบบแบตช์ (ดูตัวอย่าง 3)
ตัวอย่าง 3: การประมวลผลแบบแบตช์เพื่อประสิทธิภาพ
trOCR รองรับ batch inference เพื่อการใช้ฮาร์ดแวร์ให้เกิดประโยชน์สูงสุด ตัวอย่างนี้แสดงการประมวลผลหลายภาพพร้อมกัน:
การดึงข้อความแบบขนาน
import torch
from transformers import TrOCRProcessor, VisionEncoderDecoderModel
from PIL import Image
# เริ่มต้น
device = "cuda" if torch.cuda.is_available() else "cpu"
processor = TrOCRProcessor.from_pretrained("microsoft/trocr-base-printed")
model = VisionEncoderDecoderModel.from_pretrained("microsoft/trocr-base-printed").to(device)
# เตรียมแบตช์
image_paths = ["doc1.jpg", "doc2.jpg", "doc3.jpg"]
images = [Image.open(path).convert("RGB") for path in image_paths]
# ประมวลผลแบตช์
pixel_values = processor(images, return_tensors="pt").pixel_values.to(device)
generated_ids = model.generate(pixel_values)
texts = processor.batch_decode(generated_ids, skip_special_tokens=True)
# แสดงผลลัพธ์
for path, text in zip(image_paths, texts):
print(f"{path}: {text[:50]}...") # แสดง 50 ตัวอักษรแรก
แนวทางขนาดแบตช์:
GPU VRAM | ขนาดแบตช์ที่แนะนำ |
---|---|
8GB | 4-8 ภาพ (1024x768) |
16GB+ | 16-32 ภาพ |
เคล็ดลับขั้นสูง
เพื่อเพิ่มประสิทธิภาพของ trOCR:
- การปรับปรุงภาพ: ใช้ OpenCV สำหรับการปรับมุมและความคมชัด:
การปรับปรุงภาพ
import cv2 img = cv2.imread("เอกสารคุณภาพต่ำ.jpg") img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE) # แก้ไขการวางแนว img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] # ทำให้เป็น binary
- การปรับแต่งโมเดล: ปรับให้เหมาะกับข้อมูลเฉพาะโดเมน:
สคริปต์ปรับแต่ง
from transformers import Seq2SeqTrainingArguments args = Seq2SeqTrainingArguments( output_dir="./trocr-finetuned", per_device_train_batch_size=8, num_train_epochs=3, save_steps=1000, evaluation_strategy="steps" ) # ดูเอกสาร Hugging Face สำหรับการตั้งค่าเต็ม
สรุป
trOCR กำหนดนิยามใหม่ของสิ่งที่ทำได้ในด้านการจดจำอักขระด้วยแสง โดยรวมสถาปัตยกรรม Transformer กับคอมพิวเตอร์วิทัศน์ ความสามารถในการจัดการทุกอย่างตั้งแต่โน้ตย่อจนถึงเอกสารหลายภาษา ทำให้มันจำเป็นสำหรับ:
- โครงการดิจิทัลอาร์ไคฟ์: แปลงเอกสารประวัติศาสตร์เป็นดิจิทัลโดยคงรูปแบบเดิม
- เวิร์กโฟลว์ทางการแพทย์/กฎหมาย: ดึงข้อความจากเอกสารสำคัญพร้อมบันทึกการตรวจสอบ
- เทคโนโลยีการช่วยเหลือ: สร้างข้อความแทนภาพใน規模ใหญ่
ด้วยการพัฒนาอย่างต่อเนื่องจาก Microsoft และชุมชน open-source trOCR ยังคงขยายขีดจำกัดของเทคโนโลยีการจดจำข้อความ