openvino是intel公司開發的一款将多種深度學習模型部署于cpu,gpu,fpga等多種平台的軟體。它支援tensorflow caffe mxnet等模型的轉換,将這些模型的權重與網絡結構轉換成 .xml 與 .bin檔案,它好比計算機語言編譯器可以将多種語言編譯成二進制代碼。避免了開發人員為了同一個業務需求,在不同平台多次開發,多次部署,使用openvino,隻需一次開發,就可以将模型部署在多個平台。openvino支援多種基礎網絡,多種目标檢測算法,多種圖像分割算法,支援rcnn,支援權重量化操作。
openvino有2個大子產品,第一個model optimizer,另一個是inference engine,該子產品完全由c++實作。
本人在一家電商公司的圖像算法組做實習,到公司第二天丢給我個任務。根據公司業務要求,公司閑置cpu較多,之前上線的tensorflow模型部署于cpu裝置上,模型運算速度有慢,于是讓我調研使用openvino将tensorflow模型部署在cpu裝置,是否能優化模型的計算速度。于是,丢給我上百頁openvino的英文文檔,真是前無古人,網上有關openvino的資料太少,悲傷的我開始了苦逼的工作,這種活不應該是運維或開發幹嗎,為啥要丢給一個圖像算法組的實習生。
首先,我不太建議按照官方手冊去安裝,因為需要的依賴太多,安裝較難,本人當時就是折騰了好幾天沒成功,比較慌,但是不怕,已經有人将openvino image上傳,那就使用docker安裝。
1.sudo docker search openvino
2.sudo docker run -it cortexica/openvino /bin/bash
3.等待。。。安裝好了
4.cd /opt/intel/computer_vision_sdk/deployment_tools/model_optimizer/install_prerequisites/
- ./install_prerequisites_tf.sh(因為我要測試tf,是以安裝tf的依賴,在執行這一步之前要確定pip3安裝,否則執行失敗)
-
中間過程省略,按照官網步驟就可以,重點是介紹使用時的坑
軟體自帶的樣例是caffe模型,是以想要測試caffe模型,直接cd
/opt/intel/computer_vision_sdk/deployment_tools/demo
7在執行model optimizer時非常重要,這一步做不好,後面使用inference engine會出現2種情況,第一種 inference無法運作,第二種inference可以運作,但是得出的結果不正确
8.官網提供的mo_tf.py負責轉換tf模型,mo.py負責轉換多種模型。其中,在執行mo_tf.py檔案時,我用的.ckpt檔案和.pb檔案,文檔有提供.ckpt檔案的下載下傳連結,.pb檔案需要從.ckpt檔案得到,openvino也提供了将.ckpt轉.pb的檔案,在我的電腦上是/home/tf_models/reserach/slim/。如果不用它提供的ckpt檔案轉,會出錯。
9.總的來說應該使用該指令:python3 mo_tf.py --input_model xxx.pb --input_checkpoint xxx.ckpt --input_sahpe [1,299,299,3] --reverse_input_channels --mean_values[127.5,127.5,127.5] --scale_values [127.5]
解釋下這個指令,文檔并沒有給出這個指令,這是我摸索出來的。我使用的是inception v3模型,是以圖像輸入大小是[299,299],如果不指定–input_shape 大小,就會報錯。文檔或者程式報錯提示[-1,299,299,3],這種輸入對于inference engine是為未義的,inference engine不支援未定義輸入,如果不指定input_shape那就一定要指定batch大小,使用參數 -b。
inference engine讀入的通道是BGR,我猜可能是使用opencv,但是我們的模型被訓練時可能使用的RGB通道,如果不使用–reverse_input_channels,那麼inference的結果就會不正确,但是使用了–reverse_input_channels, 就還得使用–mean_values 和scale_values, 這2個參數值要在openvino文檔查閱,根據模型不同,數值不同。
至此,大坑介紹完畢,我在這上折騰了好幾天。如果想單線程測試openvino,openvino的多線程的實作使用的是openMP,expor OMP_NUM_THREADS=1。如果想單核測試openvino,我用的方法是,在建立容器時:docker run -it --cpus=1
10.說一下,本人親測openvino的速度和準确率。我大概使用了80張圖檔,一共10個類别。大多數類别的識别top-1準确度100%。
我使用的cpu Xen® E5-26xx v4
batch=9:單線程測試,平均推斷時間1468ms
單核測試,1641ms
16線程測試,348ms
插一句題外話,如果想僅僅測試一下openvino,我可以提供inception v3 的.xml和.bin檔案。