• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • 計算機視覺/視頻分析

    強大的場景文本檢測和識別:推理優化

    ?

    在本文中,我們將深入探討推理優化過程,以在推理階段提高機器學習模型的性能和效率。我們將討論所采用的技術,例如推理計算圖形簡化、量化和降低精度。我們還展示了場景文本檢測和識別模型的基準測試結果,其中比較了 ONNX 運行時NVIDIA TensorRT 使用 NVIDIA Triton 推理服務器

    最后,我們總結了優化深度學習模型對于推理的重要性,以及使用端到端 NVIDIA 軟件解決方案的優勢,NVIDIA AI Enterprise 用于構建高效可靠的場景文本 OCR 系統。

    在本系列的第一篇文章中,強大的場景文本檢測和識別:簡介 討論了穩健場景文本檢測和識別(STDR)在各行各業中的重要性以及所面臨的挑戰。第二篇博文 強大的場景文本檢測和識別:實施 并討論了如何使用先進的深度學習算法和技術(如增量學習和微調)實現 STDR 工作流。

    推理優化

    推理優化旨在提高推理階段機器學習模型的性能和效率。它有助于減少作出預測所需的時間、計算資源和成本,在某些情況下還可以提高準確性。

    我們通過使用推理計算圖形簡化、量化和降低精度等技術來優化推理性能。這些模型最初使用 PyTorch 庫進行訓練,隨后導出為 torchScript 格式,再轉換為ONNX格式,最終轉換為NVIDIA TensorRT引擎。

    為了執行 ONNX 到 TensorRT 的轉換,我們使用了 TensorRT 版本 22.07 的 NGC 容器鏡像。轉換過程結束后,我們使用 NVIDIA Triton 推理服務器版本 22.07 部署了推理模型。系統性能在具有 16 GB GPU 顯存的 NVIDIA A5000 筆記本電腦 GPU 上進行了基準測試。

    The diagram shows model optimization using ONNX and TensorRT Optimizer and then model inference using NVIDIA TensorRT runtime in a deployment environment.
    圖 1.推理優化流程

    我們稍后將討論場景文本檢測和識別 (STDR) 每個構建塊的優化細節。

    場景文本檢測

    場景文本檢測是場景文本 OCR 系統的一個重要組件。此組件將場景圖像作為輸入,并輸出圖像中文本字段位置。在本文中,我們將預訓練的 CRAFT 模型用于常規場景文本檢測任務。該模型基于一組不同的圖像進行訓練,能夠處理動態輸入圖像并準確定位文本字段。在我們的部署中,用作輸入的圖像的平均寬度約為 720 點。在此處,我們對兩種圖像輸入大小進行了基準測試:(3720,720) 和 (31200,1200).

    我們的基準測試表明,與用于推理的 TorchScript 相比,TensorRT 的速度提高了大約 2.3 倍。

    A graph comparing the performance of three modes of text detection model inference (on an NVIDIA A5000 mobile GPU) using Triton Server: PyTorchScript, ONNX with CUDA and TensorRT, tested on two image sizes (3,700,700 and 3,1200,1200).
    2.Triton Inference Server 基準測試對比基于圖像大小的場景文本檢測 CRAFT 模型

    部署的 CRAFT 模型是具有 FP32 精度的 TensorRT 引擎。以下代碼示例是快速轉換指南。

    創建 conda 環境:

    $ conda create –n <your_env_name> python=3.8
    $ conda activate <your_env_name>

    克隆 CRAFT 庫并安裝 requirement.txt:

    $ git clone https://github.com/clovaai/CRAFT-pytorch.git
    $ cd CRAFT-pytorch
    $ pip install –r requirement.txt

    加載模型并將其轉換為可呈現動態形狀的 .onnx 格式:

    input_tensor_detec = torch.randn((1, 3, 768, 768), requires_grad=False)
    input_tensor_detec=input_tensor_detec.to(device="cuda”)
    ?
    # Load net
    net = CRAFT()
    net.load_state_dict(copyStateDict(torch.load(model_path)))
    net = net.cuda()
    net.eval()
    ?
    # Convert the model into ONNX
    torch.onnx.export(net, input_tensor_detec, output_dir,
    ??????????????verbose=False, opset_version=11,
    ??????????????do_constant_folding= True,
    ????????????export_params=True,
    ??????????????input_names=["input"],
    ??????????????output_names=["output", "output1"], dynamic_axes={"input": {0: "batch", 2: "height", 3: "width"}})

    簡化 ONNX 計算圖。通過ONNX Simplifier來簡化 ONNX 模型。它能夠推理整個計算圖,并將多余的運算符替換為它們的常量輸出(這一過程也被稱為常量折疊)。以下代碼示例展示了如何使用操作折疊來簡化 CRAFT 模型的計算圖:

    $ onnxsim <path to non_simplified onnx model> <path to simplified onnx model>
    The screenshot shows simplification in the Cast (from 3 to 0), Concat (from 10 to 7), and Constant (from 21 to 0) values.
    圖 3.CRAFT 模型的 onnxsim 報告

    在本文中,使用 NVIDIA TensorRT 預配置的 Docker 容器將 ONNX 模型轉換為 TensorRT 序列化計劃文件。以下代碼示例適用于 tensorrt:22.07-py3 NGC 容器:

    ~$ docker run -it --gpus all -v <path to onnx model>:/models \
    nvcr.io/nvidia/tensorrt:22.07-py3
    root@576df0ec3a49:/workspace#$ trtexec --onnx=/models/craft.onnx \
    --explicitBatch --workspace=5000 --minShapes=input:1x3x256x256 \
    --optShapes=input:1x3x700x700 --maxShapes=input:1x3x1200x1200 \
    --buildOnly –saveEngine=/models/craft.engine

    以下代碼示例顯示了場景文本檢測模型的 config.pbtxt 文件:

    name: "craft"
    default_model_filename: "detec_trt.engine"
    platform: "tensorrt_plan"
    max_batch_size : 1
    input [
    ??{
    ????name: "input"
    ????data_type: TYPE_FP32
    ????dims: [ 3, -1, -1 ]
    ??}
    ]
    output [
    ??{
    ????name: "output"
    ????data_type: TYPE_FP32
    ????dims: [ -1, -1, 2 ]
    ??},
    ??{
    ????name: "output1"
    ????data_type: TYPE_FP32
    ????dims: [ 32, -1, -1 ]
    ??}
    ]

    場景文本識別

    場景文本識別是 STDR 流程的一個不可或缺的模塊。我們使用了 PARseq 算法,這是一種先進的技術,可實現高效且可定制的文本識別,以獲得準確的結果。

    為了更大限度地提高流程性能,我們將 PARseq TorchScript 模型轉換為 ONNX,然后進一步將其轉換為 TensorRT 引擎,確保文本識別的低延遲,因為每個圖像可能包含多個文本字段。

    我們發現,事實證明,為模型使用 3x32x128 的輸入大小是推理時間和準確性之間的最佳平衡。圖 4 顯示了 PARseq 模型的基準測試結果。與 TorchScript 推理相比,我們的基準測試加速約為原來的 3 倍。

    A graph comparing the performance of three modes of text recognition model inference (on NVIDIA A5000 mobile GPU) using Triton Server: PyTorchScript, ONNX with CUDA and TensorRT, tested on a fixed image size of (3,32,128).
    圖 4.場景文本識別 PARseq 模型的 Triton 推理服務器基準測試比較

    我們發現預訓練模型的作者發布的大多數案例都能很好地處理。如果您希望在自定義數據集上獲得更準確的輸出,您也可以對模型進行微調。以下代碼示例展示了進行這些重要轉換步驟的方法。

    安裝 PARSeq:

    $ git clone https://github.com/baudm/parseq.git
    $ pip install -r requirements.txt
    $ pip install -e .

    您可以使用自己的微調模型或預訓練模型,從 模型庫 中獲取,并將其轉換為 .onnx 格式。請使用 ONNX 1.12.0 以下的版本。

    from strhub.models.utils import load_from_checkpoint
    ?
    # To ONNX
    device = "cuda"
    ckpt_path = "..."
    onnx_path = "..."
    img = ...
    ?
    parseq = load_from_checkpoint(ckpt_path)
    parseq.refine_iters = 0
    parseq.decode_ar = False
    parseq = parseq.to(device).eval()
    ?
    parseq.to_onnx(onnx_path, img, do_constant_folding=True, opset_version=14)? # opset v14 or newer is required
    ?
    # check
    onnx_model = onnx.load(onnx_path)
    onnx.checker.check_model(onnx_model, full_check=True) ==> pass

    要轉換為 TensorRT 格式,請使用ONNX Simplifier

    $ onnxsim <path to non_simplified onnx model> <path to simplified onnx model>
    A screenshot of model simplification changed values. Fifteen values were lowered as a result of simplification.
    圖 5.PARSeq 模型的 onnxsim 報告

    在將模型轉換為簡化的 ONNX 格式后,可以使用 trtexec 轉換工具進行進一步處理。此轉換過程可在 TensorRT 容器版本 22.07 中完成。

    ~$ docker run -it --gpus all -v <path to onnx model repository>:/models nvcr.io/nvidia/tensorrt:22.07-py3
    root@576df0ec3a49:/workspace# trtexec --onnx=/models/parseq_simple.onnx --fp16 \
    --workspace=1024 --saveEngine=/models/parseq_fp16.trt --minShapes=input:1x3x32x128 \
    --optShapes=input:4x3x32x128 --maxShapes=input:16x3x32x128

    以下代碼示例展示了config.pbtxt場景文本識別模型的文件:

    name: "parseq"
    max_batch_size: 16
    platform: "tensorrt_plan"
    default_model_filename: "parseq_exp_fp32.trt"
    ??
    input {
    ????name: "input"
    ????data_type: TYPE_FP32
    ????dims: [3, 32, 128]
    }
    ??
    output {
    ????name: "output"
    ????data_type: TYPE_FP32
    ????dims: [26, 95]
    }
    ??
    instance_group [
    ????{
    ????count: 1
    ????kind: KIND_GPU
    ????}
    ]

    編排師

    編排器模塊是一個用于維護流程并對 STDR 管線執行預處理的Python 后端。為了進行管線基準測試,我們使用了 4 張具有不同圖像尺寸的圖像,以便于perf_analyzer的使用。

    我們創建了兩個版本的工作流,一個使用 ONNX 運行時 CPU/GPU 后端的工作流,另一個使用 TensorRT 計劃,以便工作流可在 GPU 和非 GPU 環境中運行。我們對工作流進行了基準測試,onnx_backend管道和tensorrt_plan使用 NVIDIA Triton 推理服務器的 NVIDIA RTX A5000 筆記本電腦 GPU (16 GB) 上的工作流。

    基準測試的輸入樣本具有四種不同的圖像,大小為 (3x472x338)、(3x3280x2625)、(3x512x413) 和 (3x1600x1200).

    Bar chart shows 1x throughput for ONNX-FP32 and 1.5x throughput for TensorRT-FP32.
    圖 6.在 ONNX 運行時和 TensorRT 計劃上對場景文本識別和檢測進行 Triton 推理服務器基準測試比較

    編排器是一個 Python 后端模塊,用于協調場景文本檢測和場景文本識別模型。編排器的配置文件如下所示:

    name: "pipeline"
    backend: "python"
    max_batch_size: 1
    input [
    ??{
    ????name: "input"
    ????data_type: TYPE_UINT8
    ????dims: [ -1, -1, 3 ]
    ??}
    ]
    output [
    ??{
    ????name: "output"
    ????data_type: TYPE_STRING
    ????dims: [ -1 ]
    ??}
    ]
    ??
    instance_group [
    ????{
    ????count: 1
    ????kind: KIND_GPU
    ????}
    ]

    總結

    總而言之,部署場景文本檢測和識別系統需要仔細考慮真實場景,優化深度學習模型以進行推理至關重要。

    為確保生產就緒型優化和性能, NVIDIA 提供了端到端軟件解決方案 NVIDIA AI Enterprise,該解決方案由一流的 AI 軟件和工具(包括 TensorRT 和 Triton 推理服務器)組成,可輕松訪問構建企業 AI 應用程序。該解決方案有助于在各種設備上實現低延遲和高性能推理。

    通過使用這些技術,您可以為各種應用構建高效可靠的場景文本 OCR 系統。

    ?

    0

    標簽

    人人超碰97caoporen国产