以Novatek AI Tool轉換模型放至NT9852x, NT9856x, NT9832x上運行之說明

1. 前言

Novatek AI tool是一個用來轉換caffe模型的工具,讓模型可以放在NT9852x, NT9856x, NT9832x等支援AI推論的SoC上執行。
由於現在訓練模型的框架除了caffe之外也有很多選擇,如keras、tensorflow、pytorch、mxnet、darknet等等,在網路上找到的模型可能不是caffe的模型。
下面會使用mmdnn將模型轉換成caffe模型後,再用Novatek AI tool轉換成可以在板端執行的模型檔。

2. Novatek AI Tool介紹

Novatek AI tool的功能可以分為三點:

  • 轉換模型
    目前只支援轉換caffe的模型。可以對模型進行量化壓縮、指定某些層的輸入精度,在板端硬體支援的情況下會在轉換時對一些層進行層融合,以節省頻寬及加快速度。
  • 模擬輸出
    除了轉換模型外,也可以在PC上模擬模型輸出,不用每次轉換完模型都要放到板端才能看到輸出結果。
  • 分析轉換數據
    轉換完成後,可以藉由AI tool的輸出的數據,確認轉換前後的模型是否差異會太大,影響到模型預測的結果。
    目前已經支援轉換多種網路架構,以下舉例幾個架構:
    • 分類
      inception v2~v4、resnet 18,50,101、squeezenet、…
    • 物件偵測
      mobilenet-ssd、yolo v2,v3、….
    • 語意分割
      Enet、…

如果模型裡有AI tool裡不支援的層,也可以手動加入將其加入為客製化的層並使用,例如激活函數 swish或caffe的DummyData層。

 

3. 將其他框架的模型轉換為caffe模型

網路上有很多轉換模型框架的工具,但大部分都是只能從A框架轉為B框架,只限於A、B這兩種框架間的轉換。之所以選擇mmdnn,是因為他支援多種框架之間的互相轉換,十分方便。下圖是mmdnn支援轉換的框架。
mmdnn可轉換的框架

  • 安裝環境
    首先是安裝mmdnn、要轉換的框架和一些依賴的套件。mmdnn的github中有環境配置的建議(requirement/),也可以使用他們提供的docker image。

    docker pull mdnn/mmdn:cpu.small


    我配置的環境如下表,有特別將numpy改成1.15.0才能正常運作。

    package

    version

    mmdnn

    0.3.1

    torch

    1.5.1

    torchvision

    0.6.1

    tensorflow

    1.15.2

    numpy

    1.15.0

    caffe

    1.0.0


    我的系統是Ubuntu 20.04,所以Caffe使用apt安裝。其餘的package都是用pip安裝。
  • 下載要轉換的模型檔
    mmdnn有提供一些可以下載的模型。可以使用mmdownload這個指令下載。

    mmdownload -f tensorflow -n inception_v3 -o ./

    mmdownload -f pytorch -n inception_v3 -o ./


    我下載了tensorflow和pytorch的inception v3,準備將他們轉換成caffe格式。此處下載的這兩個模型,都是以imagenet資料集訓練的。
    其中pytorch的輸出是1000類,tensorflow的輸出是1001類(增加的一類是「背景」)。
  • 開始轉換
    使用mmconvert這個指令轉換模型,轉換不同框架時要輸入的參數也會不同。以下是一定要輸入的參數:

    參數

    說明

    -sf

    input模型的框架種類

    -df

    output模型的框架種類

    -om

    output模型的名稱



    從tensorflow轉換到caffe時,要輸入的參數有:

    參數

    說明

    附註

    -in

    input模型的架構(metadata)

    tensorflow模型的架構及權重是分開的,用mmdownload下載會從ckpt產生metadata

    -iw

    input模型的權重(ckpt)

    -dstNodeName

    指定tensorflow模型的輸出節點

     

    --inputShape

    caffe需要指定輸入大小

    設為299



    從pytorch轉換到caffe時,要輸入的參數有:

    參數

    說明

    附註

    -iw

    input模型的權重

    pytorch模型包含架構及權重

    -dstNodeName

    指定pytorch模型的輸出節點

     

    --inputShape

    caffe需要指定輸入大小

    設為3, 299, 299


    轉換時會先轉成IR模型再轉換成目標框架模型,所以會出現IR的暫存檔 – xxxx.json, xxxx.npy, xxxx.pd, xxxx.py。也可以用mmtoir和mmtocode從來源框架模型產生這些檔案。
  • IR model檔案(Intermediate Representation Model)
    • json, pb: 網路架構
    • npy: 網路權重
    • py: 用來產生目標框架模型的程式
轉換成功的話這些暫存檔會被刪除,沒有轉成功的話會留存下來。有些問題可以藉由修改上述的py檔來解決,就可以成功轉換。
例如我遇到pytorch轉換至caffe時,在concat layer時會發生shape不一致的狀況。檢查py檔後發現有一層pooling轉換失敗,padding參數是錯誤的,修改後便轉換成功。
  • 驗證模型

使用imagenet 2012 validation set(50000張圖片)驗證模型是否轉換成功,且確認此模型需要怎樣的前處裡。

  • 前處理設定:

    前處理參數

    參數值

    base size

    395

    crop size (center crop)

    299

    mean value

    (128, 128, 128)

    std

    (128, 128, 128)

  • 前處理步驟:
    • resize成new_w*new_h的圖片
      new_w = w*base_size/mix(w,h)
      new_h = h*base_size/mix(w,h)
    • (各channel的pixel – 各channel mean) / 各channel std
    • 對大小是new_w*new_h的圖做center crop,最後輸出圖片大小是crop_size*crop_size。

  • 測試結果:

    模型來源

    top1 準確率

    top 5準確率

    tensorflow

    0.70444

    0.90234

    pytorch

    0.69554

    0.89782


    **關於將validation set圖片對應到label,不能參考imagenet 2012的檔案,要參考caffe中提供的才會對應成功。

  • 修改前處裡
    考慮到AI tool的前處理還未支援crop,所以測試前處理只使用resize的準確度。前處裡改為只進行步驟(1)(2),在步驟(1)時直接resize成crop_size*crop_size。

    配合ai tool的前處理方式,測試結果如下:

    模型來源

    top1 準確率

    top 5準確率

    tensorflow

    0.688

    0.89394

    pytorch

    0.6804

    0.88872

    附註: 測試資料集為imagenet 2012 validation set全部資料

4. 將caffe模型轉為novatek model bin
  • 準備檔案
    將需要的檔案放至指定位置
    • input/model/: 從tensorflow和pytorch轉換過來的inception v3 caffemodel和prototxt
    • input/model/: 和上面前處理一樣的txt
    • input/data/: 作為測試圖片的imagenet 2012 validation set中的20張圖片
  • 設定gen tool和sim tool的config
    • mean設為 (128,128,128)
    • std設為1/128 = 0.0078125
    • resize shape設為 (299, 299)
    • config/gen_config.txt和config/sim_config.txt: 設定所需檔案路徑
    • gen_cfg要注意前處理參數要和之前測試時一樣
    • 測試資料集設定為imagenet 2012 validation set的第00000001~00000020張。
  • 轉換成模型bin檔
    轉換完成後results中會輸出兩個檔案 – profile.txt和layer_diff_stataistic.txt
    • profile.txt
      會列出原本模型(golden)和轉換後模型(simulation)的top1、top5準確率。

      來源

      golden

      simulation

      top1

      top5

      top1

      top5

      tensorflow

      0.7

      0.95

      0.6

      0.9

      pytorch

      0.65

      0.95

      0.65

      0.95

      附註: 測試資料集為imagenet 2012 validation set的第1~20張

    • layer_diff_stataistic.txt
      會列出模型每一層特徵轉換前和轉換後的相似度。
      • average absolute difference ratio: 其正常值通常要 < 0.02
      • cos similarity: 其正常值通常要 > 0.99

由tensorflow轉換成的模型在某些層上cos similarity較低,可以藉由檢查debug/或gentool/下的資料找出原因。

  • 板端執行結果
    由於tensorflow模型輸出的是1001類,多的一類背景label ID=0,其餘的類別ID往後順延,所以tensorflow輸出的ID會+1。

    測試圖片的答案是no=65(66), label="sea snake"。
    • 從pytorch轉換的inception v3
      from_pytorch_result
    • 從tensorflow轉換的inception v3
5. 總結
此篇博文將用MMdnn將主流的tensorflow和pytorch的模型轉換為caffe模型,再用AI tool將caffe模型轉換為可以在NT98525上執行的bin檔,最後將模型實際放至NT98525執行。

6. 參考資料

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★博文作者未開放評論功能