Bomb Kirby Running
본문 바로가기
카테고리 없음

paddle OCR 학습

by 코낄2 2024. 8. 29.

 

 

GitHub - clovaai/deep-text-recognition-benchmark: Text recognition (optical character recognition) with deep learning methods, I

Text recognition (optical character recognition) with deep learning methods, ICCV 2019 - clovaai/deep-text-recognition-benchmark

github.com

기존에 위의 세가지 단계를 거쳐서 easyOCR 모델을 내가 가진 데이터에 맞게 훈련을 시켜보았다. 결과 내가 가진 데이터는 잘 읽어내지만 훈련이 되지 않은 이미지와 단어에서는 성능이 크게 떨어지는 모습을 보았다. 그래서 이번엔 아무런 가공도 하지 않은 raw상태에서 더 좋은 성능을 보였던 PaddleOCR을 훈련해보기로 했다.


큰 흐름은 밑에 단계를 따른다.

  • Python 3.8로 두 개의 conda 환경구축
  • GPU 설정에 맞는 올바른 버전의 PaddlePaddle을 다운로드
  • GitHub 리포지토리에서 PaddleOCR 라이브러리를 직접 설치
  • 데이터셋과 주석 파일 생성
  • Paddle OCR GitHub 리포지토리에서 pre-trained weights 다운로드 후 Fine-tunning을 위한 설정
  • 훈련 매개변수로 YAML 파일 구축
  • Fine-tunning 후 저장
  • 두 번째 conda 환경에 Paddle OCR을 설치
  • Fine-tunning 된 모델을 테스트

1. 환경 설정

우선 Python 3.8로 conda 가상환경을 하나 활성화 했다. 기존에는 보통 파이썬 3.11 버전의 가상환경을 만들었는데 패들ocr 학습이 3.8환경에서 가장 best였다고 해서...이유는 따로 찾아보지 않고 일단 따라해보았다...ㅎㅎ

 

이제 paddlepaddle을 설치해야하는데 Nvidia GPU를 사용 중이라면, GPU 구성과 CUDA 버전에 따라 올바른 paddlepaddle 버전을 선택해야한다. 웹사이트를 참고하여 본인 환경에 맞는 모델을 설치할 수 있다. 
https://www.paddlepaddle.org.cn/en/install/quick?docurl=/documentation/docs/en/install/pip/linux-pip_en.html

 

Run the following command to install

 

www.paddlepaddle.org.cn

참고로 터미널에서 본인의 환경을 확인해보는 방법은
Linux, macOS >   uname -s  
Windows >   ver 
명령어를 통해 운영 체제의 이름을 확인해볼 수 있다.

 

저는 NVIDIA 컴파일러가 설치되어 있어  nvcc --version 를 통해서 CUDA 버전을 확인했습니다.

( 만약 Conda로 CUDA를 설치한 경우  conda list cudatoolkit 명령어로 CUDA 버전 확인이 가능하다니 참고하시길..!! )

 

밑의 명령어를 통해서 paddleOCR을 설치했습니다.

python -m pip install paddlepaddle-gpu==2.6.0.post120 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html

 

다음 단계는 conda 환경 폴더 내의 Python 3.8 site-packages 폴더로 이동합니다. 해당 디렉토리로 이동한 후, Paddle OCR의 Git 저장소에서 site-packages 폴더로 Paddle OCR을 git clone 할 수 있습니다.

환경에 따라 env파일이 직접적으로 보이지 않을 수 있습니다. 저는 conda 환경이 시스템 전역에 설치되어있어서 밑의 경로로 이동을 했습니다. ( python -c "import site; print(site.getsitepackages())" 로 경로를 찾아보실 수 있습니다)

cd /opt/conda/envs/paddleocr/lib/python3.8/site-packages

 

 

그 후에 PaddleOCR 폴더로 이동해서 requirements를 install해줍니다.

cd PaddleOCR
pip3 install -r requirements.txt

2. Fine-Tuning

일단 학습시킬 데이터가 필요합니다.

저는 TextRecognitionDataGenerator를 사용하여 제가 가진 이미지에 맞는 데이터들을 생성했습니다.

git clone https://github.com/Belval/TextRecognitionDataGenerator.git

원하는 글씨체로 원하는 텍스트를 생성할 수 있는 GitHub 리포지토리입니다. 더 자세한 데이터 생성 방법은 다음에 따로 자세히 다뤄보겠습니다.

저는 제가 OCR 모델로 읽어내고자 목표하는 이미지에 맞는 데이터는 대략 4500개 생성했습니다. 또 확장성을 고려하여 기본 영어와 한글 알파벳과 글자를 추가 생성하여 학습시켰습니다. 기본 글자들은 제가 읽어내야 할 공장 패널 글씨체에 맞춰서 최대한 각지고 납작한 비슷한 글씨체를 찾아서 추가했습니다. 총 5300개의 데이터셋을 준비했습니다.

 

데이터셋을 train, test, eval로 나누기 위해 csv 파일을 판다스 라이브러리를 이용해서 8:1:1 로 나눠주었다.

import pandas as pd
from sklearn.model_selection import train_test_split

df = pd.read_csv('/content/drive/MyDrive/awa/project_test/gt.csv')

# 80%를 훈련 데이터로 나누기
train_df, temp_df = train_test_split(df, test_size=0.2, random_state=42)

# 나머지 20%를 테스트와 평가로 나누기
test_df, eval_df = train_test_split(temp_df, test_size=0.5, random_state=42)

# 다시 CSV 파일로 저장
train_df.to_csv('/content/drive/MyDrive/awa/project_test/train_file.csv', index=False)
test_df.to_csv('/content/drive/MyDrive/awa/project_test/test_file.csv', index=False)
eval_df.to_csv('/content/drive/MyDrive/awa/project_test/eval_file.csv', index=False)

 

PaddleOCR은 주석을 .txt 파일 형식으로만 받아들입니다. 이 파일에서는 이미지 경로와 ground truth가 탭으로 구분되어야 합니다. 처음부터 CSV가 아닌 txt로 데이터를 준비할 수 있었지만, PaddleOCR의 학습 스크립트가 오류 없이 실행되기 위해서는 PaddleOCR/ppocr/utils 폴더에 있는 gen_label.py 스크립트를 사용하여 .txt 파일을 생성해야만 합니다

!python3 /opt/conda/envs/paddleocr/lib/python3.8/site-packages/PaddleOCR/ppocr/utils/gen_label.py --mode="rec" --input_path="/workspace/paddleOCR/train_file.csv" --output_label="/workspace/paddleOCR/train_data"
!python3 /opt/conda/envs/paddleocr/lib/python3.8/site-packages/PaddleOCR/ppocr/utils/gen_label.py --mode="rec" --input_path="/workspace/paddleOCR/eval_file.csv" --output_label="/workspace/paddleOCR/eval_data"
!python3 /opt/conda/envs/paddleocr/lib/python3.8/site-packages/PaddleOCR/ppocr/utils/gen_label.py --mode="rec" --input_path="/workspace/paddleOCR/test_file.csv" --output_label="/workspace/paddleOCR/test_data"

 

train, eval, test 파일 모두 txt 파일을 만들었습니다. 리눅스 환경에서 ipynb 파일을 만들어서 쉘에서 진행을 했는데 혹시 윈도우 환경이거나 터미널에서 진행하시는 분들은 환경에 맞게 코드를 맞춰주시면 됩니다~

모델이 어떤 문자를 인식하도록 할지 결정해야 할 때, 기본적으로 PaddleOCR에서 제공하는 사전을 사용합니다.
만약 숫자만 인식하도록 하는 등 특정 언어의 문자만 인식하게 하려면, 자신만의 맞춤 사전을 만들 수 있습니다.
맞춤 사전을 만드는 법은 어렵지 않습니다.
txt 파일에 각 줄에 지정하고 싶은 글자 혹은 숫자 한개씩만 들어가도록 작성하면 됩니다.

3. 사전 학습 모델 다운로드

PaddleOCR에는 다양한 언어와 문자 세트를 위한 사전 학습된 모델이 여러 개 있습니다. 본인에게 가장 적합한 모델을 선택해야합니다. 모델 목록은 Git 저장소에서 확인할 수 있습니다. 탐지(detection) 모델과 인식(recognition) 모델이 따로 있으니 주의해야합니다.

https://github.com/PaddlePaddle/PaddleOCR

 

GitHub - PaddlePaddle/PaddleOCR: Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system

Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and...

github.com

 

모델을 다운로드하기 전에, site-packages 내의 PaddleOCR 디렉터리에 pretrain_model이라는 폴더를 만들어줍니다.

모델 목록은 "Pre-trained Models" 섹션에서 확인할 수 있습니다. 

중요: 미세 조정(fine-tuning)을 위해서는  Inference Model이 아닌 Trained Model 링크를 사용해야 합니다.

이 저장소에서 적절한 모델을 선택한 후, 모델 링크를 가져와  wget 명령어로 모델을 다운로드  다운로드하면 됩니다.

mkdir pretrain_model
cd pretrain_model

wget 가져온 모델 링크

[예시]

wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_rec_train.tar
tar -xf en_PP-OCRv3_rec_train.tar && rm -rf en_PP-OCRv3_rec_train.tar

 

다운받은 yml 파일을 살펴보겠습니다.

 

  • debug: false : 디버그 모드를 사용할지 여부를 설정합니다. false로 설정된 경우 디버그 모드가 비활성화됩니다.
  • use_gpu: true : GPU를 사용할지 여부를 설정합니다.
  • epoch_num: 500 : 모델을 학습시킬 총 에포크 수를 설정합니다.
  • log_smooth_window: 20 : 로그 출력을 위한 스무딩 윈도우 크기를 설정합니다. 이 값은 로그가 얼마나 자주 출력될지를 결정합니다.
  • print_batch_step: 10 :학습 중 몇 개의 배치마다 로그를 출력할지 설정합니다. 
  • save_model_dir: ./output/rec_ppocr_v3_korean :학습된 모델이 저장될 디렉토리를 설정합니다. 모델은 ./output/rec_ppocr_v3_korean에 저장됩니다.
  • save_epoch_step: 3 : 몇 에포크마다 모델을 저장할지 설정합니다. 여기서는 3 에포크마다 모델이 저장됩니다.
  • eval_batch_step: [0, 2000] : 모델을 평가할 배치 간격을 설정합니다. 여기서는 0번째와 2000번째 배치에서 평가가 이루어집니다.
  • cal_metric_during_train : true : 학습 중 메트릭을 계산할지 여부를 설정합니다. true로 설정된 경우 학습 중에 성능 메트릭이 계산됩니다.
  • pretrained_model : 사전 학습된 모델의 경로를 설정합니다. 이 항목이 비어 있는 경우, 사전 학습된 모델이 사용되지 않습니다.
  • checkpoints : 체크포인트(중간 저장된 모델)의 경로를 설정합니다. 이 항목이 비어 있는 경우, 체크포인트가 사용되지 않습니다.
  • save_inference_dir : 추론 모드에서 사용할 모델을 저장할 디렉토리를 설정합니다. 이 항목이 비어 있는 경우, 추론 모델이 저장되지 않습니다.
  • use_visualdl: false : VisualDL(시각화 도구)을 사용할지 여부를 설정합니다. false로 설정된 경우, VisualDL이 비활성화됩니다.
  • infer_img: doc/imgs_words/ch/word_1.jpg : 추론에 사용할 이미지 경로를 설정합니다. 여기서는 doc/imgs_words/ch/word_1.jpg 파일을 사용합니다.
  • character_dict_path: ppocr/utils/dict/korean_dict.txt : 인식할 문자 사전의 경로를 설정합니다. 여기서는 korean_dict.txt를 사용합니다.
  • max_text_length: &max_text_length 25 : 모델이 처리할 수 있는 최대 텍스트 길이를 설정합니다. 여기서는 25자로 제한됩니다.
  • infer_mode: false : 추론 모드를 사용할지 여부를 설정합니다. false로 설정된 경우 학습 모드로 실행됩니다.
  • use_space_char: true : 인식에 공백 문자를 포함할지 여부를 설정합니다. true로 설정된 경우 공백 문자가 포함됩니다.
  • distributed: true : 분산 학습을 사용할지 여부를 설정합니다. true로 설정된 경우 분산 학습이 활성화됩니다.
  • save_res_path: ./output/rec/predicts_ppocrv3_korean.txt : 추론 결과를 저장할 파일 경로를 설정합니다. 여기서는 predicts_ppocrv3_korean.txt에 결과가 저장됩니다.

 

 

데이터와 라벨 파일의 경로를 설정해야 합니다.

 

  • data_dir: 학습 및 평가에 사용할 이미지 데이터가 저장된 디렉토리의 경로를 지정합니다.
  • label_file_list: 각 이미지에 해당하는 라벨 파일의 경로를 지정합니다. 여기에 이전에 작성한 txt 파일 경로를 넣어주면 됩니다.

이 두 설정은 학습(train)과 평가(eval) 섹션 모두에 적용해야 합니다.

 

4. 학습

드디어 학습이 가능합니다. 밑에 코드에서 config.yml 경로를 설정하고 본인 모델의 경로를 잘 설정해주고 명령어를 실행합니다.

python3 tools/train.py -c /workspace/paddleOCR/korean_PP-OCRv3_rec_train/config.yml -o Global.pretrained_model=/workspace/paddleOCR/korean_PP-OCRv3_rec_train/best_accuracy

이어지는 내용은 추후 계속해서 작성하겠습니다.