[AIOCR]PaddleOCRで日本語を文字認識する

2021年6月26日土曜日

Artificial Intelligence

中国企業のBaiduが開発している軽量を売りにするPaddleOCR。
本記事ではPaddleOCRを使って日本語の文字を認識する方法を紹介します

アイキャッチ
出典: https://github.com/PaddlePaddle/PaddleOCR

PaddleOCRとは?

英語、日本語、中国語等の文字認識が可能なAIOCRです。

ソースコード学習済みモデルが公開されており、
学習済みモデルを使って文字認識を実行することも、
公開されたソースコードを使って学習し、新たにモデルをトレーニングすることも可能です

2 stageモデルのため文字検出、文字認識それぞれで別のモデルを使用します
また、文字の向きの検出にもモデルを使用しています。
このため、文字検出、文字の向きの検出、文字認識の合計3つの学習済みモデルを使用して3回予測し、AIOCRを実現しています。

PaddleOCRのフローチャート
出典: https://github.com/PaddlePaddle/PaddleOCR

特長は下記の4点です

  1. 中国語や日本語など複数言語をサポートしていること
  2. 2021年10月時点で活発にコードが保守されていること
  3. PaddlePaddleフレームワークで実装されていること
  4. 軽量(メモリ消費量が少ない・モデルサイズが小さい)であること
1点目のサポート言語数は2022年1月時点で下記のとおりです。


留意すべき特徴は、3点目でしょうか。
PytorchやTensorflowなどのAIフレームワークではなくPaddlePaddleで実装されているため
若干の学習コストが発生します

また、技術的な最大の特徴は、4点目の軽量化に重点を置いたAIOCRである点です。
近年機械学習を使ったモデルはGPUや、CPUメモリのハードウェアリソースの発展に伴い肥大化の一途を辿っています。

このため、たとえ論文とソースコードが公開されているモデルであっても個人所有のGPUでは実行に必要なメモリが不足する場合や実行時間が非常に遅い場合があります。

対してこのPaddleOCRは、モデルサイズが非常に小さく、実行時に必要なメモリもそれほど多くはありません。CPUのみで実行したとしても十分現実的な実行時間となります
この点、とりあえず動かしてみたい方にとっては適切ではないでしょうか。

なお、2022年1月時点のモデルサイズは下記のとおりです。
    ■Mobile用モデル
    detection(文字の検出): 3.0MB
    direction classifer(文字の方向の分類): 1.4MB
    recognition(文字の認識): 5.0MB

    ■Server用モデル
    detection(文字の検出): 47.1MB
    direction classifer(文字の方向の分類): 1.4MB
    recognition(文字の認識): 94.9MB

    なお、このデモはPythonで実装しています。
    Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

    導入手順

    LinuxにPaddleOCRを導入していきます
    PaddleOCRのGitHubにDockerを使った導入手順が記載されていますが、
    環境によって動かない場合があるため、本記事ではminicondaを使った導入手順を記載します

    始めにminicondaの仮想環境を作成します
    conda create -n ppocr python=3.7 -y  # conda環境作成
    conda activate ppocr # 仮想環境起動
    cd ppocr
    mkdir workspace
    cd workspace
    

    次にGitHubからPaddleOCRのソースコードをクローンします
    git clone https://github.com/PaddlePaddle/PaddleOCR.git -b v2.0.0
    

    次にPaddlePaddleをインストールします
    環境によってレポジトリからのインストールに失敗する場合があるため
    ファイルをダウンロードしてローカルでインストールします
    # 下記からpython version, cuda versionに一致するものをダウンロード
    # https://anaconda.org/Paddle/paddlepaddle-gpu
    
    # paddlepaddle-gpu 2.1.0 cuda 10.1 python 3.7をダウンロード
    wget https://anaconda.org/Paddle/paddlepaddle-gpu/2.1.0/download/linux-64/paddlepaddle-gpu-2.1.0-py37_gpu_cuda10.1_many_linux.tar.bz2
    # ダウンロードファイルをcondaにインストール
    conda install paddlepaddle-gpu-2.1.0-py37_gpu_cuda10.1_many_linux.tar.bz2
    

    次にpipを使ってライブラリをインストールします
    このときProxy環境下である場合は下記コマンドでプロキシ設定をpipに通しておく必要があります
    # Proxyを環境変数に設定
    export HTTP_PROXY=http://"username":"password"@"proxy":"port"
    export HTTPS_PROXY=http://"username":"password"@"proxy":"port"
    

    pipを使ってrequirements.txtに記載のライブラリをインストール
    cd PaddleOCR
    pip3 install -r requirements.txt
    

    以上で導入は完了です

    日本語の予測

    始めに日本語の文字認識モデルをダウンロードします
    ダウンロード場所は任意ですが本記事では下記のディレクトリ構成とします
    ppocr
    |- workspace
      |- PaddleOCR
         |- infer_model
            |- det
            |- rec
            |- cls

    cd /ppocr/workspace/PaddleOCR/infer_model/rec
    wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/japan_mobile_v2.0_rec_infer.tar
    tar -xvf japan_mobile_v2.0_rec_infer.tar
    

    同様に文字検出モデルと文字の向きを検出するモデルもダウンロードします
    この2つのモデルは言語に多言語共通です
    cd /ppocr/workspace/PaddleOCR/infer_model/det
    wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_infer.tar
    tar -xvf ch_ppocr_server_v2.0_det_infer.tar
    
    cd /ppocr/workspace/PaddleOCR/infer_model/cls
    wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar
    tar -xvf ch_ppocr_mobile_v2.0_cls_infer.tar
    

    最後にこれらを使って日本語のOCRを実行します
    cd /ppocr/workspace/PaddleOCR
    
    # --image_dir OCR対象の画像パスまたはディレクトリ
    # --rec_char_dict_path 文字認識モデルが利用する辞書データ
    # --drop_score 文字認識のスコアの閾値, 閾値以下のものは出力されません
    python3 tools/infer/predict_system.py \
    --image_dir="./doc/imgs/japan_2.jpg" \
    --det_model_dir="./infer_model/det/ch_ppocr_server_v2.0_det_infer" \
    --cls_model_dir="./infer_model/cls/ch_ppocr_mobile_v2.0_cls_infer" \
    --rec_model_dir="./infer_model/rec/japan_mobile_v2.0_rec_infer" \
    --use_angle_cls=true \
    --rec_char_dict_path=./ppocr/utils/dict/japan_dict.txt \
    --rec_char_type=japan \
    --use_gpu=True \
    --drop_score=0.5
    

    cd /ppocr/workspace/PaddleOCR/inference_results
    に予測結果が出力されます

    文字認識結果


    まとめ

    PaddleOCRと日本語の文字認識の実行手順を紹介させて頂きました

    見慣れないフレームワークですが、実行に求められるスペックが低く機械学習そのものの学習には打ってつけのモデルです。また物体検知や、物体認識といった画像を用いた機械学習のいくつかの手法も学べるため初学者にもおすすめのモデルです。

    また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
    もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


    また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

    AIで副業ならココから!

    まずは無料会員登録

    プロフィール

    メーカーで研究開発を行う現役エンジニア
    組み込み機器開発や機会学習モデル開発に従事しています

    本ブログでは最新AI技術を中心にソースコード付きでご紹介します


    Twitter

    カテゴリ

    このブログを検索

    ブログ アーカイブ

    TeDokology