rust ocr with python

wangki·2025년 9월 28일

parking_server

목록 보기
1/5

개요

rust로 ocr 라이브러리를 사용해서 개발을 하려고 했다. 그러나 복잡하기도 하고 필요한 라이브러리들을 설치하기 위해서 로컬에 너무 많은 것을 설치해야 했고 ai 모델을 사용하는 거에 대해서 지식이 별로 없었기 때문에 어려웠다. 최근에 도커에 대해서 공부했고 편리할 것이라고 생각을 하여 easyocr에서 제공해 주는 도커 이미지를 활용하여 python으로 ocr을 사용하고 해당 python 스크립트를 rust에서 호출해 주는 걸로 생각을 하였다.

내용

easy ocr 도커 이미지 빌드 후 사용하기

https://github.com/JaidedAI/EasyOCR 여기서 Dockerfile을 가져와서 빌드시켰다.

이미지를 생성 후 실행하였는데

PS D:\work\parking\ocr> docker run --rm -v ${PWD}:/app easyocr-image python /app/ocr_script.py /app/target.jpg

A module that was compiled using NumPy 1.x cannot be run in
NumPy 2.2.6 as it may crash. To support both 1.x and 2.x
versions of NumPy, modules must be compiled with NumPy 2.0.
Some module may need to rebuild instead e.g. with 'pybind11>=2.12'.

If you are a user of the module, the easiest solution will be to
downgrade to 'numpy<2' or try to upgrade the affected module.
We expect that some modules will need time to support NumPy 2.

Traceback (most recent call last):  File "/app/ocr_script.py", line 2, in <module>
    import easyocr
  File "/home/EasyOCR/easyocr/__init__.py", line 1, in <module>
    from .easyocr import Reader
  File "/home/EasyOCR/easyocr/easyocr.py", line 3, in <module>
    from .recognition import get_recognizer, get_text
  File "/home/EasyOCR/easyocr/recognition.py", line 2, in <module>
    import torch
  File "/opt/conda/lib/python3.10/site-packages/torch/__init__.py", line 1477, in <module>
    from .functional import *  # noqa: F403
  File "/opt/conda/lib/python3.10/site-packages/torch/functional.py", line 9, in <module>
    import torch.nn.functional as F
  File "/opt/conda/lib/python3.10/site-packages/torch/nn/__init__.py", line 1, in <module>
    from .modules import *  # noqa: F403
  File "/opt/conda/lib/python3.10/site-packages/torch/nn/modules/__init__.py", line 35, in <module>
    from .transformer import TransformerEncoder, TransformerDecoder, \
  File "/opt/conda/lib/python3.10/site-packages/torch/nn/modules/transformer.py", line 20, in <module>
    device: torch.device = torch.device(torch._C._get_default_device()),  # torch.device('cpu'),
/opt/conda/lib/python3.10/site-packages/torch/nn/modules/transformer.py:20: UserWarning: Failed to initialize NumPy: _ARRAY_API not found (Triggered internally at /opt/conda/conda-bld/pytorch_1708025847130/work/torch/csrc/utils/tensor_numpy.cpp:84.)
  device: torch.device = torch.device(torch._C._get_default_device()),  # torch.device('cpu'),
Neither CUDA nor MPS are available - defaulting to CPU. Note: This module is much faster with a GPU.
Downloading detection model, please wait. This may take several minutes depending upon your network connection.
Progress: |█████████████████████████████████████████████████-| 99.9% CompleteDownloading recognition model, please wait. This may take several minutes depending upon your network connection.
Progress: |██████████████████████████████████████████████████| 100.1% Complete이미지 경로: /app/target.jpg
--- OCR 결과 ---
OCR 실행 중 오류가 발생했습니다: Numpy is not available

에러가 발생했다. Numpy 1.x로 컴파일한 모듈은 Numpy 2.2.6에서 실행되면 크래시가 날 것이다라는 것이다. 즉, 도커 이미지를 빌드할 때 아래 명령어를 추가해서 강제로 버전을 낮춰준다.

Dockerfile

RUN ["pip", "uninstall", "numpy", "-y"]	
RUN ["pip", "install", "numpy==1.24.4"]


위 이미지를 예측해 볼 예정이다.

도커 이미지 성공적으로 빌드 후 실행을 한다.

docker run --rm --name easyocr_test -v "$(pwd):/app" easyocr-image python /app/ocr_script.py /app/target.jpg

위 명령어를 실행하게 되면 성공적으로 번호판의 글자를 파싱할 수 있다.

rust환경을 이미지에 추가하기.

rust를 설치하기 위해서 linux환경에서는 gcc가 있어야하고,

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

위 명령어로 설치할 수 있다.

rust에서 파이썬 스크립트를 호출하여 ocr 결과값을 받을 예정이다.
테스트를 하기 위해서 /bin/ocr_test.rs 파일을 생성해 주었다.

// /bin/ocr_test.rs
use std::{env, process::Command};

fn main() {
    // py script call!
    let args: Vec<String> = env::args().collect();

    println!("총 인자 개수: {}", args.len());

    if args.len() > 2 {
        println!("first args: {}", args[1]);
        println!("second args: {}", args[2]);
    }

    let output = Command::new("python")
        .arg(&args[1])
        .arg(&args[2])
        .output().unwrap();

    let res_str = String::from_utf8(output.stdout).unwrap();
    println!("{}", res_str);
}

도커 명령어를 실행한다.

docker run --rm -v "$(pwd):/app" --workdir "/app" parking_server cargo run --bin ocr_test "/app/py/ocr_script.py" "/app/assets/target.jpg"

추가적으로 데이터를 다듬어야겠지만 성공적으로 원하는 결과물을 얻어내었다.
이 로직을 사용하여 주차장 서버에 ocr 기능을 추가할 예정이다.
git: https://github.com/wangki-kyu/parking_server

결론

ocr이 정확히 무엇인지는 알 수 없지만 docker를 활용한다면 이미 만들어진 라이브러리를 통해 쉽게 사용할 수 있는 것을 알았다. 또한 docker를 어떻게 사용하는지 공부할 수 있는 시간이었다. 여러 명령어와 인수들을 통해서 도컬를 강력한 무기로 사용할 수 있는 것 같다.

0개의 댓글