Chuyển đến nội dung chính

DeepSeek-OCR: Hướng dẫn thực hành với 7 ví dụ thiết thực

Khám phá DeepSeek-OCR, mô hình thị giác-ngôn ngữ cho hiểu tài liệu. Xem 7 bài kiểm thử OCR thực tế trên biểu đồ, toán, meme và ghi chú viết tay.
· 13 phút đọc

Khám phá cùng AI

DeepSeek-OCR là một mô hình thị giác-ngôn ngữ mới quy mô lớn có khả năng hiểu cấu trúc, phân tích bảng, trích xuất biểu đồ, và thậm chí xử lý toán học, meme, cùng nhiều ngôn ngữ.

Trong hướng dẫn này, tôi kiểm thử DeepSeek-OCR trên các tác vụ thực tế đầu-cuối—từ ghi chú viết tay đến biểu đồ phức tạp, meme và tài liệu đa ngôn ngữ. Chúng ta sẽ cùng đi qua:

  • Trích xuất biểu đồ và bảng
  • Phân tích hóa học và công thức
  • Nhận dạng chữ viết tay
  • Phương trình và đầu ra Markdown
  • OCR cho meme và ảnh mạng xã hội
  • Hiểu tài liệu đa ngôn ngữ

Kết thúc, bạn sẽ thấy DeepSeek-OCR làm tốt ở đâu và còn hạn chế gì. Nếu bạn đang khám phá OCR nguồn mở, bạn sẽ muốn xem các thử nghiệm này trước khi chọn quy trình của mình. Tôi cũng khuyên bạn xem hướng dẫn DeepSeek V3.2-Speciale của chúng tôi.

DeepSeek-OCR là gì?

DeepSeek-OCR là mô hình thị giác-ngôn ngữ mở 3B tham số được huấn luyện cho hiểu tài liệu. Nó tận dụng nén quang ngữ cảnh bằng cách ánh xạ ngữ cảnh hình ảnh 2D lớn thành các token thị giác nén, cho phép xử lý hiệu quả các tài liệu rất lớn.

Một số tính năng chính gồm:

  • Đọc các tài liệu quét lớn, biên lai, hóa đơn, bài báo nghiên cứu, v.v.
  • Phân tích bảng, biểu đồ và hình học.
  • Xử lý văn bản đa ngôn ngữ và chữ viết tay.

DeepSeek-OCR hoạt động như thế nào?

DeepSeek-OCR được thiết kế để xử lý nhiều loại ảnh tài liệu, từ biểu đồ và bảng đến chữ viết tay, toán học, và văn bản đa ngôn ngữ. Thay vì xem hình ảnh và văn bản là hai miền tách biệt, nó tận dụng mô thức thị giác như một động cơ nén cho văn bản dài, cho phép các mô hình ngôn ngữ lớn (LLM) xử lý nhiều thông tin hơn với số token ít hơn rất nhiều. Hãy cùng phân tích kiến trúc và điểm khác biệt:

Pipeline đầu-cuối: Từ encoder đến decoder

Ở mức cao, DeepSeek-OCR gồm hai thành phần chính:

  • DeepEncoder (Bộ mã hóa & nén token thị giác)
  • DeepSeek-3B MoE Decoder (Bộ sinh văn bản)

image2.png

Nguồn: DeepSeek-OCR: Contexts Optical Compression

1. Tiền xử lý ảnh đầu vào: Pipeline bắt đầu với ảnh tài liệu như hợp đồng quét, ghi chú viết tay, bảng tài chính, v.v. Ảnh được chia thành lưới các ô 16x16 pixel như các “từ” thị giác nhỏ nhất mà mô hình hiểu được.

2. DeepEncoder: DeepEncoder là động cơ thị giác nhiều tầng, cân bằng giữa độ phân giải, bộ nhớ và mức độ nén thông tin. Nó hoạt động qua ba giai đoạn chính:

  • SAM (Segment Anything Model, 80M tham số): Xử lý attention cục bộ bằng cách phân tích các ô nhỏ, chồng lấp để nắm bắt chi tiết và bố cục.
  • Bộ nén tích chập (giảm mẫu 16x): Giảm mạnh số lượng token thị giác bằng cách nén đặc trưng cục bộ, để ít token hơn đi vào giai đoạn attention toàn cục tốn kém.
  • CLIP ViT: Một transformer thị giác (300M tham số) áp dụng attention toàn cục để hiểu cấu trúc và ngữ cảnh tổng thể của tài liệu, đóng vai trò là tầng embedding cho các token đã nén.

3. Từ token thị giác tới văn bản: MoE Decoder nén các token thị giác rồi đưa vào DeepSeek-3B MoE (Mixture-of-Experts) decoder để suy luận hiệu quả bằng cách chỉ kích hoạt các chuyên gia liên quan nhất cho mỗi mẫu, giảm chi phí tính toán mà không đánh đổi độ chính xác.

4. Linh hoạt theo prompt: Hệ thống định hướng định dạng đầu ra (Markdown, bảng HTML, công thức hóa học SMILES, bố cục đa ngôn ngữ, v.v.) chỉ bằng cách thay đổi prompt, tương tự LLM.

DeepSeek-OCR cho thấy một ảnh tài liệu đơn lẻ có thể được “nén” còn khoảng 1/10 số token so với văn bản thuần mà không suy giảm đáng kể độ chính xác. 

Bản demo DeepSeek OCR: Ứng dụng Gradio

Trong phần này, chúng ta sẽ thiết lập một ứng dụng web Gradio hoàn chỉnh cho DeepSeek-OCR để chạy OCR trực tiếp trên trình duyệt hoặc Google Colab. Chỉ với vài bước, bạn có thể tải ảnh biểu đồ, bảng, ghi chú viết tay, meme, toán, văn bản đa ngôn ngữ và nhận đầu ra có cấu trúc kèm khung giới hạn (bounding boxes).

Bước 1: Điều kiện tiên quyết

Trước khi bắt đầu, hãy đảm bảo các điều kiện sau đã sẵn sàng:

!pip install -q "transformers==4.46.3" "tokenizers==0.20.3" einops addict easydict pillow gradio

Lệnh trên cài đặt tất cả thư viện Python cần thiết cho DeepSeek-OCR và Gradio, bao gồm các phiên bản tương thích mới nhất của transformers, tokenizers, xử lý ảnh (pillow) và bộ công cụ giao diện Gradio. 

Lưu ý: Mã này chạy trên GPU L4 với RAM cao trên Google Colab.

Bước 2: Import

Giờ đây ta đã cài xong phụ thuộc. Tiếp theo, thiết lập các import.

import os, time, torch, gradio as gr
from PIL import Image
from transformers import AutoModel, AutoTokenizer
from datetime import datetime
import random
import string

Chúng ta import các mô-đun Python thiết yếu cho I/O tệp, suy luận mô hình (torch), xây dựng UI (gradio), xử lý ảnh (PIL), cùng các tiện ích quản lý đường dẫn tệp và mã chạy ngẫu nhiên.

Bước 3: Tải mô hình

Khi đã cài đủ thư viện, bạn sẵn sàng tải mô hình DeepSeek-OCR từ Hugging Face. Tuy nhiên, truy cập một số mô hình cần xác thực bằng access token của Hugging Face.

Cách thiết lập access token của Hugging Face trong Google Colab:

  • Thêm secret trong Colab: Trong sổ tay Google Colab, nhấp biểu tượng hình chìa khóa (“Secrets”) ở thanh bên trái và chọn “Add a Secret.”
  • Tạo token trên Hugging Face: Đăng nhập tài khoản Hugging Face, vào cài đặt tài khoản và tìm mục “Access Tokens”. Nhấp “Create new token”, chọn vai trò phù hợp (thường là “Read”) và tạo token.
  • Sao chép và dán token: Sao chép access token mới và dán vào trường “Add a Secret” của Colab. Điều này cho phép sổ tay truy cập mô hình DeepSeek-OCR một cách an toàn.

Giờ bạn sẵn sàng xác thực và tải mô hình!

model_id = "deepseek-ai/DeepSeek-OCR"
tok = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
if tok.pad_token is None and tok.eos_token is not None:
    tok.pad_token = tok.eos_token
model = AutoModel.from_pretrained(
    model_id,
    trust_remote_code=True,
    use_safetensors=True,
    attn_implementation="eager"
).to(dtype=torch.bfloat16, device="cuda").eval()

Đoạn mã trên tải mô hình và tokenizer DeepSeek-OCR chính thức từ Hugging Face. Sau đó đảm bảo tương thích tokenizer bằng cách đặt pad token và tải mô hình ở định dạng bfloat16.

Bước 4: Hàm tiện ích

Mô hình đã sẵn sàng, tiếp theo ta tạo thư mục mới cho mỗi lần chạy để quản lý kết quả OCR gọn gàng. Việc này đảm bảo văn bản trích xuất, ảnh hiển thị khung giới hạn và log được lưu lại mà không ghi đè kết quả cũ.

def new_run_dir(base="/content/runs"):
    os.makedirs(base, exist_ok=True)
    ts = datetime.now().strftime("%Y%m%d-%H%M%S")
    rid = ''.join(random.choices(string.ascii_lowercase + string.digits, k=5))
    path = os.path.join(base, f"run_{ts}_{rid}")
    os.makedirs(path)
    return path

Hàm new_run_dir tạo một thư mục đầu ra duy nhất cho mỗi lần xử lý ảnh, dựa trên dấu thời gian hiện tại và hậu tố ngẫu nhiên. Điều này ngăn chặn ghi đè giữa các lần chạy và giúp tổ chức tệp để kiểm tra hoặc gỡ lỗi.

Bước 5: Trình xử lý OCR

Đây là động cơ chính cho ứng dụng Gradio của DeepSeek-OCR. Nó bắt đầu bằng việc chuyển đổi ảnh đã tải lên về đúng định dạng và đổi kích thước nếu tệp quá lớn. Mỗi lần chạy mô hình, tất cả đầu ra sẽ được lưu trong một thư mục mới.

def gr_ocr(image, mode, custom_prompt, base_size, image_size, crop_mode):
    img = image.convert("RGB")
    if max(img.size) > 2000:
        s = 2000 / max(img.size)
        img = img.resize((int(img.width*s), int(img.height*s)), Image.LANCZOS)
    run_dir = new_run_dir()
    img_path_proc = os.path.join(run_dir, "input.png")
    img.save(img_path_proc, optimize=True)
    if mode == "Custom Prompt" and custom_prompt.strip():
        prompt = custom_prompt.strip()
    else:
        prompt = DEMO_MODES[mode]["prompt"]
    t0 = time.time()
    try:
        with torch.inference_mode():
            _ = model.infer(
                tok,
                prompt=prompt,
                image_file=img_path_proc,
                output_path=run_dir,
                base_size=base_size,
                image_size=image_size,
                crop_mode=crop_mode,
                save_results=True,
                test_compress=True
            )
    except ZeroDivisionError:
        print(" [Patched] Division by zero in compression ratio (valid_img_tokens==0). Ignored.")
    dt = time.time() - t0
    result_file = os.path.join(run_dir, "result.mmd")
    if not os.path.exists(result_file):
        result_file = os.path.join(run_dir, "result.txt")
    result = "[No text extracted]"
    if os.path.exists(result_file):
        with open(result_file, "r", encoding="utf-8") as f:
            result = f.read().strip() or "[No text extracted]"
    boxed_path = os.path.join(run_dir, "result_with_boxes.jpg")
    boxed_img = Image.open(boxed_path) if os.path.exists(boxed_path) else None
    stats = f"""
**{dt:.1f}s** | Image: {img.size[0]}×{img.size[1]} px  
**Output directory:** {run_dir}  
"""
    return result, stats, boxed_img

Hàm gr_ocr bao gói logic tiền xử lý, suy luận và hậu xử lý cho ứng dụng Gradio của DeepSeek-OCR. Nó thực hiện các bước sau:

  • Tiêu chuẩn hóa và tiền xử lý ảnh: Trước hết, hàm chuyển mọi ảnh đầu vào sang không gian màu RGB để tương thích với mô hình. Nếu ảnh vượt quá kích thước tối đa (2000px), sẽ được đổi cỡ theo tỷ lệ để tránh tràn bộ nhớ GPU.
  • Quản lý thư mục chạy: Mỗi lần OCR được tách biệt trong một thư mục duy nhất. Điều này cho phép truy vết, quan trọng cho xử lý hàng loạt, gỡ lỗi và tái lập kết quả.
  • Suy luận mô hình hiệu quả: Mô hình được gọi trong ngữ cảnh torch.inference_mode() để không tính gradient, giảm dùng bộ nhớ và tăng tốc độ suy luận.
  • Xử lý ngoại lệ và biên: Hàm xử lý ngoại lệ như ZeroDivisionError trong các trường hợp hiếm khi nén token gây lỗi, mà không làm gián đoạn trải nghiệm người dùng.
  • Tổng hợp kết quả và trực quan hóa: Sau suy luận, hàm nạp văn bản trích xuất và ảnh phủ khung giới hạn để dễ kiểm tra.
  • Tích hợp UI: Cuối cùng, hàm trả về bộ ba gồm nội dung OCR, thống kê xử lý và ảnh chú thích để tích hợp liền mạch với giao diện Gradio.

Hãy chuyển sang giao diện tương tác và xem DeepSeek-OCR hoạt động ra sao.

Bước 6: Giao diện Gradio

Ở bước cuối, chúng ta định nghĩa giao diện Gradio tương tác cho DeepSeek-OCR, giúp người dùng dễ dàng tải ảnh, chọn các chế độ trích xuất OCR, điều chỉnh thiết lập nâng cao và xem kết quả trong một UI web duy nhất.

DEMO_MODES = {
    "Document ➔ Markdown": {
        "prompt": "<image>\n<|grounding|>Convert the document to markdown.",
        "desc": "Extracts full document text as Markdown, preserving structure (headings, tables, lists, etc.).",
        "base_size": 1024, "image_size": 640, "crop_mode": False
    },
    "Chart Deep Parsing": {
        "prompt": "<image>\nParse all charts and tables. Extract data as HTML tables.",
        "desc": "Extracts tabular/chart data into HTML tables.",
        "base_size": 1024, "image_size": 640, "crop_mode": False
    },
    "Chemical Formula Recognition": {
        "prompt": "<image>\nExtract all chemical formulas and SMILES.",
        "desc": "Extracts chemical structures and formulae.",
        "base_size": 1024, "image_size": 768, "crop_mode": False
    },
    "Geometry Parsing": {
        "prompt": "<image>\nExtract all geometric figures and their measurements.",
        "desc": "Parses diagrams and extracts geometric data.",
        "base_size": 1024, "image_size": 768, "crop_mode": False
    },
    "Plain Text Extraction": {
        "prompt": "<image>\nFree OCR.",
        "desc": "Fast, plain text OCR of the image.",
        "base_size": 768, "image_size": 512, "crop_mode": False
    },
    "Multilingual Document": {
        "prompt": "<image>\n<|grounding|>Extract text. Preserve all languages and structure.",
        "desc": "Extracts multi-language content, preserves structure.",
        "base_size": 1024, "image_size": 640, "crop_mode": False
    },
    "Custom Prompt": {
        "prompt": "",
        "desc": "Provide your own custom prompt for flexible OCR or parsing.",
        "base_size": 1024, "image_size": 640, "crop_mode": False
    }
}
with gr.Blocks(theme=gr.themes.Soft()) as demo:
    gr.Markdown("""
    <div style="text-align:center;">
        <h1>DeepSeek-OCR Demo</h1>
    </div>
    """)
    with gr.Row():
        with gr.Column():
            gr.Markdown("### Input")
            image_input = gr.Image(type="pil", label="Upload Document/Image", height=350)
            gr.Markdown("#### Demo Modes (From Paper)")
            mode = gr.Radio(
                choices=list(DEMO_MODES.keys()), value="Document to Markdown", label="Select Capability to Test"
            )
            desc = gr.Markdown(DEMO_MODES["Document to Markdown"]["desc"])
            custom_prompt = gr.Textbox(label="Custom Prompt", visible=False)
            with gr.Accordion("Advanced Settings", open=False):
                base_size = gr.Slider(512, 1280, value=DEMO_MODES["Document to Markdown"]["base_size"], step=64, label="Base Size")
                image_size = gr.Slider(512, 1280, value=DEMO_MODES["Document to Markdown"]["image_size"], step=64, label="Image Size")
                crop_mode = gr.Checkbox(value=DEMO_MODES["Document to Markdown"]["crop_mode"], label="Dynamic Resolution (Crop Mode)")
            process_btn = gr.Button("Process Image", variant="primary")
        with gr.Column():
            gr.Markdown("### Results")
            ocr_output = gr.Textbox(label="Extracted Content", lines=22, show_copy_button=True)
            status_out = gr.Markdown("_Process an image to see stats and output dir_")
            boxed_output = gr.Image(label="Result with Bounding Boxes", type="pil")
    def update_mode(selected):
        d = DEMO_MODES[selected]
        return d["desc"], gr.update(visible=selected=="Custom Prompt"), d["base_size"], d["image_size"], d["crop_mode"]
    mode.change(update_mode, inputs=mode,
                outputs=[desc, custom_prompt, base_size, image_size, crop_mode])
    process_btn.click(
        gr_ocr,
        inputs=[image_input, mode, custom_prompt, base_size, image_size, crop_mode],
        outputs=[ocr_output, status_out, boxed_output]
    )
demo.launch(share=True, debug=True)

Hãy cùng hiểu đoạn mã này theo từng phần nhỏ:

  • Chế độ demo và prompt: Từ điển DEMO_MODES bao quát các năng lực OCR chính của DeepSeek-OCR như "Document to Markdown", "Chart Deep Parsing", "Chemical Formula Recognition", v.v. Mỗi chế độ gồm prompt mặc định, mô tả và tham số xử lý ảnh khuyến nghị, cho phép người dùng chuyển đổi tác vụ trích xuất linh hoạt.
  • Kiến trúc Blocks: UI được xây dựng bằng API cấp cao Blocks của Gradio. Giao diện chia hai cột chính: bảng nhập cho phép tải ảnh, chọn chế độ OCR và tinh chỉnh tham số nâng cao như kích thước ảnh và chế độ cắt; bảng kết quả hiển thị nội dung OCR trích xuất, thống kê suy luận và ảnh chú thích với khung quanh vùng được phát hiện.
  • Điều khiển UI động: Ứng dụng có các nút radio, thanh trượt, checkbox và ô văn bản được liên kết tự động điều chỉnh dựa trên đầu vào và chế độ demo đã chọn, nâng cao tính tiện dụng và giảm cấu hình thủ công.
  • Kích hoạt suy luận và hiển thị kết quả: Khi nhấp nút Process Image, ứng dụng gọi trình xử lý OCR chính gr_ocr và truyền các lựa chọn hiện tại của UI làm tham số. Kết quả được hiển thị ngay ở bảng đầu ra.

Lưu ý: Bạn có thể cần khởi động lại phiên trên Google Colab nếu vẫn trả về kết quả từ đầu vào trước đó.

Giờ ứng dụng Gradio đã sẵn sàng, hãy kiểm thử DeepSeek-OCR với một loạt ví dụ thực tiễn.

Ví dụ ứng dụng DeepSeek OCR 1: Phân tích biểu đồ chuyên sâu

Trong demo Gradio của DeepSeek-OCR, tôi muốn xem mô hình trích xuất dữ liệu dạng bảng từ biểu đồ tốt đến đâu. Đây vẫn là thách thức với hầu hết mô hình OCR và thị giác.

Tôi thử hai trường hợp kinh điển:

  • Biểu đồ cột kiểu Statista và
  • Biểu đồ phân tích kỹ thuật phức tạp đầy tín hiệu “BUY/SELL” và lớp phủ số

DeepSeek-OCR trả về một bảng HTML cho mỗi biểu đồ, với các ô tương ứng với danh mục, giá trị và nhãn phát hiện trong ảnh.

Điểm tốt: Mô hình bắt được toàn bộ văn bản và cấu trúc hiển thị trong biểu đồ, và đầu ra ở định dạng bảng HTML, dùng được cho máy và giữ nguyên logic bảng. Nó còn xử lý các biểu đồ tài chính phức tạp, cố gắng lập bảng mọi con số và nhãn.

Hạn chế: Đầu ra thô rất dài dòng, với nhiều thẻ <td> và <tr>, khó hiểu nhanh. Ở biểu đồ phức tạp, mô hình đôi khi nhân đôi mục hoặc mất cấu trúc thị giác cấp cao, dẫn đến bảng tràn ngập tín hiệu "BUY"/"SELL" lặp lại và giá trị.

Với quy trình thực tế, bạn nên hậu xử lý HTML cho dễ đọc hoặc nhập vào Excel hay Pandas.

Khả năng phân tích biểu đồ của DeepSeek-OCR là tính năng số hóa biểu đồ thông minh, nhưng đầu ra nặng HTML phù hợp nhất cho pipeline dữ liệu hạ nguồn hoặc phân tích tiếp theo, không lý tưởng để duyệt nhanh bằng mắt.

Ví dụ 2: Trích xuất công thức hóa học

Ở bài kiểm thử tiếp theo, tôi muốn xem DeepSeek-OCR xử lý trích xuất thông tin hóa học từ ảnh có cấu trúc tốt đến đâu. Chế độ trích xuất hóa học được thiết kế để chuyển cả dữ liệu hóa học dạng bảng và cấu trúc phân tử đồ họa thành định dạng máy đọc được như bảng HTML và ký hiệu SMILES.

Tôi đã tải lên hai loại ảnh cho thí nghiệm này, và đây là những gì tôi ghi nhận:

  • Trích xuất công thức dạng văn bản: Trong ví dụ này, mô hình chép chính xác tên chất và công thức phân tử của chúng (như “Glucose: C₆H₁₂O₆”, “Butane: C₄H₁₀”). Tuy nhiên, đầu ra được định dạng dưới dạng mã bảng HTML thô, tuy có cấu trúc nhưng hơi khó đọc lướt. Việc chuyển từ ảnh sang bảng diễn ra nhanh và khá chính xác với văn bản thuần.

  • Nhận dạng cấu trúc phân tử: Với ảnh chứa sơ đồ hóa học, DeepSeek-OCR cố gắng trích xuất chuỗi SMILES tương ứng. Ví dụ, nó tạo SMILES cho ethane và propane. Dù nhận ra đây là cấu trúc hóa học, nhưng SMILES sinh ra không phải lúc nào cũng hợp lệ về hóa học, cho thấy hạn chế khi phân tích ảnh phân tử phức tạp.

image9.png

Tổng thể, khả năng trích xuất công thức hóa học cung cấp cách nhanh để số hóa dữ liệu hóa học và thử nhận dạng cấu trúc phân tử, nhưng cần tinh chỉnh thêm để phân tích hóa học đáng tin cậy, nhất là với cấu trúc phức tạp.

Ví dụ 3: OCR chữ viết tay

Tiếp theo, tôi muốn xem DeepSeek-OCR xử lý ghi chú viết tay—một thách thức kinh điển của OCR—đặc biệt khi chữ viết cách điệu hoặc kích cỡ khác nhau.

Tôi tải ảnh danh sách hóa học viết tay, gồm tên hợp chất trên giấy kẻ dòng. Sau khi xử lý, chế độ Document to Markdown của mô hình trích xuất văn bản và giữ cấu trúc khá tốt. Nó nhận ra tiêu đề và liệt kê mỗi hợp chất trên một dòng riêng, đúng như ảnh gốc. Các khung giới hạn xác nhận mô hình đã xác định đúng từng dòng và tách các khối văn bản.

image1.png

Kết quả này cho thấy khả năng chép lại nội dung viết tay thành văn bản số. Dù có thể mất một vài chi tiết định dạng nhỏ, nhưng tổng thể việc trích xuất rất chính xác trong ví dụ này.

Ví dụ 4: Trích xuất phương trình

Một kiểm thử chuẩn khác cho OCR là đọc và hiểu đúng các phương trình toán học theo ký pháp sách giáo khoa. Trong thí nghiệm này, tôi tải ảnh chứa vài phương trình phức tạp với phông chữ kiểu LaTeX để đánh giá mô hình không chỉ phát hiện mà còn trích xuất và định dạng chính xác các biểu thức này.

image13.png

DeepSeek-OCR phát hiện thành công cả bốn phương trình trong ảnh và trích xuất chúng thành chuỗi LaTeX. Đầu ra được cấu trúc gọn, mỗi phương trình trên một dòng theo định dạng LaTeX tiêu chuẩn. 

Các khung giới hạn phủ lên ảnh gốc cũng khớp (xấp xỉ), cho thấy mô hình có thể định vị và phân tách chính xác từng biểu thức toán học.

Điểm nổi bật là nội dung trích xuất giữ nguyên cấu trúc toán học bằng các lệnh như \frac cho phân số và định dạng biến chuẩn, giúp tái sử dụng trực tiếp cho tài liệu. 

Ví dụ 5: Trích xuất bảng

Một trong những tác vụ OCR phổ biến và giá trị nhất là trích xuất dữ liệu bảng từ ảnh tài liệu, đặc biệt với báo cáo quét, bài nghiên cứu hoặc bộ dữ liệu. Để đánh giá khả năng này, tôi tải ảnh chứa bảng so sánh kinh tế có cấu trúc giữa nhiều quốc gia.

image5.png

Sau khi chọn chế độ "Chart Deep Parsing" và xử lý ảnh, DeepSeek-OCR cố gắng chuyển bảng trực quan thành cấu trúc bảng HTML. Nội dung trích xuất (bên phải) gồm một loạt thẻ <table> và <td>, ánh xạ các hàng và cột dưới dạng văn bản thuần. Ảnh khung giới hạn xác nhận mô hình đã xác định và phân tách đúng vùng bảng chính trong ảnh.

Mô hình trích xuất khá ổn với các bảng đơn giản, dù có thể cần hậu xử lý vì định dạng đầu ra (HTML thô) kém thân thiện khi xem nhanh hoặc phân tích dữ liệu tiếp theo.

Ví dụ 6: OCR trên meme

Ở ví dụ này, tôi muốn kiểm tra mô hình trích xuất văn bản từ ảnh meme phổ biến. Đây là kịch bản thực tế khi văn bản thường đặt chồng lên nền phức tạp, dùng phông đa dạng và không tuân theo cấu trúc tài liệu điển hình.

Tôi tải một ảnh meme kinh điển với chữ trắng in hoa lớn đè lên cảnh phim (Leonardo DiCaprio trong Django Unchained) và chạy chế độ trích xuất Document to Markdown.

image6.png

Nguồn: Media.io

Kết quả OCR cho meme này đáng ngạc nhiên là vững vàng. Nó bắt được mọi từ quan trọng theo đúng thứ tự, không mắc lỗi chính tả hay bỏ sót, dù nền phức tạp. 

Dù không có đánh dấu cấu trúc, trích xuất này rất hữu dụng cho các tác vụ hạ nguồn như phân tích cảm xúc meme, kiểm duyệt nội dung hoặc tìm kiếm meme theo văn bản.

Ví dụ 7: OCR đa ngôn ngữ

Một điểm mạnh nổi bật của DeepSeek-OCR là hỗ trợ trích xuất văn bản đa ngôn ngữ, đặc biệt hữu ích cho tài liệu/ảnh chứa pha trộn nhiều ngôn ngữ.

Tôi kiểm thử khả năng này với nhiều mẫu, gồm biển báo đường phố thực tế bằng tiếng Trung và mẫu tổng hợp chứa câu tiếng Trung, Nhật và Hàn lẫn nhau.

image3.png

Nguồn: DeepSeek OCR Hugging Face

Khi xử lý các mẫu đa ngôn ngữ này, chế độ document-to-Markdown của DeepSeek-OCR có thể phát hiện và trích xuất chính xác các hệ chữ không phải tiếng Anh. Với ảnh đường phố, mô hình nhận diện và trả về toàn bộ đoạn văn tiếng Trung. 

Với ví dụ trộn ngôn ngữ, mô hình tách và gắn nhãn đúng phần tiếng Trung, Nhật và Hàn, giữ nguyên định dạng và khối văn bản. Các khung giới hạn cũng cho thấy phát hiện chính xác vùng văn bản của từng ngôn ngữ.

Tuy nhiên, có hai lưu ý quan trọng:

  • Tốc độ xử lý: OCR đa ngôn ngữ chậm hơn đáng kể so với tiếng Anh đơn ngữ hay tác vụ bảng. Thử nghiệm của tôi cho thấy thời gian xử lý dài hơn, có lẽ do phức tạp thêm ở phát hiện và giải mã hệ chữ.
  • Lỗi không thường xuyên: Đôi khi đầu ra có token dư thừa hoặc văn bản định dạng chưa đúng.

Bất chấp những vấn đề nhỏ này, DeepSeek-OCR mang lại khả năng OCR đa ngôn ngữ mạnh mẽ, có thể xử lý đáng tin cậy các hệ chữ trộn và ảnh chụp thực tế.

Nhận định cuối về DeepSeek-OCR

DeepSeek-OCR thu hẹp khoảng cách giữa OCR cổ điển và LLM đa phương thức hiện đại. Điểm mạnh nhất là tính đa dụng: bạn có một pipeline duy nhất đọc tài liệu quét, trích xuất bảng và biểu đồ phức tạp, hiểu phương trình và cấu trúc hóa học, thậm chí hoạt động với meme, chữ viết tay và hàng chục ngôn ngữ.

Tuy vậy, DeepSeek-OCR chưa hoàn hảo. Đầu ra biểu đồ và bảng có thể quá dài dòng, nhận dạng cấu trúc hóa học đôi lúc chưa đạt, và xử lý đa ngôn ngữ có thể chậm thấy rõ. Bố cục thị giác phức tạp có thể cần hậu xử lý để dùng trực tiếp.

Nhưng cho nghiên cứu, quy trình học thuật, thử nghiệm nhanh và bất kỳ ai cần OCR nâng cao vượt ngoài văn bản thuần, DeepSeek-OCR đã mang lại cảm giác như một bước nâng cấp đáng kể so với công cụ cũ. 

Nếu bạn muốn tìm hiểu thêm về hệ sinh thái DeepSeek, tôi khuyên bạn nên xem khóa học Làm việc với DeepSeek trong Python.

Aashi Dutt

Tác giả

Aashi Dutt

Tôi là Chuyên gia Google Developers trong lĩnh vực ML (Gen AI), Chuyên gia Kaggle 3x và Đại sứ Women Techmakers với hơn 3 năm kinh nghiệm trong ngành công nghệ. Tôi đồng sáng lập một startup công nghệ y tế vào năm 2020 và hiện đang theo học thạc sĩ khoa học máy tính tại Georgia Tech, chuyên sâu về học máy.

Chủ đề

Liên quan