2024年2月29日 星期四

如何運行Intel OpenVINO Open Model Zoo(OMZ)範例於Google Colab上

20240229_OMZ_Colab

Intel OpenVINO[1] 從2018年5月發行至今已更新20多個版次,目前最新版次為 2023.3 LTS。期間有很多重大革新,這也讓很多不錯的功能可能消失或以其它方式出現。如2021.4版後開始提供Jupyter Notebook (Python) 格式範例讓大家更容易學習。2023.0版後開始提供 Google Colab 格式的範例,讓大家免本地安裝可直接在雲端體驗 OpenVINO。不過也有像 Open Model Zoo (OMZ)[2] 之類方便學習、測試各種預訓練模型的項目及相關工具被移出。主要是因為自2023.1版後開始支援直接讀取更多框架模型及神經網路壓縮架構(Neural Network Compression Framework, NNCF)取代原有模型優化器(Model Optimizer, MO)。

目前 OpenVINO Notebooks[3] 範例編號101~128提供了各種常見框架轉成OpenVINO專屬 IR(XML+BIN) 格式的範例,如TensorFlow, PyTorch, PaddlePaddel 等,甚至 Hugging Face 格式。當然這裡也包含了OMZ的轉換範例(104-model-tools)。不過這個範例比較適合單獨運行、預先轉檔工作,當想像以往 OMZ Demos 下的應用範例,要整合轉檔加執行時,就會遇到一些小麻煩。

雖然這些OMZ的範例已被淡出,但如果大家想直接在 Google Colab 上直接運行時,這篇文章應該可以給大家一些幫助。以下就以OMZ 影像分類(Classification) Public Pre-Trained Models[4]為例,說明如何以 Colab 完成直接運行。

OpenVINO Open Model Zoo (OMZ) & Tools

Intel OpenVINO 自20018發行後 Open Model Zoo (OMZ) 一直提供很豐富的預訓練模型庫,很方便進行AI應用的實驗,其中包含三大部份。

  • Intel's Pre-Trained
    Intel 提供之預設訓練模型,包括物件偵測、物件辨識、影像分割、姿態偵測、行為分析、語音處理、時間預測等數十種模型。此部份已直接轉成IR格式(Bin + Xml),可直接載入運行。
  • Public Pre-Trained
    常用公開預訓練模型,有數十種應用及數百個模型,下載後需依原始框架格式(如TensorFlow, PyTorch, Caffe等)轉換到IR格式才能載入運行。
  • Demos
    提供整合型範例,使用單一或組合不同模型完成特定功能,搭配簡易顯示畫面,更方便使用者理解。

另外亦提供OMZ相關工具,方便使用者處理模型轉檔、優化及效能評估,主要包括下列四項工具。

ToolCommandDescription
Model Downloaderomz_downloader從Open Model Zoo下載模型
Model Converteromz_converter將模型轉換成 OpenVINO IR 格式
Info Dumperomz_info_dumper列印模型完整資訊
Benchmark Toolbenchmark_app比較模型推論效能

隨著 OpenVINO 版本的迭代更新,在2023.1版後, OMZ[4] 及相關工具[5]在官方說明文件中就移到「舊版功能(Legacy Features)」,不再持續維護。使用 pip install openvino 也不再預安裝OMZ相關工具,需改用 pip install openvino-dev 才能取得。

舊版 Open Model Zoo 相關文件及範例仍於開源於 Github[6] 上,有需要可行下載研究。另外原始模型及說明文件亦可從「官方共用區」[7]中取得。

OpenVINO Notebooks

為了讓大家更容易使用 OpenVINO ,自2021.4版後就開始提供 Jupyter Notebook 格式的範例程式庫 Notebooks ,主要分為五大部份。

  • 第一步(First steps)(編號001~099)
  • 轉換與優化(Covert & Optimize)(編號100~199)
  • 模型展示(Model Demos)(編號200~299)
  • 模型訓練(Model Training)(編號300~399)
  • 即時展示(Live Demos)(編號400~499)

2022.1版後部份範例已支援直接在 Binder 線上運行。 2023.0版後除增加更多範例外,亦有部份範例支援直接在 Google Colab 環境下安裝 OpenVINO 及運行。不過目前 Notebooks 範例中並未納入原先 OMZ Pri-Trained Model 及 Demos 範例,如有需要可參考下列作法。

OMZ Classification Public Pre-Trained Models

目前 OMZ Public Pre-Trained Models提供了常見的預訓練模型有數十種應用及數百個模型,單就影像分類來看就有超過五十種,詳如文末附錄。

以往可透過Demos下的「Classification Python* Demo」[8]在命令列運行,來呼叫這五十多種影像分類模型。當它利用 omz_downloader 下載模型時會一併把對應的參數設定好。可是這樣的作法並無法適用在 Colab 環境下,所以這裡可簡單把工作流程改成下列步驟,就能完整運行影像分類。

  1. 安裝openvino-dev
  2. 導入必要模組
  3. 下載預訓練模型
  4. 模型轉換
  5. 指定推論裝置
  6. 將模型載入裝置並編譯
  7. 下載測試資料

更完整的細部程式說明可直接點擊下列連結,進入Colab直接運行。大家可試著修改模型名稱及指定對應設定來實驗一下。
Colab完整範例

小結

這個範例僅示範了OMZ影像分類用法,這只是一個開始,大家可試著延伸到其它類型範例,後續會持續安排將Demos下的範例轉至Colab,讓大家更方便學習。

參考文獻

[1] Intel, OpenVINO Toolkit Document
https://docs.openvino.ai/

[2] Intel, OpenVINO Document - Documentation - Legacy Features - Open Model Zoo (2023.3 LTS)
https://docs.openvino.ai/2023.3/model_zoo.html

[3] Intel, Github - openvinotoolkit / openvino_notebooks
https://github.com/openvinotoolkit/openvino_notebooks

[4] Intel, OpenVINO Document - Documentation - Legacy Features - Open Model Zoo - Public Pre-Training Models (2023.3 LTS)
https://docs.openvino.ai/2023.3/omz_models_group_public.html#classification-models

[5] Intel, OpenVINO Document - Documentation - Legacy Features - Model Optimizer / Conversion API (2023.3 LTS)
https://docs.openvino.ai/2023.3/openvino_docs_OV_Converter_UG_prepare_model_convert_model_MO_OVC_transition.html

[6] Intel, Github - openvinotoolkit / open_model_zoo
https://github.com/openvinotoolkit/open_model_zoo

[7] Intel, stroage for open model zoo
https://storage.openvinotoolkit.org/repositories/open_model_zoo/

[8] Intel, OpenVINO Document - Classification Python* Demo
https://docs.openvino.ai/2023.3/omz_demos_classification_demo_python.html

附錄 - OMZ 影像分類模型清單

[資料來源], OmniXRI 整理製作

Model NameImplementationOMZ Model NameAccuracy (Top1/5)GFlopsMParamsINPUTOUTPUT
AlexNetCaffe*alexnet56.598%/79.812%1.560.965[1, 3, 227, 227][1,1000]
AntiSpoofNetPyTorch*anti-spoof-mn33.81%0.153.02[1, 3, 128, 128][1,2]
CaffeNetCaffe*caffenet56.714%/79.916%1.46360.965[1, 3, 227, 227][1,1000]
ConvNeXt TinyPyTorch*convnext-tiny82.05%/95.86%8.941928.5892[1,3,224,224][1,1000]
DenseNet 121Caffe*densenet-12174.42%/92.136%5.2747.971[1,3,224,224][1,1000]
DenseNet 121TensorFlow*densenet-121-tf74.46%/92.13%5.72877.971[1,224,224,3][1,1000]
DLA 34PyTorch*dla-3474.64%/92.06%6.136815.7344[1,3,224,224][1,1000]
EfficientNet B0TensorFlow*efficientnet-b075.70%/92.76%0.8195.268[1,224,224,3][1,1000]
EfficientNet B0PyTorch*efficientnet-b0-pytorch77.70%/93.52%0.8195.268[1,3,224,224][1,1000]
EfficientNet V2 B0PyTorch*efficientnet-v2-b078.36%/94.02%1.46417.1094[1,3,224,224][1,1000]
EfficientNet V2 SmallPyTorch*efficientnet-v2-s84.29%/97.26%16.940621.3816[1,3,224,224][1,1000]
HBONet 1.0PyTorch*hbonet-1.073.1%/91.0%0.62084.5443[1,3,224,224][1,1000]
HBONet 0.25PyTorch*hbonet-0.2557.3%/79.8%0.07581.9299[1,3,224,224][1,1000]
Inception (GoogleNet) V1Caffe*googlenet-v68.928%/89.144%3.0166.619[1,3,224,224][1,1000]
Inception (GoogleNet) V1TensorFlow*googlenet-v1-tf69.814%/89.6%3.2666.999[1,224,224,3][1,1001]
Inception (GoogleNet) V2Caffe*googlenet-v272.024%/90.844%4.05811.185[1,3,224,224][1,1000]
Inception (GoogleNet) V2TensorFlow*googlenet-v2-tf74.084%/91.798%4.05811.185[1,224,224,3][1,1001]
Inception (GoogleNet) V3TensorFlow*googlenet-v377.904%/93.808%11.46923.817[1,299,299,3][1,1001]
Inception (GoogleNet) V3PyTorch*googlenet-v3-pytorch77.69%/93.7%11.46923.817[1,3,299,299][1,1000]
Inception (GoogleNet) V4TensorFlow*googlenet-v4-tf80.204%/95.21%24.58442.648[1,299,299,3][1,1001]
Inception-ResNet V2TensorFlow*inception-resnet-v2-tf77.82%/94.03%22.22730.223[1,299,299,3][1,1001]
LeViT 128SPyTorch*levit-128s76.54%/92.85%0.61778.2199[1,3,224,224][1,1000]
MixNet LTensorFlow*mixnet-l78.30%/93.91%0.5657.3[1,224,224,3][1,1000]
MobileNet V1 0.25 128Caffe*mobilenet-v1-0.25-12840.54%/65%0.0280.468[1,128,128,3][1,1001]
MobileNet V1 1.0 224Caffe*mobilenet-v1-1.0-22469.496%/89.224%1.1484.221[1,3,224,224][1,1000]
MobileNet V1 1.0 224TensorFlow*mobilenet-v1-1.0-224-tf71.03%/89.94%1.1484.221[1,224,224,3][1,1001]
MobileNet V2 1.0 224Caffe*mobilenet-v271.218%/90.178%0.8763.489[1,3,224,224][1,1000]
MobileNet V2 1.0 224TensorFlow*mobilenet-v2-1.0-22471.85%/90.69%0.6153.489[1,224,224,3][1,1001]
MobileNet V2 1.0 224PyTorch*mobilenet-v2-pytorch71.81%/90.396%0.6153.489[1,3,224,224][1,1000]
MobileNet V2 1.4 224TensorFlow*mobilenet-v2-1.4-22474.09%/91.97%1.1836.087[1,224,224,3][1,1001]
MobileNet V3 Small 1.0TensorFlow*mobilenet-v3-small-1.0-224-tf67.36%/87.44%0.11682.537[1,224,224,3][1,1000]
MobileNet V3 Small 1.0Paddle*mobilenet-v3-small-1.0-paddle68.21%/88.04%0.12692.9339[1,3,224,224][1,1000]
MobileNet V3 Large 1.0TensorFlow*mobilenet-v3-large-1.0-224-tf75.30%/92.62%0.4455.4721[1,224,224,3][1,1000]
MobileNet V3 Large 1.0Paddle*mobilenet-v3-large-1.0-224-paddle75.248%/92.32%0.45655.468[1,3,224,224][1,1000]
NFNet F0PyTorch*nfnet-f083.34%/96.56%24.805371.4444[1,3,256,256][1,1000]
RegNetX-3.2GFPyTorch*regnetx-3.2gf78.17%/94.08%6.389315.2653[1,3,224,224][1,1000]
ResNet 26, alpha=0.25MXNet*octave-resnet-26-0.2576.076%/92.584%3.76815.99[1,3,224,224][1,1000]
open-closed-eye-0001PyTorch*open-closed-eye-000195.84%0.00140.0113[1,3,32,32][1,2,1,1]
RepVGG A0PyTorch*repvgg-a072.40%/90.49%2.72868.3094[1,3,224,224][1,1000]
RepVGG B1PyTorch*repvgg-b178.37%/94.09%23.647251.8295[1,3,224,224][1,1000]
RepVGG B3PyTorch*repvgg-b380.50%/95.25%52.4407110.9609[1,3,224,224][1,1000]
ResNeSt 50PyTorch*resnest-50-pytorch81.11%/95.36%10.814827.4493[1,3,224,224][1,1000]
ResNet 18PyTorch*resnet-18-pytorch69.754%/89.088%3.63711.68[1,3,224,224][1,1000]
ResNet 34PyTorch*resnet-34-pytorch73.30%/91.42%7.340921.7892[1,3,224,224][1,1000]
ResNet 50TensorFlow*resnet-50-tf76.17%/92.98%8.21625.53[1,224,224,3][1,1001]
ResNet 50PyTorch*resnet-50-pytorch76.128%/92.858%8.21625.53[1,3,224,224][1,1000]
ReXNet V1 x1.0PyTorch*rexnet-v1-x1.077.86%/93.87%0.83254.7779[1,3,224,224][1,1000]
SE-InceptionCaffe*se-inception75.996%/92.964%4.09111.922[1,3,224,224][1,1000]
SE-ResNet 50Caffe*se-resnet-5077.596%/93.85%7.77528.061[1,3,224,224][1,1000]
SE-ResNeXt 50Caffe*se-resnext-5078.968%/94.63%8.53327.526[1,3,224,224][1,1000]
Shufflenet V2 x0.5Caffe*shufflenet-v2-x0.558.80%/81.13%0.084651.363[1,3,224,224][1,1000]
Shufflenet V2 x1.0PyTorch*shufflenet-v2-x1.069.36%/88.32%0.29572.2705[1,3,224,224][1,1000]
SqueezeNet v1.0Caffe*squeezenet1.057.684%/80.38%1.7371.248[1,3,227,227][1,1000]
SqueezeNet v1.1Caffe*squeezenet1.158.382%/81%0.7851.236[1,3,227,227][1,1000]
Swin Transformer TinyPyTorch*swin-tiny-patch4-window7-22481.38%/95.51%9.02828.8173[1,3,224,224][1,1000]
T2T-ViTPyTorch*t2t-vit-1481.44%/95.66%9.545121.5498[1,3,224,224][1,1000]
VGG 16Caffe*vgg1670.968%/89.878%30.974138.358[1,3,224,224][1,1000]
VGG 19Caffe*vgg1971.062%/89.832%39.3143.667[1,3,224,224][1,1000]

OmniXRI 整理製作,歡迎點贊、收藏、訂閱、留言、分享

沒有留言:

張貼留言

【頂置】簡報、源碼、系列文快速連結區

常有人反應用手機瀏覽本部落格時常要捲很多頁才能找到系列發文、開源專案、課程及活動簡報,為了方便大家快速查詢,特整理連結如下,敬請參考! Edge AI Taiwan 邊緣智能交流區 全像顯示與互動交流區 台科大(NTUST) 人工智慧與邊緣運算實務 開南大學...