PaddleDetection2.x は独自のモデルをトレーニングしてデプロイします

PaddleDetection は、Baidu Paddle ファミリーのターゲット検出開発キットです。個人的には、Paddle の利点は、モデルが豊富で、より多くのデプロイ方法 (python、C++、モバイル端末など) をサポートしていることであり、欠点は、落とし穴が多いことです。この記事では、PaddleDetection の使用プロセスを研究し、トレーニング、推論、展開プロセス全体を、私自身のデータ セット (私の仕事で使用) から記録します。

1. PaddleDetection のインストール

インストールは比較的簡単です。公式のチュートリアルを参照するだけです。インストール チュートリアル パス: PaddleDetection/docs/tutorials/INSTALL.md

最初に、インストール中に遭遇した大きな落とし穴について話しましょう。

Paddle2.3 (最新) は ubuntu22.04 と互換性がありません。これは、ubuntu22.04 の gcc バージョンの方が高く、パドルはそのようなより高い gcc バージョンをサポートしていないためです。

このブログ投稿でインストールされているバージョンは、paddlepaddle-gpu==2.3.1 paddledetection==2.4 です。 

2. PaddleDetection は独自のデータセット (coco) をトレーニングします

2.1 パドル検出ファイルの紹介

図は、パドル検出のファイル構造を示しています。ここで、configs は構成ファイルです。基本的に構成ファイルは、ネットワークのすべての構造、データ セット、トレーニング戦略などを定義します。output はトレーニング済みモデルの保存に使用され、tools には train val などの基本的なツール スクリプトが含まれています。 

2.2 独自のデータセットを構築する

paddledetection は、voc、coco、および wideface 形式をサポートします。その中で coco が最も多くのモデルを持っています。coco のデータ形式は labelme のラベリング ファイルに依存します. ラベリング後に coco のデータ形式に変換できます. 変換されたコードについては, インターネット上には多くの labelme2coco スクリプトがあり, paddlededeciont のファイル ディレクトリにある tools/x2coco.py も利用可能。目的は、対応する coco データ形式を次のように構築することです。

 

その中で、annotations ディレクトリには、instances_train2017.json と instaan​​ces_val2017.json (検出とセグメンテーション用)、train2017 ディレクトリ (トレーニング セットの元の画像)、および val2017 (検証セットの元の画像) が含まれています。coco データセットの説明については、PaddleDetection/docs/tutorials/PrepareDataset.md を参照してください。

今回は5カテゴリの物標検知データセットを使用しています.合計2k枚の画像が含まれています.9:1の割合でトレーニングセットと検証セットに分けられています.仕事や業務に関わるデータなので,詳細は示しません。

2.3 構成ファイルの変更

この記事では、トレーニング用に faster_rcnn_r50_vd_fpn_ssld_2x_coco.yml モデルを選択します.記述ファイル configs/faster_rcnn/README.md では、このネットワークは coco データの最適なマップに達しています: 42.6

configs/faster_rcnn/faster_rcnn_r50_vd_fpn_ssld_2x_coco.yml を開くと、これが入れ子人形モードの設定ファイルであることがわかります。レイヤーごとに開いて設定するだけです。

一般的な構成には、データ構成、トレーニング戦略、およびネットワーク モデルの 3 つの主な内容が含まれます。以下に示すように

その中で、データ構成はcoco_detection.ymlにあります

  • num_classes: 独自のデータ セットのカテゴリ数を変更します
  • TrainDataset: トレーニング セット パスの構成
  • EvalDataset: 検証セットのパス構成
  • TestDataset: テスト セット パスの構成。検証セットをテスト セットとして使用するだけです。

ネットワークの設定 fast_rcnn_r50_fpn.yml

これはバックボーンやヘッドなどの情報を定義するネットワークファイルで、自分でモデルを変更しない場合(お兄ちゃんレベル)は、基本的にこのファイルを変更する必要はなく、公式のネットワークアーキテクチャをそのまま使用してください。ここでの事前トレーニング済みの事前トレーニング モデルは、ネットワーク全体ではなく、SwinTransformer のものであることに注意してください。 

トレーニング戦略faster_fpn_reader.yml、optimizer_1x.yml、runtime.ymlを構成します。実際、上記の設定ファイルの内容は名前から理解できます。

  • reader.yml は、input_size、batch_size、transformer、およびその他のパラメーター設定を含む、データ テンソルの読み取り構成を示します。
  • optimizer_swin_1x.yml は、learning_rate、optimizer、およびその他のパラメータ設定を含む、optimizer の構成を表します。
  • runtime.yml は、use_gpu、log_iter、save_dir およびその他のパラメーターを含む、操作中のパラメーター構成を表します。

2.4 トレーニング

トレーニング & 検証 & 推論

# Train
export CUDA_VISIBLE_DEVICES=0 
python tools/train.py -c configs/faster_rcnn/faster_rcnn_r50_vd_fpn_ssld_2x_coco.yml --eval --use_vdl=true
  • -c : 構成ファイル.yml
  • --eval : トレーニング中に評価するように切り替えます
  • --use_vdl : --vdl_log_dir パラメーターとペアで使用されるトレーニング プロセスを視覚化します。

そのうち --vdl_log_dir のデフォルト値は vdl_log_dir/scalar. --use_vdl=true の場合、トレーニング プロセスの .log ファイルが生成され、損失とマップの変化が記録されます。次に、コマンドを使用します

visualdl --logdir vdl_log_dir/scalar/

「 http://localhost:8040/ 」でWebサービスが生成でき、損失の変化が見られます。次のように:

 

# Val
export CUDA_VISIBLE_DEVICES=0 
python tools/eval.py -c configs/faster_rcnn/faster_rcnn_r50_vd_fpn_ssld_2x_coco.yml -o weights=output/faster_rcnn_r50_vd_fpn_ssld_2x_coco/ model_final.pdparams --classwise
  • -c : 構成ファイル.yml
  • -o : 重みファイル.pdparams
  • --classwise : 個々のクラスごとに AP 値を出力します
# Infer
export CUDA_VISIBLE_DEVICES=0
python tools/infer.py -c configs/faster_rcnn/faster_rcnn_r50_vd_fpn_ssld_2x_coco.yml -o weights=output/faster_rcnn_r50_vd_fpn_ssld_2x_coco/model_final.pdparams --infer_img=demo/DJI_1116.png --output_dir=output/ --draw_threshold=0.5 --use_vdl=True
  •  -c : 設定ファイル .yml を設定します
  • -o : 重みを設定 file.pdparams
  • --infer_img : 画像パス
  • --output_dir : 結果を保存するパス
  • --draw_threshold : 描画時に選択されたバウンディング ボックスの信頼度のしきい値

上記は、Train & Val & Infer の完全なプロセスです。しかし、実際の使用では、このように使用されることはあまりありません。これは、ここでの Infer がトレーニング部分で多くのコードと結合されており、呼び出しが十分に柔軟ではないためです。In real use, another step is deploy. 同様に、デプロイには Infer プロセスがあり、これはトレーニング プロセスに依存せず、他のプロジェクトによりよく組み込まれるように最適化されています。

3. モデルのエクスポートと展開 

モデルのトレーニング プロセス中に保存されたモデル ファイルには、前方予測と逆伝播が含まれます.実際の産業展開では、逆伝播は必要ないため、展開に必要なモデル形式にモデルをインポートする必要があります. モデルをエクスポートするための tools/export_model.py スクリプトが PaddleDetection で提供されています。

Python のデプロイ方法

# 导出模型
python tools/export_model.py -c configs/faster_rcnn/faster_rcnn_r50_vd_fpn_ssld_2x_coco.yml -o weights=output/faster_rcnn_r50_vd_fpn_ssld_2x_coco/model_final.pdparams --output_dir=./inference_model

 モデルがエクスポートされると、次のように、対応するフォルダーに 4 つのファイルが生成されます。

infer_cfg.yml : 変換パラメーター、input_size パラメーターなどの前処理。

モデル.pdiparams

model.pdiparams.info

モデル.pdモデル

# 预测
python deploy/python/infer.py --model_dir=./inference_model/faster_rcnn_r50_vd_fpn_ssld_2x_coco --image_file=demo/DJI_1116.png --device=GPU

パドル検出用のファイルとコードが多すぎて、実際の展開では使用されていません。それを使用する他の方法は次のとおりです。プロジェクトにパドルを埋め込んで、その推論プロセスを使用します。モデルがエクスポートされた後は、トレーニング プロセスとは関係がないため、./inference_model で必要なモデル フォルダーとデプロイ フォルダーを他のプロジェクトにコピーして、その推論機能を使用するだけで済みます。

deploy/python/infer.py のソース コードを参照する必要がありますが、ビジネス ニーズに合わせて自分で Infer 関数を作成することをお勧めします。例は次のとおりです。

import os
import yaml
import glob
import json
from pathlib import Path
import time

import cv2
import numpy as np
import math
import paddle
from paddle.inference import Config
from paddle.inference import create_predictor

from infer import Detector, visualize_box_mask


# paddle.enable_static()
model_dir = "/home/elvis/CodeReconstruction/Det_Tinktek_V2.0/paddledetection/inference_model/faster_rcnn_r50_vd_fpn_ssld_2x_coco"

detector = Detector(model_dir,
                 device='GPU',
                 run_mode='paddle',
                 batch_size=1,
                 trt_min_shape=1,
                 trt_max_shape=1280,
                 trt_opt_shape=640,
                 trt_calib_mode=False,
                 cpu_threads=1,
                 enable_mkldnn=False,
                 enable_mkldnn_bfloat16=False,
                 output_dir='output',
                 threshold=0.5,
                 delete_shuffle_pass=False)

img_path = "/home/elvis/paddle/PaddleDetection/demo/1116.png"
frame = cv2.imread(img_path)
results = detector.predict_image([frame[:, :, ::-1]], visual=False)  # bgr-->rgb
print(results)
print(detector.det_times.info())
im = visualize_box_mask(frame, results, detector.pred_config.labels, detector.threshold)
im = np.array(im)
cv2.imshow('Mask Detection', im)
cv2.waitKey(0)


# def pre_img(detector, frame:cv2):
#     results = detector.predict_image([frame[:, :, ::-1]], visual=False)  # bgr-->rgb

    

 

4. 考えられるエラー

モデル configs/faster_rcnn/faster_rcnn_swin_tiny_fpn_3x_coco.yml をトレーニングに使用した場合、tools/infer.py での推論も正常ですが、モデルがエクスポートされた後、deploy/python/infer.py を使用した推論エラーは次のようになります。とりあえず問題はわかりません。

 

 

おすすめ

転載: blog.csdn.net/Eyesleft_being/article/details/126347874