使用 OpenCV DNN 模組與 Res10 SSD 進行人臉偵測

OpenCV DNN 模組使用 Res10 SSD 進行人臉偵測教學

使用 OpenCV DNN 模組與 Res10 SSD 進行人臉偵測教學

OpenCV 提供了強大的 DNN 模組,讓我們能輕鬆載入深度學習預訓練模型並進行物件偵測。本教學將示範如何使用 Res10 SSD 模型對圖片中的人臉進行偵測,並詳細解說核心程式碼與座標換算邏輯。

一、教學目標與環境準備

  • 使用 OpenCV DNN 模組載入 Res10 SSD 人臉偵測模型
  • 從圖片中偵測人臉位置
  • 在圖片中繪製偵測到的人臉方框
  • 深入解析模型輸出座標如何轉換成像素座標

需準備:

  • OpenCV(建議版本4.x以上)
  • Res10 SSD 模型權重檔 res10_300x300_ssd_iter_140000_fp16.caffemodel
  • 模型配置檔 deploy.prototxt
  • 測試圖片(如 faces2.jpg

二、完整程式碼範例

import cv2

model_path = r"ch03/models/Res10_ssd/res10_300x300_ssd_iter_140000_fp16.caffemodel"
config_path = r"ch03/models/Res10_ssd/deploy.prototxt"

model = cv2.dnn.readNet(model=model_path, config=config_path, framework='Caffe')

image = cv2.imread(r"ch03/images/faces2.jpg")
image_height, image_width, _ = image.shape

blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300), (104.0, 177))

model.setInput(blob)
detections = model.forward()

for face in detections[0][0]:
    face_confidence = face[2]
    print(face_confidence)

    if face_confidence > 0.5:
        x1 = int(face[3] * image_width)
        y1 = int(face[4] * image_height)
        x2 = int(face[5] * image_width)
        y2 = int(face[6] * image_height)

        cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)

cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、程式碼詳解

1. 載入模型

使用 cv2.dnn.readNet 讀取 Caffe 格式模型與網路結構,準備進行推論。

2. 圖片讀取與尺寸取得

透過 cv2.imread 載入圖片,並用 image.shape 取得圖片的高度與寬度,方便後續座標換算。

3. 建立輸入 Blob

函式 cv2.dnn.blobFromImage 將圖片縮放至模型需求大小(300×300),並做均值移除等前處理,產生符合模型輸入的 4D 張量。

4. 模型推論

設置模型輸入後使用 forward() 執行推論,取得偵測結果 detections

5. 模型輸出格式與座標換算

模型輸出是一個多維陣列,每個偵測結果中包含:

  • face[0]:影像索引(通常為0)
  • face[1]:類別 ID
  • face[2]:置信度(confidence)
  • face[3]:偵測框左上角 x 座標(比例值,介於0~1)
  • face[4]:偵測框左上角 y 座標(比例值,介於0~1)
  • face[5]:偵測框右下角 x 座標(比例值,介於0~1)
  • face[6]:偵測框右下角 y 座標(比例值,介於0~1)

將模型輸出的相對比例座標轉換成實際圖片像素座標,是使用這段關鍵程式碼完成的:

x1 = int(face[3] * image_width)
y1 = int(face[4] * image_height)
x2 = int(face[5] * image_width)
y2 = int(face[6] * image_height)

說明如下:

  • 模型回傳的邊界框座標是相對於輸入圖片的比例值,取值介於 0 到 1 之間。
  • 乘以圖片的寬度或高度後,即可取得該偵測框在原始圖片中的絕對像素位置。
  • 使用 int() 取整數是因為繪圖函式需要整數座標。

此轉換確保方框能準確顯示在圖片上的偵測位置。

6. 繪製偵測框

利用 OpenCV 的 cv2.rectangle 在圖片上以綠色框標示出偵測到的人臉位置。

---

四、總結

本教學示範了如何使用 OpenCV DNN 模組搭配 Res10 SSD 模型,快速完成圖片中人臉的偵測。特別強調了模型輸出座標的「比例轉換為像素座標」的流程,這是理解物件偵測結果並正確繪製框選的關鍵。

留言

這個網誌中的熱門文章

opencv-畫線條/矩陣/圓/文字

opencv-圖像相素調整(resize)和剪裁(cropping)

原來opencv也能"訓練"人臉辨識