适合 MacBook 用户的 Python OCR 推荐

힘센캥거루
2025년 10월 13일(수정됨)
3
42

为了识别学生的医疗诊断证明,我几乎尝试了所有的OCR。

我使用过 Tesseract、EasyOCR、PaddleOCR 等各种OCR,但没有一个对韩语的性能让我满意。

不过最近我发现了一个包装了MacBook上实时文本功能的Python库。

这是利用苹果公开的 Vision Framework API。

1. Vision Framework

适合 MacBook 用户的 Python OCR 推荐-1

Vision Framework 是苹果从 High Sierra 开始面向开发者公开的机器视觉框架

提供图像分类、排序、文本识别、面部识别等各种API。

因为是设备自带的,所以不需要互联网连接。

如果用纯 swift 实现,可以如下使用。

import Foundation
import Vision
import AppKit

func loadNSImage(_ path: String) -> NSImage? {
    return NSImage(contentsOfFile: path)
}

func cgImage(from nsImage: NSImage) -> CGImage? {
    var rect = CGRect(origin: .zero, size: nsImage.size)
    return nsImage.cgImage(forProposedRect: &rect, context: nil, hints: nil)
}

let args = CommandLine.arguments
guard args.count >= 2 else {
    fputs("Usage: ocr <image_path> [lang1,lang2,...] [roi]\n", stderr)
    exit(1)
}
let imagePath = args[1]
let langs = args.count >= 3 ? args[2].split(separator: ",").map { String($0) } : ["ko-KR","en-US"]

// ROI: "x,y,w,h" in 0~1 (optional)
var roi: CGRect? = nil
if args.count >= 4 {
    let comps = args[3].split(separator: ",").compactMap { Double($0) }
    if comps.count == 4 {
        roi = CGRect(x: comps[0], y: comps[1], width: comps[2], height: comps[3])
    }
}

guard let nsImage = loadNSImage(imagePath), let cg = cgImage(from: nsImage) else {
    fputs("Failed to load image\n", stderr)
    exit(1)
}

let request = VNRecognizeTextRequest { request, error in
    if let error = error {
        fputs("Error: \(error.localizedDescription)\n", stderr)
        exit(1)
    }
    let observations = request.results as? [VNRecognizedTextObservation] ?? []
    for obs in observations {
        if let top = obs.topCandidates(1).first {
            print(top.string)
        }
    }
}

// 核心选项
request.recognitionLevel = .accurate
request.usesLanguageCorrection = true
request.recognitionLanguages = langs
request.customWords = [] // 如果需要,添加领域词典

if let r = roi {
    request.regionOfInterest = r
}

// 如果支持最新版本,将自动使用(如需显式,使用以下行)
// request.revision = VNRecognizeTextRequestRevision3 // 根据OS调整

let handler = VNImageRequestHandler(cgImage: cg, options: [:])
do {
    try handler.perform([request])
} catch {
    fputs("Perform error: \(error.localizedDescription)\n", stderr)
    exit(1)
}

然后在终端中编译并运行。

xcrun swiftc ocr.swift -o ocr
./ocr sample.png "ko-KR,en-US"
适合 MacBook 用户的 Python OCR 推荐-2

识别率和速度都非常惊人。

使用 EasyOCR 时读取一张图像需要超过3秒,而使用 Vision Framework 一秒可以处理2张图像。

搜索后发现有人已经做了一个 Python 库。

2. ocrmac

果然有人好心地用 Python 包装好了API。

我们可以用 pip 下载并使用。

pip install ocrmac 

然后尝试识别一个样本图像。

开始时字符识别效果不好,但指定目标语言后识别率大大提高。

from ocrmac import ocrmac
import matplotlib.pyplot as plt

img_path = './pdf2png/scan0.png'
result = ocrmac.OCR(img_path, language_preference=["ko-KR","en-US"]).recognize()
for line in result:
    print(line)

第一个值是文字,第二个值是准确性,第三个值是边界框。

适合 MacBook 用户的 Python OCR 推荐-4

通常用 cv2 绘制边界框,但这个库直接绘制。

可以用如下方式使用 annotation_PIL。

from ocrmac import ocrmac
import matplotlib.pyplot as plt

img_path = './pdf2png/scan0.png'
result = ocrmac.OCR(img_path, language_preference=["ko-KR","en-US"])
img  = result.annotate_PIL()
plt.figure(figsize=(12,12))
plt.imshow(img)
适合 MacBook 用户的 Python OCR 推荐-5

框架可以选择为livetext或改变识别等级。

可以使用以下示例了解更多详细信息。

3. 使用心得

使用苹果的 Vision Framework,让我对OCR的渴望一次性得到了满足。

处理 200dpi 的 100 张图像,EasyOCR 需要约10分钟,而 ocrmac 几乎在1分钟内完成。

可以考虑用这个做一个网络服务。

如果有人早点告诉我,我会更爱我的 MacBook ...

只是太晚知道,实在可惜。

관련 글

学校事务自动化——利用 AI 检查学生综合素质评价(生记簿)科目别“细部能力及特长事项”
学校事务自动化——利用 AI 检查学生综合素质评价(生记簿)科目别“细部能力及特长事项”
如果要在学校工作里选出一项最无意义、最辛苦、最无聊的,我会选生记簿检查。在初中,学生综合素质评价(生活记录簿)并不那么重要,但在高中它与升学直接相关,因此极其重要。问题在于,这样的生记簿检查最终找的无非就是简单的错别字、禁止填写用语、拼写等。这篇文章就是从这样的疑问开始的。现在这种简单检查,是不是已...
从零构建中学习 LLM 第7章读书心得与挑战回顾
从零构建中学习 LLM 第7章读书心得与挑战回顾
第7章的内容是让模型遵循指令进行微调的过程。也就是让它针对某个问题给出我们期望的回答。果然,最需要的还是数据。1. 指令微调步骤这里的核心是准备好问答数据集,用作输入-输出对来进行训练。这就叫做提示(prompt)风格。其他部分就像之前的流程一样,对内容进行分词(tokenize)、训练和评估,过程...
从零开始构建中学习 LLM 第 6 章读后感
从零开始构建中学习 LLM 第 6 章读后感
第 6 章是为分类进行微调。作为例子给出的任务是构建垃圾邮件分类器。垃圾邮件分类器需要判断一封邮件是不是垃圾邮件,因此输出结果要是类似 0、1 这样的值。1. 微调的顺序微调的过程和训练模型的过程很相似。准备数据集,加载权重值,然后进行训练和评估。稍微不同的一点是,会有一个把输出层映射到 0(非垃圾...
从零开始构建中学习 LLM 第5章读书后记
从零开始构建中学习 LLM 第5章读书后记
今天是12月14日。其实挑战期已经过去整整两周了,但也不能因此就放弃写后记。像这样留下的 TIL(Today I Learned),以后都会变成自己的血和肉。这次打算比起代码本身,更专注在“意义”上来写一写。1. 模型的损失计算这一部分讲的是,在构建好 GPT 模型之后,用什么方式来计算损失。GPT...
从零开始动手实现 LLM 第4章读书心得
从零开始动手实现 LLM 第4章读书心得
今天是11月26日,如果每天读一章并看完的话,这次挑战就算成功。在老大和老二的各种干扰下,不知道能不能做到。1. Dummy Transformer在实现 GPT 模型的过程中,看到是从 PyTorch 里拿来一个 Transformer 的 dummy 模块用的。一查才发现,在 PyTorch 的...
通过从头构建学习的LLM第3章读后感
通过从头构建学习的LLM第3章读后感
我在MacBook上泼了一大杯水后,崩溃了,浪费了大约3-4天。现在回想起来,反正MacBook已经坏了,应该想着送修,干点别的事情。无论如何,虽然有点晚了,但我觉得必须坚持到底,所以留下了第3章的读后感。1. 注意力机制第3章...

댓글을 불러오는 중...