基於OpenVINO的PaddlePaddle的鮮花識別模型預測部署

語言: CN / TW / HK

攜手創作,共同成長!這是我參與「掘金日新計劃 · 8 月更文挑戰」的第27天,點選檢視活動詳情

基於PaddlePaddle的模型已訓練好,下一步使用OpenVINO來進行預測部署

一、鮮花識別

1.資料集簡介

Oxford 102 Flowers Dataset 是一個花卉集合資料集,主要用於影象分類,它分為 102 個類別共計 102 種花,其中每個類別包含 40 到 258 張影象。

該資料集由牛津大學工程科學系於 2008 年釋出,相關論文有《Automated flower classification over a large number of classes》。

在資料夾下已經生成用於訓練和測試的三個.txt檔案:train.txt(訓練集,1020張圖)、valid.txt(驗證集,1020張圖)、test.txt(6149)。檔案中每行格式:影象相對路徑 影象的label_id(注意:中間有空格)。

2.PaddleClas簡介

PaddleClas目前已經是 release2.3了,和以前有脫胎換骨的差別,所以需要重新熟悉。

地址: http://gitee.com/paddlepaddle/PaddleClas

configs已經移動到了ppcls目錄 部署為單獨的deploy目錄

3.OpenVINO 2022.1 部署支援

OpenVINO™ 是開源的AI預測部署工具箱,支援多種格式,對飛槳支援友好,目前無需轉換即可使用。

4.OpenVINO 2022.1 工作流程

```python

解壓縮資料集

!tar -xvf data/data19852/flowers102.tar -C ./data/ >log.log ```

二、PaddleClas準備

```python

下載最新版

!git clone http://gitee.com/paddlepaddle/PaddleClas/ --depth=1 ```

python %cd PaddleClas/ !pip install -r requirements.txt >log.log

/home/aistudio/PaddleClas

三、模型訓練

1.修改imagenet_dataset.py

目錄: \ppcls\data\dataloader\imagenet_dataset.py

修改原因是目錄這塊存在bug,註釋:

  • assert os.path.exists(self._cls_path)
  • assert os.path.exists(self._img_root)

新增

  • self._cls_path=os.path.join(self._img_root,self._cls_path)

否則不能使用相對路徑

``` class ImageNetDataset(CommonDataset): def _load_anno(self, seed=None): 會對目錄進行檢測,如果cls_path使用相對目錄,就會報錯,在此註釋掉,並修改為self._cls_path=os.path.join(self._img_root,self._cls_path) # assert os.path.exists(self._cls_path) # assert os.path.exists(self._img_root) self._cls_path=os.path.join(self._img_root,self._cls_path) print('self._cls_path',self._cls_path) self.images = [] self.labels = []

    with open(self._cls_path) as fd:
        lines = fd.readlines()
        if seed is not None:
            np.random.RandomState(seed).shuffle(lines)
        for l in lines:
            l = l.strip().split(" ")
            self.images.append(os.path.join(self._img_root, l[0]))
            self.labels.append(int(l[1]))
            assert os.path.exists(self.images[-1])

```

2.修改配置檔案

```

global configs

Global: checkpoints: null pretrained_model: null output_dir: ./output/ # gpu或cpu配置 device: gpu # 分類數量 class_num: 102 # 儲存間隔 save_interval: 5 # 是否再訓練立案過程中進行eval eval_during_train: True # eval間隔 eval_interval: 5 # 訓練輪數 epochs: 20 # 列印batch step設定 print_batch_step: 10 # 是否使用visualdl use_visualdl: False # used for static mode and model export image_shape: [3, 224, 224] # 儲存地址 save_inference_dir: ./inference

model architecture

Arch: name: ResNet50_vd

loss function config for traing/eval process

Loss: Train: - CELoss: weight: 1.0 Eval: - CELoss: weight: 1.0

Optimizer: name: Momentum momentum: 0.9 lr: name: Cosine learning_rate: 0.0125 warmup_epoch: 5 regularizer: name: 'L2' coeff: 0.00001

data loader for train and eval

DataLoader: Train: dataset: name: ImageNetDataset image_root: /home/aistudio/data/oxford-102-flowers/oxford-102-flowers/ cls_label_path: train.txt transform_ops: - DecodeImage: to_rgb: True channel_first: False - RandCropImage: size: 224 - RandFlipImage: flip_code: 1 - NormalizeImage: scale: 1.0/255.0 mean: [0.485, 0.456, 0.406] std: [0.229, 0.224, 0.225] order: ''

sampler:
  name: DistributedBatchSampler
  batch_size: 256
  drop_last: False
  shuffle: True
loader:
  num_workers: 4
  use_shared_memory: True

Eval: dataset: name: ImageNetDataset image_root: /home/aistudio/data/oxford-102-flowers/oxford-102-flowers/ cls_label_path: valid.txt transform_ops: - DecodeImage: to_rgb: True channel_first: False - ResizeImage: resize_short: 256 - CropImage: size: 224 - NormalizeImage: scale: 1.0/255.0 mean: [0.485, 0.456, 0.406] std: [0.229, 0.224, 0.225] order: '' sampler: name: DistributedBatchSampler batch_size: 256 drop_last: False shuffle: False loader: num_workers: 4 use_shared_memory: True

Infer: infer_imgs: /home/aistudio/data/oxford-102-flowers/oxford-102-flowers/ batch_size: 10 transforms: - DecodeImage: to_rgb: True channel_first: False - ResizeImage: resize_short: 256 - CropImage: size: 224 - NormalizeImage: scale: 1.0/255.0 mean: [0.485, 0.456, 0.406] std: [0.229, 0.224, 0.225] order: '' - ToCHWImage: PostProcess: name: Topk topk: 5 class_id_map_file: /home/aistudio/data/oxford-102-flowers/oxford-102-flowers/jpg/image_00030.jpg

Metric: Train: - TopkAcc: topk: [1, 5] Eval: - TopkAcc: topk: [1, 5] ```

  • -c 引數是指定訓練的配置檔案路徑,訓練的具體超引數可檢視yaml檔案
  • yaml文Global.device 引數設定為cpu,即使用CPU進行訓練(若不設定,此引數預設為True)
  • yaml檔案中epochs引數設定為20,說明對整個資料集進行20個epoch迭代,預計訓練20分鐘左右(不同CPU,訓練時間略有不同),此時訓練模型不充分。若提高訓練模型精度,請將此引數設大,如40,訓練時間也會相應延長

3.配置說明

3.1 全域性配置(Global)

| 引數名字 | 具體含義 | 預設值 | 可選值 | |:------------------:|:-------------------:|:----------------:|:-----------------:| | checkpoints | 斷點模型路徑,用於恢復訓練 | null | str | | pretrained_model | 預訓練模型路徑 | null | str | | output_dir | 儲存模型路徑 | "./output/" | str | | save_interval | 每隔多少個epoch儲存模型 | 1 | int | | eval_during_train | 是否在訓練時進行評估 | True | bool | | eval_interval | 每隔多少個epoch進行模型評估 | 1 | int | | epochs | 訓練總epoch數 | | int | | print_batch_step | 每隔多少個mini-batch列印輸出 | 10 | int | | use_visualdl | 是否是用visualdl視覺化訓練過程 | False | bool | | image_shape | 圖片大小 | [3,224,224] | list, shape: (3,) | | save_inference_dir | inference模型的儲存路徑 | "./inference" | str | | eval_mode | eval的模式 | "classification" | "retrieval" |

3.2 結構(Arch)

| 引數名字 | 具體含義 | 預設值 | 可選值 | |:----------:|:------:|:--------:|:-----------------:| | name | 模型結構名字 | ResNet50 | PaddleClas提供的模型結構 | | class_num | 分類數 | 1000 | int | | pretrained | 預訓練模型 | False | bool, str |

3.3 損失函式(Loss)

| 引數名字 | 具體含義 | 預設值 | 可選值 | |:--------------:|:----------------------------:|:---:|:-----------:| | CELoss | 交叉熵損失函式 | —— | —— | | CELoss.weight | CELoss的在整個Loss中的權重 | 1.0 | float | | CELoss.epsilon | CELoss中label_smooth的epsilon值 | 0.1 | float,0-1之間 |

3.4 優化器(Optimizer)

| 引數名字 | 具體含義 | 預設值 | 可選值 | |:-----------------:|:---------:|:----------:|:---------------------------:| | name | 優化器方法名 | "Momentum" | "RmsProp"等其他優化器 | | momentum | momentum值 | 0.9 | float | | lr.name | 學習率下降方式 | "Cosine" | "Linear"、"Piecewise"等其他下降方式 | | lr.learning_rate | 學習率初始值 | 0.1 | float | | lr.warmup_epoch | warmup輪數 | 0 | int,如5 | | regularizer.name | 正則化方法名 | "L2" | ["L1", "L2"] | | regularizer.coeff | 正則化係數 | 0.00007 | float |

4.訓練

python !pwd !cp ~/ResNet50_vd.yaml ./ppcls/configs/quick_start/ResNet50_vd.yaml !cp ~/imagenet_dataset.py ./ppcls/data/dataloader/imagenet_dataset.py

/home/aistudio/PaddleClas

```python

GPU設定

!export CUDA_VISIBLE_DEVICES=0

-o Arch.pretrained=True 使用預訓練模型,當選擇為True時,預訓練權重會自動下載到本地

!python tools/train.py -c ./ppcls/configs/quick_start/ResNet50_vd.yaml -o Arch.pretrained=True ```

A new filed (pretrained) detected!
[2022/04/04 17:51:03] root INFO: 
===========================================================
==        PaddleClas is powered by PaddlePaddle !        ==
===========================================================
==                                                       ==
==   For more info please go to the following website.   ==
==                                                       ==
==       http://github.com/PaddlePaddle/PaddleClas      ==
===========================================================

[2022/04/04 17:51:03] root INFO: Arch : 
[2022/04/04 17:51:03] root INFO:     name : ResNet50_vd
[2022/04/04 17:51:03] root INFO:     pretrained : True
[2022/04/04 17:51:03] root INFO: DataLoader : 
[2022/04/04 17:51:03] root INFO:     Eval : 
[2022/04/04 17:51:03] root INFO:         dataset : 
[2022/04/04 17:51:03] root INFO:             cls_label_path : valid.txt
[2022/04/04 17:51:03] root INFO:             image_root : /home/aistudio/data/oxford-102-flowers/oxford-102-flowers/
[2022/04/04 17:51:03] root INFO:             name : ImageNetDataset
[2022/04/04 17:51:03] root INFO:             transform_ops : 
[2022/04/04 17:51:03] root INFO:                 DecodeImage : 
[2022/04/04 17:51:03] root INFO:                     channel_first : False
[2022/04/04 17:51:03] root INFO:                     to_rgb : True
[2022/04/04 17:51:03] root INFO:                 ResizeImage : 
[2022/04/04 17:51:03] root INFO:                     resize_short : 256
[2022/04/04 17:51:03] root INFO:                 CropImage : 
[2022/04/04 17:51:03] root INFO:                     size : 224
[2022/04/04 17:51:03] root INFO:                 NormalizeImage : 
[2022/04/04 17:51:03] root INFO:                     mean : [0.485, 0.456, 0.406]
[2022/04/04 17:51:03] root INFO:                     order : 
[2022/04/04 17:51:03] root INFO:                     scale : 1.0/255.0
[2022/04/04 17:51:03] root INFO:                     std : [0.229, 0.224, 0.225]
[2022/04/04 17:51:03] root INFO:         loader : 
[2022/04/04 17:51:03] root INFO:             num_workers : 4
[2022/04/04 17:51:03] root INFO:             use_shared_memory : True
[2022/04/04 17:51:03] root INFO:         sampler : 
[2022/04/04 17:51:03] root INFO:             batch_size : 128
[2022/04/04 17:51:03] root INFO:             drop_last : False
[2022/04/04 17:51:03] root INFO:             name : DistributedBatchSampler
[2022/04/04 17:51:03] root INFO:             shuffle : False
[2022/04/04 17:51:03] root INFO:     Train : 
[2022/04/04 17:51:03] root INFO:         dataset : 
[2022/04/04 17:51:03] root INFO:             cls_label_path : train.txt
[2022/04/04 17:51:03] root INFO:             image_root : /home/aistudio/data/oxford-102-flowers/oxford-102-flowers/
[2022/04/04 17:51:03] root INFO:             name : ImageNetDataset
[2022/04/04 17:51:03] root INFO:             transform_ops : 
[2022/04/04 17:51:03] root INFO:                 DecodeImage : 
[2022/04/04 17:51:03] root INFO:                     channel_first : False
[2022/04/04 17:51:03] root INFO:                     to_rgb : True
[2022/04/04 17:51:03] root INFO:                 RandCropImage : 
[2022/04/04 17:51:03] root INFO:                     size : 224
[2022/04/04 17:51:03] root INFO:                 RandFlipImage : 
[2022/04/04 17:51:03] root INFO:                     flip_code : 1
[2022/04/04 17:51:03] root INFO:                 NormalizeImage : 
[2022/04/04 17:51:03] root INFO:                     mean : [0.485, 0.456, 0.406]
[2022/04/04 17:51:03] root INFO:                     order : 
[2022/04/04 17:51:03] root INFO:                     scale : 1.0/255.0
[2022/04/04 17:51:03] root INFO:                     std : [0.229, 0.224, 0.225]
[2022/04/04 17:51:03] root INFO:         loader : 
[2022/04/04 17:51:03] root INFO:             num_workers : 4
[2022/04/04 17:51:03] root INFO:             use_shared_memory : True
[2022/04/04 17:51:03] root INFO:         sampler : 
[2022/04/04 17:51:03] root INFO:             batch_size : 128
[2022/04/04 17:51:03] root INFO:             drop_last : False
[2022/04/04 17:51:03] root INFO:             name : DistributedBatchSampler
[2022/04/04 17:51:03] root INFO:             shuffle : True
[2022/04/04 17:51:03] root INFO: Global : 
[2022/04/04 17:51:03] root INFO:     checkpoints : None
[2022/04/04 17:51:03] root INFO:     class_num : 102
[2022/04/04 17:51:03] root INFO:     device : gpu
[2022/04/04 17:51:03] root INFO:     epochs : 20
[2022/04/04 17:51:03] root INFO:     eval_during_train : True
[2022/04/04 17:51:03] root INFO:     eval_interval : 5
[2022/04/04 17:51:03] root INFO:     image_shape : [3, 224, 224]
[2022/04/04 17:51:03] root INFO:     output_dir : ./output/
[2022/04/04 17:51:03] root INFO:     pretrained_model : None
[2022/04/04 17:51:03] root INFO:     print_batch_step : 10
[2022/04/04 17:51:03] root INFO:     save_inference_dir : ./inference
[2022/04/04 17:51:03] root INFO:     save_interval : 5
[2022/04/04 17:51:03] root INFO:     use_visualdl : False
[2022/04/04 17:51:03] root INFO: Infer : 
[2022/04/04 17:51:03] root INFO:     PostProcess : 
[2022/04/04 17:51:03] root INFO:         class_id_map_file : /home/aistudio/data/oxford-102-flowers/oxford-102-flowers/jpg/image_00030.jpg
[2022/04/04 17:51:03] root INFO:         name : Topk
[2022/04/04 17:51:03] root INFO:         topk : 5
[2022/04/04 17:51:03] root INFO:     batch_size : 10
[2022/04/04 17:51:03] root INFO:     infer_imgs : /home/aistudio/data/oxford-102-flowers/oxford-102-flowers/
[2022/04/04 17:51:03] root INFO:     transforms : 
[2022/04/04 17:51:03] root INFO:         DecodeImage : 
[2022/04/04 17:51:03] root INFO:             channel_first : False
[2022/04/04 17:51:03] root INFO:             to_rgb : True
[2022/04/04 17:51:03] root INFO:         ResizeImage : 
[2022/04/04 17:51:03] root INFO:             resize_short : 256
[2022/04/04 17:51:03] root INFO:         CropImage : 
[2022/04/04 17:51:03] root INFO:             size : 224
[2022/04/04 17:51:03] root INFO:         NormalizeImage : 
[2022/04/04 17:51:03] root INFO:             mean : [0.485, 0.456, 0.406]
[2022/04/04 17:51:03] root INFO:             order : 
[2022/04/04 17:51:03] root INFO:             scale : 1.0/255.0
[2022/04/04 17:51:03] root INFO:             std : [0.229, 0.224, 0.225]
[2022/04/04 17:51:03] root INFO:         ToCHWImage : None
[2022/04/04 17:51:03] root INFO: Loss : 
[2022/04/04 17:51:03] root INFO:     Eval : 
[2022/04/04 17:51:03] root INFO:         CELoss : 
[2022/04/04 17:51:03] root INFO:             weight : 1.0
[2022/04/04 17:51:03] root INFO:     Train : 
[2022/04/04 17:51:03] root INFO:         CELoss : 
[2022/04/04 17:51:03] root INFO:             weight : 1.0
[2022/04/04 17:51:03] root INFO: Metric : 
[2022/04/04 17:51:03] root INFO:     Eval : 
[2022/04/04 17:51:03] root INFO:         TopkAcc : 
[2022/04/04 17:51:03] root INFO:             topk : [1, 5]
[2022/04/04 17:51:03] root INFO:     Train : 
[2022/04/04 17:51:03] root INFO:         TopkAcc : 
[2022/04/04 17:51:03] root INFO:             topk : [1, 5]
[2022/04/04 17:51:03] root INFO: Optimizer : 
[2022/04/04 17:51:03] root INFO:     lr : 
[2022/04/04 17:51:03] root INFO:         learning_rate : 0.0125
[2022/04/04 17:51:03] root INFO:         name : Cosine
[2022/04/04 17:51:03] root INFO:         warmup_epoch : 5
[2022/04/04 17:51:03] root INFO:     momentum : 0.9
[2022/04/04 17:51:03] root INFO:     name : Momentum
[2022/04/04 17:51:03] root INFO:     regularizer : 
[2022/04/04 17:51:03] root INFO:         coeff : 1e-05
[2022/04/04 17:51:03] root INFO:         name : L2
[2022/04/04 17:51:03] root INFO: profiler_options : None
[2022/04/04 17:51:03] root INFO: train with paddle 2.1.2 and device CUDAPlace(0)
[2022/04/04 17:51:03] root WARNING: The Global.class_num will be deprecated. Please use Arch.class_num instead. Arch.class_num has been set to 102.
self._cls_path /home/aistudio/data/oxford-102-flowers/oxford-102-flowers/train.txt
self._cls_path /home/aistudio/data/oxford-102-flowers/oxford-102-flowers/valid.txt
[2022/04/04 17:51:03] root WARNING: 'TopkAcc' metric can not be used when setting 'batch_transform_ops' in config. The 'TopkAcc' metric has been removed.
W0404 17:51:03.718078   846 device_context.cc:404] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W0404 17:51:03.723338   846 device_context.cc:422] device: 0, cuDNN Version: 7.6.
[2022/04/04 17:51:08] root INFO: unique_endpoints {''}
[2022/04/04 17:51:08] root INFO: Found /home/aistudio/.paddleclas/weights/ResNet50_vd_pretrained.pdparams
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/layers.py:1301: UserWarning: Skip loading for fc.weight. fc.weight receives a shape [2048, 1000], but the expected shape is [2048, 102].
  warnings.warn(("Skip loading for {}. ".format(key) + str(err)))
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/layers.py:1301: UserWarning: Skip loading for fc.bias. fc.bias receives a shape [1000], but the expected shape is [102].
  warnings.warn(("Skip loading for {}. ".format(key) + str(err)))
[2022/04/04 17:51:09] root WARNING: The training strategy in config files provided by PaddleClas is based on 4 gpus. But the number of gpus is 1 in current training. Please modify the stategy (learning rate, batch size and so on) if use config files in PaddleClas to train.
[2022/04/04 17:51:12] root INFO: [Train][Epoch 1/20][Iter: 0/8]lr: 0.00031, CELoss: 4.64081, loss: 4.64081, batch_cost: 3.14893s, reader_cost: 2.57331, ips: 40.64869 images/sec, eta: 0:08:23
[2022/04/04 17:51:16] root INFO: [Train][Epoch 1/20][Avg]CELoss: 4.64772, loss: 4.64772
[2022/04/04 17:51:16] root INFO: Already save model in ./output/ResNet50_vd/latest
[2022/04/04 17:51:19] root INFO: [Train][Epoch 2/20][Iter: 0/8]lr: 0.00281, CELoss: 4.61437, loss: 4.61437, batch_cost: 1.05037s, reader_cost: 0.63829, ips: 121.86160 images/sec, eta: 0:02:39
[2022/04/04 17:51:22] root INFO: [Train][Epoch 2/20][Avg]CELoss: 4.58869, loss: 4.58869
[2022/04/04 17:51:23] root INFO: Already save model in ./output/ResNet50_vd/latest
[2022/04/04 17:51:26] root INFO: [Train][Epoch 3/20][Iter: 0/8]lr: 0.00531, CELoss: 4.55260, loss: 4.55260, batch_cost: 1.19191s, reader_cost: 0.78459, ips: 107.39076 images/sec, eta: 0:02:51
[2022/04/04 17:51:30] root INFO: [Train][Epoch 3/20][Avg]CELoss: 4.45869, loss: 4.45869
[2022/04/04 17:51:30] root INFO: Already save model in ./output/ResNet50_vd/latest
[2022/04/04 17:51:33] root INFO: [Train][Epoch 4/20][Iter: 0/8]lr: 0.00781, CELoss: 4.32414, loss: 4.32414, batch_cost: 0.95354s, reader_cost: 0.56087, ips: 134.23697 images/sec, eta: 0:02:09
[2022/04/04 17:51:36] root INFO: [Train][Epoch 4/20][Avg]CELoss: 4.16781, loss: 4.16781
[2022/04/04 17:51:37] root INFO: Already save model in ./output/ResNet50_vd/latest
[2022/04/04 17:51:39] root INFO: [Train][Epoch 5/20][Iter: 0/8]lr: 0.01031, CELoss: 3.81278, loss: 3.81278, batch_cost: 0.97704s, reader_cost: 0.57012, ips: 131.00846 images/sec, eta: 0:02:05
[2022/04/04 17:51:43] root INFO: [Train][Epoch 5/20][Avg]CELoss: 3.64121, loss: 3.64121
[2022/04/04 17:51:46] root INFO: [Eval][Epoch 5][Iter: 0/8]CELoss: 3.10458, loss: 3.10458, top1: 0.62500, top5: 0.84375, batch_cost: 2.88314s, reader_cost: 2.69916, ips: 44.39597 images/sec
[2022/04/04 17:51:49] root INFO: [Eval][Epoch 5][Avg]CELoss: 3.06763, loss: 3.06763, top1: 0.58627, top5: 0.83039
[2022/04/04 17:51:49] root INFO: Already save model in ./output/ResNet50_vd/best_model
[2022/04/04 17:51:49] root INFO: [Eval][Epoch 5][best metric: 0.586274507933972]
[2022/04/04 17:51:50] root INFO: Already save model in ./output/ResNet50_vd/epoch_5
[2022/04/04 17:51:50] root INFO: Already save model in ./output/ResNet50_vd/latest
[2022/04/04 17:51:53] root INFO: [Train][Epoch 6/20][Iter: 0/8]lr: 0.01250, CELoss: 3.23097, loss: 3.23097, batch_cost: 1.12798s, reader_cost: 0.72043, ips: 113.47702 images/sec, eta: 0:02:15
[2022/04/04 17:51:56] root INFO: [Train][Epoch 6/20][Avg]CELoss: 2.82732, loss: 2.82732
[2022/04/04 17:51:57] root INFO: Already save model in ./output/ResNet50_vd/latest
[2022/04/04 17:52:00] root INFO: [Train][Epoch 7/20][Iter: 0/8]lr: 0.01233, CELoss: 2.31577, loss: 2.31577, batch_cost: 0.97315s, reader_cost: 0.58090, ips: 131.53180 images/sec, eta: 0:01:48
[2022/04/04 17:52:03] root INFO: [Train][Epoch 7/20][Avg]CELoss: 2.02123, loss: 2.02123
[2022/04/04 17:52:04] root INFO: Already save model in ./output/ResNet50_vd/latest
[2022/04/04 17:52:06] root INFO: [Train][Epoch 8/20][Iter: 0/8]lr: 0.01189, CELoss: 1.60169, loss: 1.60169, batch_cost: 0.96181s, reader_cost: 0.56401, ips: 133.08299 images/sec, eta: 0:01:40
[2022/04/04 17:52:10] root INFO: [Train][Epoch 8/20][Avg]CELoss: 1.38111, loss: 1.38111
[2022/04/04 17:52:10] root INFO: Already save model in ./output/ResNet50_vd/latest
[2022/04/04 17:52:13] root INFO: [Train][Epoch 9/20][Iter: 0/8]lr: 0.01121, CELoss: 1.10794, loss: 1.10794, batch_cost: 1.00229s, reader_cost: 0.59248, ips: 127.70792 images/sec, eta: 0:01:36
[2022/04/04 17:52:16] root INFO: [Train][Epoch 9/20][Avg]CELoss: 0.93859, loss: 0.93859
[2022/04/04 17:52:17] root INFO: Already save model in ./output/ResNet50_vd/latest
[2022/04/04 17:52:20] root INFO: [Train][Epoch 10/20][Iter: 0/8]lr: 0.01031, CELoss: 0.78641, loss: 0.78641, batch_cost: 1.16687s, reader_cost: 0.75940, ips: 109.69474 images/sec, eta: 0:01:42
[2022/04/04 17:52:23] root INFO: [Train][Epoch 10/20][Avg]CELoss: 0.66623, loss: 0.66623
[2022/04/04 17:52:27] root INFO: [Eval][Epoch 10][Iter: 0/8]CELoss: 0.75807, loss: 0.75807, top1: 0.85938, top5: 0.95312, batch_cost: 3.28170s, reader_cost: 3.07438, ips: 39.00414 images/sec
[2022/04/04 17:52:29] root INFO: [Eval][Epoch 10][Avg]CELoss: 0.66149, loss: 0.66149, top1: 0.89118, top5: 0.97647
[2022/04/04 17:52:30] root INFO: Already save model in ./output/ResNet50_vd/best_model
[2022/04/04 17:52:30] root INFO: [Eval][Epoch 10][best metric: 0.8911764738606471]
[2022/04/04 17:52:30] root INFO: Already save model in ./output/ResNet50_vd/epoch_10
[2022/04/04 17:52:31] root INFO: Already save model in ./output/ResNet50_vd/latest
[2022/04/04 17:52:33] root INFO: [Train][Epoch 11/20][Iter: 0/8]lr: 0.00923, CELoss: 0.42259, loss: 0.42259, batch_cost: 0.98574s, reader_cost: 0.57787, ips: 129.85227 images/sec, eta: 0:01:18
[2022/04/04 17:52:37] root INFO: [Train][Epoch 11/20][Avg]CELoss: 0.48286, loss: 0.48286
[2022/04/04 17:52:37] root INFO: Already save model in ./output/ResNet50_vd/latest
[2022/04/04 17:52:40] root INFO: [Train][Epoch 12/20][Iter: 0/8]lr: 0.00803, CELoss: 0.42716, loss: 0.42716, batch_cost: 1.01280s, reader_cost: 0.57595, ips: 126.38195 images/sec, eta: 0:01:12
[2022/04/04 17:52:44] root INFO: [Train][Epoch 12/20][Avg]CELoss: 0.35100, loss: 0.35100
[2022/04/04 17:52:44] root INFO: Already save model in ./output/ResNet50_vd/latest
[2022/04/04 17:52:47] root INFO: [Train][Epoch 13/20][Iter: 0/8]lr: 0.00674, CELoss: 0.27117, loss: 0.27117, batch_cost: 0.95948s, reader_cost: 0.56412, ips: 133.40572 images/sec, eta: 0:01:01
[2022/04/04 17:52:50] root INFO: [Train][Epoch 13/20][Avg]CELoss: 0.31605, loss: 0.31605
[2022/04/04 17:52:51] root INFO: Already save model in ./output/ResNet50_vd/latest
[2022/04/04 17:52:54] root INFO: [Train][Epoch 14/20][Iter: 0/8]lr: 0.00543, CELoss: 0.28394, loss: 0.28394, batch_cost: 1.13772s, reader_cost: 0.72433, ips: 112.50533 images/sec, eta: 0:01:03
[2022/04/04 17:52:57] root INFO: [Train][Epoch 14/20][Avg]CELoss: 0.26122, loss: 0.26122
[2022/04/04 17:52:58] root INFO: Already save model in ./output/ResNet50_vd/latest
[2022/04/04 17:53:01] root INFO: [Train][Epoch 15/20][Iter: 0/8]lr: 0.00416, CELoss: 0.16402, loss: 0.16402, batch_cost: 1.09271s, reader_cost: 0.68246, ips: 117.14036 images/sec, eta: 0:00:52
[2022/04/04 17:53:04] root INFO: [Train][Epoch 15/20][Avg]CELoss: 0.21305, loss: 0.21305
[2022/04/04 17:53:08] root INFO: [Eval][Epoch 15][Iter: 0/8]CELoss: 0.53277, loss: 0.53277, top1: 0.88281, top5: 0.94531, batch_cost: 3.47772s, reader_cost: 3.29045, ips: 36.80568 images/sec
[2022/04/04 17:53:10] root INFO: [Eval][Epoch 15][Avg]CELoss: 0.42379, loss: 0.42379, top1: 0.91863, top5: 0.98039
[2022/04/04 17:53:11] root INFO: Already save model in ./output/ResNet50_vd/best_model
[2022/04/04 17:53:11] root INFO: [Eval][Epoch 15][best metric: 0.9186274477079803]
[2022/04/04 17:53:11] root INFO: Already save model in ./output/ResNet50_vd/epoch_15
[2022/04/04 17:53:11] root INFO: Already save model in ./output/ResNet50_vd/latest
[2022/04/04 17:53:14] root INFO: [Train][Epoch 16/20][Iter: 0/8]lr: 0.00298, CELoss: 0.30324, loss: 0.30324, batch_cost: 0.98888s, reader_cost: 0.57842, ips: 129.43957 images/sec, eta: 0:00:39
[2022/04/04 17:53:18] root INFO: [Train][Epoch 16/20][Avg]CELoss: 0.22449, loss: 0.22449
[2022/04/04 17:53:18] root INFO: Already save model in ./output/ResNet50_vd/latest
[2022/04/04 17:53:21] root INFO: [Train][Epoch 17/20][Iter: 0/8]lr: 0.00195, CELoss: 0.19888, loss: 0.19888, batch_cost: 0.95664s, reader_cost: 0.56364, ips: 133.80189 images/sec, eta: 0:00:30
[2022/04/04 17:53:24] root INFO: [Train][Epoch 17/20][Avg]CELoss: 0.24154, loss: 0.24154
[2022/04/04 17:53:25] root INFO: Already save model in ./output/ResNet50_vd/latest
[2022/04/04 17:53:28] root INFO: [Train][Epoch 18/20][Iter: 0/8]lr: 0.00110, CELoss: 0.26926, loss: 0.26926, batch_cost: 1.14401s, reader_cost: 0.73260, ips: 111.88671 images/sec, eta: 0:00:27
[2022/04/04 17:53:31] root INFO: [Train][Epoch 18/20][Avg]CELoss: 0.23758, loss: 0.23758
[2022/04/04 17:53:32] root INFO: Already save model in ./output/ResNet50_vd/latest
[2022/04/04 17:53:35] root INFO: [Train][Epoch 19/20][Iter: 0/8]lr: 0.00048, CELoss: 0.31946, loss: 0.31946, batch_cost: 0.94231s, reader_cost: 0.54846, ips: 135.83640 images/sec, eta: 0:00:15
[2022/04/04 17:53:38] root INFO: [Train][Epoch 19/20][Avg]CELoss: 0.20997, loss: 0.20997
[2022/04/04 17:53:39] root INFO: Already save model in ./output/ResNet50_vd/latest
[2022/04/04 17:53:42] root INFO: [Train][Epoch 20/20][Iter: 0/8]lr: 0.00010, CELoss: 0.16348, loss: 0.16348, batch_cost: 1.05688s, reader_cost: 0.64513, ips: 121.11092 images/sec, eta: 0:00:08
[2022/04/04 17:53:45] root INFO: [Train][Epoch 20/20][Avg]CELoss: 0.20710, loss: 0.20710
[2022/04/04 17:53:48] root INFO: [Eval][Epoch 20][Iter: 0/8]CELoss: 0.51250, loss: 0.51250, top1: 0.89062, top5: 0.95312, batch_cost: 3.19902s, reader_cost: 2.99184, ips: 40.01228 images/sec
[2022/04/04 17:53:51] root INFO: [Eval][Epoch 20][Avg]CELoss: 0.40260, loss: 0.40260, top1: 0.92059, top5: 0.98235
[2022/04/04 17:53:52] root INFO: Already save model in ./output/ResNet50_vd/best_model
[2022/04/04 17:53:52] root INFO: [Eval][Epoch 20][best metric: 0.9205882329566806]
[2022/04/04 17:53:52] root INFO: Already save model in ./output/ResNet50_vd/epoch_20
[2022/04/04 17:53:52] root INFO: Already save model in ./output/ResNet50_vd/latest

訓練日誌如下

[2021/10/31 01:53:47] root INFO: [Train][Epoch 16/20][Iter: 0/4]lr: 0.00285, top1: 0.93750, top5: 0.96484, CELoss: 0.36489, loss: 0.36489, batch_cost: 1.48066s, reader_cost: 0.68550, ips: 172.89543 images/sec, eta: 0:00:29 [2021/10/31 01:53:49] root INFO: [Train][Epoch 16/20][Avg]top1: 0.95098, top5: 0.97745, CELoss: 0.31581, loss: 0.31581 [2021/10/31 01:53:53] root INFO: [Train][Epoch 17/20][Iter: 0/4]lr: 0.00183, top1: 0.94531, top5: 0.97656, CELoss: 0.32916, loss: 0.32916, batch_cost: 1.47958s, reader_cost: 0.68473, ips: 173.02266 images/sec, eta: 0:00:23 [2021/10/31 01:53:55] root INFO: [Train][Epoch 17/20][Avg]top1: 0.95686, top5: 0.98137, CELoss: 0.29560, loss: 0.29560 [2021/10/31 01:53:58] root INFO: [Train][Epoch 18/20][Iter: 0/4]lr: 0.00101, top1: 0.93750, top5: 0.98047, CELoss: 0.31542, loss: 0.31542, batch_cost: 1.47524s, reader_cost: 0.68058, ips: 173.53117 images/sec, eta: 0:00:17 [2021/10/31 01:54:01] root INFO: [Train][Epoch 18/20][Avg]top1: 0.94608, top5: 0.98627, CELoss: 0.29086, loss: 0.29086 [2021/10/31 01:54:04] root INFO: [Train][Epoch 19/20][Iter: 0/4]lr: 0.00042, top1: 0.97266, top5: 0.98438, CELoss: 0.24642, loss: 0.24642, batch_cost: 1.47376s, reader_cost: 0.67916, ips: 173.70590 images/sec, eta: 0:00:11 [2021/10/31 01:54:07] root INFO: [Train][Epoch 19/20][Avg]top1: 0.94608, top5: 0.97941, CELoss: 0.30998, loss: 0.30998 [2021/10/31 01:54:10] root INFO: [Train][Epoch 20/20][Iter: 0/4]lr: 0.00008, top1: 0.98047, top5: 0.98438, CELoss: 0.20209, loss: 0.20209, batch_cost: 1.47083s, reader_cost: 0.67647, ips: 174.05180 images/sec, eta: 0:00:05 [2021/10/31 01:54:13] root INFO: [Train][Epoch 20/20][Avg]top1: 0.95784, top5: 0.98922, CELoss: 0.25974, loss: 0.25974 [2021/10/31 01:54:16] root INFO: [Eval][Epoch 20][Iter: 0/4]CELoss: 0.47912, loss: 0.47912, top1: 0.91797, top5: 0.96094, batch_cost: 3.26175s, reader_cost: 3.02034, ips: 78.48538 images/sec [2021/10/31 01:54:17] root INFO: [Eval][Epoch 20][Avg]CELoss: 0.54982, loss: 0.54982, top1: 0.88922, top5: 0.96667 [2021/10/31 01:54:18] root INFO: Already save model in ./output/ResNet50_vd/best_model [2021/10/31 01:54:18] root INFO: [Eval][Epoch 20][best metric: 0.8892156844045601] [2021/10/31 01:54:18] root INFO: Already save model in ./output/ResNet50_vd/epoch_20 [2021/10/31 01:54:18] root INFO: Already save model in ./output/ResNet50_vd/latest

可見日誌輸出比較混亂,沒有以前那麼清晰,最好使用visualdl來檢視訓練情況

四、模型匯出

python !python tools/export_model.py \ -c ./ppcls/configs/quick_start/ResNet50_vd.yaml \ -o Global.pretrained_model=./output/ResNet50_vd/best_model \ -o Global.save_inference_dir=./deploy/models/class_ResNet50_vd_ImageNet_infer

[2022/04/04 18:13:38] root INFO: 
===========================================================
==        PaddleClas is powered by PaddlePaddle !        ==
===========================================================
==                                                       ==
==   For more info please go to the following website.   ==
==                                                       ==
==       http://github.com/PaddlePaddle/PaddleClas      ==
===========================================================

[2022/04/04 18:13:38] root INFO: Arch : 
[2022/04/04 18:13:38] root INFO:     name : ResNet50_vd
[2022/04/04 18:13:38] root INFO: DataLoader : 
[2022/04/04 18:13:38] root INFO:     Eval : 
[2022/04/04 18:13:38] root INFO:         dataset : 
[2022/04/04 18:13:38] root INFO:             cls_label_path : valid.txt
[2022/04/04 18:13:38] root INFO:             image_root : /home/aistudio/data/oxford-102-flowers/oxford-102-flowers/
[2022/04/04 18:13:38] root INFO:             name : ImageNetDataset
[2022/04/04 18:13:38] root INFO:             transform_ops : 
[2022/04/04 18:13:38] root INFO:                 DecodeImage : 
[2022/04/04 18:13:38] root INFO:                     channel_first : False
[2022/04/04 18:13:38] root INFO:                     to_rgb : True
[2022/04/04 18:13:38] root INFO:                 ResizeImage : 
[2022/04/04 18:13:38] root INFO:                     resize_short : 256
[2022/04/04 18:13:38] root INFO:                 CropImage : 
[2022/04/04 18:13:38] root INFO:                     size : 224
[2022/04/04 18:13:38] root INFO:                 NormalizeImage : 
[2022/04/04 18:13:38] root INFO:                     mean : [0.485, 0.456, 0.406]
[2022/04/04 18:13:38] root INFO:                     order : 
[2022/04/04 18:13:38] root INFO:                     scale : 1.0/255.0
[2022/04/04 18:13:38] root INFO:                     std : [0.229, 0.224, 0.225]
[2022/04/04 18:13:38] root INFO:         loader : 
[2022/04/04 18:13:38] root INFO:             num_workers : 4
[2022/04/04 18:13:38] root INFO:             use_shared_memory : True
[2022/04/04 18:13:38] root INFO:         sampler : 
[2022/04/04 18:13:38] root INFO:             batch_size : 128
[2022/04/04 18:13:38] root INFO:             drop_last : False
[2022/04/04 18:13:38] root INFO:             name : DistributedBatchSampler
[2022/04/04 18:13:38] root INFO:             shuffle : False
[2022/04/04 18:13:38] root INFO:     Train : 
[2022/04/04 18:13:38] root INFO:         dataset : 
[2022/04/04 18:13:38] root INFO:             cls_label_path : train.txt
[2022/04/04 18:13:38] root INFO:             image_root : /home/aistudio/data/oxford-102-flowers/oxford-102-flowers/
[2022/04/04 18:13:38] root INFO:             name : ImageNetDataset
[2022/04/04 18:13:38] root INFO:             transform_ops : 
[2022/04/04 18:13:38] root INFO:                 DecodeImage : 
[2022/04/04 18:13:38] root INFO:                     channel_first : False
[2022/04/04 18:13:38] root INFO:                     to_rgb : True
[2022/04/04 18:13:38] root INFO:                 RandCropImage : 
[2022/04/04 18:13:38] root INFO:                     size : 224
[2022/04/04 18:13:38] root INFO:                 RandFlipImage : 
[2022/04/04 18:13:38] root INFO:                     flip_code : 1
[2022/04/04 18:13:38] root INFO:                 NormalizeImage : 
[2022/04/04 18:13:38] root INFO:                     mean : [0.485, 0.456, 0.406]
[2022/04/04 18:13:38] root INFO:                     order : 
[2022/04/04 18:13:38] root INFO:                     scale : 1.0/255.0
[2022/04/04 18:13:38] root INFO:                     std : [0.229, 0.224, 0.225]
[2022/04/04 18:13:38] root INFO:         loader : 
[2022/04/04 18:13:38] root INFO:             num_workers : 4
[2022/04/04 18:13:38] root INFO:             use_shared_memory : True
[2022/04/04 18:13:38] root INFO:         sampler : 
[2022/04/04 18:13:38] root INFO:             batch_size : 128
[2022/04/04 18:13:38] root INFO:             drop_last : False
[2022/04/04 18:13:38] root INFO:             name : DistributedBatchSampler
[2022/04/04 18:13:38] root INFO:             shuffle : True
[2022/04/04 18:13:38] root INFO: Global : 
[2022/04/04 18:13:38] root INFO:     checkpoints : None
[2022/04/04 18:13:38] root INFO:     class_num : 102
[2022/04/04 18:13:38] root INFO:     device : gpu
[2022/04/04 18:13:38] root INFO:     epochs : 20
[2022/04/04 18:13:38] root INFO:     eval_during_train : True
[2022/04/04 18:13:38] root INFO:     eval_interval : 5
[2022/04/04 18:13:38] root INFO:     image_shape : [3, 224, 224]
[2022/04/04 18:13:38] root INFO:     output_dir : ./output/
[2022/04/04 18:13:38] root INFO:     pretrained_model : ./output/ResNet50_vd/best_model
[2022/04/04 18:13:38] root INFO:     print_batch_step : 10
[2022/04/04 18:13:38] root INFO:     save_inference_dir : ./deploy/models/class_ResNet50_vd_ImageNet_infer
[2022/04/04 18:13:38] root INFO:     save_interval : 5
[2022/04/04 18:13:38] root INFO:     use_visualdl : False
[2022/04/04 18:13:38] root INFO: Infer : 
[2022/04/04 18:13:38] root INFO:     PostProcess : 
[2022/04/04 18:13:38] root INFO:         class_id_map_file : /home/aistudio/data/oxford-102-flowers/oxford-102-flowers/jpg/image_00030.jpg
[2022/04/04 18:13:38] root INFO:         name : Topk
[2022/04/04 18:13:38] root INFO:         topk : 5
[2022/04/04 18:13:38] root INFO:     batch_size : 10
[2022/04/04 18:13:38] root INFO:     infer_imgs : /home/aistudio/data/oxford-102-flowers/oxford-102-flowers/
[2022/04/04 18:13:38] root INFO:     transforms : 
[2022/04/04 18:13:38] root INFO:         DecodeImage : 
[2022/04/04 18:13:38] root INFO:             channel_first : False
[2022/04/04 18:13:38] root INFO:             to_rgb : True
[2022/04/04 18:13:38] root INFO:         ResizeImage : 
[2022/04/04 18:13:38] root INFO:             resize_short : 256
[2022/04/04 18:13:38] root INFO:         CropImage : 
[2022/04/04 18:13:38] root INFO:             size : 224
[2022/04/04 18:13:38] root INFO:         NormalizeImage : 
[2022/04/04 18:13:38] root INFO:             mean : [0.485, 0.456, 0.406]
[2022/04/04 18:13:38] root INFO:             order : 
[2022/04/04 18:13:38] root INFO:             scale : 1.0/255.0
[2022/04/04 18:13:38] root INFO:             std : [0.229, 0.224, 0.225]
[2022/04/04 18:13:38] root INFO:         ToCHWImage : None
[2022/04/04 18:13:38] root INFO: Loss : 
[2022/04/04 18:13:38] root INFO:     Eval : 
[2022/04/04 18:13:38] root INFO:         CELoss : 
[2022/04/04 18:13:38] root INFO:             weight : 1.0
[2022/04/04 18:13:38] root INFO:     Train : 
[2022/04/04 18:13:38] root INFO:         CELoss : 
[2022/04/04 18:13:38] root INFO:             weight : 1.0
[2022/04/04 18:13:38] root INFO: Metric : 
[2022/04/04 18:13:38] root INFO:     Eval : 
[2022/04/04 18:13:38] root INFO:         TopkAcc : 
[2022/04/04 18:13:38] root INFO:             topk : [1, 5]
[2022/04/04 18:13:38] root INFO:     Train : 
[2022/04/04 18:13:38] root INFO:         TopkAcc : 
[2022/04/04 18:13:38] root INFO:             topk : [1, 5]
[2022/04/04 18:13:38] root INFO: Optimizer : 
[2022/04/04 18:13:38] root INFO:     lr : 
[2022/04/04 18:13:38] root INFO:         learning_rate : 0.0125
[2022/04/04 18:13:38] root INFO:         name : Cosine
[2022/04/04 18:13:38] root INFO:         warmup_epoch : 5
[2022/04/04 18:13:38] root INFO:     momentum : 0.9
[2022/04/04 18:13:38] root INFO:     name : Momentum
[2022/04/04 18:13:38] root INFO:     regularizer : 
[2022/04/04 18:13:38] root INFO:         coeff : 1e-05
[2022/04/04 18:13:38] root INFO:         name : L2
[2022/04/04 18:13:38] root INFO: train with paddle 2.1.2 and device CUDAPlace(0)
[2022/04/04 18:13:38] root WARNING: The Global.class_num will be deprecated. Please use Arch.class_num instead. Arch.class_num has been set to 102.
W0404 18:13:38.957692  2099 device_context.cc:404] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W0404 18:13:38.962862  2099 device_context.cc:422] device: 0, cuDNN Version: 7.6.
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/layers/utils.py:77: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  return (isinstance(seq, collections.Sequence) and

python !ls ./deploy/models/class_ResNet50_vd_ImageNet_infer -la

total 93944
drwxr-xr-x 2 aistudio aistudio     4096 Apr  4 18:13 .
drwxr-xr-x 3 aistudio aistudio     4096 Apr  4 18:13 ..
-rw-r--r-- 1 aistudio aistudio 95165295 Apr  4 18:13 inference.pdiparams
-rw-r--r-- 1 aistudio aistudio    23453 Apr  4 18:13 inference.pdiparams.info
-rw-r--r-- 1 aistudio aistudio   996386 Apr  4 18:13 inference.pdmodel

五、OpenVINO預測

鑑於AiStudio無法使用最新版OpenVINO,在本地跑完後上傳

1.OpenVINO安裝

此處要注意,使用最新版的OpenVINO,目前最新版為2022.1.0

python !pip install OpenVINO

Looking in indexes: http://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: OpenVINO in c:\miniconda3\envs\p2g\lib\site-packages (2022.1.0)
Requirement already satisfied: numpy<1.20,>=1.16.6 in c:\miniconda3\envs\p2g\lib\site-packages (from OpenVINO) (1.19.3)

2.Import

匯入必須的OpenVINO庫

```python

model download

from pathlib import Path import os import urllib.request import tarfile

inference

from openvino.runtime import Core

preprocessing

import cv2 import numpy as np from openvino.preprocess import PrePostProcessor, ResizeAlgorithm from openvino.runtime import Layout, Type, AsyncInferQueue, PartialShape

results visualization

import time import json from IPython.display import Image ```

3.預處理

3.1生成花分類字典

python flowers_classes={} for i in range(102): flowers_classes[str(i)]='flower_'+ str(i) print(flowers_classes)

{'0': 'flower_0', '1': 'flower_1', '2': 'flower_2', '3': 'flower_3', '4': 'flower_4', '5': 'flower_5', '6': 'flower_6', '7': 'flower_7', '8': 'flower_8', '9': 'flower_9', '10': 'flower_10', '11': 'flower_11', '12': 'flower_12', '13': 'flower_13', '14': 'flower_14', '15': 'flower_15', '16': 'flower_16', '17': 'flower_17', '18': 'flower_18', '19': 'flower_19', '20': 'flower_20', '21': 'flower_21', '22': 'flower_22', '23': 'flower_23', '24': 'flower_24', '25': 'flower_25', '26': 'flower_26', '27': 'flower_27', '28': 'flower_28', '29': 'flower_29', '30': 'flower_30', '31': 'flower_31', '32': 'flower_32', '33': 'flower_33', '34': 'flower_34', '35': 'flower_35', '36': 'flower_36', '37': 'flower_37', '38': 'flower_38', '39': 'flower_39', '40': 'flower_40', '41': 'flower_41', '42': 'flower_42', '43': 'flower_43', '44': 'flower_44', '45': 'flower_45', '46': 'flower_46', '47': 'flower_47', '48': 'flower_48', '49': 'flower_49', '50': 'flower_50', '51': 'flower_51', '52': 'flower_52', '53': 'flower_53', '54': 'flower_54', '55': 'flower_55', '56': 'flower_56', '57': 'flower_57', '58': 'flower_58', '59': 'flower_59', '60': 'flower_60', '61': 'flower_61', '62': 'flower_62', '63': 'flower_63', '64': 'flower_64', '65': 'flower_65', '66': 'flower_66', '67': 'flower_67', '68': 'flower_68', '69': 'flower_69', '70': 'flower_70', '71': 'flower_71', '72': 'flower_72', '73': 'flower_73', '74': 'flower_74', '75': 'flower_75', '76': 'flower_76', '77': 'flower_77', '78': 'flower_78', '79': 'flower_79', '80': 'flower_80', '81': 'flower_81', '82': 'flower_82', '83': 'flower_83', '84': 'flower_84', '85': 'flower_85', '86': 'flower_86', '87': 'flower_87', '88': 'flower_88', '89': 'flower_89', '90': 'flower_90', '91': 'flower_91', '92': 'flower_92', '93': 'flower_93', '94': 'flower_94', '95': 'flower_95', '96': 'flower_96', '97': 'flower_97', '98': 'flower_98', '99': 'flower_99', '100': 'flower_100', '101': 'flower_101'}

3.2預處理callback定義

```python def callback(infer_request, i) -> None: """ Define the callback function for postprocessing

:param: infer_request: the infer_request object
        i: the iteration of inference
:retuns:
        None
"""
# flowers_classes
predictions = next(iter(infer_request.results.values()))
indices = np.argsort(-predictions[0])
if (i == 0):
    # Calculate the first inference time
    latency = time.time() - start
    print(f"latency: {latency}")
    for n in range(5):
        print(
            "class name: {}, probability: {:.5f}"
            .format(flowers_classes[str(list(indices)[n])], predictions[0][list(indices)[n]])
        )

```

3.3讀取模型

```python

Intialize Inference Engine with Core()

ie = Core()

model_path

model_path="inference/inference.pdmodel" model = ie.read_model(model_path)

get the information of intput and output layer

input_layer = model.input(0) output_layer = model.output(0) ```

4.呼叫API進行預處理

  • 如果輸入資料不完全符合模型輸入張量,則需要額外的操作/步驟將資料轉換為模型所期望的格式。這些操作被稱為“預處理”。
  • 預處理步驟被整合到執行圖中,並在選定的裝置(CPU/GPU/VPU/等)上執行,而不是總是在CPU上執行。這將提高所選裝置的利用率。

相關 API: http://docs.openvino.ai/latest/openvino_docs_OV_Runtime_UG_Preprocessing_Overview.html

```python

待預測圖片

filename = "myflower.jpg" test_image = cv2.imread(filename) test_image = np.expand_dims(test_image, 0) / 255 _, h, w, _ = test_image.shape

調整模型輸入圖片尺寸

model.reshape({input_layer.any_name: PartialShape([1, 3, 224, 224])}) ppp = PrePostProcessor(model)

設定輸入 tensor 資訊:

- input() 提供模型的輸入

- 資料格式 "NHWC"

- 設定靜態模型輸入維度

ppp.input().tensor() \ .set_spatial_static_shape(h, w) \ .set_layout(Layout("NHWC")) inputs = model.inputs

設模型有“NCHW”佈局作為輸入

ppp.input().model().set_layout(Layout("NCHW"))

處理操作:

- tensor RESIZE_LINEAR 縮放設定

- 每個通道的歸一化

- 將每個畫素資料劃分為適當的比例值

ppp.input().preprocess() \ .resize(ResizeAlgorithm.RESIZE_LINEAR, 224, 224) \ .mean([0.485, 0.456, 0.406]) \ .scale([0.229, 0.224, 0.225])

設定輸出張量資訊:

- 張量精度設定為 'f32'

ppp.output().tensor().set_element_type(Type.f32)

Apply preprocessing to modify the original 'model'

model = ppp.build() ```

5.預測

使用“AUTO”作為裝置名,委託OpenVINO選擇裝置。自動裝置外掛內部識別和選擇裝置從英特爾的CPU和GPU之間依賴於裝置功能和模型(例如,精度)的特點。然後,它將推理請求分配給最佳裝置。

AUTO立即在CPU上啟動推理,然後在準備好後透明地轉移到GPU(或VPU),大大減少了第一次推理的時間。

```python

檢查可用裝置

devices = ie.available_devices for device in devices: device_name = ie.get_property(device_name=device, name="FULL_DEVICE_NAME") print(f"{device}: {device_name}")

將模型載入到由AUTO從可用裝置列表中選擇的裝置

compiled_model = ie.compile_model(model=model, device_name="AUTO")

建立請求佇列

infer_queue = AsyncInferQueue(compiled_model) infer_queue.set_callback(callback) start = time.time()

開始預測

infer_queue.start_async({input_layer.any_name: test_image}, 0) infer_queue.wait_all() Image(filename=filename) ```

CPU: Intel(R) Core(TM) i5-9400F CPU @ 2.90GHz
latency: 0.02329254150390625
class name: flower_76, probability: 0.40075
class name: flower_81, probability: 0.15170
class name: flower_91, probability: 0.03979
class name: flower_12, probability: 0.03356
class name: flower_17, probability: 0.02347

6.效能技巧:延遲和吞吐量

吞吐量和延遲是一些最廣泛使用的度量應用程式整體效能的指標。

drawing

  • 延遲 是預測單個輸入所需要的時間(ms)
  • 吞吐量, 處理時間/處理的輸入數

OpenVINO效能提示是在考慮可移植性的情況下配置效能的新方法。效能提示將允許裝置自己配置,而不是將應用程式需要對映到低級別的效能設定,並保持一個相關的應用程式邏輯來分別配置每個可能的裝置。

高階技巧: http://docs.openvino.ai/latest/openvino_docs_OV_UG_Performance_Hints.html

6.1延遲計算

可以通過配置調整應用程式的效能設定,讓裝置調整以實現更好的面向延遲的效能。

```python loop = 100

AUTO sets device config based on hints

compiled_model = ie.compile_model(model=model, device_name="AUTO", config={"PERFORMANCE_HINT": "LATENCY"}) infer_queue = AsyncInferQueue(compiled_model)

implement AsyncInferQueue Python API to boost the performance in Async mode

infer_queue.set_callback(callback) start = time.time()

run infernce for 100 times to get the average FPS

for i in range(loop): infer_queue.start_async({input_layer.any_name: test_image}, i) infer_queue.wait_all() end = time.time()

Calculate the average FPS

fps = loop / (end - start) print(f"fps: {fps}") ```

latency: 0.018686771392822266
class name: flower_76, probability: 0.40075
class name: flower_81, probability: 0.15170
class name: flower_91, probability: 0.03979
class name: flower_12, probability: 0.03356
class name: flower_17, probability: 0.02347
fps: 50.20953840260486

6.2吞吐量計算

可以使用配置設定應用程式的效能設定,讓裝置調整以實現更好的吞吐量效能。

```python

AUTO sets device config based on hints

compiled_model = ie.compile_model(model=model, device_name="AUTO", config={"PERFORMANCE_HINT": "THROUGHPUT"}) infer_queue = AsyncInferQueue(compiled_model) infer_queue.set_callback(callback) start = time.time() for i in range(loop): infer_queue.start_async({input_layer.any_name: test_image}, i) infer_queue.wait_all() end = time.time()

Calculate the average FPS

fps = loop / (end - start) print(f"fps: {fps}") ```

latency: 0.04830741882324219
class name: flower_76, probability: 0.40075
class name: flower_81, probability: 0.15170
class name: flower_91, probability: 0.03979
class name: flower_12, probability: 0.03356
class name: flower_17, probability: 0.02347
fps: 57.274455164002134

python !benchmark_app -m $model_path -data_shape [1,3,224,224] -hint "latency"

[Step 1/11] Parsing and validating input arguments
[ WARNING ]  -nstreams default value is determined automatically for a device. Although the automatic selection usually provides a reasonable performance, but it still may be non-optimal for some cases, for more information look at README. 
[Step 2/11] Loading OpenVINO
[ INFO ] OpenVINO:
         API version............. 2022.1.0-7019-cdb9bec7210-releases/2022/1
[ INFO ] Device info
         CPU
         openvino_intel_cpu_plugin version 2022.1
         Build................... 2022.1.0-7019-cdb9bec7210-releases/2022/1

[Step 3/11] Setting device configuration
[Step 4/11] Reading network files
[ INFO ] Read model took 144.60 ms
[Step 5/11] Resizing network to match image sizes and given batch
[ INFO ] Network batch size: ?
[Step 6/11] Configuring input of the model
[ INFO ] Model input 'x' precision u8, dimensions ([N,C,H,W]): ? 3 224 224
[ INFO ] Model output 'save_infer_model/scale_0.tmp_1' precision f32, dimensions ([...]): ? 102
[Step 7/11] Loading the model to the device
[ INFO ] Compile model took 232.62 ms
[Step 8/11] Querying optimal runtime parameters
[ INFO ] DEVICE: CPU
[ INFO ]   AVAILABLE_DEVICES  , ['']
[ INFO ]   RANGE_FOR_ASYNC_INFER_REQUESTS  , (1, 1, 1)
[ INFO ]   RANGE_FOR_STREAMS  , (1, 6)
[ INFO ]   FULL_DEVICE_NAME  , Intel(R) Core(TM) i5-9400F CPU @ 2.90GHz
[ INFO ]   OPTIMIZATION_CAPABILITIES  , ['FP32', 'FP16', 'INT8', 'BIN', 'EXPORT_IMPORT']
[ INFO ]   CACHE_DIR  , 
[ INFO ]   NUM_STREAMS  , 1
[ INFO ]   INFERENCE_NUM_THREADS  , 0
[ INFO ]   PERF_COUNT  , False
[ INFO ]   PERFORMANCE_HINT_NUM_REQUESTS  , 0
[Step 9/11] Creating infer requests and preparing input data
[ INFO ] Create 1 infer requests took 0.00 ms
[ WARNING ] No input files were given for input 'x'!. This input will be filled with random values!
[ INFO ] Fill input 'x' with random values 
[Step 10/11] Measuring performance (Start inference asynchronously, 1 inference requests, inference only: False, limits: 60000 ms duration)
[ INFO ] Benchmarking in full mode (inputs filling are included in measurement loop).
[ INFO ] First inference took 31.26 ms
[Step 11/11] Dumping statistics report
Count:          2793 iterations
Duration:       60018.45 ms
Latency:
    AVG:        21.40 ms
    MIN:        17.28 ms
    MAX:        73.23 ms
Throughput: 46.54 FPS