[使い方解説]PaddleClasで画像認識[Python]

2021年11月13日土曜日

Artificial Intelligence

本記事ではLightweightが特徴である画像認識ツールPaddleClasの使い方を解説します。

アイキャッチ

PaddleClasとは

PaddleClasは、Lightweightを特徴とする画像認識ツールセットです。
Baiduが開発するAIフレームワークPaddlePaddleを利用しています。

提供されている事前学習モデルでは、車両、ロゴ、アニメのキャラクターなどが認識可能となっています。 Lightweight(軽量動作)を特徴とするため、一般的なPCのCPUさえあれば推論の実行が可能です。

画像認識結果
画像認識結果
出典: PaddlePaddle/PaddleClas

少々技術的な詳細を記載します。
PaddleClasは、PP-ShiTuと呼ばれる軽量画像認識手法を組み込んだツールセットです。

PP-ShiTuは、本体検出(mainbody detection)特徴抽出(feature extraction)ベクトル検索(vector search)の3つのモジュールで構成されています。

PaddleClas
PaddleClas構成図
出典: PaddlePaddle/PaddleClas

そしてこの手法を組み込んだPaddleClasはオープンソースとして、Githubに公開されており、事前学習済みモデルを使用して画像認識を実施することや、公開されたネットワークを使って自作のモデルをトレーニングすることも可能です。

PaddleClasの導入手順

セットアップ1: paddlepaddleのインストール

それでは早速、開発環境にPaddleClasをセットアップしていきます。
動作確認は下記の環境で行っています。

OS: Ubuntu 18.04.3 LTS
GPU: GeForce GTX 1080

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

それでは、PaddleClasをインストールしていきます。他の機械学習環境に影響を与えないためにMinicondaの仮想環境上に構築していきます。Minicondaのインストール手順は公式ドキュメントをご参照ください。

始めにPaddleClasの動作環境を下記に記載します。

  1. python 3.x
  2. cuda >= 10.1 (paddlepaddle-gpuを使用する場合)
  3. cudnn >= 7.6.4 (paddlepaddle-gpuを使用する場合)
  4. nccl >= 2.1.2 (train/evalを実施する場合)
  5. gcc >= 8.2

またcuda driverはcuda10.1の場合は418.39以上を、cuda10.2の場合は440.33以上をインストールしている必要があります。paddlepaddle-gpuを使用する場合は事前に必ず確認してください。
cuda driverはnvidia-smiで確認できます。

$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.87.00    Driver Version: 418.87.00    CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+

次にminicondaの仮想環境を作成し、そこにpaddlepaddleフレームワークをインストールします。
paddlepaddle-gpuのインストール時にpip3 install paddlepaddle-gpu --upgrade -i https://mirror.baidu.com/pypi/simpleでインストールすることも可能ですが、pythonのバージョンやcudaのバージョン不一致で詰まると厄介なためFilesからダウンロードしてインストールします。

# python version 3.7のconda環境を作成
$ conda create -n paddle_clas python=3.7

# 作成した環境をアクティベート
$ conda activate paddle_clas
$ cd paddle_clas

# Proxy配下の場合はインストール前に下記を設定
$ export http_proxy="http://"username":"password"@proxy:port"
$ export https_proxy="http://"username":"password"@proxy:port"

# GPUを使用する場合
# cudatoolkitのバージョンはインストールされているcudaのバージョンに合わせる
$ conda install -c conda-forge cudatoolkit=10.1 cudnn nccl
$ conda install -c anaconda decorator
# バージョンを指定せず最新版をインストールする場合
$ pip3 install paddlepaddle-gpu --upgrade -i https://mirror.baidu.com/pypi/simple
# バージョンを指定、cudaも指定してダウンロードしてからインストールする場合(本記事ではこちらを実施)
$ wget https://anaconda.org/Paddle/paddlepaddle-gpu/2.2.0/download/linux-64/paddlepaddle-gpu-2.2.0-py37_gpu_cuda10.1_many_linux.tar.bz2
$ conda install paddlepaddle-gpu-2.2.0-py37_gpu_cuda10.1_many_linux.tar.bz2

# CPUのみの場合
$ pip3 install paddlepaddle --upgrade -i https://mirror.baidu.com/pypi/simple

問題なくインストールできているか下記のコマンドを実行して確認します。

$ python3 -c "import paddle; print(paddle.__version__)"
2.2.0
$ python3 -c "import paddle; paddle.utils.run_check()"
Running verify PaddlePaddle program ...
中略
PaddlePaddle is installed successfully! Let's start deep learning with PaddlePaddle now.

上記のようにバージョンが表示されチェックに成功すれば、インストールは完了です。

一方で、paddlepaddle-gpuをインストールした場合に下記のエラーが発生した場合、GPUを認識できていません。 cudaバージョンの不一致の可能性が高いため cudaバージョン、pythonバージョンが一致するpaddlepaddle-gpuFilesからダウンロードしてインストールすると解消する場合があります。

$ python3 -c "import paddle; print(paddle.__version__)"
W1112 23:42:28.197413 15800 init.cc:143] Compiled with WITH_GPU, but no GPU found in runtime.
paddle_clas/lib/python3.7/site-packages/paddle/fluid/framework.py:312: UserWarning: You are using GPU version Paddle, but your CUDA device is not set properly. CPU device will be used by default.
  "You are using GPU version Paddle, but your CUDA device is not set properly. CPU device will be used by default."
2.2.0

以上でpaddlepaddleのインストールは完了です。

セットアップ2: PaddleClasのインストール

続いて、PaddleClasのインストールを行います。

# GitHubからcode clone
$ git clone https://github.com/PaddlePaddle/PaddleClas.git -b develop
$ cd PaddleClas/

# ライブラリをインストール
$ pip3 install --upgrade -r requirements.txt -i https://mirror.baidu.com/pypi/simple

以上でPaddleClasのインストールは完了です。
paddlepaddleに比較して簡単ですね。

セットアップ3: 学習済みモデルとdemoデータの準備

次に学習済みモデルとdemo用データを取得します。

# ディレクトリ確認
$ pwd
.../paddle_clas/PaddleClas
$ cd deploy

# modelの保存ディレクトリ作成
$ mkdir models
$ cd models

# MainBody Detectionモデルのダウンロード
$ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/ppyolov2_r50vd_dcn_mainbody_v1.0_infer.tar
$ tar -xf ppyolov2_r50vd_dcn_mainbody_v1.0_infer.tar

# Product Recognition(Feature Extraction/Vector Search)モデルのダウンロード
$ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/product_ResNet50_vd_aliproduct_v1.0_infer.tar
$ tar -xf product_ResNet50_vd_aliproduct_v1.0_infer.tar

# Demoデータのダウンロード
$ cd ..
$ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/recognition_demo_data_en_v1.1.tar
$ tar -xf recognition_demo_data_en_v1.1.tar

ここまでで下記のようなディレクトリ構造になっていればモデル、データの準備は完了です。

PaddleClas/deploy$ tree -L 2 -d
.
├── models
│   ├── ppyolov2_r50vd_dcn_mainbody_v1.0_infer
│   └── product_ResNet50_vd_aliproduct_v1.0_infer
├── recognition_demo_data_v1.1
│   ├── gallery_cartoon
│   ├── gallery_logo
│   ├── gallery_product
│   ├── gallery_vehicle
│   ├── test_cartoon
│   ├── test_logo
│   ├── test_product
│   └── test_vehicle

画像認識

最後に画像認識を用意したモデルを使って画像認識を行います。

# ディレクトリ確認
$ pwd
.../paddle_clas/PaddleClas/deploy

# 画像認識(GPU)
$ python3.7 python/predict_system.py -c configs/inference_product.yaml
# 画像認識(CPU)
python3.7 python/predict_system.py -c configs/inference_product.yaml -o Global.use_gpu=False
[{'bbox': [287, 128, 497, 326], 'rec_docs': 'Daoxaingcun', 'rec_scores': 0.82785296}, {'bbox': [99, 242, 313, 426], 'rec_docs': 'Daoxaingcun', 'rec_scores': 0.7245654}]

画像認識が完了すると/deploy/outputには以下のような認識結果の画像が出力されています。

画像認識結果1

画像認識ができているようですが、日本人には馴染みのない製品のため合っているかどうかが分かりませんね。
そのため自分で用意した画像を画像認識させてみます。

はじめにProduct Recognitionモデルが認識できる製品を確認します。
recognition_demo_data_v1.1/gallery_product/data_file.txtを確認します。
MacBook Pro, iPhone 12proなどいろいろありますね。今回はMacBook Proを認識させてみます。

MacBook Proを認識するかを確認するため本記事では以下のロイヤリティフリーの画像を用意しました。

画像認識対象画像

上記画像をPaddleClas/deploy/my_dataのディレクトリを作成し配置します。
そして以下を実行します。

# 画像の場所の確認
/PaddleClas/deploy/my_data$ ls
target1.jpg

$ cd ..

#my_data直下の画像全てを画像認識
python3.7 python/predict_system.py -c configs/inference_product.yaml -o Global.infer_imgs="./my_data/"
[{'bbox': [513, 1403, 1541, 2009], 'rec_docs': 'MacBook', 'rec_scores': 0.656101}]

以下のような出力が得られ正常に認識できていることが分かります。

画像認識結果2

まとめ

本記事では、PaddleClasで画像認識を行う方法を紹介しました。
今回は学習済みモデルを使って画像認識を行ったため認識できる対象に限りがありましたが、
学習用データを準備し、モデルをトレーニングすれば、任意の対象を認識するモデルを生成することも可能です。

またlightweightを謳っていることもありLightWeight版のモデルサイズは約33MBほどでスマホに組み込むことも可能なサイズです。

モデルが複雑化し消費するディスクやメモリが増大する手法も多い中、LightWeightな戦略は、機械学習技術の適用範囲を拡大する一つの要因になり得るかもしれません。

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


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

参考文献

1. 論文 - PP-ShiTu: A Practical Lightweight Image Recognition System

2. GitHub - PaddlePaddle/PaddleClas

AIで副業ならココから!

まずは無料会員登録

プロフィール

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

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


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology