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的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: 用來產生目標框架模型的程式
- 驗證模型
使用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。
- resize成new_w*new_h的圖片
- 測試結果:
模型來源
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全部資料
- 準備檔案
將需要的檔案放至指定位置 - 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
- 從tensorflow轉換的inception v3
6. 參考資料