gandol2-ocr


Namegandol2-ocr JSON
Version 0.0.3 PyPI version JSON
download
home_pageNone
Summary이미지를 시각적 경계 기준으로 안전하게 섹션 분리 & OCR (Korean, Chinese)
upload_time2025-10-21 05:08:02
maintainerNone
docs_urlNone
authorNone
requires_python<3.13,>=3.9
licenseMIT
keywords image section split opencv computer-vision
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # gandol2-ocr

이미지 섹션 분리와 OCR을 통합한 Python 유틸리티입니다. 세로로 긴 상세페이지 이미지를 시각적 경계 기준으로 안전하게 섹션 분리하고, 각 섹션에 대해 OCR을 수행할 수 있습니다.

## ✨ 주요 기능

### 🖼️ 이미지 섹션 분리 (Splitter)

- 세로로 긴 상세페이지 이미지를 시각적 경계 기준으로 자동 분리
- OpenCV 기반의 고급 이미지 처리 알고리즘
- 시각적 경계 감지 및 안전한 섹션 분할
- 분리된 섹션 정보를 구조화된 데이터로 제공

### 🔍 OCR (Optical Character Recognition)

- PaddleOCR 기반의 고성능 OCR 엔진
- 한국어(`korean`) 포함 다국어 지원
- GPU/CPU 선택 가능
- 바운딩박스와 텍스트 결과를 JSON으로 저장

## 📦 설치

### **중요**

```bash
# paddlepaddle-gpu==3.2.0 버전이 필수 입니다.
# pyproject.toml 설정 이후 패키지를 설치해주세요

dependencies = [
    ...
    "paddlepaddle-gpu==3.2.0",
    ...
]

[tool.uv.sources]
paddlepaddle-gpu = { index = "paddle" }


[[tool.uv.index]]
name = "paddle"
url = "https://www.paddlepaddle.org.cn/packages/stable/cu126/"
explicit = true

> uv sync

```

```bash
# uv 사용 (권장)
uv add gandol2-ocr

# pip 사용
pip install gandol2-ocr
```

또는 소스에서 설치:

```bash
# uv 사용
uv add git+https://github.com/gandol2/gandol2-ocr.git

# pip 사용
pip install git+https://github.com/gandol2/gandol2-ocr.git
```

## 🖥️ 요구 사항

- Python **3.9-3.12** (pyproject.toml에 명시됨)
- (선택) NVIDIA GPU + CUDA 12.6 환경 (PaddlePaddle GPU 지원)

## 🚀 사용법

### 1) 이미지 섹션 분리

```python
from gandol2_ocr.splitter import split_image_sections

# 이미지를 섹션으로 분리
sections = split_image_sections(
    image_path="./input/image.png",
    output_dir="./output"
)

print(f"총 {len(sections)}개 섹션 생성:")
for section in sections:
    print(f"  {section.order}. {section.top}-{section.bottom} ({section.height}px)")
```

### 2) OCR 실행

```python
from gandol2_ocr.ocr import run_ocr

# OCR 실행
results = run_ocr(
    input_image="./input/image.png",
    output_dir="./output",
    lang="korean",
    device="gpu"
)

# 결과 출력
for result in results:
    print(result["rec_texts"])
```

### 3) 통합 워크플로우

```python
from gandol2_ocr.splitter import split_image_sections
from gandol2_ocr.ocr import run_ocr

# 1단계: 이미지 섹션 분리
sections = split_image_sections(
    image_path="./input/long_image.png",
    output_dir="./sections"
)

# 2단계: 각 섹션에 대해 OCR 수행
for section in sections:
    ocr_results = run_ocr(
        input_image=section.path,
        output_dir=f"./ocr_results/section_{section.order}",
        lang="korean",
        device="gpu"
    )
    print(f"섹션 {section.order}: {len(ocr_results)}개 텍스트 감지")
```

### 4) 다양한 Import 방법

```python
# 방법 1: 최상위 모듈 (권장)
from gandol2_ocr.ocr import run_ocr
from gandol2_ocr.splitter import split_image_sections

# 방법 2: 패키지 레벨
from gandol2_ocr import run_ocr, split_image_sections

# 방법 3: 서브모듈 직접 접근
from gandol2_ocr.image_ocr.ocr import run_ocr
from gandol2_ocr.splitter.splitter import split_image_sections

# 방법 4: 클래스 import
from gandol2_ocr.splitter import ImageSectionSplitter, SectionInfo
```

## 🧱 프로젝트 구조

```
gandol2-ocr/
├─ pyproject.toml
├─ README.md
├─ src/
│  └─ gandol2_ocr/        # 메인 패키지
│     ├─ __init__.py      # 패키지 진입점
│     ├─ ocr.py           # 최상위 OCR 모듈 (re-export)
│     ├─ splitter.py      # 최상위 Splitter 모듈 (re-export)
│     ├─ image_ocr/       # 내부 OCR 모듈
│     │  ├─ __init__.py
│     │  ├─ cli.py
│     │  └─ ocr.py
│     └─ splitter/         # 내부 Splitter 모듈
│        ├─ __init__.py
│        └─ splitter.py
├─ examples/
│  ├─ demo_splitter.py    # 섹션 분리 예제
│  └─ demo_ocr.py         # OCR 예제
├─ input/                 # 입력 이미지
└─ output/                # 출력 결과
```

## 🔧 API 참조

### Splitter API

#### `split_image_sections(image_path, output_dir, debug_verbose=True, save_diagnostic=True)`

이미지를 섹션으로 분리하는 메인 함수입니다.

**사용법:**

```python
from gandol2_ocr.splitter import split_image_sections
```

**매개변수:**

- `image_path` (str): 입력 이미지 경로
- `output_dir` (str): 출력 디렉토리
- `debug_verbose` (bool): 디버그 출력 여부 (기본: True)
- `save_diagnostic` (bool): 진단 이미지 저장 여부 (기본: True)

**반환값:**

- `List[SectionInfo]`: 섹션 정보 리스트

#### `SectionInfo` 클래스

```python
@dataclass
class SectionInfo:
    order: int      # 섹션 순서
    top: int        # 상단 좌표
    bottom: int     # 하단 좌표
    height: int     # 섹션 높이
    path: str       # 저장된 파일 경로
```

### OCR API

#### `run_ocr(input_image, output_dir, lang="korean", device="cpu")`

이미지에서 텍스트를 인식하는 함수입니다.

**사용법:**

```python
from gandol2_ocr.ocr import run_ocr
```

**매개변수:**

- `input_image` (str): 입력 이미지 경로
- `output_dir` (str): 출력 디렉토리
- `lang` (str): OCR 언어 (기본: "korean")
- `device` (str): "cpu" 또는 "gpu" (기본: "cpu")

**반환값:**

- `List[dict]`: OCR 결과 리스트

## 🧪 소비측 테스트

패키지 설치 후 다음과 같이 테스트할 수 있습니다:

```python
# test_gandol2_ocr.py
def test_all_import_methods():
    """모든 import 방법 테스트"""
    try:
        # 방법 1: 최상위 모듈 (권장)
        from gandol2_ocr.ocr import run_ocr
        from gandol2_ocr.splitter import split_image_sections
        print("✅ 최상위 모듈 import 성공")

        # 방법 2: 패키지 레벨
        from gandol2_ocr import run_ocr as run_ocr2, split_image_sections as split_sections2
        print("✅ 패키지 레벨 import 성공")

        # 방법 3: 서브모듈
        from gandol2_ocr.image_ocr.ocr import run_ocr as run_ocr3
        from gandol2_ocr.splitter.splitter import split_image_sections as split_sections3
        print("✅ 서브모듈 import 성공")

        # 방법 4: 클래스
        from gandol2_ocr.splitter import ImageSectionSplitter, SectionInfo
        print("✅ 클래스 import 성공")

        print("🎉 모든 import 방법 성공!")
        return True

    except ImportError as e:
        print(f"❌ Import 오류: {e}")
        return False

if __name__ == "__main__":
    test_all_import_methods()
```

## 🛠️ 개발 및 배포

### 로컬 빌드

```bash
uv build
```

### TestPyPI 업로드

### PyPI 업로드

```bash
twine upload dist/*
```

## 🔎 참고사항

- **의존성**: OpenCV, PaddleOCR, PaddlePaddle, Matplotlib, Pandas, SciPy
- **GPU 지원**: CUDA 12.6 환경에서 PaddlePaddle GPU 사용 가능
- **이미지 형식**: PNG, JPG, JPEG 등 OpenCV 지원 형식
- **언어 지원**: PaddleOCR이 지원하는 모든 언어 (한국어, 영어, 중국어 등)

## 📄 라이선스

MIT License

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "gandol2-ocr",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<3.13,>=3.9",
    "maintainer_email": null,
    "keywords": "image, section, split, opencv, computer-vision",
    "author": null,
    "author_email": "gandol2 <sskim2333@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/f1/b2/189f29f59d0b1f4d41f0752da301b502c816f18f69c8efb741b3a673149f/gandol2_ocr-0.0.3.tar.gz",
    "platform": null,
    "description": "# gandol2-ocr\n\n\uc774\ubbf8\uc9c0 \uc139\uc158 \ubd84\ub9ac\uc640 OCR\uc744 \ud1b5\ud569\ud55c Python \uc720\ud2f8\ub9ac\ud2f0\uc785\ub2c8\ub2e4. \uc138\ub85c\ub85c \uae34 \uc0c1\uc138\ud398\uc774\uc9c0 \uc774\ubbf8\uc9c0\ub97c \uc2dc\uac01\uc801 \uacbd\uacc4 \uae30\uc900\uc73c\ub85c \uc548\uc804\ud558\uac8c \uc139\uc158 \ubd84\ub9ac\ud558\uace0, \uac01 \uc139\uc158\uc5d0 \ub300\ud574 OCR\uc744 \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n## \u2728 \uc8fc\uc694 \uae30\ub2a5\n\n### \ud83d\uddbc\ufe0f \uc774\ubbf8\uc9c0 \uc139\uc158 \ubd84\ub9ac (Splitter)\n\n- \uc138\ub85c\ub85c \uae34 \uc0c1\uc138\ud398\uc774\uc9c0 \uc774\ubbf8\uc9c0\ub97c \uc2dc\uac01\uc801 \uacbd\uacc4 \uae30\uc900\uc73c\ub85c \uc790\ub3d9 \ubd84\ub9ac\n- OpenCV \uae30\ubc18\uc758 \uace0\uae09 \uc774\ubbf8\uc9c0 \ucc98\ub9ac \uc54c\uace0\ub9ac\uc998\n- \uc2dc\uac01\uc801 \uacbd\uacc4 \uac10\uc9c0 \ubc0f \uc548\uc804\ud55c \uc139\uc158 \ubd84\ud560\n- \ubd84\ub9ac\ub41c \uc139\uc158 \uc815\ubcf4\ub97c \uad6c\uc870\ud654\ub41c \ub370\uc774\ud130\ub85c \uc81c\uacf5\n\n### \ud83d\udd0d OCR (Optical Character Recognition)\n\n- PaddleOCR \uae30\ubc18\uc758 \uace0\uc131\ub2a5 OCR \uc5d4\uc9c4\n- \ud55c\uad6d\uc5b4(`korean`) \ud3ec\ud568 \ub2e4\uad6d\uc5b4 \uc9c0\uc6d0\n- GPU/CPU \uc120\ud0dd \uac00\ub2a5\n- \ubc14\uc6b4\ub529\ubc15\uc2a4\uc640 \ud14d\uc2a4\ud2b8 \uacb0\uacfc\ub97c JSON\uc73c\ub85c \uc800\uc7a5\n\n## \ud83d\udce6 \uc124\uce58\n\n### **\uc911\uc694**\n\n```bash\n# paddlepaddle-gpu==3.2.0 \ubc84\uc804\uc774 \ud544\uc218 \uc785\ub2c8\ub2e4.\n# pyproject.toml \uc124\uc815 \uc774\ud6c4 \ud328\ud0a4\uc9c0\ub97c \uc124\uce58\ud574\uc8fc\uc138\uc694\n\ndependencies = [\n    ...\n    \"paddlepaddle-gpu==3.2.0\",\n    ...\n]\n\n[tool.uv.sources]\npaddlepaddle-gpu = { index = \"paddle\" }\n\n\n[[tool.uv.index]]\nname = \"paddle\"\nurl = \"https://www.paddlepaddle.org.cn/packages/stable/cu126/\"\nexplicit = true\n\n> uv sync\n\n```\n\n```bash\n# uv \uc0ac\uc6a9 (\uad8c\uc7a5)\nuv add gandol2-ocr\n\n# pip \uc0ac\uc6a9\npip install gandol2-ocr\n```\n\n\ub610\ub294 \uc18c\uc2a4\uc5d0\uc11c \uc124\uce58:\n\n```bash\n# uv \uc0ac\uc6a9\nuv add git+https://github.com/gandol2/gandol2-ocr.git\n\n# pip \uc0ac\uc6a9\npip install git+https://github.com/gandol2/gandol2-ocr.git\n```\n\n## \ud83d\udda5\ufe0f \uc694\uad6c \uc0ac\ud56d\n\n- Python **3.9-3.12** (pyproject.toml\uc5d0 \uba85\uc2dc\ub428)\n- (\uc120\ud0dd) NVIDIA GPU + CUDA 12.6 \ud658\uacbd (PaddlePaddle GPU \uc9c0\uc6d0)\n\n## \ud83d\ude80 \uc0ac\uc6a9\ubc95\n\n### 1) \uc774\ubbf8\uc9c0 \uc139\uc158 \ubd84\ub9ac\n\n```python\nfrom gandol2_ocr.splitter import split_image_sections\n\n# \uc774\ubbf8\uc9c0\ub97c \uc139\uc158\uc73c\ub85c \ubd84\ub9ac\nsections = split_image_sections(\n    image_path=\"./input/image.png\",\n    output_dir=\"./output\"\n)\n\nprint(f\"\ucd1d {len(sections)}\uac1c \uc139\uc158 \uc0dd\uc131:\")\nfor section in sections:\n    print(f\"  {section.order}. {section.top}-{section.bottom} ({section.height}px)\")\n```\n\n### 2) OCR \uc2e4\ud589\n\n```python\nfrom gandol2_ocr.ocr import run_ocr\n\n# OCR \uc2e4\ud589\nresults = run_ocr(\n    input_image=\"./input/image.png\",\n    output_dir=\"./output\",\n    lang=\"korean\",\n    device=\"gpu\"\n)\n\n# \uacb0\uacfc \ucd9c\ub825\nfor result in results:\n    print(result[\"rec_texts\"])\n```\n\n### 3) \ud1b5\ud569 \uc6cc\ud06c\ud50c\ub85c\uc6b0\n\n```python\nfrom gandol2_ocr.splitter import split_image_sections\nfrom gandol2_ocr.ocr import run_ocr\n\n# 1\ub2e8\uacc4: \uc774\ubbf8\uc9c0 \uc139\uc158 \ubd84\ub9ac\nsections = split_image_sections(\n    image_path=\"./input/long_image.png\",\n    output_dir=\"./sections\"\n)\n\n# 2\ub2e8\uacc4: \uac01 \uc139\uc158\uc5d0 \ub300\ud574 OCR \uc218\ud589\nfor section in sections:\n    ocr_results = run_ocr(\n        input_image=section.path,\n        output_dir=f\"./ocr_results/section_{section.order}\",\n        lang=\"korean\",\n        device=\"gpu\"\n    )\n    print(f\"\uc139\uc158 {section.order}: {len(ocr_results)}\uac1c \ud14d\uc2a4\ud2b8 \uac10\uc9c0\")\n```\n\n### 4) \ub2e4\uc591\ud55c Import \ubc29\ubc95\n\n```python\n# \ubc29\ubc95 1: \ucd5c\uc0c1\uc704 \ubaa8\ub4c8 (\uad8c\uc7a5)\nfrom gandol2_ocr.ocr import run_ocr\nfrom gandol2_ocr.splitter import split_image_sections\n\n# \ubc29\ubc95 2: \ud328\ud0a4\uc9c0 \ub808\ubca8\nfrom gandol2_ocr import run_ocr, split_image_sections\n\n# \ubc29\ubc95 3: \uc11c\ube0c\ubaa8\ub4c8 \uc9c1\uc811 \uc811\uadfc\nfrom gandol2_ocr.image_ocr.ocr import run_ocr\nfrom gandol2_ocr.splitter.splitter import split_image_sections\n\n# \ubc29\ubc95 4: \ud074\ub798\uc2a4 import\nfrom gandol2_ocr.splitter import ImageSectionSplitter, SectionInfo\n```\n\n## \ud83e\uddf1 \ud504\ub85c\uc81d\ud2b8 \uad6c\uc870\n\n```\ngandol2-ocr/\n\u251c\u2500 pyproject.toml\n\u251c\u2500 README.md\n\u251c\u2500 src/\n\u2502  \u2514\u2500 gandol2_ocr/        # \uba54\uc778 \ud328\ud0a4\uc9c0\n\u2502     \u251c\u2500 __init__.py      # \ud328\ud0a4\uc9c0 \uc9c4\uc785\uc810\n\u2502     \u251c\u2500 ocr.py           # \ucd5c\uc0c1\uc704 OCR \ubaa8\ub4c8 (re-export)\n\u2502     \u251c\u2500 splitter.py      # \ucd5c\uc0c1\uc704 Splitter \ubaa8\ub4c8 (re-export)\n\u2502     \u251c\u2500 image_ocr/       # \ub0b4\ubd80 OCR \ubaa8\ub4c8\n\u2502     \u2502  \u251c\u2500 __init__.py\n\u2502     \u2502  \u251c\u2500 cli.py\n\u2502     \u2502  \u2514\u2500 ocr.py\n\u2502     \u2514\u2500 splitter/         # \ub0b4\ubd80 Splitter \ubaa8\ub4c8\n\u2502        \u251c\u2500 __init__.py\n\u2502        \u2514\u2500 splitter.py\n\u251c\u2500 examples/\n\u2502  \u251c\u2500 demo_splitter.py    # \uc139\uc158 \ubd84\ub9ac \uc608\uc81c\n\u2502  \u2514\u2500 demo_ocr.py         # OCR \uc608\uc81c\n\u251c\u2500 input/                 # \uc785\ub825 \uc774\ubbf8\uc9c0\n\u2514\u2500 output/                # \ucd9c\ub825 \uacb0\uacfc\n```\n\n## \ud83d\udd27 API \ucc38\uc870\n\n### Splitter API\n\n#### `split_image_sections(image_path, output_dir, debug_verbose=True, save_diagnostic=True)`\n\n\uc774\ubbf8\uc9c0\ub97c \uc139\uc158\uc73c\ub85c \ubd84\ub9ac\ud558\ub294 \uba54\uc778 \ud568\uc218\uc785\ub2c8\ub2e4.\n\n**\uc0ac\uc6a9\ubc95:**\n\n```python\nfrom gandol2_ocr.splitter import split_image_sections\n```\n\n**\ub9e4\uac1c\ubcc0\uc218:**\n\n- `image_path` (str): \uc785\ub825 \uc774\ubbf8\uc9c0 \uacbd\ub85c\n- `output_dir` (str): \ucd9c\ub825 \ub514\ub809\ud1a0\ub9ac\n- `debug_verbose` (bool): \ub514\ubc84\uadf8 \ucd9c\ub825 \uc5ec\ubd80 (\uae30\ubcf8: True)\n- `save_diagnostic` (bool): \uc9c4\ub2e8 \uc774\ubbf8\uc9c0 \uc800\uc7a5 \uc5ec\ubd80 (\uae30\ubcf8: True)\n\n**\ubc18\ud658\uac12:**\n\n- `List[SectionInfo]`: \uc139\uc158 \uc815\ubcf4 \ub9ac\uc2a4\ud2b8\n\n#### `SectionInfo` \ud074\ub798\uc2a4\n\n```python\n@dataclass\nclass SectionInfo:\n    order: int      # \uc139\uc158 \uc21c\uc11c\n    top: int        # \uc0c1\ub2e8 \uc88c\ud45c\n    bottom: int     # \ud558\ub2e8 \uc88c\ud45c\n    height: int     # \uc139\uc158 \ub192\uc774\n    path: str       # \uc800\uc7a5\ub41c \ud30c\uc77c \uacbd\ub85c\n```\n\n### OCR API\n\n#### `run_ocr(input_image, output_dir, lang=\"korean\", device=\"cpu\")`\n\n\uc774\ubbf8\uc9c0\uc5d0\uc11c \ud14d\uc2a4\ud2b8\ub97c \uc778\uc2dd\ud558\ub294 \ud568\uc218\uc785\ub2c8\ub2e4.\n\n**\uc0ac\uc6a9\ubc95:**\n\n```python\nfrom gandol2_ocr.ocr import run_ocr\n```\n\n**\ub9e4\uac1c\ubcc0\uc218:**\n\n- `input_image` (str): \uc785\ub825 \uc774\ubbf8\uc9c0 \uacbd\ub85c\n- `output_dir` (str): \ucd9c\ub825 \ub514\ub809\ud1a0\ub9ac\n- `lang` (str): OCR \uc5b8\uc5b4 (\uae30\ubcf8: \"korean\")\n- `device` (str): \"cpu\" \ub610\ub294 \"gpu\" (\uae30\ubcf8: \"cpu\")\n\n**\ubc18\ud658\uac12:**\n\n- `List[dict]`: OCR \uacb0\uacfc \ub9ac\uc2a4\ud2b8\n\n## \ud83e\uddea \uc18c\ube44\uce21 \ud14c\uc2a4\ud2b8\n\n\ud328\ud0a4\uc9c0 \uc124\uce58 \ud6c4 \ub2e4\uc74c\uacfc \uac19\uc774 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:\n\n```python\n# test_gandol2_ocr.py\ndef test_all_import_methods():\n    \"\"\"\ubaa8\ub4e0 import \ubc29\ubc95 \ud14c\uc2a4\ud2b8\"\"\"\n    try:\n        # \ubc29\ubc95 1: \ucd5c\uc0c1\uc704 \ubaa8\ub4c8 (\uad8c\uc7a5)\n        from gandol2_ocr.ocr import run_ocr\n        from gandol2_ocr.splitter import split_image_sections\n        print(\"\u2705 \ucd5c\uc0c1\uc704 \ubaa8\ub4c8 import \uc131\uacf5\")\n\n        # \ubc29\ubc95 2: \ud328\ud0a4\uc9c0 \ub808\ubca8\n        from gandol2_ocr import run_ocr as run_ocr2, split_image_sections as split_sections2\n        print(\"\u2705 \ud328\ud0a4\uc9c0 \ub808\ubca8 import \uc131\uacf5\")\n\n        # \ubc29\ubc95 3: \uc11c\ube0c\ubaa8\ub4c8\n        from gandol2_ocr.image_ocr.ocr import run_ocr as run_ocr3\n        from gandol2_ocr.splitter.splitter import split_image_sections as split_sections3\n        print(\"\u2705 \uc11c\ube0c\ubaa8\ub4c8 import \uc131\uacf5\")\n\n        # \ubc29\ubc95 4: \ud074\ub798\uc2a4\n        from gandol2_ocr.splitter import ImageSectionSplitter, SectionInfo\n        print(\"\u2705 \ud074\ub798\uc2a4 import \uc131\uacf5\")\n\n        print(\"\ud83c\udf89 \ubaa8\ub4e0 import \ubc29\ubc95 \uc131\uacf5!\")\n        return True\n\n    except ImportError as e:\n        print(f\"\u274c Import \uc624\ub958: {e}\")\n        return False\n\nif __name__ == \"__main__\":\n    test_all_import_methods()\n```\n\n## \ud83d\udee0\ufe0f \uac1c\ubc1c \ubc0f \ubc30\ud3ec\n\n### \ub85c\uceec \ube4c\ub4dc\n\n```bash\nuv build\n```\n\n### TestPyPI \uc5c5\ub85c\ub4dc\n\n### PyPI \uc5c5\ub85c\ub4dc\n\n```bash\ntwine upload dist/*\n```\n\n## \ud83d\udd0e \ucc38\uace0\uc0ac\ud56d\n\n- **\uc758\uc874\uc131**: OpenCV, PaddleOCR, PaddlePaddle, Matplotlib, Pandas, SciPy\n- **GPU \uc9c0\uc6d0**: CUDA 12.6 \ud658\uacbd\uc5d0\uc11c PaddlePaddle GPU \uc0ac\uc6a9 \uac00\ub2a5\n- **\uc774\ubbf8\uc9c0 \ud615\uc2dd**: PNG, JPG, JPEG \ub4f1 OpenCV \uc9c0\uc6d0 \ud615\uc2dd\n- **\uc5b8\uc5b4 \uc9c0\uc6d0**: PaddleOCR\uc774 \uc9c0\uc6d0\ud558\ub294 \ubaa8\ub4e0 \uc5b8\uc5b4 (\ud55c\uad6d\uc5b4, \uc601\uc5b4, \uc911\uad6d\uc5b4 \ub4f1)\n\n## \ud83d\udcc4 \ub77c\uc774\uc120\uc2a4\n\nMIT License\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "\uc774\ubbf8\uc9c0\ub97c \uc2dc\uac01\uc801 \uacbd\uacc4 \uae30\uc900\uc73c\ub85c \uc548\uc804\ud558\uac8c \uc139\uc158 \ubd84\ub9ac & OCR (Korean, Chinese)",
    "version": "0.0.3",
    "project_urls": {
        "Documentation": "https://github.com/gandol2/gandol2-ocr#readme",
        "Homepage": "https://github.com/gandol2/gandol2-ocr",
        "Repository": "https://github.com/gandol2/gandol2-ocr"
    },
    "split_keywords": [
        "image",
        " section",
        " split",
        " opencv",
        " computer-vision"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b271765372cd3aee49eaf821a96c04367d3cb2e7b50c34abd8584d5f5a966cf0",
                "md5": "b061d20a17ac6a10ad16498532659b75",
                "sha256": "5c0819083b005eb6d97977bfca1307d9823d9139bd72fc3f0354aef28c368fd6"
            },
            "downloads": -1,
            "filename": "gandol2_ocr-0.0.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "b061d20a17ac6a10ad16498532659b75",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<3.13,>=3.9",
            "size": 13308,
            "upload_time": "2025-10-21T05:08:00",
            "upload_time_iso_8601": "2025-10-21T05:08:00.622152Z",
            "url": "https://files.pythonhosted.org/packages/b2/71/765372cd3aee49eaf821a96c04367d3cb2e7b50c34abd8584d5f5a966cf0/gandol2_ocr-0.0.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f1b2189f29f59d0b1f4d41f0752da301b502c816f18f69c8efb741b3a673149f",
                "md5": "60611950ed79829d8a339234577f3353",
                "sha256": "e43d2eb428002c03dbd0422e5ee43f6668ce623b11b78da31531b0a5d763e8c3"
            },
            "downloads": -1,
            "filename": "gandol2_ocr-0.0.3.tar.gz",
            "has_sig": false,
            "md5_digest": "60611950ed79829d8a339234577f3353",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<3.13,>=3.9",
            "size": 13595,
            "upload_time": "2025-10-21T05:08:02",
            "upload_time_iso_8601": "2025-10-21T05:08:02.116479Z",
            "url": "https://files.pythonhosted.org/packages/f1/b2/189f29f59d0b1f4d41f0752da301b502c816f18f69c8efb741b3a673149f/gandol2_ocr-0.0.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-21 05:08:02",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "gandol2",
    "github_project": "gandol2-ocr#readme",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "gandol2-ocr"
}
        
Elapsed time: 4.01232s