Python | OpenCV 與深度學習框架整合
📚 前言
在上一篇 多物件偵測與追蹤 中,我們學會了以 YOLO + DeepSORT 進行即時多物件偵測與追蹤,這是偏向「應用層」的做法,直接利用 OpenCV 的 DNN 模組載入模型並完成任務。
然而,若要進一步開發專案或研究,就需要更高的彈性與可擴充性。
在進入框架整合之前,先退一步看看這一路走來的學習路徑。
🗺️ 這一路怎麼走過來的
這個系列的學習順序是刻意安排的——先做,後懂。
如果一開始就從「深度神經網路的原理」、「框架的計算圖設計」這些概念開始講,大多數人學不到三頁就放棄了。所以我們從能馬上看到結果的東西開始,先建立信心,再一步步深入。
第一階段:純 OpenCV 操作
完全不碰任何模型,只用 OpenCV 內建的函式處理圖片與影片。讀取、顯示、縮放、濾波、畫框……這些都是基礎,但也是後面所有應用的地基。
圖:第一階段涵蓋入門、圖片處理、幾何繪圖、特徵與進階、視訊與互動篇五大區塊,全程只用 OpenCV 內建函式
第二階段:cv2 模型整合(不需安裝深度學習框架)
開始使用模型,但還不需要安裝 PyTorch 或 TensorFlow。Haar、LBP、MobileNet SSD、YOLOv3-tiny……這些模型直接透過 OpenCV 的 cv2.dnn 模組載入,傻傻拿來用就好,不用管底層框架是什麼。
圖:第二階段全程使用 OpenCV,透過 cv2.dnn 載入 Caffe、Darknet 等格式的模型進行推論,不需安裝 PyTorch 或 TensorFlow
第三階段:深度學習框架整合(現在這篇)
到了這裡,cv2.dnn 的限制開始出現——它只能推論,不能訓練,也不能修改網路結構。若要自己訓練模型、針對特定場景微調,就必須直接接觸 PyTorch 或 TensorFlow。
圖:第三階段開始使用 PyTorch 與 TensorFlow/Keras,載入預訓練模型並整合 OpenCV 進行推論
第四階段:自己訓練模型(後續篇章)
理解了框架的用法之後,下一步就是真正「自己訓練模型」。從資料蒐集、標註、選擇模型架構、到訓練、評估、匯出,以及如何避免過擬合、使用資料增強提升泛化能力——這些都是後續篇章的主題。
圖:第四階段涵蓋模型訓練與微調、YOLOv8 自訓練物件偵測兩條路線,最終都可匯出 ONNX 接回 OpenCV 部署
從這篇開始,你會陸續看到更多術語:PyTorch、TensorFlow、Keras、YOLO、ResNet、MobileNet……
這篇就是要把這些詞一次講清楚,讓你之後看到時不會一頭霧水。
🔎 先看懂這張全景圖
下面這張圖把電腦視覺常用的工具分成四層,搞懂四層的分工,後面就不會搞混了。
圖:電腦視覺工具四層架構,從左到右依序為:函式庫、深度學習框架、模型架構、執行模型的方式
第一層:函式庫(OpenCV)
OpenCV 是影像處理的工具箱,負責讀取、顯示、前處理圖片與影片。它本身不訓練模型,但有一個子模組 cv2.dnn,可以載入別人訓練好的模型直接推論。
第二層:深度學習框架(PyTorch / TensorFlow / Keras)
這是真正負責訓練模型的引擎。
- PyTorch:Meta (Facebook) 開發,動態計算圖,程式碼直覺,學術研究主流。
- TensorFlow:Google 開發,適合大規模部署與生產環境。
- Keras:TensorFlow 的高階 API,用更少的程式碼就能建立模型,適合快速開發。
第三層:模型架構(YOLO / ResNet / MobileNet / Haar / LBP)
這些是「設計圖」,只是一種網路架構的概念,不能獨立運作,需要搭配框架或工具才能執行。
| 模型 | 用途 | 特色 |
|---|---|---|
| YOLO | 物件偵測 | 單次推論偵測多目標,速度快 |
| ResNet | 影像分類 | 殘差連接,解決深層網路訓練困難 |
| MobileNet | 影像分類 | 輕量化設計,適合嵌入式裝置 |
| Haar Cascades | 人臉偵測(傳統) | 速度快,.xml 格式 |
| LBP Cascades | 人臉偵測(傳統) | 比 Haar 更快,精度略低,.xml 格式 |
第四層:執行模型的方式
同一個模型,有不同的執行方式,依需求選擇:
- ultralytics:YOLO 的高階工具套件,底層是 PyTorch,一行程式碼就能跑。
- cv2.dnn:OpenCV 內建,不需安裝 PyTorch,僅限推論(不能訓練)。
- PyTorch 直接跑:彈性最高,可訓練、可修改網路結構。
💡 DNN 這個詞有兩種意思,要分清楚:
cv2.dnn:OpenCV 裡的一個工具模組,只負責推論- DNN(Deep Neural Network):深度神經網路這個「概念」,PyTorch / TensorFlow 實作它
🔎 整合流程 — 影像怎麼流過這些工具
不管用哪個框架,整合 OpenCV 的流程都長這樣:
圖:OpenCV 與深度學習框架的整合流程,影像從讀取到顯示的完整路徑
- 用 OpenCV 讀取圖片或影片
- 交給框架(PyTorch / TensorFlow / cv2.dnn)執行推論
- 拿回偵測結果(邊界框 + 類別 + 信心度)
- 用 OpenCV 畫框、標籤、儲存或顯示
三種執行方式的差異:
PyTorch / ultralytics:需安裝torch,呼叫model("img.jpg")自動處理全流程TensorFlow / Keras:需安裝tensorflow,呼叫model.predict(img)自動處理全流程OpenCV cv2.dnn:僅需 OpenCV,呼叫blob → forward()推論,需手動解析結果
🔎 PyTorch 生態 — torchvision 與 ultralytics
PyTorch 底下有兩個常用的影像工具,功能定位不同:
圖:PyTorch 生態系,torchvision 主攻分類,ultralytics 主攻偵測與分割
- torchvision:PyTorch 官方的影像工具集,提供現成的模型架構與預訓練權重,主攻影像分類任務。
- ultralytics:YOLO 的高階套件,底層跑在 PyTorch 上,主攻物件偵測與分割,一行程式碼就能推論。
兩者都跑在 PyTorch 上,但功能定位不同,之後選擇時可以依任務需求決定。
🔎 模型格式 — 各框架存的檔案不一樣
訓練完的模型會存成檔案,各框架有自己的原生格式,但可以透過 ONNX 互相轉換:
圖:各框架模型格式對照,ONNX 是跨框架的通用橋樑
| 框架 | 原生格式 | 轉換後 | 可用於 |
|---|---|---|---|
| PyTorch | .pt / .pth |
.onnx |
cv2.dnn、ONNX Runtime |
| ultralytics | .pt |
.onnx |
cv2.dnn、ONNX Runtime |
| TensorFlow | SavedModel |
.onnx / .tflite |
跨平台部署 |
| Keras | .h5 |
.onnx |
跨框架推論 |
ONNX 是通用橋樑格式,PyTorch 或 TensorFlow 訓練的模型都可以匯出成 .onnx,再用 cv2.dnn 載入推論,不需要安裝 PyTorch。
🔎 任務對應 — 哪個模型做哪件事
看到這麼多模型名稱,新手最常問的就是「到底哪個用在哪裡」:
圖:模型與任務對應,左側為 YOLO 系列,右側為傳統與分類架構
YOLO 能做的事:
- 物件偵測:同時找出圖中所有「車、人、動物」等目標,最常見用途
- 影像分類:YOLOv8 之後才支援
- 人臉偵測 / 自訂目標:換資料集重新訓練即可
傳統與分類架構:
- Haar Cascades:人臉偵測專用,傳統方法
- LBP Cascades:人臉偵測,比 Haar 更快,精度略低
- ResNet / MobileNet:影像分類專用架構,判斷「這張圖是什麼」
🔎 分類 vs 偵測 — 以及 MobileNet SSD 是什麼
新手很容易把「MobileNet」和「MobileNet SSD」混為一談,但兩者完全不同類型:
圖:同一張馬路全景餵給分類模型 vs 偵測模型的差異,以及 MobileNet SSD 的組合方式
影像分類模型(ResNet18、MobileNet 純)設計上是「整張圖給我一個答案」,輸入複雜場景只會硬選一個最像的類別,結果往往奇怪。適合輸入單一主體的清晰照片。
物件偵測模型(YOLO、MobileNet SSD)才是設計來處理「一張圖裡有多個物件」的情境,輸出多個邊界框,每個框各自有類別與信心度,複雜場景才對味。
MobileNet SSD 的組合方式:MobileNet 作為骨幹(Backbone)負責提取特徵,SSD(Single Shot Detector)偵測頭接在後面負責輸出多個邊界框。整體是偵測模型,不是分類模型。
🔎 torchvision 有哪些模型可用
使用 PyTorch 的 torchvision 時,可以從以下分類中挑選現成的預訓練模型:
圖:torchvision 提供的模型清單,涵蓋分類、偵測、分割、影片等任務
🎯 結語
本篇把電腦視覺常見的術語與工具定位一次整理清楚,包含:四層架構全景圖、整合流程、PyTorch 生態、模型格式對照、任務與模型對應,以及這個系列的學習路徑設計理念。
下一篇進入 與深度學習框架整合 — 實作範例,直接用 PyTorch 與 TensorFlow/Keras 寫程式,對影像進行分類。
📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。
註:以上參考了
OpenCV 官方文件 — Tutorials
OpenCV 官方文件 — Python Tutorials
PyTorch 官方安裝指南
TensorFlow/Keras 官方文件
