<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          實(shí)踐教程 | 輕松入門模型轉(zhuǎn)換和可視化

          共 4336字,需瀏覽 9分鐘

           ·

          2021-09-18 21:58

          ↑ 點(diǎn)擊藍(lán)字 關(guān)注極市平臺

          作者 | 愛做菜的煉丹師
          來源 | CV研習(xí)社
          編輯 | 極市平臺

          極市導(dǎo)讀

           

          本文給大家介紹一個模型轉(zhuǎn)換格式ONNX和可視化工具Netron。ONNX是微軟設(shè)計的一種多平臺的通用文件格式,幫助算法人員進(jìn)行模型部署和框架之間相互轉(zhuǎn)換。而Netron是一款老牌的輕量化模型可視化工具,支持多種開源框架,使用上比TensorBoard簡單直接。 >>加入極市CV技術(shù)交流群,走在計算機(jī)視覺的最前沿

          1 不同框架模型需要轉(zhuǎn)換嗎?

          目前開源的深度學(xué)習(xí)框架有很多,當(dāng)我們在Github上搜索一個通用網(wǎng)絡(luò)時,會發(fā)現(xiàn)各種各樣的版本實(shí)現(xiàn)。但是深度學(xué)習(xí)方法的本質(zhì)都是分為訓(xùn)練和部署兩個環(huán)節(jié),如果以目標(biāo)為導(dǎo)向,我們關(guān)注算法部署在哪兒,用什么部署?是x86上采樣TensorRT部署還是ARM上采用端框架NCNN運(yùn)行,又或者采樣某個硬件廠商提供的SDK做推理。

          假設(shè)童鞋A有一個檢測任務(wù)需要部署在TX2的開發(fā)板上,基于TensorFlow框架把yolov5改改,訓(xùn)練得到了一份pb權(quán)重,接下來將pb轉(zhuǎn)換成TensorRT使用的uff文件做推理。

          如果A將框架換成Pytorch,按照上述流程得到了一份pt的權(quán)重,然后調(diào)用TensorRT的SDK轉(zhuǎn)換成uff格式,看上去好像也很順暢沒什么問題,它們的區(qū)別就在于訓(xùn)練生成的權(quán)重文件格式不同,不過反正最終都轉(zhuǎn)換成uff格式。

          實(shí)際操作中或者部署在其他移動端時,我們會發(fā)現(xiàn)瓶頸在于如何才能更友好的將PC端訓(xùn)練的權(quán)重文件轉(zhuǎn)換成部署端需要的格式。Nividia的開發(fā)板雖然基于CUDA加速,生態(tài)鏈完整,但是對不同的神經(jīng)網(wǎng)絡(luò)框架支持的算子力度也有區(qū)別,如果訓(xùn)練框架是Pytorch,在TensorRT上部署,如下圖所示理論上有三條路(這里Caffe的存在是因?yàn)門RT對它的支持更友好,可以根據(jù)需求刪除):

          直接調(diào)用TRT提供的SDK轉(zhuǎn)換接口,很大可能遇到不支持的操作算子,在Nividia顯卡上還能通過CUDA編程自定義算法,換成其他硬件可能直接就不支持自定義功能。

          既然直接轉(zhuǎn)換走不通,那么能否將Pytorch先轉(zhuǎn)成Caffe,再由Caffe轉(zhuǎn)到TRT呢?

          這條路也存在問題,不同神經(jīng)網(wǎng)絡(luò)框架在一些定義上存在差異,比如Pytorch的反卷積自帶兩次padding;最大池化時Pytorch向下取整,而Caffe向上取整等等。細(xì)節(jié)上的問題會導(dǎo)致轉(zhuǎn)換后輸出不同。

          所以我們可以看到圖上那條更迂回的路,經(jīng)過ONNX這個較為通用的格式,因?yàn)镻ytorch—>ONNX—>Caffe—>TensorRT從部署角度看才更可行。

          2 什么是ONNX?

          ONNX是一套神經(jīng)網(wǎng)絡(luò)模型的開放格式,支持Core ML, PaddlePaddle, SNPE, MXNet, Caffe2, PyTorch, TensorFlow, CNTK 等框架。

          ONNX的安裝比較簡單,在Ubuntu上直接pip install onnx即可,從圖上可以看出它是依賴Protobuf庫的,因?yàn)樗鼉?nèi)部采用的是Protobuf作為其數(shù)據(jù)存儲和傳輸。

          ONNX是一種可擴(kuò)展的計算圖模型、一系列內(nèi)置的運(yùn)算單元和標(biāo)準(zhǔn)數(shù)據(jù)類型。每一個計算流圖都定義為由節(jié)點(diǎn)組成的列表,并構(gòu)建有向無環(huán)圖。其中每一個節(jié)點(diǎn)都有一個或多個輸入與輸出,每一個節(jié)點(diǎn)稱之為一個 運(yùn)算單元。這相當(dāng)于一種通用的計算圖,不同深度學(xué)習(xí)框架構(gòu)建的計算圖都能轉(zhuǎn)化為它。

          為什么要把訓(xùn)練的模型轉(zhuǎn)換成ONNX?

          ONNX的作用是在五花八門的訓(xùn)練框架和屈指可數(shù)的部署方案之間建立橋梁。它是一個中間環(huán)節(jié),方便模型的部署和在各個框架之間轉(zhuǎn)移。

          試下如果你電腦上是Tensorflow的環(huán)境,卻發(fā)現(xiàn)最新的開源模型是用Pytorch寫的,你想快速測試效果怎么辦?

          1. 采用TensorFlow重寫一遍嗎?肯定不行,先不說實(shí)現(xiàn)后性能是否一致,單就花費(fèi)的時間成本就很高。

          2. 那么配置一份Pytorch的運(yùn)行環(huán)境跑一下結(jié)果?看起來可行,但是下一次是Caffe,CoreML呢?難不成都配置一遍嗎!

          3. 再想想辦法,寫個腳本將Pytorch的權(quán)重轉(zhuǎn)成TensorFlow的pb文件?好像也可以,但是實(shí)際操作下來會發(fā)現(xiàn)不同框架直接的直接轉(zhuǎn)換有許多細(xì)節(jié)上的不統(tǒng)一。

          最后大家商量一個共同使用的中間接口過度不就可以了,微軟開發(fā)的ONNX因此出現(xiàn)了。

          還有一種部署的場景是當(dāng)用某個開源框架訓(xùn)練的模型文件轉(zhuǎn)換到ONNX后,還需要將它再次轉(zhuǎn)換,比如轉(zhuǎn)換到TensorRT后做前向傳播。為什么要轉(zhuǎn)換這么多次呢?

          我們反過來看就清楚了,目標(biāo)平臺支持哪個框架力度大,我們就通過ONNX做為中轉(zhuǎn)站將當(dāng)前的框架模型轉(zhuǎn)換到支持算子多的框架,為了讓算法在移動端部署成功。

          如何轉(zhuǎn)換ONNX?

          這里以tensorflow為例,從tf轉(zhuǎn)到onnx還處于實(shí)驗(yàn)階段,我們可以依靠外部工具進(jìn)行轉(zhuǎn)換。

          1. 首先第一步需要安裝tf2onnx包,即pip install -U tf2onnx。

          2. 然后第二步將ckpt文件凍結(jié)成pb文件,這里是因?yàn)閏kpt和meta文件分別權(quán)重信息和拓?fù)浣Y(jié)構(gòu)分開存儲,而且固化到pb中是將變量凍結(jié)成常量形式。TensorFlow官方已經(jīng)提過了相關(guān)工具freeze_graph。

          3. 最后第三部執(zhí)行tf2onnx.convert命令,即:

            python3 -m tf2onnx.convert --input model.pb  --inputs input_name:0[1,640,640,3] --outputs output_name:0 --output model.onnx

            其中input_name是網(wǎng)絡(luò)輸入的名稱,output_name是網(wǎng)絡(luò)輸出的名稱。

          3 網(wǎng)絡(luò)可視化工具

          隨著深度學(xué)習(xí)從2016年的爆發(fā)到現(xiàn)在已有5年時間,市面上深度學(xué)習(xí)框架也是百花齊放,有TensorFlow、Caffe、Pytorch、NCNN、CoreML、MXNet、ArmNN等等,再加上各大硬件廠商集成的SDK(SNPE、TIDL、TensorRT等),加起來不少于小幾十種。

          但是好用的模型可視化工具卻相對非常較少,其中TensorBoard應(yīng)該算煉丹師們較為熟悉的一種工具,它能夠查看網(wǎng)絡(luò)結(jié)構(gòu),損失的變化,準(zhǔn)確率指標(biāo)等變化情況。功能比較全面,界面如下圖所示:

          TensorBoard安裝和使用

          TensorBoard是隨著TensorFlow一起安裝的,這里我們不再啰嗦。使用時分為五步:

          1. 指定文件用于保存Tensorboard的圖:writer = tf.summary.FileWriter(log_dir=log_dir)

          2. 增加需要觀測的變量:

            tf.summary.histogram('weights',weight)

            tf.summary.scalar('loss',loss) ......

          3. 合并所有待觀察的數(shù)據(jù):

            merged = tf.summary.merge_all()

          4. 運(yùn)行命令:tensorboard --logdir=./logs

          5. 在瀏覽器輸入網(wǎng)址:http://localhost:6006,即可查看生成圖和參數(shù)

          在第2步中,具體TensorBoard可以觀察哪些東西呢?

          • 標(biāo)量Scalars:存儲和顯示諸如學(xué)習(xí)率和損失等單個值的變化趨勢
          • 圖片Images:對于輸入是圖像的模型,顯示某一步輸入給模型的圖像
          • 計算圖Graph:顯示代碼中定義的計算圖,也可以顯示包括每個節(jié)點(diǎn)的計算時間、內(nèi)存使用等情況
          • 數(shù)據(jù)分布Distribution:顯示模型參數(shù)隨迭代次數(shù)的變化情況
          • 直方圖Histograms:顯示模型參數(shù)隨迭代次數(shù)的變化情況
          • 嵌入向量Embeddings:在3D或者2D圖中展示高維數(shù)據(jù)

          下面我們再推薦另一款輕量級的可視化工具Netron。

          Netron安裝和使用

          Netron支持兩種方式打開,其一是瀏覽器訪問,無需任何安裝。登錄IP地址:https://netron.app/

          點(diǎn)擊Open Model選中你要可視化的模型格式,即可看到如下界面:

          圖中可以看到中間區(qū)域是網(wǎng)絡(luò)結(jié)構(gòu)的描述,左側(cè)是菜單欄,可選擇顯示節(jié)點(diǎn)屬性、名稱等功能,右側(cè)是選中的節(jié)點(diǎn)特性,包括類型、名稱、輸入、輸出等。

          另一種打開方式需要進(jìn)行軟件安裝,不同操作系統(tǒng)安裝方式不同,官網(wǎng)上有各個操作系統(tǒng)下的軟件包鏈接:

          客戶端模式下加載權(quán)重文件,感覺比瀏覽器版本更清晰一些:

          Netron支持的框架

          Netron目前支持的框架有:

          • Keras的h5文件
          • Caffe的caffemodel和prototxt文件
          • TensorFlow Lite的tflite文件
          • ONNX的onnx文件
          • Core ML的mlmodel文件
          • NCNN的param文件

          還有一些處于實(shí)驗(yàn)階段,還不夠穩(wěn)定,如:

          • Pytorch的pt文件
          • TensorFlow的pb、ckpt文件
          • CNTK的model、cntk文件
          • Arm NN的armnn文件
          • Scikit-learn的pkl文件
          • Deeplearning4j的zip文件

          從使用角度來說,Netron更適合在拿到一份陌生的網(wǎng)絡(luò)時查看其結(jié)構(gòu);而TensorBoard更適合在訓(xùn)練的過程中實(shí)時關(guān)注訓(xùn)練參數(shù)的變化,以便及時作出調(diào)整。

          如果覺得有用,就請分享到朋友圈吧!

          △點(diǎn)擊卡片關(guān)注極市平臺,獲取最新CV干貨

          公眾號后臺回復(fù)“CVPR21檢測”獲取CVPR2021目標(biāo)檢測論文下載~


          極市干貨
          深度學(xué)習(xí)環(huán)境搭建:如何配置一臺深度學(xué)習(xí)工作站?
          實(shí)操教程:OpenVINO2021.4+YOLOX目標(biāo)檢測模型測試部署為什么你的顯卡利用率總是0%?
          算法技巧(trick):圖像分類算法優(yōu)化技巧21個深度學(xué)習(xí)調(diào)參的實(shí)用技巧


          CV技術(shù)社群邀請函 #

          △長按添加極市小助手
          添加極市小助手微信(ID : cvmart4)

          備注:姓名-學(xué)校/公司-研究方向-城市(如:小極-北大-目標(biāo)檢測-深圳)


          即可申請加入極市目標(biāo)檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學(xué)影像/3D/SLAM/自動駕駛/超分辨率/姿態(tài)估計/ReID/GAN/圖像增強(qiáng)/OCR/視頻理解等技術(shù)交流群


          每月大咖直播分享、真實(shí)項目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、與 10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~



          覺得有用麻煩給個在看啦~  
          瀏覽 67
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天堂资源在线网 | 欧美高清橾逼网免费观看 | 黄色在线播放 | 伊人AV综合 | 激情五月天婷婷 |