Like Share Discussion Bookmark Smile

J.J. Huang   2026-03-02   Python OpenCV 07.物件偵測與辨識篇   瀏覽次數:次   DMCA.com Protection Status

Python | OpenCV 與深度學習框架整合

📚 前言

在前一篇我們學會了 多物件偵測與追蹤 (YOLO + DeepSORT),這是偏向「應用層」的做法,直接利用 OpenCV 的 DNN 模組載入模型並完成任務。
然而,若要進一步開發專案或研究,就需要更高的彈性與可擴充性。

整合 PyTorchTensorFlow/Keras 的好處在於:

  • 可以載入各種預訓練模型(ResNet、MobileNet、YOLOv5 等)。
  • 能使用自己訓練或微調過的模型,針對特定場景最佳化。
  • 支援 GPU 加速,大幅提升即時推論效能。
  • 允許修改網路結構、增加新層,甚至自行訓練,滿足研究與開發需求。
  • 結合 OpenCV 的影像處理能力,打造更靈活的應用。

這樣不僅能「跑起來」,還能「改得動」,真正把電腦視覺應用推向研究與實務的下一步。

🎨 範例圖片/影片

這裡我們使用 Pexels 提供的免費圖片素材:Street Image
下載後將檔名改為 street.jpg,在程式碼範例中使用。這張圖片中有車輛與行人,非常適合用來測試物件分類與定位。

這裡我們使用 Pexels 提供的免費影片素材:Street Video
下載後將檔名改為 street.mp4,在程式碼範例中使用。影片中有車輛與行人,非常適合用來測試物件分類與定位。

🔎 原理說明

  • OpenCV:負責影像擷取、前處理與顯示。
  • 深度學習框架:負責模型載入、推論與微調。
  • 整合方式:框架輸出推論結果,OpenCV 負責繪製邊界框或文字。

📂 模型下載與使用說明

PyTorch

  • 使用 torchvision.models 載入預訓練模型 (ResNet、MobileNet 等)。
  • 可進行微調或自訂網路結構。

TensorFlow/Keras

  • 使用 tf.keras.applications 載入預訓練模型 (MobileNetV2、ResNet50 等)。
  • API 友善,適合快速應用與部署。

🧠 函式與參數說明

PyTorch — torchvision.models

  • resnet18(weights=ResNet18_Weights.DEFAULT):載入 ResNet18 預訓練模型,建議使用 weights 參數取代舊版的 pretrained=True,避免警告。
  • model.eval():切換到推論模式。
  • weights.transforms():取得官方推薦的前處理流程。
  • torch.topk(probs, 5):取出前 5 個類別與機率。

TensorFlow/Keras — tf.keras.applications

  • MobileNetV2(weights="imagenet"):載入 MobileNetV2 預訓練模型。
  • preprocess_input(x):對輸入影像做正規化。
  • model.predict(x):進行推論,輸出 1000 類別的分數。
  • decode_predictions(preds, top=5):解碼分類結果,顯示前 5 個預測類別與機率。

💻 範例程式 — PyTorch 整合 (ResNet18)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import torch
from torchvision.models import resnet18, ResNet18_Weights
import cv2
from PIL import Image

weights = ResNet18_Weights.DEFAULT
model = resnet18(weights=weights)
model.eval()

preprocess = weights.transforms()

img = cv2.imread("street.jpg")
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
pil_img = Image.fromarray(img_rgb)

input_tensor = preprocess(pil_img).unsqueeze(0)

with torch.no_grad():
outputs = model(input_tensor)
probs = torch.nn.functional.softmax(outputs[0], dim=0)

# 取前 5 個類別
top5 = torch.topk(probs, 5)

for idx, score in zip(top5.indices, top5.values):
label = weights.meta["categories"][idx]
print(f"{label}: {score:.4f}")


圖:使用 PyTorch ResNet18 對影像進行分類,Top-5 預測結果顯示模型的信心分布

📊 ResNet18 Top-5 預測結果

排名 類別 (Label) 機率 (Probability)
1 police van 0.3636
2 ambulance 0.2735
3 garbage truck 0.1055
4 tow truck 0.0890
5 minivan 0.0556

💻 範例程式 — TensorFlow/Keras 整合 (MobileNetV2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import tensorflow as tf
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions
import cv2
import numpy as np

model = MobileNetV2(weights="imagenet")

img = cv2.imread("street.jpg")
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_resized = cv2.resize(img_rgb, (224, 224))

x = np.expand_dims(img_resized, axis=0)
x = preprocess_input(x)

preds = model.predict(x)

# 顯示前五個預測結果
results = decode_predictions(preds, top=5)[0]
for (imagenet_id, label, prob) in results:
print(f"{label}: {prob:.4f}")


圖:使用 TensorFlow/Keras MobileNetV2 對影像進行分類,顯示前 5 個預測結果

📊 MobileNetV2 Top-5 預測結果

排名 類別 (Label) 機率 (Probability)
1 minivan 0.2867
2 minibus 0.2489
3 police van 0.1733
4 cab 0.0288
5 limousine 0.0198

🛠️ 與 OpenCV 結合的應用

  • 即時影像分類:用框架載入模型,OpenCV 負責影像擷取與顯示。
  • 物件偵測:用 PyTorch/TensorFlow 載入 YOLOv5/SSD 模型,OpenCV 負責繪製邊界框。
  • 追蹤整合:框架提供特徵抽取,OpenCV + DeepSORT 負責追蹤。

⚠️ 注意事項

  • 版本相容性:建議使用 Python 3.8–3.11,避免 3.12+ 的套件相容性問題。
  • GPU 支援:若要使用 CUDA,需安裝對應版本的 PyTorch/TensorFlow。
  • 資料集準備:若要進行微調或訓練,需準備符合格式的影像資料集。

📊 應用場景

  • 智慧交通:用框架載入 YOLOv5,結合 OpenCV 即時顯示。
  • 人流分析:用 ResNet/MobileNet 做分類,OpenCV 負責影像擷取。
  • 零售應用:用框架模型辨識商品,OpenCV 顯示結果。

🎯 結語

本篇我們學會了如何將 OpenCV 與深度學習框架整合,不再只是「跑起來」,而是能夠載入、修改、甚至微調模型。
這讓我們的應用更靈活,能同時滿足研究與實務需求。

📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。

註:以上參考了
OpenCV 官方文件 — Tutorials
OpenCV 官方文件 — Python Tutorials
PyTorch 官方安裝指南
TensorFlow/Keras 官方文件
Pexels — 免費圖片與影片素材