맥북 유저를 위한 파이썬 OCR 추천

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

학생들 진료 확인서 인식을 위해 안써본 OCR이 없는 것 같다.

Tesseract, EasyOCR, PaddleOCR 등 다양한 OCR들을 써보았는데, 한글에 대해 만족할만한 성능을 가진 OCR이 없었다.

그런데 최근에 맥북에 있는 라이브 텍스트 기능을 래핑한 파이썬 라이브러리를 발견했다.

애플에서 공개한 Vision Framework API를 이용한 것이다.

1. Vision Framework

맥북 유저를 위한 파이썬 OCR 추천-1

비전 프레임워크는 애플이 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"
맥북 유저를 위한 파이썬 OCR 추천-2

인식률과 속도가 엄청나다.

EasyOCR로 했을 때는 1장 읽는데 3초 이상이 걸리는데, 비젼 프레임워크를 이용하면 1초당 2장씩 처리한다.

검색해보니 누가 만들어놓은 파이썬 라이브러리도 있었다.

2. ocrmac

역시 누군가 고맙게도 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)

첫번째 값은 글자, 두번째 값은 정확도, 세번째 값은 바운딩 박스이다.

맥북 유저를 위한 파이썬 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)
맥북 유저를 위한 파이썬 OCR 추천-5

프레임워크를 livetext로 하거나 인식 레벨을 변경시켜줄수도 있다.

자세한 예제는 아래를 이용해보자.

3. 후기

애플의 비젼 프레임워크를 쓰면서 OCR에 대한 갈증이 한방에 해결되었다.

200dpi의 이미지 100장을 처리하는데 EasyOCR은 10분 정도가 걸리는데 반해, ocrmac은 거의 1분 이내의 시간이 걸린다.

이걸로 웹 서비스를 한번 만들어봐도 좋을것 같다.

누군가 나에게 알려주었다면 맥북을 더 사랑했을텐데..

너무 늦게 알게 돼서 아쉬울 따름이다.

관련 글

학교 업무 자동화 - AI를 이용한 생활기록부 점검 과목별 세부능력 특기사항편
학교 업무 자동화 - AI를 이용한 생활기록부 점검 과목별 세부능력 특기사항편
학교에서 가장 의미없고 힘들며 지루한 업무를 하나 뽑으라고 하면 나는 생기부 점검을 뽑을 것이다.중학교에서는 생활기록부가 그리 중요치 않지만 고등학교에서는 입시와 관련되어 있기 때문에 무척 중요하다.문제는 이런 생기부 점검에서 찾는 것이 고작 단순 오탈자, 기재 금지용...
밑바닥부터 만들면서 배우는 LLM 7장 독서 후기 및 챌린지 후기
밑바닥부터 만들면서 배우는 LLM 7장 독서 후기 및 챌린지 후기
7장 내용은 지시를 따르도록 미세 튜닝하는 과정이다.어떤 질문에 대해 기대하는 응답을 하도록 하는 것.역시나 필요한 것은 데이터이다.1. 지시 미세 튜닝 절차여기서의 핵심은 질문-응답 데이터 셋을 준비하여 입력-출력 쌍으로 훈련시키는 것.이걸 프롬프트 스타일이라고 한다...
밑바닥부터 만들면서 배우는 LLM 6장 독서 후기
밑바닥부터 만들면서 배우는 LLM 6장 독서 후기
6장은 분류를 위한 미세 튜닝하기이다.예제로 나오는 것은 스팸 분류기 만들기.스팸 분류기는 이것이 스팸인지, 스펨이 아닌지를 분류하는 것이므로 출력의 결과가 0, 1과 같은 값으로 나와야 한다.1. 미세튜닝의 순서미세 튜닝의 과정은 모델을 훈련시키는 과정과 비슷하다.데...
밑바닥부터 만들면서 배우는 LLM 5장 독서 후기
밑바닥부터 만들면서 배우는 LLM 5장 독서 후기
오늘은 12월 14일이다.사실 챌린지 기간은 이미 2주나 지나 버렸지만, 그렇다고 후기를 포기할 순 없었다.이렇게 남기는 TIL이 나중에 피와 살이 되기 때문.코드 자체보다는 의미에 집중해서 적어보려고 한다.1. 모델의 손실 계산GPT 모델을 만든 후에 어떤 방식으로 ...
밑바닥부터 만들면서 배우는 LLM 4장 독서 후기
밑바닥부터 만들면서 배우는 LLM 4장 독서 후기
오늘이 11월 26일이니, 매일 1장식 독파하면 챌린지 성공이다.첫째와 둘째의 방해 속에서 가능할지 모르겠다.1. 더미 트랜스포머GPT 모델을 만들면서 파이토치에서 트랜스포머 더미 블록을 가져오는 것을 봤다.찾아보니 pytorch의 nn 안에는 이미 여러 트랜스포머 모...
밑바닥부터 만들면서 배우는 LLM 3장 독서 후기
밑바닥부터 만들면서 배우는 LLM 3장 독서 후기
맥북에 물을 한바가지 쏟은 후, 멘붕이 와서 3~4일 정도를 허비했다.지금 생각해보니 그냥 어차피 맥북은 나간거고, 수리 맡긴다고 생각하고 뭐라도 할걸 그랬나 싶다.어쨌든 조금 늦었지만, 그래도 끝까지 달려봐야 한다는 생각에 3장 후기를 남긴다.1. 어텐션 메커니즘3장...

댓글을 불러오는 중...