1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 5993字,需瀏覽 12分鐘

         ·

        2024-07-15 22:00

        ↑ 點(diǎn)擊藍(lán)字 關(guān)注極市平臺(tái)
        作者 | 愛(ài)做菜的煉丹師
        來(lái)源 | CV研習(xí)社
        編輯 | 極市平臺(tái)

        極市導(dǎo)讀

         

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

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

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

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

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

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

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

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

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

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

        2 什么是ONNX?

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

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

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

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

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

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

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

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

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

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

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

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

        如何轉(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)分開(kāi)存儲(chǔ),而且固化到pb中是將變量?jī)鼋Y(jié)成常量形式。TensorFlow官方已經(jīng)提過(guò)了相關(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ò)輸入的名稱(chēng),output_name是網(wǎng)絡(luò)輸出的名稱(chēng)。

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

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

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

        TensorBoard安裝和使用

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

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

        2. 增加需要觀測(cè)的變量:

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

        下面我們?cè)偻扑]另一款輕量級(jí)的可視化工具Netron。

        Netron安裝和使用

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

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

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

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

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

        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文件

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

        公眾號(hào)后臺(tái)回復(fù)“數(shù)據(jù)集”獲取60+深度學(xué)習(xí)數(shù)據(jù)集下載~

        極市干貨
        數(shù)據(jù)集資源匯總:10個(gè)開(kāi)源工業(yè)檢測(cè)數(shù)據(jù)集匯總21個(gè)深度學(xué)習(xí)開(kāi)源數(shù)據(jù)集分類(lèi)匯總
        算法trick目標(biāo)檢測(cè)比賽中的tricks集錦從39個(gè)kaggle競(jìng)賽中總結(jié)出來(lái)的圖像分割的Tips和Tricks
        技術(shù)綜述:一文弄懂各種loss function工業(yè)圖像異常檢測(cè)最新研究總結(jié)(2019-2020)


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

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

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


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


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



        覺(jué)得有用麻煩給個(gè)在看啦~  
        瀏覽 54
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产高清不卡一区 | 中文字幕日韩欧美一区二区三区 | 成人片爱爱爱激情视频 | 五月天激情小说视频 | 男人扒开添女人下部免费视频 | 最新国产在线拍揄自揄视频 | 国产 在线观看免费视频 | 俺也去了大香蕉在线 | 一级淫荡 | www俺去也 |