戰(zhàn)指南:從模型下載到推理部署全解析)
簡介Open Model Zoo預(yù)訓(xùn)練模型與演示資源包面向需要快速落地深度學(xué)習(xí)推理的算法工程師與部署開發(fā)者。資源整合了圖像分類、目標(biāo)檢測、語義分割等方向的預(yù)訓(xùn)練模型并提供通過OpenVINO工具套件調(diào)用模型的示例工程可幫助跳過繁瑣訓(xùn)練與模型轉(zhuǎn)換環(huán)節(jié)直接評估模型精度與部署性能適用于邊緣計算、智能攝像頭、工業(yè)視覺等推理場景。由于這些模型面向OpenVINO工具鏈做過多輪優(yōu)化可減少自行轉(zhuǎn)換與調(diào)優(yōu)帶來的兼容性問題適合在成熟框架與邊緣設(shè)備之間快速打通推理鏈路。壓縮包整體約159.61MB以預(yù)訓(xùn)練模型和配套演示工程為主適合配合官方文檔作環(huán)境配置與二次開發(fā)當(dāng)前已有618人瀏覽學(xué)習(xí)適合作為OpenVINO相關(guān)模型部署的入門參考。結(jié)合Caffe、TensorFlow等模型與OpenVINO工具鏈?zhǔn)褂谜呖蓮氖纠霭l(fā)快速替換業(yè)務(wù)數(shù)據(jù)并驗(yàn)證邊緣設(shè)備上的運(yùn)行表現(xiàn)也能將這套流程遷移到自定義模型中。1. 聊聊Open Model Zoo它到底解決了什么問題做深度學(xué)習(xí)落地的人十有八九都經(jīng)歷過這種場景項目剛立項老板問能不能先跑個效果看看客戶問這個方案可行性怎么樣然后你打開GitHub開始漫無目的地搜模型下載一個預(yù)訓(xùn)練權(quán)重結(jié)果發(fā)現(xiàn)這個模型是用你沒見過的框架訓(xùn)練的配置文件格式也不兼容連輸入尺寸都要自己翻論文去猜。一上午過去了連個Demo的影子都沒看到。這個痛點(diǎn)Intel的Open Model Zoo就是沖著它來的。Open Model Zoo是Intel開源的預(yù)訓(xùn)練深度學(xué)習(xí)模型倉庫里面收錄了大量已經(jīng)訓(xùn)練好的模型覆蓋目標(biāo)檢測、圖像分類、語義分割、人體姿態(tài)估計、文本識別、語音識別、推薦系統(tǒng)等常見任務(wù)。它的核心價值不在模型數(shù)量多而在于兩點(diǎn)一是這些模型全部經(jīng)過OpenVINO工具套件的轉(zhuǎn)換和優(yōu)化可以直接用推理引擎跑起來二是每個模型都配套了標(biāo)準(zhǔn)的預(yù)處理方法、輸入輸出格式說明和Demo示例你不需要去猜任何參數(shù)。說白了Open Model Zoo給的是從模型到可運(yùn)行Demo的一條龍體驗(yàn)。它特別適合這幾類人剛接觸OpenVINO的開發(fā)者想快速驗(yàn)證某個視覺任務(wù)落地效果的算法工程師以及需要在資源受限設(shè)備上做原型驗(yàn)證的嵌入式工程師。我自己最常用的場景就是客戶說幫我看看這個任務(wù)用深度學(xué)習(xí)能不能做我打開Open Model Zoo找到對應(yīng)模型跑個Demo效果好壞一目了然前后不超過半小時。需要先說明一個概念Open Model Zoo里有一部分模型是Intel自己訓(xùn)練的另一部分是從公開模型庫比如TensorFlow Hub、Caffe Model Zoo收集過來并轉(zhuǎn)換格式的。無論來源是哪兒發(fā)布前都經(jīng)過了精度驗(yàn)證和性能調(diào)優(yōu)比你自己去網(wǎng)上隨便找個權(quán)重文件靠譜得多。2. 倉庫結(jié)構(gòu)拆解第一次打開該從哪里入手很多人第一次clone Open Model Zoo會被它的目錄結(jié)構(gòu)嚇到感覺東西又多又雜。其實(shí)它的組織邏輯非常清晰核心就幾個目錄。2.1 頂層目錄的分工邏輯整個倉庫主要分成這幾塊models模型定義目錄按任務(wù)類型分子文件夾比如public公開模型、intelIntel訓(xùn)練的模型。每個模型文件夾里都有一個model.yml文件里面記錄了模型的下載地址、輸入輸出格式、預(yù)處理參數(shù)、license等信息。demosDemo程序目錄按任務(wù)類型分子文件夾比如object_detection_demo、segmentation_demo。每個Demo都是完整的C或Python工程可以直接編譯運(yùn)行。notebooksJupyter Notebook教程適合想邊看邊跑的人。這部分后來獨(dú)立出去了但倉庫里仍有指引。tools輔助工具比如模型下載腳本、模型轉(zhuǎn)換工具等。data存放Demo運(yùn)行時需要的測試圖片、視頻等數(shù)據(jù)。實(shí)際用下來我建議的順序是先看models目錄搞清楚有哪些模型可以用再看demos目錄找對應(yīng)的Demo最后用tools里的腳本把模型下載下來跑通Demo。2.2 模型清單文件才是真正的索引models目錄下的每個子文件夾都有model.yml文件這個文件是模型的身份證。里面包含了模型名稱、任務(wù)類型、框架來源、輸入輸出格式、預(yù)處理細(xì)節(jié)、license信息等。我強(qiáng)烈建議你花十分鐘隨手打開幾個model.yml看看它比任何文檔都直觀。比如你要找一個做人體姿態(tài)估計的模型打開models/intel目錄下的human-pose-estimation-0001文件夾里面的model.yml會告訴你輸入是1x3x384x288的BGR圖像輸出是1x80x96x96的熱力圖預(yù)處理需要把圖像縮放到384x288減均值除方差這些信息直接決定了你怎么寫預(yù)處理代碼省掉了翻論文的時間。3. 模型下載與轉(zhuǎn)換這步最容易踩坑3.1 用官方腳本下載別手動去點(diǎn)鏈接Open Model Zoo提供了一個統(tǒng)一的下載腳本tools/model_tools/downloader.py這是最推薦的方式。手動去瀏覽器點(diǎn)鏈接下載容易因?yàn)榘姹靖聦?dǎo)致路徑失效而且模型文件通常很大斷點(diǎn)續(xù)傳也不好處理?;居梅ㄊ莗ython tools/model_tools/downloader.py --name human-pose-estimation-0001 --output_dir /opt/models如果想一次下載某個任務(wù)類型下的所有模型可以用--all參數(shù)配合任務(wù)類型過濾python tools/model_tools/downloader.py --all --task_type detection --output_dir /opt/models--task_type支持的取值包括classification、detection、segmentation、pose_estimation等具體可以參考腳本的--help輸出。3.2 轉(zhuǎn)換到IR格式的兩種路徑Open Model Zoo里的模型分兩類一類是已經(jīng)轉(zhuǎn)換好的OpenVINO IR格式.xml.bin另一類是原始框架格式比如.pb、.caffemodel、.onnx。對于后者需要先轉(zhuǎn)換成IR格式才能用OpenVINO Runtime加載。轉(zhuǎn)換工具是OpenVINO自帶的Model Optimizerpython mo.py --input_model /opt/models/public/mobilenet-v2/mobilenet-v2.onnx --output_dir /opt/models/public/mobilenet-v2/IR如果模型來自TensorFlow的GraphDef格式可能需要額外指定輸入輸出節(jié)點(diǎn)名比如python mo.py --input_model /opt/models/public/ssd_mobilenet_v2/ssd_mobilenet_v2.pb --input_shape [1,300,300,3] --reverse_input_channels --output_dir /opt/models/public/ssd_mobilenet_v2/IRModel Optimizer轉(zhuǎn)換過程中的幾個高頻參數(shù)--input_shape指定固定的輸入形狀不指定的話OpenVINO會保留動態(tài)shape雖然也能跑但性能會差一些。--reverse_input_channels如果訓(xùn)練時用的是RGB順序、推理時數(shù)據(jù)是BGR需要加這個參數(shù)做通道反轉(zhuǎn)。--mean_values和--scale_values對應(yīng)模型訓(xùn)練時的歸一化參數(shù)不設(shè)置的后果是推理精度明顯下降。提示Model Optimizer在OpenVINO 2023及以上版本中已經(jīng)合并到ovcOpenVINO Converter工具里遷移后的命令格式有變化但model_tools里的腳本會自動處理這些細(xì)節(jié)。如果你手動轉(zhuǎn)換建議先確認(rèn)OpenVINO版本再查對應(yīng)文檔。3.3 下載慢或失敗時的替代方案國內(nèi)網(wǎng)絡(luò)環(huán)境下直接從GitHub或Model Zoo下載大模型經(jīng)常超時。我的經(jīng)驗(yàn)是先用downloader.py跑一遍看它卡在哪個URL然后用支持?jǐn)帱c(diǎn)續(xù)傳的下載工具單獨(dú)下載該文件放到對應(yīng)目錄后重新運(yùn)行腳本腳本會跳過已下載的文件。另外downloader.py支持--precisions參數(shù)用來指定想要的精度版本FP32、FP16、INT8等。嵌入式設(shè)備上通常選FP16或INT8模型體積能小一半甚至更多推理速度也有肉眼可見的提升精度損失在多數(shù)任務(wù)里可以接受。4. Demo實(shí)戰(zhàn)跑通一個人體姿態(tài)估計示例理論說再多不如親手跑通一個Demo。我用Open Model Zoo里最經(jīng)典的人體姿態(tài)估計模型來演示完整流程。4.1 環(huán)境準(zhǔn)備清單跑這個Demo需要準(zhǔn)備Python 3.8及以上版本OpenVINO Runtimepip install openvino即可OpenCV Python庫pip install opencv-pythonOpen Model Zoo倉庫代碼安裝OpenVINO時有個細(xì)節(jié)pip安裝的OpenVINO和完整安裝包帶Model Optimizer等工具不是一回事。如果你只需要推理pip install openvino就夠了如果你還需要做模型轉(zhuǎn)換建議用完整安裝包或者在虛擬環(huán)境里額外安裝Model Optimizer相關(guān)組件。4.2 下載模型和Demo代碼# 克隆倉庫 git clone https://github.com/openvinotoolkit/open_model_zoo.git cd open_model_zoo # 下載人體姿態(tài)估計模型IR格式 python tools/model_tools/downloader.py --name human-pose-estimation-0001 --precisions FP16 --output_dir models_ir這里指定FP16是因?yàn)槲业哪繕?biāo)設(shè)備是集成顯卡FP16精度在視覺任務(wù)上幾乎無損但內(nèi)存占用和計算量都更低。4.3 跑通Python推理腳本Open Model Zoo里這個模型對應(yīng)的Demo是C工程對于Python用戶我建議直接用官方Notebook里的思路或者手動寫一個最簡腳本其實(shí)核心代碼不超過50行import cv2 import numpy as np from openvino import Core # 初始化推理引擎 core Core() model core.read_model(models_ir/intel/human-pose-estimation-0001/FP16/human-pose-estimation-0001.xml) compiled_model core.compile_model(model, CPU) # 獲取輸入輸出信息 input_layer compiled_model.input(0) output_layer compiled_model.output(0) # 讀取并預(yù)處理圖像 image cv2.imread(test.jpg) input_image cv2.resize(image, (288, 384)) # 模型的寬高順序要留意 input_image input_image.transpose((2, 0, 1)) # HWC - CHW input_image np.expand_dims(input_image, axis0).astype(np.float32) # 推理 result compiled_model([input_image])[output_layer] heatmaps result[0] # shape: [80, 96, 96] # 從熱力圖提取關(guān)鍵點(diǎn)坐標(biāo) h, w heatmaps.shape[1:] keypoints [] for i in range(heatmaps.shape[0]): heatmap heatmaps[i] _, max_val, _, max_loc cv2.minMaxLoc(heatmap) if max_val 0.1: keypoints.append((int(max_loc[0] * image.shape[1] / w), int(max_loc[1] * image.shape[0] / h))) else: keypoints.append((0, 0)) # 可視化 for point in keypoints: if point ! (0, 0): cv2.circle(image, point, 4, (0, 255, 0), -1) cv2.imwrite(output.jpg, image)這段腳本有幾個容易出錯的地方我逐個說明圖像縮放尺寸的順序模型輸入是384x288我第一次寫反了導(dǎo)致推理結(jié)果完全錯亂。OpenVINO的模型輸入順序是NCHW即通道數(shù)在前、高度其次、寬度最后對應(yīng)到OpenCV的resize時參數(shù)是(width, height)也就是(288, 384)。熱力圖坐標(biāo)映射回原圖熱力圖尺寸是96x96要映射回原圖坐標(biāo)需要分別乘以縮放比例。上面代碼里用了int(max_loc[0] * image.shape[1] / w)其中image.shape[1]是原圖寬度對應(yīng)的是x軸別搞反了。置信度閾值我設(shè)了0.1實(shí)際使用中這個值要根據(jù)場景調(diào)整。背景復(fù)雜、目標(biāo)較小的時候閾值太低會出來一堆噪點(diǎn)太高會漏檢關(guān)鍵點(diǎn)建議在0.05到0.2之間多試幾次。4.4 推理速度的真實(shí)體感我在一臺普通的辦公筆記本上用的是CPU推理跑這個模型輸入是1920x1080的視頻幀F(xiàn)P16精度下實(shí)測單幀推理時間在40到60毫秒之間大概是20幀每秒左右的處理速度。如果換成視頻文件后處理不算在推理時間里實(shí)際體感是接近實(shí)時的。這個速度對原型驗(yàn)證和Demo演示來說已經(jīng)相當(dāng)夠用了。如果還想更快可以轉(zhuǎn)為INT8精度速度還能再提升50%左右把輸入尺寸從384x288降到192x160速度翻倍但小目標(biāo)檢測精度會下降用--device GPU跑在核顯上通常比CPU快提示OpenVINO把CPU和核顯統(tǒng)稱為CPU和GPU設(shè)備在compile_model時通過第二個參數(shù)指定比如core.compile_model(model, GPU)。核顯推理需要安裝OpenCL驅(qū)動Windows下一般裝顯卡驅(qū)動即可Linux下需要額外裝intel-opencl-icd包。5. 精度與性能之間的調(diào)優(yōu)經(jīng)驗(yàn)5.1 FP32、FP16、INT8該怎么選Open Model Zoo里很多模型都提供了多種精度版本。選哪種取決于你的硬件、精度要求和推理速度要求。精度模型體積相對速度精度損失適用場景FP32基準(zhǔn)基準(zhǔn)無PC端、服務(wù)器端追求最高精度FP16約一半提升1.5-2倍幾乎不可感知大多數(shù)實(shí)際應(yīng)用推薦首選INT8約四分之一提升2-4倍部分任務(wù)損失1-3%嵌入式設(shè)備、實(shí)時性要求高的場景實(shí)際經(jīng)驗(yàn)是FP16在絕大多數(shù)視覺任務(wù)上可以直接替代FP32模型體積減半、速度翻倍精度差異在肉眼層面看不出來。INT8需要謹(jǐn)慎分類任務(wù)損失很小但檢測任務(wù)里的小目標(biāo)容易丟。5.2 預(yù)處理參數(shù)不匹配是最隱蔽的精度殺手我見過不少人下載了模型、寫好了推理代碼結(jié)果輸出結(jié)果一團(tuán)糟。排查到最后發(fā)現(xiàn)是預(yù)處理參數(shù)和模型訓(xùn)練時不一致。Open Model Zoo的model.yml文件里每個模型都標(biāo)明了預(yù)處理要求。以human-pose-estimation-0001為例它的預(yù)處理是圖像縮放到384x288BGR格式減均值[123.675, 116.28, 103.53]除以標(biāo)準(zhǔn)差[58.395, 57.12, 57.375]。這個均值和標(biāo)準(zhǔn)差對應(yīng)的是訓(xùn)練集統(tǒng)計出來的數(shù)據(jù)如果你的預(yù)處理不匹配輸入分布就偏移了模型效果自然會崩。用model.yml的另一個好處是你可以在下載模型前先確認(rèn)預(yù)處理復(fù)雜度。有些模型的預(yù)處理特別繁瑣如果你的項目對端到端流程有強(qiáng)要求盡量選預(yù)處理簡單的模型能省不少事。5.3 多個模型串聯(lián)時的性能陷阱Open Model Zoo的價值不止于單個模型。在實(shí)際項目里我經(jīng)常把多個模型串聯(lián)起來用比如人體檢測 → 姿態(tài)估計 → 行為識別或者車牌檢測 → 字符識別。多模型串聯(lián)最容易踩的性能坑是每個模型單獨(dú)推理時都很快但串起來后總耗時遠(yuǎn)超各部分之和。原因在于Python層面的數(shù)據(jù)格式轉(zhuǎn)換、內(nèi)存拷貝開銷以及CPU推理時OpenVINO的線程調(diào)度策略。緩解方法有幾個方向盡量復(fù)用輸入輸出緩沖區(qū)避免每幀都重新分配內(nèi)存推理前統(tǒng)一所有模型的圖像縮放尺寸減少resize次數(shù)如果兩個模型可以并行考慮用OpenVINO的Async API讓前一個模型還在推理時下一個模型的數(shù)據(jù)已經(jīng)在準(zhǔn)備了6. 模型選型的核心判斷標(biāo)準(zhǔn)Open Model Zoo里的模型越來越多新手反而會挑花眼。我的選型邏輯很簡單按優(yōu)先級看三件事。6.1 首選任務(wù)匹配度高的專精模型同樣是檢測任務(wù)ssd_mobilenet_v2能檢測80類物體person-detection-0200專門檢測人。如果場景固定為人流統(tǒng)計那后者的精度和速度都遠(yuǎn)勝前者。Open Model Zoo的好處是它按task_type分了類你可以先粗篩再精挑。從架構(gòu)上看專精模型因?yàn)轭悇e數(shù)少最后一層分類頭的計算量小同樣的backbone在相同算力下可以跑更大的輸入分辨率或者塞進(jìn)更小的設(shè)備。這是很多人在模型選型時容易忽略的維度。6.2 用model.yml的license判斷商用風(fēng)險做商業(yè)項目的人一定要看這個。Open Model Zoo里的模型license并不統(tǒng)一有的來自Apache 2.0有的來自MIT還有的是Intel自己的license。商用前務(wù)必逐個確認(rèn)模型來源和license條款別等到客戶審代碼時才被發(fā)現(xiàn)用了不合適的模型。6.3 在Demo里看真實(shí)效果別只看指標(biāo)模型自帶的README和model.yml里通常有精度指標(biāo)mAP、accuracy等但那些指標(biāo)是在特定數(shù)據(jù)集和設(shè)定下測出來的跟你的真實(shí)場景未必匹配。最靠譜的做法是把模型下載下來直接用Open Model Zoo的Demo跑一遍你的測試圖片看看在目標(biāo)小、遮擋多、光照差等極端情況下的表現(xiàn)。Open Model Zoo的Demo程序都支持輸入圖片或視頻測試非常方便。7. 我踩過的幾個坑寫出來免得你再踩7.1 版本不匹配導(dǎo)致的模型加載失敗OpenVINO的版本更新很頻繁每個版本對IR格式的兼容性有一定窗口期。你上個月下載的模型這個月升級了OpenVINO后發(fā)現(xiàn)加載報錯很大概率是老模型是舊版IR版本新版本OpenVINO已經(jīng)不支持了。解決辦法升級OpenVINO后不用重新下載模型用官方的mo.py或者ovc重新轉(zhuǎn)換一次IR即可。如果模型是直接從Open Model Zoo下載的也可以刪掉重新跑一次downloader.py它會下載匹配新版本格式的模型。7.2 多線程推理的資源競爭OpenVINO默認(rèn)會占用所有可用的CPU核。如果你在推理的同時還要做視頻解碼、圖像預(yù)處理這兩件事就會搶CPU資源導(dǎo)致推理時間反而變慢。我的做法是給推理設(shè)置CPU核心數(shù)限制config {PERFORMANCE_HINT: THROUGHPUT, NUM_STREAMS: 2} compiled_model core.compile_model(model, CPU, config)或者顯式設(shè)置線程數(shù)config {INFERENCE_NUM_THREADS: 4}具體開幾個線程取決于你的CPU核數(shù)和任務(wù)并行度通常設(shè)為核心數(shù)的一半到三分之二留給其他任務(wù)一些余量。7.3 攝像頭輸入時的緩沖問題用Open Model Zoo跑攝像頭實(shí)時視頻時攝像頭幀率高于模型推理速度會出現(xiàn)視頻緩沖越來越大、延遲越來越高的現(xiàn)象。要解決這個問題最有效的辦法是丟幀策略不處理每一幀而是固定間隔處理或者隊列里只保留最新幀。我在實(shí)際代碼里用的方式很簡單while True: ret, frame cap.read() if not ret: break frame_count 1 if frame_count % 3 ! 0: # 每3幀處理一幀 continue # 推理處理這個方法雖然粗暴但在實(shí)時演示場景下非常管用視覺上畫面依然連貫推理延遲卻大大降低了。8. 從Demo到項目落地還差這幾步跑通Open Model Zoo的Demo只是第一步真正把它用到項目里還需要做幾件事。8.1 封裝統(tǒng)一的推理接口Open Model Zoo的Demo代碼往往為了展示效果在可視化上寫了很多代碼。實(shí)際項目里你需要把推理邏輯封裝成一個干凈的接口只接收圖像、返回結(jié)果對象。這樣換模型時只需要改模型加載部分業(yè)務(wù)邏輯完全不用動。8.2 加入業(yè)務(wù)邏輯和后處理模型輸出的是裸結(jié)果比如檢測框坐標(biāo)、關(guān)鍵點(diǎn)坐標(biāo)要對接業(yè)務(wù)系統(tǒng)還需要做跟蹤、計數(shù)、告警等后處理。Open Model Zoo本身不提供這些能力但好消息是它輸出的數(shù)據(jù)結(jié)構(gòu)很標(biāo)準(zhǔn)對接起來很方便。8.3 性能Profiling看瓶頸在哪如果落地后發(fā)現(xiàn)性能不達(dá)標(biāo)先別急著換模型做一次Profiling。把整條鏈路拆成視頻采集、解碼、預(yù)處理、推理、后處理、可視化、傳輸七個環(huán)節(jié)分別計時找到耗時最高的環(huán)節(jié)再針對性地優(yōu)化。我遇到過很多次推理本身只要20毫秒但視頻解碼花了80毫秒或者可視化繪制花了50毫秒。優(yōu)化解碼方式或降低可視化頻率性能問題就解決了完全不需要動模型。Open Model Zoo給我最大的感受是它把深度學(xué)習(xí)模型從論文里的數(shù)學(xué)公式變成了可以直接運(yùn)行的程序。如果你卡在模型怎么選、Demo怎么跑這個階段我建議你直接clone倉庫挑一個任務(wù)相關(guān)的模型按本文的流程跑一遍。跑通了你對OpenVINO和模型落地的理解會上一個臺階后面再選型、調(diào)優(yōu)都有了自己的判斷基準(zhǔn)。本文還有配套的精品資源點(diǎn)擊獲取