Skip to content

feat(ocr): VLM 輔助圖片偵測與裁切 --extract-figures #74

@kiki830621

Description

@kiki830621

Problem

Original text:
「我覺得 macdoc 需要好好考慮這個功能,要用 D(VLM 輔助裁切:用 vision model 偵測圖片邊界框再自動裁)」
— Source: Claude Code conversation, 2026-04-12

macdoc ocr 目前只提取文字,遇到掃描 PDF 中的圖片/圖表/流程圖會直接遺失。實測 78 份轉學考 PDF,38%(30/78)的試卷包含「右圖」「下圖」「下表」「如圖」等圖片引用,但 OCR 輸出的 .md 完全沒有對應圖片。

根本原因:大部分考古題 PDF 是整頁掃描(ccitt 壓縮),pdfimages 提取出來的只是整頁掃描圖,不是個別嵌入圖片。需要 VLM 層級的空間理解才能定位圖片區域。

Type

feature

Expected

# 基本用法:OCR + 圖片提取
macdoc ocr page.png --extract-figures --output page.md --figures-dir figures/

# 輸出 .md 自動插入圖片引用
# ![figure-1](figures/page-1-fig-1.png)

# 也支援 PDF 直接輸入
macdoc ocr exam.pdf --extract-figures --output exam.md

技術設計

兩階段流程(每頁):

  1. 偵測(Detection):送 page PNG 給 VLM,用 structured prompt 要求回傳 bounding box 座標

    [
      {"label": "figure", "bbox": [x1, y1, x2, y2], "description": "ANOVA table"},
      {"label": "chart", "bbox": [x1, y1, x2, y2], "description": "scatter plot"}
    ]
    • 偵測目標:圖片、圖表、統計表格、流程圖、數學圖形
    • 不偵測:純文字段落、題號、頁首頁尾
  2. 裁切(Crop):用 CoreGraphics / sips --crop 從原始 PNG 裁出各圖片區域

    • 加 padding(10-20px)避免切到邊緣
    • 存到 --figures-dir,命名 page-{N}-fig-{M}.png
  3. 整合:在 OCR 輸出的 .md 中,在對應位置插入 ![描述](figures/page-N-fig-M.png)

模型選擇

  • 偵測用qwen2.5vl(空間理解能力好,支援 bounding box 輸出)
  • OCR 用glm-ocr(文字辨識好但不擅長空間定位)
  • 可能需要 --detection-model 參數讓使用者指定偵測模型(預設 qwen2.5vl)

CLI 介面

OPTIONS:
  --extract-figures       啟用圖片偵測與裁切
  --figures-dir <path>    圖片輸出目錄(預設 figures/)
  --detection-model <m>   圖片偵測用的模型(預設 qwen2.5vl)
  --figure-padding <px>   裁切 padding(預設 15)
  --min-figure-size <px>  忽略小於此尺寸的偵測結果(預設 50x50)

Actual

macdoc ocr 只提取文字,圖片完全遺失。含圖的題目在 .md 中變成:

3. 右圖是某國小老師想要探討...

但「右圖」指向的圖片不在 .md 中。

Impact

  • 教學場景:轉學考/研究所考古題大量包含統計圖表(scatter plot、ANOVA 表、分配圖),沒有圖片等於題目不完整
  • 自動化:目前替代方案是手動從 PNG 裁切,每張圖要算座標,78 份試卷 × 38% 含圖 ≈ 30 份需要手動處理
  • macdoc 定位:作為「PDF → 結構化文字」的工具,圖片提取是 OCR 的自然延伸

Design Notes

為什麼用 VLM 而非傳統 CV

  1. 掃描 PDF 的圖片區域沒有清晰邊界(不像網頁 <img> 有 DOM 邊界)
  2. 需要語意理解:區分「這是一張統計圖」vs「這是一段有框線的文字」
  3. VLM 可以提供 description("ANOVA table"),方便在 .md 中生成有意義的 alt text
  4. 同一個 Ollama 後端已經在跑,不需要額外 infra

--parallel 的整合

  • 偵測和 OCR 可以是同一個 VLM 呼叫(一次處理文字 + 圖片偵測)
  • 或者分開:先 glm-ocr 做文字,再 qwen2.5vl 做偵測
  • 分開的好處:可以只在需要時啟用 --extract-figures,不影響純文字 OCR 速度

Related

Current Status

Phase: verified
Last updated: 2026-05-25 by /idd-all-chain (multi-root verify)

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions