Recomendación de OCR para MacBook

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

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.

관련 글

Automatización de tareas escolares: revisión del boletín de vida escolar con IA – Detalles de competencias por asignatura
Automatización de tareas escolares: revisión del boletín de vida escolar con IA – Detalles de competencias por asignatura
Si tuviera que escoger la tarea más insignificante, dura y aburrida en la escuela, elegiría la revisión del boletín de vida escolar.En secundaria el b...
Reseña de lectura y experiencia del desafío del capítulo 7 de "밑바닥부터 만들면서 배우는 LLM"
Reseña de lectura y experiencia del desafío del capítulo 7 de "밑바닥부터 만들면서 배우는 LLM"
El contenido del capítulo 7 trata sobre el proceso de ajustar finamente el modelo para que siga instrucciones.Es hacer que responda como se espera ant...
Reseña de lectura del capítulo 6 de "Aprendiendo LLM desde cero"
Reseña de lectura del capítulo 6 de "Aprendiendo LLM desde cero"
El capítulo 6 trata sobre el fine-tuning para clasificación.El ejemplo que aparece es la creación de un clasificador de spam.Como el clasificador de s...
Reseña de lectura del capítulo 5 de «Aprender LLM construyéndolo desde cero»
Reseña de lectura del capítulo 5 de «Aprender LLM construyéndolo desde cero»
Hoy es 14 de diciembre.En realidad, el período del desafío ya terminó hace 2 semanas, pero aun así no podía renunciar a escribir la reseña.Porque esto...
Aprendiendo a crear un LLM desde cero – Reseña del capítulo 4
Aprendiendo a crear un LLM desde cero – Reseña del capítulo 4
Hoy es 26 de noviembre, así que si leo un capítulo al día, habré completado el reto.No sé si será posible con las interrupciones del primero y del seg...
Reseña de la lectura del capítulo 3 de LLM aprendiendo desde cero
Reseña de la lectura del capítulo 3 de LLM aprendiendo desde cero
Después de derramar agua sobre mi MacBook, entré en crisis y perdí alrededor de 3 a 4 días. Ahora que lo pienso, debería haber hecho algo, pensando que mi MacBook ya estaba arruinada y que la mandaría a reparar de todas formas. Aunque estoy un poco atrasado, quiero dejar mi reseña del capítulo 3 porque creo que debo continuar hasta el final. 1. Mecanismo de atención Capítulo 3...

댓글을 불러오는 중...