Recomendación de OCR para MacBook

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

Parece que he probado todos los OCR disponibles para reconocer informes médicos de estudiantes.

Probé Tesseract, EasyOCR, PaddleOCR y otros, pero ninguno ofrecía un rendimiento satisfactorio con coreano.

Sin embargo, recientemente encontré una biblioteca de Python que utiliza la función de Texto en Vivo de MacBook.

Usa la API del Vision Framework que Apple ha publicado.

1. Vision Framework

Recomendación de OCR para MacBook-1

El Vision Framework es un framework de visión por computadora que Apple ha hecho disponible para desarrolladores desde High Sierra.

Ofrece diversas API como clasificación de imágenes, alineación, reconocimiento de texto y reconocimiento facial.

Funciona en el dispositivo, por lo que no necesita conexión a Internet.

Si se implementa en Swift puro, se puede utilizar de la siguiente manera.

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)
}

Luego, puede compilar y ejecutar en el terminal de la siguiente manera.

xcrun swiftc ocr.swift -o ocr
./ocr sample.png "ko-KR,en-US"
Recomendación de OCR para MacBook-2

La velocidad y precisión del reconocimiento son impresionantes.

Cuando usaba EasyOCR, tardaba más de 3 segundos por imagen, pero con el Vision Framework procesa 2 imágenes por segundo.

Encontré una biblioteca de Python que alguien ya había creado.

2. ocrmac

Alguien gentilmente ya lo había envuelto en una API para Python.

Sólo necesitamos descargarlo con pip y usarlo.

pip install ocrmac 

Probemos reconocer texto en una imagen de muestra.

Al principio, el reconocimiento no fue muy bueno, pero al especificar el idioma objetivo, mejoró notablemente.

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)

El primer valor es el texto, el segundo es la precisión y el tercero es la caja delimitadora.

Recomendación de OCR para MacBook-4

Generalmente usamos cv2 para dibujar las cajas, pero esta biblioteca lo hace automáticamente.

Podemos usar annotation_PIL de la siguiente manera.

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)
Recomendación de OCR para MacBook-5

También podemos ajustar el framework a livetext o cambiar el nivel de reconocimiento.

Para ejemplos más detallados, consulte lo siguiente.

3. Opinión

Usar el Vision Framework de Apple ha resuelto mi necesidad de OCR de una vez.

Mientras que EasyOCR tardaba unos 10 minutos para procesar 100 imágenes de 200 dpi, ocrmac lo hace en menos de un minuto.

Podría ser una buena idea crear un servicio web con esto.

Si alguien me lo hubiera contado antes, probablemente habría amado más mi MacBook...

Es una lástima haberlo descubierto tan tarde.

댓글을 불러오는 중...