Celery를 활용한 비동기 OCR 처리

이번 포스트에서는 Celery를 활용하여 비동기적으로 OCR(광학 문자 인식) 처리를 수행하는 방법에 대해 알아보겠습니다. OCR은 이미지나 스캔된 문서에서 텍스트를 추출하는 과정으로 많이 사용되며, 대용량의 이미지나 문서 처리에는 시간이 많이 소요될 수 있습니다. 따라서, Celery를 사용하여 OCR 처리를 비동기로 수행하면 시간을 절약할 수 있습니다.

Celery란?

Celery는 분산 작업 큐 시스템으로, Python을 기반으로 한 오픈 소스 프로젝트입니다. Celery를 사용하면 애플리케이션에서 수행해야 하는 작업을 비동기적으로 처리할 수 있습니다. Celery는 메시지 브로커를 통해 작업을 큐에 전달하고, 워커(worker)라는 프로세스를 통해 작업을 수행합니다. 이를 통해 애플리케이션의 응답 속도를 향상시킬 수 있습니다.

OCR 처리를 위한 Celery 설정

Celery를 사용하기 위해 먼저 Celery와 필요한 라이브러리를 설치해야 합니다. 다음은 필요한 패키지들을 설치하는 명령어입니다:

pip install celery pillow pytesseract

설치가 완료되면, Celery의 설정 파일인 celery.py를 작성합니다. 이 파일은 Celery 애플리케이션의 설정을 정의하는 역할을 합니다.

from celery import Celery

app = Celery('ocr_processing', broker='amqp://guest@localhost//')

app.conf.task_routes = {
    'ocr_processing.tasks.*': {'queue': 'ocr_queue'},
}

위의 코드에서 broker 부분은 사용할 메시지 브로커의 주소를 설정합니다. 여기서는 로컬 환경에서 RabbitMQ를 사용하며, 기본 설정인 guest 계정과 localhost 주소를 사용합니다. 만약 다른 메시지 브로커를 사용한다면, 해당 브로커의 주소를 입력해야 합니다.

또한, task_routes 부분은 특정 작업을 특정 큐에 할당하기 위해 사용됩니다. 여기서는 ocr_processing.tasks 모듈의 모든 작업들을 ocr_queue라는 큐에 할당하도록 설정했습니다.

Celery 작업 정의하기

OCR 처리를 위한 Celery 작업을 정의하기 위해 tasks.py 파일을 작성합니다. 이 파일은 Celery 작업을 정의하는 역할을 합니다.

from celery import Celery
from PIL import Image
import pytesseract

app = Celery('ocr_processing', broker='amqp://guest@localhost//')

@app.task
def ocr_extract_text(image_path):
    image = Image.open(image_path)
    text = pytesseract.image_to_string(image)
    return text

위의 예제에서는 ocr_extract_text라는 Celery 작업을 정의하였습니다. 이 작업은 이미지 경로를 입력으로 받아 해당 이미지의 텍스트를 추출하여 반환합니다. 이 때, PIL 라이브러리를 사용하여 이미지를 열고, pytesseract 라이브러리를 사용하여 텍스트를 추출합니다.

Celery 작업 실행하기

이제 Celery 작업을 실행해보겠습니다. tasks.py 파일이 있는 디렉토리에서 다음 명령어를 실행합니다:

celery -A tasks worker --loglevel=info

위의 명령어는 tasks.py 파일에 정의된 Celery 작업을 실행하는 명령어입니다. --loglevel 옵션은 로깅 레벨을 설정하는 옵션으로, 필요한 경우 조정할 수 있습니다.

Celery 작업 호출하기

Celery 작업을 호출하기 위해 다음과 같은 코드를 작성할 수 있습니다:

from tasks import ocr_extract_text

result = ocr_extract_text.delay('/path/to/image.jpg')
text = result.get()

print(text)

위의 코드에서 delay 메서드는 Celery 작업을 비동기로 호출하는 메서드입니다. 이를 통해 작업을 큐에 추가하고, 작업의 결과를 가져올 수 있습니다. get 메서드를 사용하여 작업의 결과를 가져올 수 있습니다.

마무리

이번 포스트에서는 Celery를 활용하여 비동기적으로 OCR 처리를 수행하는 방법에 대해 알아보았습니다. Celery를 사용하면 애플리케이션의 응답 시간을 향상시킬 수 있으며, 대용량의 이미지나 문서 처리에 유용합니다. Celery의 다양한 기능과 설정에 대해서는 공식 문서를 참고하시기 바랍니다.

해시태그: #Celery #OCR