이미지에 대한 OCR LLM 분석을 수행하는 방법을 살펴보겠습니다. 수십년의 경험을 가진 전문가가 제시하는 최선의 방법이 아닐까? 설마. 그러나 그것은 실제 생활에서 비슷한 접근 방식을 취하는 사람에게서 나온 것입니다. 프로덕션에 바로 사용할 수 있는 코드가 아닌 실용적인 코드 조각이 포함된 주말 프로젝트 버전이라고 생각하세요. 파헤쳐보자!
이미지(또는 PDF)를 가져와서 OCR을 사용하여 텍스트를 추출한 다음 LLM을 사용하여 해당 텍스트를 분석하여 유용한 메타데이터를 얻을 수 있는 간단한 파이프라인을 구축하겠습니다. 이는 자동으로 문서를 분류하거나, 들어오는 서신을 분석하거나, 스마트 문서 관리 시스템을 구축하는 데 유용할 수 있습니다. 우리는 널리 사용되는 오픈 소스 도구를 사용하여 작업을 비교적 간단하게 진행할 것입니다.
그리고 아래의 모든 내용은 귀하가 이미 HF 변압기에 꽤 익숙하다고 가정합니다. 그렇지 않다면 https://huggingface.co/docs/transformers/en/quicktour를 확인하세요. 시작하기 좋은 곳인 것 같습니다. 나는 한 번도 해본 적이 없고 단지 예를 통해 배웠습니다. 결국엔...
우리는 무거운 작업을 위해 토치와 트랜스포머를 사용하고 사용자 친화적인 콘솔 출력으로 우리의 삶을 더 쉽게 만들기 위해 pymupdf 및 rich를 사용할 것입니다(저는 rich를 좋아하므로 기본적으로 재미로 사용합니다).
import json import time import fitz import torch from transformers import AutoModel, AutoTokenizer, pipeline from rich.console import Console console = Console()
먼저 어떤 이미지를 입력으로 사용해야 할까요? 여기에서는 Hugging Face를 기본 작업으로 사용하고 있으므로 주요 웹 페이지의 첫 번째 페이지를 테스트 주제로 사용하겠습니다. 텍스트와 복잡한 형식을 모두 갖춘 좋은 후보입니다. OCR을 진행하는 데 적합합니다.
보다 현실적인 솔루션을 위해 입력이 PDF라고 가정해 보겠습니다. 현실 세계에서는 아마도 PDF를 다루게 될 것이기 때문입니다. 모델이 처리할 수 있도록 PNG 형식으로 변환해야 합니다.
INPUT_PDF_FILE = "./data/ocr_hf_main_page.pdf" OUTPUT_PNG_FILE = "./data/ocr_hf_main_page.png" doc = fitz.open(INPUT_PDF_FILE) page = doc.load_page(0) pixmap = page.get_pixmap(dpi=300) img = pixmap.tobytes() with console.status("Converting PDF to PNG...", spinner="monkey"): with open(OUTPUT_PNG_FILE, "wb") as f: f.write(img)
저는 이 작업을 위해 다양한 OCR 솔루션을 사용해 보았습니다. 물론, tesseract와 다른 옵션도 많이 있습니다. 하지만 내 테스트 사례에서는 GOT-OCR2_0(https://huggingface.co/stepfun-ai/GOT-OCR2_0)을 사용하여 최상의 결과를 얻었습니다. 그럼 바로 시작해 보겠습니다.
tokenizer = AutoTokenizer.from_pretrained( "ucaslcl/GOT-OCR2_0", device_map="cuda", trust_remote_code=True, ) model = AutoModel.from_pretrained( "ucaslcl/GOT-OCR2_0", trust_remote_code=True, low_cpu_mem_usage=True, use_safetensors=True, pad_token_id=tokenizer.eos_token_id, ) model = model.eval().cuda()
여기서 무슨 일이 벌어지고 있는 걸까요? 음, 기본 AutoModel과 AutoTokenizer, 유일하게 특별한 부분은 cuda를 사용하도록 모델을 설정한다는 것입니다. 그리고 이것은 선택 사항이 아닙니다. 모델을 실행하려면 CUDA 지원이 필요합니다.
이제 모델을 정의했으므로 실제로 저장된 파일에 적용해 보겠습니다. 또한 시간을 측정하여 인쇄해 드립니다. 다른 모델과 비교할 뿐만 아니라 사용 사례에서 너무 오래 기다리는 것이 가능한지 이해하는 데에도 유용합니다(우리의 경우에는 매우 빠르지만).
import json import time import fitz import torch from transformers import AutoModel, AutoTokenizer, pipeline from rich.console import Console console = Console()
원본 이미지에서 얻은 내용은 다음과 같습니다.
INPUT_PDF_FILE = "./data/ocr_hf_main_page.pdf" OUTPUT_PNG_FILE = "./data/ocr_hf_main_page.png" doc = fitz.open(INPUT_PDF_FILE) page = doc.load_page(0) pixmap = page.get_pixmap(dpi=300) img = pixmap.tobytes() with console.status("Converting PDF to PNG...", spinner="monkey"): with open(OUTPUT_PNG_FILE, "wb") as f: f.write(img)
^ 텍스트가 모두 있고 서식은 없지만 의도적인 것입니다.
GOT-OCR2_0은 매우 유연합니다. HTML을 포함한 다양한 형식으로 출력할 수 있습니다. 다음은 이를 사용할 수 있는 다른 방법입니다.
tokenizer = AutoTokenizer.from_pretrained( "ucaslcl/GOT-OCR2_0", device_map="cuda", trust_remote_code=True, ) model = AutoModel.from_pretrained( "ucaslcl/GOT-OCR2_0", trust_remote_code=True, low_cpu_mem_usage=True, use_safetensors=True, pad_token_id=tokenizer.eos_token_id, ) model = model.eval().cuda()
이제 재미있는 부분인 LLM 선택이 시작됩니다. 어느 것이 최고인지에 대한 끊임없는 토론이 있었고 어디를 가든 기사가 있었습니다. 하지만 간단하게 해보자. 모든 사람과 그들의 개는 LLM에 대해 들어본 적이 있을 것이다. 야마. 따라서 Llama-3.2-1B를 사용하여 텍스트를 처리하겠습니다.
텍스트에서 무엇을 얻을 수 있나요? 텍스트 분류, 감정 분석, 언어 감지 등과 같은 기본적인 사항을 생각해 보세요. 업로드된 문서를 자동으로 분류하거나 약국에 수신되는 팩스를 정렬하는 시스템을 구축한다고 상상해 보세요.
프롬프트 엔지니어링에 대한 심층적인 내용은 건너뛰겠습니다. (이것은 완전히 다른 글이고 제가 아무것도 쓰지 않을 것이라고 믿습니다.) 기본 아이디어는 다음과 같습니다.
def run_ocr_for_file(func: callable, text: str): start_time = time.time() res = func() final_time = time.time() - start_time console.rule(f"[bold red] {text} [/bold red]") console.print(res) console.rule(f"Time: {final_time} seconds") return res result_text = None with console.status( "Running OCR for the result file...", spinner="monkey", ): result_text = run_ocr_for_file( lambda: model.chat( tokenizer, OUTPUT_PNG_FILE, ocr_type="ocr", ), "plain texts OCR", )
그건 그렇고, 내가 여기서 프롬프트/콘텐츠로 우스꽝스러울 정도로 어리석은 짓을 하고 있는 걸까요? 알려줘요. "신속한 엔지니어링"은 매우 새로운 기능이며 아직 충분히 심각하게 받아들이지 않습니다.
모델은 때때로 마크다운 코드 블록으로 결과를 래핑하므로 이를 처리해야 합니다. (더 깔끔한 방법을 아시는 분이 계시다면 저는 귀기울입니다.)
Hugging Face- The Al community building the future. https: / / hugging face. co/ Search models, datasets, users. . . Following 0 All Models Datasets Spaces Papers Collections Community Posts Up votes Likes New Follow your favorite Al creators Refresh List black- forest- labs· Advancing state- of- the- art image generation Follow stability a i· Sharing open- source image generation models Follow bria a i· Specializing in advanced image editing models Follow Trending last 7 days All Models Datasets Spaces deep see k- a i/ Deep Seek- V 3 Updated 3 days ago· 40 k· 877 deep see k- a i/ Deep Seek- V 3- Base Updated 3 days ago· 6.34 k· 1.06 k 2.39 k TRELLIS Q wen/ QV Q- 72 B- Preview 88888888888888888888 888888888888888888 301 Gemini Co der 1 of 3 2025-01-01,9:38 p. m
일반적으로 출력으로 얻는 내용은 다음과 같습니다.
# format texts OCR: result_text = model.chat( tokenizer, image_file, ocr_type='format', ) # fine-grained OCR: result_text = model.chat( tokenizer, image_file, ocr_type='ocr', ocr_box='', ) # ... ocr_type='format', ocr_box='') # ... ocr_type='ocr', ocr_color='') # ... ocr_type='format', ocr_color='') # multi-crop OCR: # ... ocr_type='ocr') # ... ocr_type='format') # render the formatted OCR results: result_text = model.chat( tokenizer, image_file, ocr_type='format', render=True, save_render_file = './demo.html', )
우리는 PDF를 가져와서 매우 우수한 OCR을 사용하여 텍스트를 추출한 다음 LLM을 사용하여 해당 텍스트를 분석하여 유용한 메타데이터를 얻을 수 있는 작은 파이프라인을 구축했습니다. 생산 준비가 되었나요? 아마도 그렇지 않을 것입니다. 그러나 비슷한 것을 구축하려는 경우 이는 확실한 출발점이 됩니다. 멋진 점은 PDF 처리부터 OCR, LLM 분석에 이르기까지 다양한 오픈 소스 도구를 결합하여 유용한 것을 만드는 방법입니다.
쉽게 연장할 수 있습니다. 더 나은 오류 처리 기능을 추가하거나 여러 페이지에 대한 지원을 추가하거나 다른 LLM을 사용해 볼 수도 있습니다. 아니면 문서 관리 시스템에 연결할 수도 있습니다. 그러기를 바랍니다. 재미있는 작업이 될 것 같아요.
이것은 단지 한 가지 방법일 뿐이라는 점을 기억하세요. 특정 사용 사례에 더 잘 맞는 다른 접근 방식이 수십 가지 있을 수 있습니다. 하지만 이것이 여러분의 실험을 위한 좋은 출발점이 되기를 바랍니다! 아니면 댓글로 작업 방법을 가르쳐 줄 수 있는 완벽한 장소입니다.
위 내용은 빠르고 더러운 문서 분석: Python에서 GOT-OCR과 LLama 결합의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!