PP-DocLayoutV3 다중 시나리오 적용: 신문 레이아웃 분할, 고전 수평 배치 변환, 연구 보고서 차트 위치 확인

PP-DocLayoutV3는 다양한 실무 환경에서 활용 가능한 문서 레이아웃 분석 도구입니다. 이 글에서는 신문 페이지를 자동으로 분할하고, 고전 문헌을 현대식 수평 배치로 전환하며, 연구 보고서의 차트를 정확히 추출하는 방법을 소개합니다.

1. PP-DocLayoutV3란?

문서의 구조를 이해하는 것은 매우 복잡한 작업일 수 있습니다. 예를 들어, 한 장의 신문은 여러 열로 구성된 본문, 제목, 사진 및 광고 등 다양한 요소를 포함하고 있습니다. 이러한 요소들을 하나하나 수작업으로 분류하는 것은 시간이 많이 걸리고 오류가 발생하기 쉽습니다.

이런 문제를 해결하기 위해 PP-DocLayoutV3는 문서 내의 각 요소(본문, 제목, 표, 이미지 등)를 자동으로 식별하고 그 위치를 정확하게 표시합니다. PaddlePaddle 기반의 이 모델은 특히 한글 문서에 최적화되어 있으며, 실제 비즈니스 환경에서 쉽게 사용할 수 있도록 사전 패키징된 형태로 제공됩니다.

다음 섹션에서는 PP-DocLayoutV3를 어떻게 신문 레이아웃 분석, 고전 문헌 변환 및 연구 보고서 차트 추출에 적용할 수 있는지 설명하겠습니다.

2. 빠르게 시작하기

2.1 환경 설정

먼저 GPU 지원 서버 환경을 준비하세요. ins-doclayout-paddle33-v1이라는 이름의 미리 구성된 Docker 이미지를 사용하면 됩니다. 이를 통해 모든 필요한 의존성과 PP-DocLayoutV3 모델이 자동으로 설치됩니다.

배포 후, 다음 두 가지 방식으로 접근할 수 있습니다:

  • 포트 7860: 웹 기반 시각화 인터페이스
  • 포트 8000: 프로그래밍적인 접근을 위한 REST API

2.2 시각화 인터페이스 사용법

웹 인터페이스를 통해 직접 문서 이미지를 업로드하고 결과를 확인할 수 있습니다. 아래 코드는 기본적인 분석 요청을 보여줍니다.

import requests

url = "http://localhost:8000/analyze"
files = {'file': open('example.jpg', 'rb')}
response = requests.post(url, files=files)
data = response.json()
print(data)

응답 데이터에는 각 요소의 위치 정보와 신뢰도 점수가 포함됩니다.

3. 신문 레이아웃 분석

신문 페이지는 일반적으로 여러 열로 나뉘어 있으며, 크기가 다른 제목과 삽입된 이미지 및 광고를 포함합니다. 이러한 복잡한 레이아웃을 자동으로 분석하는 것이 목표입니다.

3.1 코드 예제

아래 코드는 신문 이미지에서 본문 영역만 추출하는 과정을 보여줍니다.

import requests
from PIL import Image, ImageDraw

def analyze_newspaper(image_path):
    api_url = "http://localhost:8000/analyze"
    
    with open(image_path, 'rb') as f:
        files = {'file': f}
        response = requests.post(api_url, files=files)

    result = response.json()
    text_regions = [r for r in result['regions'] if r['label'] == 'text']

    img = Image.open(image_path)
    draw = ImageDraw.Draw(img)
    for region in text_regions:
        bbox = region['bbox']
        draw.rectangle(bbox, outline='red', width=3)
    img.save('annotated_newspaper.jpg')

analyze_newspaper("newspaper.jpg")

4. 고전 문헌 변환

고전 문헌은 주로 세로 배치로 되어 있으며, 현대 독자들이 더 쉽게 읽을 수 있도록 수평 배치로 전환해야 합니다. 이 과정에서 PP-DocLayoutV3는 텍스트 블록을 정확히 식별하여 OCR 처리를 용이하게 합니다.

4.1 변환 로직

세로 텍스트를 수평으로 변환하는 간단한 함수는 다음과 같습니다.

def convert_vertical_to_horizontal(text_blocks):
    horizontal_text = []
    for block in text_blocks:
        lines = block.split('\n')
        reversed_lines = lines[::-1]
        horizontal_text.append(' '.join(reversed_lines))
    return '\n'.join(horizontal_text)

# OCR 결과 예시
ocr_result = ["첫째줄\n둘째줄", "셋째줄"]
converted_text = convert_vertical_to_horizontal(ocr_result)
print(converted_text)

5. 연구 보고서 차트 추출

많은 연구자들은 PDF에서 차트를 효율적으로 추출하는 방법을 필요로 합니다. 아래 코드는 PDF 파일에서 차트 이미지를 자동으로 추출하는 방법을 보여줍니다.

import os
import fitz
from PIL import Image
import requests

def extract_charts_from_pdf(pdf_path, output_dir="charts"):
    os.makedirs(output_dir, exist_ok=True)
    doc = fitz.open(pdf_path)
    
    for page_num in range(len(doc)):
        page = doc.load_page(page_num)
        pix = page.get_pixmap(dpi=200)
        image_path = f"temp_{page_num}.png"
        pix.save(image_path)
        
        with open(image_path, 'rb') as f:
            response = requests.post("http://localhost:8000/analyze", files={'file': f})
        data = response.json()
        
        figures = [r for r in data['regions'] if r['label'] == 'figure']
        img = Image.open(image_path)
        for idx, fig in enumerate(figures):
            bbox = fig['bbox']
            cropped_img = img.crop(bbox)
            save_path = os.path.join(output_dir, f"chart_{page_num}_{idx}.png")
            cropped_img.save(save_path)
        
        os.remove(image_path)
    
    doc.close()

extract_charts_from_pdf("report.pdf")

6. 결론

PP-DocLayoutV3는 문서의 레이아웃을 자동으로 분석하여 다양한 실무 문제를 해결할 수 있는 강력한 도구입니다. 이를 통해 신문, 고전 문헌 및 연구 보고서의 처리가 더욱 효율적으로 이루어질 수 있습니다.

태그: PaddlePaddle OCR DocumentAnalysis

6월 18일 00:44에 게시됨